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.
Ödeme Yöntemleri Karşılaştırması
Section titled “Ödeme Yöntemleri Karşılaştırması”| Özellik | Stripe Connect | Payoneer | Cenoa |
|---|---|---|---|
| Ödeme Tipi | Otomatik | Manuel | Manuel |
| Doğrulama | Stripe Onboarding | KYC (Admin onayı) | KYC (Admin onayı) |
| İletişim Bilgisi | Stripe tarafından | E-posta | Telefon |
| Admin İşlemi | Onay → Otomatik transfer | Onay → Manuel ödeme | Onay → Manuel ödeme |
| Logo | /images/stripe.webp | /images/payoneer.png | /images/cenoa.png |
| Tema Rengi | İndigo | Turuncu | Mavi (#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ış:
- Yetkilendirme: Giriş yapmış ve
role === "instructor"olan kullanıcı. - Connect hesabı yoksa:
stripe.accounts.create({ type: "express", country, email, capabilities: { transfers: { requested: true } }, ... })ile Express hesabı oluşturulur;stripeConnectIdkullanıcıya kaydedilir. - Hesap varsa: Mevcut
stripeConnectIdkullanılır; gerekirsetransferscapability güncellenir. - Account Link:
stripe.accountLinks.create({ account, refresh_url, return_url, type: "account_onboarding" })ile Stripe’ın onboarding sayfasına yönlendirme linki üretilir. - 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.
Kullanıcı Tarafı
Section titled “Kullanıcı Tarafı”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”Komisyon ve Bakiye
Section titled “Komisyon ve Bakiye”Satış gerçekleştiğinde (Stripe checkout.session.completed webhook’u):
- Earnings kaydı oluşturulur: toplam tutar, eğitmen payı, platform payı, affiliate payı (varsa)
earningstablosuna yazılır. - Eğitmen bakiyesi bu kayıtlar üzerinden hesaplanır (tamamlanan satışların eğitmen payı toplamı).
Ödeme Talebi ve Transfer
Section titled “Ödeme Talebi ve Transfer”Eğitmen ödeme talebi oluşturduğunda:
- Tablo:
payout_requests(PAYOUT_REQUEST). - method:
stripe_connect(Stripe Connect ile ödeme) veyabank_transfer(Payoneer/Cenoa). - destination: Eğitmenin
stripeConnectIdveyamanualPayoutDetails.
Admin Onay Süreci
Section titled “Admin Onay Süreci”Admin talebi onayladığında sistem önce eğitmenin doğrulama yöntemini kontrol eder:
// app/routes/admin.payouts.tsx - actionconst 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)”payout_requeststablosundan ilgili kayıt okunur; eğitmeninstripeConnectId’si kontrol edilir.- Tutar cent cinsine çevrilir.
stripe.transfers.createçağrılır: platform Stripe hesabından eğitmenin Connect hesabına (destination: stripeConnectId) transfer yaratılır.- Başarılıysa
stripeTransferIdpayout 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 Panelinde Doğrulama Gösterimi
Section titled “Eğitmen Panelinde Doğrulama Gösterimi”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>Renk Temaları
Section titled “Renk Temaları”| Ödeme Yöntemi | Ana Renk | Tema |
|---|---|---|
| Stripe | İndigo (#6366F1) | bg-indigo-50, text-indigo-600, border-indigo-200 |
| Payoneer | Turuncu (#F97316) | bg-orange-50, text-orange-600, border-orange-200 |
| Cenoa | Mavi (#0052FF) | bg-blue-50, text-blue-600, border-blue-200 |
| Konu | Açıklama |
|---|---|
| Onboarding | api.stripe.connect-onboarding → Express hesap oluşturma / Account Link → Stripe Express sayfasına yönlendirme. |
| Earnings | Satış 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.
İlgili Dosyalar
Section titled “İlgili Dosyalar”| Dosya | Açıklama |
|---|---|
app/routes/api.stripe.connect-onboarding.ts | Stripe Connect Express onboarding; Account Link ile yönlendirme |
app/routes/instructor.payouts.tsx | Eğitmen ödemeler sayfası; Connect bağlama ve payout talebi |
app/routes/admin.payouts.tsx | Admin ödeme talepleri paneli; doğrulama yöntemine göre onay işlemi |
app/lib/payout-engine.ts | Payout talebi ve bakiye mantığı |
public/images/stripe.webp | Stripe logosu |
public/images/payoneer.png | Payoneer logosu |
public/images/cenoa.png | Cenoa logosu |
Stripe geliştirmeleri ve daha fazla bilgi için: Stripe Dokümantasyonu