Skip to content

Stripe Connect Akışı

Global eğitmenler, Express Dashboard onboarding, anlık transferler ve manuel ödeme yöntemleri (Payoneer/Cenoa).

Achidemy’de uluslararası eğitmenler için ödemeler Stripe Connect (Express) ile yapılır. Bu sayfa, Express Dashboard onboarding, api.stripe.connect-onboarding.ts ve satış sonrası paranın eğitmen hesabına anlık transfer mantığını açıklar. Türkiye’deki eğitmenler veya manuel ödeme tercih edenler için Payoneer/Cenoa akışı sunulur; detay için TR Özel Payout Akışı ve KYC Onboarding sayfalarına bakın.

ÖzellikStripe ConnectPayoneerCenoa
Ödeme TipiOtomatikManuelManuel
DoğrulamaStripe OnboardingKYC (Admin onayı)KYC (Admin onayı)
İletişim BilgisiStripe tarafındanE-postaTelefon
Admin İşlemiOnay → Otomatik transferOnay → Manuel ödemeOnay → Manuel ödeme
Logo/images/stripe.webp/images/payoneer.png/images/cenoa.png
Tema RengiİndigoTuruncuMavi (#0052FF)

Global Eğitmenler: Express Dashboard Onboarding

Section titled “Global Eğitmenler: Express Dashboard Onboarding”

Eğitmenin banka bilgilerini Stripe Express Dashboard üzerinden güvenli şekilde tanımlaması; platform daha sonra kazançları bu Connect hesabına transfer eder.

Onboarding Endpoint: api.stripe.connect-onboarding

Section titled “Onboarding Endpoint: api.stripe.connect-onboarding”

Dosya: app/routes/api.stripe.connect-onboarding.ts

Akış:

  1. Yetkilendirme: Giriş yapmış ve role === "instructor" olan kullanıcı.
  2. Connect hesabı yoksa: stripe.accounts.create({ type: "express", country, email, capabilities: { transfers: { requested: true } }, ... }) ile Express hesabı oluşturulur; stripeConnectId kullanıcıya kaydedilir.
  3. Hesap varsa: Mevcut stripeConnectId kullanılır; gerekirse transfers capability güncellenir.
  4. Account Link: stripe.accountLinks.create({ account, refresh_url, return_url, type: "account_onboarding" }) ile Stripe’ın onboarding sayfasına yönlendirme linki üretilir.
  5. Yönlendirme: Kullanıcı bu linke yönlendirilir; tamamlayınca return_url (örn. /instructor/payouts?onboarding=success) ile döner.

Refresh URL: Onboarding yarıda kesilirse tekrar denemek için refresh_url (örn. /instructor/payouts) kullanılır.

Eğitmen, Ödemeler sayfasında (örn. /instructor/payouts) “Stripe Connect hesabını bağla” benzeri bir butonla bu endpoint’i tetikler (form POST veya link). Ülke bilgisi kullanıcı kaydındaki country alanından alınır; Express hesabı o ülkeye göre oluşturulur.

Anlık Transferler: Satış Sonrası Eğitmen Hesabına Aktarım

Section titled “Anlık Transferler: Satış Sonrası Eğitmen Hesabına Aktarım”

Satış gerçekleştiğinde (Stripe checkout.session.completed webhook’u):

  1. Earnings kaydı oluşturulur: toplam tutar, eğitmen payı, platform payı, affiliate payı (varsa) earnings tablosuna yazılır.
  2. Eğitmen bakiyesi bu kayıtlar üzerinden hesaplanır (tamamlanan satışların eğitmen payı toplamı).

Eğitmen ödeme talebi oluşturduğunda:

  • Tablo: payout_requests (PAYOUT_REQUEST).
  • method: stripe_connect (Stripe Connect ile ödeme) veya bank_transfer (Payoneer/Cenoa).
  • destination: Eğitmenin stripeConnectId veya manualPayoutDetails.

Admin talebi onayladığında sistem önce eğitmenin doğrulama yöntemini kontrol eder:

// app/routes/admin.payouts.tsx - action
const isStripeVerified = instructor?.isConnectOnboardingCompleted ?? false;
const isPayoneerVerified = instructor?.kycStatus === "approved" &&
!isStripeVerified &&
instructor?.payoutMethod === "payoneer";
const isCenoaVerified = instructor?.kycStatus === "approved" &&
!isStripeVerified &&
instructor?.payoutMethod === "cenoa";

Stripe Connect Doğrulamalı Eğitmenler (isStripeVerified)

Section titled “Stripe Connect Doğrulamalı Eğitmenler (isStripeVerified)”
  1. payout_requests tablosundan ilgili kayıt okunur; eğitmenin stripeConnectId’si kontrol edilir.
  2. Tutar cent cinsine çevrilir.
  3. stripe.transfers.create çağrılır: platform Stripe hesabından eğitmenin Connect hesabına (destination: stripeConnectId) transfer yaratılır.
  4. Başarılıysa stripeTransferId payout kaydına yazılır; durum güncellenir.

Böylece anlık transfer (onay sonrası tek seferde) eğitmenin Stripe Connect bakiyesine yansır; eğitmen Stripe üzerinden kendi bankasına çekim yapar.

Payoneer Doğrulamalı Eğitmenler (isPayoneerVerified)

Section titled “Payoneer Doğrulamalı Eğitmenler (isPayoneerVerified)”

Stripe Transfer yapılmaz. Admin Payoneer/IBAN bilgilerine manuel ödeme yapar, ardından “Onayla” ile talebi tamamlandı olarak işaretler.

Cenoa Doğrulamalı Eğitmenler (isCenoaVerified)

Section titled “Cenoa Doğrulamalı Eğitmenler (isCenoaVerified)”

Stripe Transfer yapılmaz. Admin Cenoa telefon numarasına manuel ödeme yapar, ardından “Onayla” ile talebi tamamlandı olarak işaretler.

Önemli: Payoneer veya Cenoa doğrulamalı eğitmenler için “Onayla” butonuna basıldığında Stripe API çağrısı yapılmaz. Sadece talep durumu “completed” olarak güncellenir.

Admin Panelinde Ödeme Yöntemi Gösterimi

Section titled “Admin Panelinde Ödeme Yöntemi Gösterimi”

Her ödeme yöntemi için gerçek logo kullanılır:

{/* Stripe Connect */}
{payout.isStripeVerified && (
<>
<img src="/images/stripe.webp" alt="Stripe" className="h-5 w-auto object-contain" />
<span className="bg-indigo-100 text-indigo-700">Doğrulandı</span>
</>
)}
{/* Payoneer */}
{payout.isPayoneerVerified && (
<>
<img src="/images/payoneer.png" alt="Payoneer" className="h-5 w-auto object-contain" />
<span className="bg-emerald-100 text-emerald-700">Doğrulandı</span>
</>
)}
{/* Cenoa */}
{payout.isCenoaVerified && (
<>
<img src="/images/cenoa.png" alt="Cenoa" className="h-5 w-auto object-contain" />
<span className="bg-blue-100 text-blue-700">Doğrulandı</span>
</>
)}

Eğitmen ödeme talebi oluştururken logo + “ile doğrulandı” formatında gösterim:

<div className="flex items-center gap-2 mt-1">
<img
src={isStripeVerified ? "/images/stripe.webp" : isCenoaVerified ? "/images/cenoa.png" : "/images/payoneer.png"}
alt={isStripeVerified ? "Stripe" : isCenoaVerified ? "Cenoa" : "Payoneer"}
className="h-4 w-auto object-contain"
/>
<span className={`text-xs font-bold ${
isStripeVerified ? "text-indigo-600" : isCenoaVerified ? "text-blue-600" : "text-orange-600"
}`}>
ile doğrulandı
</span>
</div>
Ödeme YöntemiAna RenkTema
Stripeİndigo (#6366F1)bg-indigo-50, text-indigo-600, border-indigo-200
PayoneerTuruncu (#F97316)bg-orange-50, text-orange-600, border-orange-200
CenoaMavi (#0052FF)bg-blue-50, text-blue-600, border-blue-200
KonuAçıklama
Onboardingapi.stripe.connect-onboarding → Express hesap oluşturma / Account Link → Stripe Express sayfasına yönlendirme.
EarningsSatış webhook’unda earnings tablosuna eğitmen/platform/affiliate payları yazılır.
Payout talebi (Stripe)Eğitmen talep oluşturur → Admin onaylar → stripe.transfers.create ile otomatik transfer; para eğitmen Connect hesabına gider.
Payout talebi (Payoneer)Eğitmen talep oluşturur → Admin manuel ödeme yapar → Admin onaylar → Sadece durum güncellenir.
Payout talebi (Cenoa)Eğitmen talep oluşturur → Admin manuel ödeme yapar → Admin onaylar → Sadece durum güncellenir.

Türkiye’deki eğitmenler için Stripe kısıtlamaları nedeniyle kullanılan manuel Payoneer/Cenoa akışı için Türkiye (TR) Özel Payout Akışı sayfasına bakın.

DosyaAçıklama
app/routes/api.stripe.connect-onboarding.tsStripe Connect Express onboarding; Account Link ile yönlendirme
app/routes/instructor.payouts.tsxEğitmen ödemeler sayfası; Connect bağlama ve payout talebi
app/routes/admin.payouts.tsxAdmin ödeme talepleri paneli; doğrulama yöntemine göre onay işlemi
app/lib/payout-engine.tsPayout talebi ve bakiye mantığı
public/images/stripe.webpStripe logosu
public/images/payoneer.pngPayoneer logosu
public/images/cenoa.pngCenoa logosu

Stripe geliştirmeleri ve daha fazla bilgi için: Stripe Dokümantasyonu