Wise ve Payoneer ile freelancer ödeme akışları: uygulamalı rehber
Wise ve Payoneer ile yurt dışından ödeme alan freelancer için hesap türleri, kur dönüşümü, ücret karşılaştırma yöntemi, fatura ve kayıt disiplini; Python örnekli.
Yurt dışındaki müşterilerden ödeme almak, bağımsız çalışan bir geliştiricinin işin teknik kısmından daha fazla kafa yorduğu konulardan biri. Ben de ilk yıllarda her ödemeyi ayrı bir sorun gibi yaşadım: banka havalesi günlerce sürdü, aracı banka kesintisi sürpriz oldu, kur farkı faturamı küçülttü. Wise ve Payoneer ile freelancer ödeme akışları kurduktan sonra bu işi tek bir rutine indirdim; bu yazıda o rutini, çalışan iki Python betiğiyle birlikte anlatıyorum.
Bu iki sağlayıcıyı tercih etmemin sebebi "en ucuz" olmaları değil. İkisi de sizin adınıza yabancı para birimlerinde hesap bilgileri üretiyor; müşteri kendi ülkesinde iç havale yapar gibi ödüyor, SWIFT zinciri ve aracı banka kesintisi devreden çıkıyor. Fark hesap yapısında, dönüşüm mantığında ve ücretlerin nereye yerleştirildiğinde ortaya çıkıyor.
Baştan söyleyeyim: bu yazıda tek bir ücret rakamı bulamayacaksınız. Her iki sağlayıcı da ücretlerini para birimine, ödeme yöntemine ve ülkeye göre farklılaştırıyor ve düzenli olarak güncelliyor; bugün yazacağım rakam birkaç ay sonra yanlış olur. Bunun yerine ücretleri kendi başınıza karşılaştırmanın yöntemini ve ödemeleri kayıt altına almanın disiplinini vereceğim. Güncel rakamlar için her zaman sağlayıcının kendi fiyat sayfasına bakın.
Hesap türleri: neyi açıyorsunuz, ne alıyorsunuz
İki sağlayıcı da bireysel ve işletme hesabı ayrımı yapıyor. Hangisini açarsanız açın, hesabın asıl değeri bakiyede değil, sizin adınıza üretilen yabancı para birimi hesap bilgilerinde. Kabaca ayrım şöyle:
- Wise: çok para birimli tek hesap. Her para birimi ayrı bir bakiye olarak durur; desteklenen para birimleri için yerel hesap bilgileri alırsınız (dolar için ABD yönlendirme numarası, euro için IBAN gibi). Para hesabınıza geldiği para biriminde düşer; ne zaman ve ne kadarını dönüştüreceğinize siz karar verirsiniz.
- Payoneer: ödeme alma hesapları etrafında kurulu. Freelance platformları ve uygulama mağazaları gibi pazar yerleriyle entegrasyonu güçlü; doğrudan çalıştığınız müşteriye ödeme talebi gönderebiliyorsunuz, müşteri kartla ya da havaleyle ödüyor.
- İşletme hesabı: şirketiniz varsa hesabı şirket adına açın. Faturadaki ad ile hesap sahibinin adı eşleşmeli; muhasebe bunu ister, bazı müşterilerin satın alma birimi de ister.
- Uygunluk: hangi ülke sakinlerinin hangi hesabı açabildiği ve hangi para birimlerini tutabildiği zamanla değişiyor. Başvurmadan önce sağlayıcının güncel listesine bakın; bir belgede okuduğunuz bilgi bayat olabilir.
Benim düzenim basit: müşteri hangi ülkedeyse ona en yakın yerel hesap bilgisini gönderiyorum, para o para biriminde bekliyor, Türkiye'ye çekimi kendi seçtiğim günde yapıyorum. Akış kabaca şu:
müşteri ──yerel havale──> USD/EUR bakiye ──dönüşüm (siz seçersiniz)──> TL banka hesabı
│ │ │
fatura no sağlayıcı ekstresi banka ekstresi
└──────────── mutabakat: üçü aynı fatura numarasında buluşur ───────┘
Ödeme alma anı ile dönüştürme anını ayırmak, hem kur seçme özgürlüğü veriyor hem de aşağıdaki maliyet hesabını mümkün kılıyor.
Para birimi dönüşümü: kur, marj ve gerçek maliyet
Bir ödemenin size maliyeti üç parçadan oluşur: alma ücreti, dönüşüm ücreti ve kur marjı. İlk ikisi ekranda yazar; üçüncüsü çoğu zaman yazmaz. Bazı sağlayıcılar orta piyasa kurunu kullanıp ücreti ayrı gösterir, bazıları marjı kurun içine gömer ve işlemi "ücretsiz" diye sunar. İkisini yan yana koymanın tek dürüst yolu etkin kur: gönderdiğim tutar ile elime geçen net tutarın oranı.
- Referans kur olarak aynı gün ve saate ait bir orta piyasa kuru kullanın; TCMB verisi ya da herkese açık bir kur kaynağı iş görür. Referansın zamanı kaymışsa hesap anlamını yitirir.
- İki sağlayıcıyı aynı tutar, aynı para birimi çifti ve aynı dakika içinde karşılaştırın. Ekranda gösterilen "alacağınız tutar" değeri bu hesabın girdisi.
- Parayı yabancı para biriminde bekletmek kur riski taşır; hemen dönüştürmek ise o günkü marjı kabul etmektir. Hangisini seçtiğinizi bilerek seçin, iki seçenek de meşru.
from decimal import Decimal, ROUND_HALF_UP
def etkin_maliyet(gonderilen: Decimal, alinan: Decimal, piyasa_kuru: Decimal) -> dict:
"""Dönüşümün gerçek maliyeti: ücret + kur marjı, tek yüzde olarak.
gonderilen : kaynak para biriminden çıkan tutar
alinan : hedef para biriminde hesaba düşen NET tutar
piyasa_kuru : aynı ana ait referans orta piyasa kuru
"""
beklenen = gonderilen * piyasa_kuru # marjsız dünyada elinize geçecek tutar
kayip = beklenen - alinan
yuzde = (kayip / beklenen * 100).quantize(Decimal("0.01"), ROUND_HALF_UP)
etkin_kur = (alinan / gonderilen).quantize(Decimal("0.0001"), ROUND_HALF_UP)
if yuzde < 0:
# Piyasadan iyi kur olmaz; referans kurunuz büyük ihtimalle bayat
raise ValueError(f"negatif maliyet ({yuzde}%), referans kuru kontrol edin")
return {"etkin_kur": etkin_kur, "kayip": kayip, "maliyet_yuzde": yuzde}
def karsilastir(teklifler: dict, gonderilen: Decimal, piyasa_kuru: Decimal) -> list:
"""{'sağlayıcı': net tutar} sözlüğünü maliyete göre sıralar."""
satirlar = [(ad, etkin_maliyet(gonderilen, net, piyasa_kuru)) for ad, net in teklifler.items()]
return sorted(satirlar, key=lambda s: s[1]["maliyet_yuzde"])
if __name__ == "__main__":
# Tutarlar temsili; iki uygulamanın o anki ekranından okuyup buraya yazın
teklifler = {"saglayici_a": Decimal("33810.50"), "saglayici_b": Decimal("33560.00")}
for ad, s in karsilastir(teklifler, Decimal("1000"), Decimal("34.2500")):
print(f"{ad:12} etkin kur {s['etkin_kur']} maliyet %{s['maliyet_yuzde']}")
Bu betiği ay sonunda ekstreyle çalıştırıyor, maliyet_yuzde değerini kayıt tablosuna yazıyorum. Birkaç ay sonra hangi rotanın hangi para biriminde daha pahalı olduğunu kendi verimden görüyorum; broşüre ya da forum yorumuna bakmam gerekmiyor.
Ücret yapısı: iki sağlayıcıyı nasıl karşılaştırırım
Fiyat sayfalarını okurken şu kalemleri ayrı ayrı not ediyorum. Aynı kalem iki sağlayıcıda farklı adla geçebiliyor, bu yüzden adına değil işlevine bakın:
- Alma ücreti: yerel havaleyle gelen paraya kesinti var mı? SWIFT ile gelene? Pazar yerinden gelene? Üçü ayrı fiyatlanabiliyor.
- Kartla ödeme: müşteri kartla öderse yüzdesel kesinti havaleden farklıdır; ödeme talebi gönderirken yöntemi buna göre seçin.
- Dönüşüm ücreti: yüzde mi, sabit mi, para birimine göre değişiyor mu? Küçük tutarlarda sabit ücret, büyük tutarlarda yüzde daha çok acıtır.
- Çekim ücreti: Türkiye'deki banka hesabına TL çekimde ayrı bir kalem var mı, çekim kuru hangi kaynaktan geliyor?
- Hareketsizlik ve bakiye tutma: uzun süre işlem yapılmayan hesaba ücret uygulayan sağlayıcılar var; sözleşme metninde arayın, fiyat tablosunda öne çıkmaz.
- Kur marjı: fiyat sayfasında yer almaz; yukarıdaki betikle kendiniz ölçersiniz.
Bu kalemleri bir tabloya döküp her çeyrek yeniden bakıyorum. Tabloyu Excel'de tutuyorsanız satır satır göz kontrolü yerine kural tabanlı denetimi otomatiğe bağlayın; Excel kalite kontrol otomasyonu yazısındaki yaklaşım buraya olduğu gibi uyuyor. Bir de küçük faturaları aylık tek faturada toplamak, sabit ücretlerin toplam maliyetteki payını düşürür; müşteriyle baştan konuşun.
Faturalandırma: para gelmeden önce belge
Türkiye'de vergi mükellefi olarak yurt dışına hizmet satıyorsanız faturayı yine siz kesersiniz. Wise ya da Payoneer'ın ürettiği ödeme özeti bir banka dekontu gibidir, fatura yerine geçmez. Benim kontrol listem:
- Fatura döviz cinsinden kesilebilir; TL karşılığı ve kullanılan kur faturada yer almalı. Uygulamada fatura tarihindeki TCMB kuru esas alınıyor; kendi durumunuz için mali müşavirinizle teyit edin.
- Fatura numarasını müşteriden ödeme açıklamasına yazmasını isteyin. Sonraki bölümdeki mutabakat tamamen bunun üzerine kurulu.
- Müşterinin ödediği tutar ile elinize geçen tutar farklıdır. Fatura brüt tutarı gösterir; sağlayıcı kesintisi ayrı bir gider kalemi olarak kaydedilir, faturadan düşülmez.
- Yurt dışına hizmet ihracında KDV istisnası ve belirli hizmet türleri için gelir vergisi indirimi gibi düzenlemeler var. Şartları ve oranları değişiyor; hangisinden yararlanabileceğinizi mali müşavirinize bırakın, ben burada yalnızca var olduklarını söylüyorum.
- Sağlayıcı ekstresini her ay hem PDF hem CSV olarak indirip fatura klasörünün yanında saklayın. Yıllar sonra bir ödemenin kaynağını sormak zorunda kalabilirsiniz; o gün sağlayıcı paneline erişiminiz olmayabilir.
Faturayı ödeme gelmeden kesmek, sonradan "bu para hangi işin karşılığıydı" sorusunu ortadan kaldırıyor. Para önce gelip fatura sonra kesildiğinde eşleştirme her seferinde elle yapılan bir iş oluyor.
Kayıt disiplini: her ödemeyi faturayla eşleştir
Ay sonunda elimde iki dosya olur: kestiğim faturaların listesi ve sağlayıcıdan indirdiğim ödeme hareketleri. İkisini birbirine bağlayan tek şey müşterinin açıklamaya yazdığı fatura numarası. Dosyaların en sade hâli şu sütunlardan oluşuyor:
faturalar.csv:fatura_no, tarih, musteri, para_birimi, tutarodemeler.csv:tarih, saglayici, referans, para_birimi, brut, net(brüt müşterinin gönderdiği, net hesaba düşen)
import csv
from decimal import Decimal
from pathlib import Path
def oku(yol: str) -> list:
with Path(yol).open(newline="", encoding="utf-8") as f:
return list(csv.DictReader(f))
def mutabakat(fatura_yolu: str, odeme_yolu: str) -> dict:
faturalar = {f["fatura_no"]: f for f in oku(fatura_yolu)}
eslesen, sahipsiz = [], []
for o in oku(odeme_yolu):
# Müşteri açıklamaya fatura numarasını yazdıysa buradan yakalarız
no = next((n for n in faturalar if n in o["referans"]), None)
if no is None:
sahipsiz.append(o)
continue
f = faturalar.pop(no)
brut, net = Decimal(o["brut"]), Decimal(o["net"])
eslesen.append({
"fatura_no": no,
"eksik_odeme": Decimal(f["tutar"]) - brut, # müşteri eksik yolladıysa
"ucret": brut - net, # sağlayıcının kestiği
"saglayici": o["saglayici"],
})
return {"eslesen": eslesen, "acik_fatura": list(faturalar.values()), "sahipsiz_odeme": sahipsiz}
if __name__ == "__main__":
r = mutabakat("faturalar.csv", "odemeler.csv")
for e in r["eslesen"]:
uyari = " !! eksik ödeme" if e["eksik_odeme"] > 0 else ""
print(f"{e['fatura_no']:12} ücret {e['ucret']:>8} ({e['saglayici']}){uyari}")
print(f"açık fatura: {len(r['acik_fatura'])} sahipsiz ödeme: {len(r['sahipsiz_odeme'])}")
Sütun adlarını sağlayıcının dışa aktarım biçimine göre eşlemeniz gerekir; her sağlayıcı farklı başlık kullanıyor ve arada değiştiriyor. Çıktıdaki "açık fatura" satırı alacak takibinizdir, "sahipsiz ödeme" ise açıklamaya numara yazmayan müşteridir; ikisini de ay kapanmadan temizleyin. Birkaç aylık veri birikince CSV yerine tek dosyalık bir veritabanı daha rahat oluyor; SQLite ile küçük ama sağlam veri boru hatları yazısındaki yeniden çalıştırılabilirlik kuralları burada da aynen geçerli.
Özetle: hesap türünü işinize göre seçin, ödeme almayı dönüştürmeden ayırın, maliyeti etkin kurla ölçün, faturayı önce kesin ve her ödemeyi bir fatura numarasına bağlayın. Ücret rakamları değişir, sağlayıcılar politikalarını değiştirir; yöntem değişmez. Bu yüzden rakamı ezberlemek yerine ölçen betiği elinizin altında tutun.
Bu akışı kendi işinize uyarlamak, sağlayıcı ekstrelerini otomatik çekip mutabakatı zamanlayıcıya bağlamak isterseniz iletişim bölümünden yazın; veri ve otomasyon tarafında neler yaptığımı ana sayfada bulabilirsiniz.