Skip to content

Türkiye (TR) Özel Payout Akışı

Stripe kısıtlamalarını aşmak için manuel IBAN/Payoneer toplama, admin onay ve payout_requests tablosu.

Türkiye’de Stripe Connect’in sınırlı olması nedeniyle Coursio, TR eğitmenleri için Stripe yerine manuel ödeme (IBAN veya Payoneer) akışı sunar. Bu sayfa, bu mantığın nasıl çalıştığını, PAYOUT_REQUEST tablosunu ve admin onay mekanizmasını açıklar.

  • Stripe Connect, Türkiye’de tam desteklenmediği veya kısıtlamaları olduğu için, TR’deki eğitmenlere Stripe Transfer ile ödeme yapılamıyor.
  • Çözüm: Eğitmen IBAN veya Payoneer bilgisini platforma girer; admin ödeme talebini onayladıktan sonra manuel (platform dışı) havale/EFT ile ödeme yapar.
  • Eğitmen ülkesi TR ise ödeme yöntemi olarak “Banka havalesi / Payoneer” seçeneği sunulur.
  • Bilgi girişi: manualPayoutDetails alanına IBAN (TR…) veya Payoneer e-posta adresi metin olarak kaydedilir.
  • Kayıt: users tablosunda payout_method = 'bank_transfer' ve manual_payout_details = '...' güncellenir.

Endpoint: Eğitmen bu bilgiyi GraphQL mutation updatePayoutSettings(method, details, manualPayoutDetails) veya ilgili form ile gönderir; backend app/routes/api.instructor.update-manual-payout.ts veya GraphQL resolver üzerinden users.manualPayoutDetails ve users.payoutMethod günceller.

AlanAçıklama
payout_method'stripe_connect' veya 'bank_transfer' (TR için bank_transfer).
manual_payout_detailsIBAN veya Payoneer bilgisi (serbest metin).

Tüm ödeme talepleri (hem Stripe Connect hem manuel) aynı tabloda tutulur:

AlanAçıklama
idUUID, primary key.
instructor_idTalep sahibi (eğitmen veya affiliate).
amountTalep edilen tutar (numeric).
statuspending, processing, completed, rejected.
method'stripe_connect' veya 'bank' (manuel).
destinationStripe Connect hesap ID’si veya IBAN/Payoneer metni.
processed_atİşlenme zamanı.
stripe_transfer_idStripe Transfer ID (sadece method=stripe_connect için).
request_type'instructor' veya 'affiliate'.
  • Stripe Connect talepleri: method = 'stripe_connect', destination = stripeConnectId; admin onayında processPayoutTransfer ile Stripe’a transfer oluşturulur.
  • TR (manuel) talepleri: method = 'bank', destination = manualPayoutDetails (IBAN/Payoneer); admin sadece durumu completed yapar ve dışarıda havale/EFT gerçekleştirir.

Sayfa: Admin ödemeler paneli (örn. /admin/payouts).

  1. Liste: payout_requests tablosundan status = 'pending' talepler listelenir; eğitmen bilgisi ve destination (IBAN/Payoneer veya Connect ID) gösterilir.
  2. Onay (Stripe Connect): Admin “Onayla” dediğinde backend processPayoutTransfer(db, payoutId) çağırır; Stripe transfer yaratılır, stripe_transfer_id ve status güncellenir.
  3. Onay (TR / bank): Admin “Onayla” dediğinde yalnızca status = 'completed' (ve isteğe bağlı processed_at) güncellenir; gerçek para hareketi platform dışında (manuel havale/EFT) yapılır.
  4. Red: status = 'rejected' yapılır.

Böylece tek bir payout_requests tablosu ve tek bir admin akışı hem Connect hem TR manuel ödemeyi kapsar.

AdımAçıklama
1TR eğitmeni payout_method = bank_transfer ve manual_payout_details (IBAN/Payoneer) kaydeder.
2Eğitmen ödeme talebi oluşturur → payout_requests’e method = 'bank', destination = manualPayoutDetails ile kayıt eklenir.
3Admin panelde talebi görür; manuel ödemeyi kendi sürecine göre yaptıktan sonra talebi “Tamamlandı” olarak işaretler.
4Stripe Connect talepleri için admin “Onayla” dediğinde processPayoutTransfer ile Stripe’da transfer oluşturulur.

Checkout ve webhook tarafı için Checkout & Webhooks sayfasına bakın.

  • app/routes/api.instructor.update-manual-payout.ts — TR eğitmeni manuel ödeme bilgisi (IBAN/Payoneer) güncelleme.
  • app/routes/instructor.payouts.tsx — Eğitmen ödemeler sayfası; manuel bilgi girişi ve payout talebi.
  • app/routes/admin.payouts.tsx — Admin ödemeler paneli; onay/red.
  • app/lib/stripe-connect-payout.ts — Connect talepleri için processPayoutTransfer.
  • app/lib/payout-engine.ts — Payout talebi mantığı.