SaaS uygulaması için ödeme ve abonelik sistemi kur. Stripe veya Lemon Squeezy ile checkout, webhook, abonelik yönetimi, fiyatlandırma planları ve müşteri portalı yapılandır. Bu skill'i kullanıcı ödeme, abonelik, fiyatlandırma, Stripe, gelir, plan, subscription veya checkout ile ilgili bir şey istediğinde kullan. "Para al", "ödeme sistemi kur", "pricing yap", "abonelik ekle" gibi ifadeler tetikler.
Bu skill, bir SaaS uygulamasının ödeme katmanını kurar. Ödeme, SaaS'ın kalbidir — doğru kurulmazsa ya para alırsın ama plan aktifleşmez, ya da plan aktifleşir ama para alınmaz.
Bağımlılık: Bu skill saas-launcher orkestratör skill'inin Faz 4'üdür. Bağımsız olarak da kullanılabilir. Auth katmanının (saas-auth) tamamlanmış olması gerekir — ödeme sistemi kullanıcı kimliğine bağlıdır.
Bağlı skill'ler:
Varsayılan önerimiz. Gerekçeler:
Güçlü yönleri: Sektör standardı, en iyi dokümantasyon, en düşük komisyon (%2.9 + $0.30/işlem), kapsamlı webhook sistemi, müşteri portalı hazır, test modu ve CLI ile kolay geliştirme, dev ekosistem (faturalandırma, Connect, Tax).
Zayıf yönleri: Vergi yönetimi ayrı yapılandırılmalı (Stripe Tax ek ücretli veya kendi başına hesaplamalısın). Türkiye'den doğrudan Stripe hesabı açmak kısıtlı olabilir — Stripe Atlas ile ABD LLC kurulması gerekebilir.
Türkiye bağlamı: Stripe Türkiye'de doğrudan merchant hesabı desteklemiyor (bu durum değişebilir, güncel bilgiyi kontrol et). Seçenekler: Stripe Atlas ile ABD şirketi kurmak, ya da Lemon Squeezy'nin MoR modelini kullanmak. Kullanıcıya bu durumu mutlaka belirt.
Ne zaman seç: Vergi yönetimiyle uğraşmak istemeyenler için ideal.
Güçlü yönleri: Merchant of Record (MoR) modeli — KDV, sales tax, GST hesaplama, tahsilat ve beyanı Lemon Squeezy yapar. Türkiye'den global satış yapan founder'lar için büyük avantaj. Herhangi bir ülkeden hesap açılabilir.
Zayıf yönleri: Daha yüksek komisyon (%5 + $0.50/işlem), Stripe kadar geniş ekosistem yok, dokümantasyon daha sınırlı.
Önerimiz: 2 plan ile başla. İhtiyaç ortaya çıktıkça 3. planı ekle.
Bu işte kesin formül yok ama rehber ilkeler:
Her planın net sınırları olmalı. Sınırlar şu kategorilerden seçilmeli:
Her sınır ölçülebilir ve uygulanabilir olmalı. "Sınırsız" vaat etme — ya kaynakların tükenir ya da kötü niyetli kullanım başlar. "Cömert limitler" daha dürüst ve sürdürülebilir.
Hosted Checkout kullan. Kendi ödeme formu oluşturmaya çalışma. Stripe Checkout ve Lemon Squeezy Checkout PCI uyumlu, güvenli, dönüşüm için optimize edilmiş hosted sayfalardır. Kendi formunu yapmak güvenlik riski ve dönüşüm kaybıdır.
Server-side API route'unda yapılması gerekenler:
Kritik: Checkout session'a kullanıcı ID'sini metadata olarak ekle. Webhook geldiğinde bu ID ile ödemeyi doğru kullanıcıya eşleştireceksin.
Webhook, ödeme sağlayıcının "hey, bir şey oldu" diye senin sunucuna haber göndermesidir. SaaS'ın en kritik altyapı parçasıdır.
Kullanıcı ödeme yaptıktan sonra başarı sayfasına yönlendirilir. Ama bu sayfaya ulaşmak ödemenin gerçekten tamamlandığını garanti etmez — tarayıcı kapanabilir, internet kesilir, kullanıcı geri tuşuna basar. Tek güvenilir kaynak webhook'tur.
| Event | Anlam | Yapılması Gereken |
|---|---|---|
| Checkout tamamlandı | Kullanıcı ilk ödemeyi yaptı | Planı aktifleştir, veritabanını güncelle |
| Abonelik güncellendi | Plan değişti veya yenilendi | Plan bilgisini ve bitiş tarihini güncelle |
| Abonelik iptal edildi | Kullanıcı iptal etti veya süre doldu | Planı free'ye düşür, ödeme referanslarını temizle |
| Ödeme başarısız | Kart reddedildi veya bakiye yetersiz | Kullanıcıyı bilgilendir (e-posta), grace period başlat |
İmza doğrulama zorunludur. Her webhook isteği ödeme sağlayıcı tarafından imzalanır. Bu imzayı doğrulamadan webhook'u işleme — aksi halde herhangi biri sahte webhook göndererek planları bedava aktifleştirebilir.
İmza doğrulama süreci:
Raw body kritik. Çoğu framework (Next.js dahil) gelen istekleri otomatik JSON parse eder. Webhook endpoint'inde bu davranışı devre dışı bırakmalısın — Stripe imza doğrulaması ham byte'lar üzerinde çalışır.
Ödeme sağlayıcılar aynı webhook'u birden fazla kez gönderebilir (ağ kesintisi, timeout, retry mekanizması). Webhook handler'ın idempotent olmalı — aynı event'i iki kez işlese bile sonuç aynı olmalı.
Yaklaşımlar:
Webhook handler'da hata olursa ne döndürmelisin?
[Ücretsiz] → Checkout → [Aktif Abonelik]
[Aktif] → Yenileme başarılı → [Aktif] (bitiş tarihi uzar)
[Aktif] → Ödeme başarısız → [Grace Period] → Düzelirse [Aktif], düzelmezse [İptal]
[Aktif] → Kullanıcı iptal etti → [İptal Bekliyor] → Dönem sonunda [Ücretsiz]
[Aktif] → Plan değişikliği → [Yeni Plan Aktif]
Kart reddedildiğinde kullanıcının erişimini hemen kesme. Grace period tanımla (genellikle 3-7 gün). Bu sürede:
İki yaklaşım:
Stripe ve Lemon Squeezy hazır hosted müşteri portalı sunar. Bu portalda kullanıcılar:
Kendi portal sayfanı yapmaya çalışma. Hosted portal PCI uyumlu, bakım gerektirmez ve ödeme sağlayıcı tarafından güncel tutulur. Senden tek gereken: bir API endpoint'i oluştur, portal URL'sini al, kullanıcıyı oraya yönlendir.
Fiyatlandırma sayfası (saas-landing-seo skill'inin kapsamında) buradaki plan tanımlarını tek kaynaktan okumalı. Plan bilgilerini bir konfigürasyon dosyasında tanımla — isim, açıklama, fiyat, özellik listesi, ödeme sağlayıcı referansları (price ID veya variant ID). Bu konfigürasyonu hem fiyatlandırma sayfası hem checkout akışı kullanır.
Aylık/yıllık toggle: Fiyatlandırma sayfasında aylık ve yıllık arasında geçiş yapabilen bir toggle koy. Yıllık planı vurgula — tasarruf yüzdesini göster.
Her ödeme sağlayıcının test modu var. Development'ta her zaman test modu kullan.
Stripe: Test kartları — 4242 4242 4242 4242 (başarılı), 4000 0000 0000 0002 (reddedilir). Stripe CLI ile webhook'ları localhost'a yönlendir. Her event türünü ayrı ayrı test et.
Lemon Squeezy: Dashboard'da test modu aktifleştir. Test ürünleri ve variant'ları ayrıca oluşturulmalı.
Minimum test edilmesi gerekenler:
sk_test_ ile, live sk_live_ ile başlar. Karıştırma — test ödemesi live'da görünmez, live ödeme test'te görünmez.