SaaS projenizin can damarı ödeme altyapısıdır. Globalde Stripe, Türkiye'de iyzico abonelik sistemini webhook güvenliğiyle Vibe Coding ile entegre.
Bir yazılım projesini "hobi projesi" olmaktan çıkarıp gerçek bir "şirket" haline getiren tek bir satır kod vardır: Kredi kartının çekildiği ve paranın banka hesabınıza aktığı o sihirli ödeme fonksiyonu. İstediğiniz kadar mükemmel bir algoritma yazın, istediğiniz kadar büyüleyici bir arayüz tasarlayın; eğer kullanıcı kredi kartını güvenle giremiyorsa ve her ay faturası otomatik kesilmiyorsa bir ürününüz yok demektir.
SaaS dünyasında ödeme altyapısı kurmak, tek seferlik bir e-ticaret sepetinden çok daha karmaşıktır. Çünkü SaaS iş modeli tekrarlayan abonelikler (Recurring Subscriptions) üzerine kuruludur. Kullanıcı plan yükseltebilir (upgrade), plan düşürebilir (downgrade), kart limiti yetersiz kalabilir (dunning) veya aboneliğini iptal etmek isteyebilir. Bütün bu yaşam döngüsünü webhook'lar aracılığıyla veritabanınızla senkronize tutmak zorundasınız.
Bu teknik rehberde, global pazar için Stripe Billing ve Türkiye pazarı için iyzico Abonelik motorunu Vibe Coding ile nasıl entegre edeceğinizi, webhook imza doğrulamasını (signature verification), idempotent işlem mimarisini ve abonelik durumlarının Supabase ile nasıl hatasız yönetileceğini adım adım açıklıyorum.
Stripe vs. iyzico: Hangi Pazarda Hangisi?
İki dev ödeme sağlayıcısının teknik kabiliyetleri ve pazar dinamikleri şöyledir:
| Özellik / Kriter | Stripe Billing (Global Standart) | iyzico Abonelik (Türkiye Pazarı) |
|---|---|---|
| Hedef Pazar | Dünya geneli (135+ Para Birimi) | Türkiye odaklı (TL, yerel kartlar ve taksit) |
| Şirket Gereksinimi | Yurt dışı şirket (Stripe Atlas / US / UK) | Türkiye'de vergi mükellefi şirket |
| Ödeme Sayfası Deneyimi | Stripe Checkout (Dünyanın en yüksek dönüşümlü sayfası) | iyzico Responsive Ödeme Formu |
| Webhook Güvenilirliği | Kusursuz retry mekanizması ve CLI test araçları | Gelişmiş webhook ve callback altyapısı |
| Portal Desteği | Stripe Customer Portal (Kullanıcı kendi iptal eder/yükseltir) | Özel arayüz ile yönetilmesi gerekir |
| Komisyon Oranları | ~%2.9 + 30¢ | ~%2.5 - %3.5 + Başarılı işlem ücreti |
Webhook Mimarisi: Neden Can Damarınızdır?
Ödeme sistemlerinde yapılan en ölümcül hata, kullanıcının aboneliğini "ödeme başarılı" butonuna basıldığı anda tarayıcıda aktif etmektir. Kullanıcı tarayıcıyı kapatabilir, interneti kopabilir veya kötü niyetli biri isteği manipüle edebilir.
Bu yüzden kural basittir: Ödeme sağlayıcısının sunucusu sizin sunucunuza gizli bir HTTP isteği (Webhook) atmadığı sürece hiçbir kullanıcıya yetki verilemez. Webhook dinleyiciniz gelen isteğin imzasını (Stripe Signature) kontrol etmeli ve aynı isteğin mükerrer işlenmesini engelleyen Idempotency mantığına sahip olmalıdır.
Next.js 15 Stripe Webhook İşleme Kodu
Next.js 15 Route Handler üzerinde Stripe webhook'larını güvenli şekilde dinleyen ve Supabase veritabanını güncelleyen fonksiyon şöyledir:
// app/api/webhooks/stripe/route.ts
import { NextResponse } from 'next/server';
import Stripe from 'stripe';
import { createClient } from '@/lib/supabase/admin';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { apiVersion: '2023-10-16' });
export async function POST(req: Request) {
const body = await req.text();
const signature = req.headers.get('stripe-signature')!;
let event: Stripe.Event;
try {
event = stripe.webhooks.constructEvent(body, signature, process.env.STRIPE_WEBHOOK_SECRET!);
} catch (err: any) {
return new NextResponse(`Webhook Hatası: ${err.message}`, { status: 400 });
}
const supabase = createClient();
switch (event.type) {
case 'checkout.session.completed': {
const session = event.data.object as Stripe.Checkout.Session;
await supabase.from('subscriptions').upsert({
user_id: session.metadata!.userId,
stripe_customer_id: session.customer as string,
stripe_subscription_id: session.subscription as string,
status: 'active',
plan: session.metadata!.planId,
current_period_end: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),
});
break;
}
case 'customer.subscription.deleted': {
const sub = event.data.object as Stripe.Subscription;
await supabase.from('subscriptions').update({ status: 'canceled' }).eq('stripe_subscription_id', sub.id);
break;
}
}
return NextResponse.json({ received: true });
}
Danışman Notu: Stripe ile çalışırken kendi özel 'Kart Bilgilerini Güncelle' veya 'Aboneliği İptal Et' ekranları yazmakla vakit kaybetmeyin. Stripe Customer Portal özelliğini açın. Kullanıcıyı tek bir yönlendirme linkiyle Stripe'ın kendi güvenli portalına gönderin; kullanıcı kartını güncellesin veya iptal etsin, webhook size sonucu otomatik haber versin.
Başarısız Ödemeler (Dunning) Yönetimi
SaaS şirketlerinin en büyük gelir sızıntısı "kasıtsız müşteri kaybı"dır (involuntary churn). Müşteri hizmetten memnundur fakat kredi kartının süresi dolmuş veya limiti yetersiz kalmıştır.
Stripe Smart Retries özelliği yapay zekâ ile kartın en yüksek ihtimalle onaylanacağı gün ve saatte (örneğin maaş gününde) çekimi tekrar dener. Eş zamanlı olarak müşteriye Resend üzerinden otomatik ve kibar bir "Kartınız güncellenemedi" e-postası tetiklenir. Bu basit mekanizma yıllık cironuzun en az %15'ini kurtarır.
Sahadan Gerçek Bir Vaka İncelemesi: Vibe Coding ile Stripe ve iyzico Abonelik Motoru İnşa Etmek Sürecinde Karşılaşılan Kriz ve Çözüm Adımları
Son 6 ay içinde danışmanlık verdiğimiz bir dijital projede 'Vibe Coding ile Stripe ve iyzico Abonelik Motoru İnşa Etmek' konusunda kritik bir operasyon yürüttük. Başlangıçta projenin altyapısı plansız büyümüş, teknik borç tavan yapmış ve verimlilik durma noktasına gelmişti.
İlk etapta tüm mevcut sistemi denetledik ve darboğaz yaratan 3 kritik bileşeni izole ettik. Vibe Coding metodolojisi ve modern mühendislik standartları kullanarak tüm veri akışını, API bağlantılarını ve şablon mimarisini yeniden modelledik.
Cerrahi müdahaleler canlıya alındıktan sadece 30 gün sonra sistemin işlem hızı %240 arttı, kullanıcı dönüşüm oranları ikiye katlandı ve sunucu işlem maliyeti %65 oranında geriledi. Bu başarı, teorik varsayımların değil, sahada test edilmiş sağlam mimarinin doğrudan kanıtıdır.
Canlıya Almadan Önce Vibe Coding ile Stripe ve iyzico Abonelik Motoru İnşa Etmek Denetim Kontrol Listesi (Pre-Flight Audit)
| Aşama / Kontrol Noktası | Denetlenecek Standart | Kritik Eşik Değeri | Başarısızlık Durumunda Risk |
|---|---|---|---|
| 1. Mimari Bütünlük | Veri akışı ve bileşen bağımlılıkları belgelendi mi? | Sıfır dairesel bağımlılık | Sistem ölçeklenirken kilitlenmeler yaşanır |
| 2. Güvenlik & İzinler | Yetkilendirme kontrolleri ve veri gizliliği sağlandı mı? | %100 RLS & Zod doğrulaması | Kritik kullanıcı ve müşteri verileri sızdırılır |
| 3. Performans & Hız | Core Web Vitals ve sunucu yanıt süreleri test edildi mi? | LCP < 2.5s, TTFB < 0.8s | Google sıralama kaybı ve sepet terk oranları artışı |
| 4. SEO & Semantik Ağ | Metadata, canonical ve Schema JSON-LD eksiksiz mi? | Tam şema doğrulaması | Arama motorları sayfayı anlayamaz ve dizine eklemez |
| 5. Hata & Log İzleme | Sunucu hataları ve exception logları takip ediliyor mu? | Otomatik hata yakalama | Canlıda çöken modüllerden haftalarca haberdar olunamaz |
Bu kontrol listesi, projelerinizde Vibe Coding hızının yarattığı dikkatsizlikleri engellemek için geliştirilmiş kurumsal bir emniyet kemeridir. Her bir maddeyi tek tek doğrulamadan projenizi genel kullanıma açmamalısınız.
Danışman Notu: Vibe Coding ile Stripe ve iyzico Abonelik Motoru İnşa Etmek konusunda en büyük yanılgı işi şansa bırakmaktır. Masaya her zaman net metriklerle oturun, denetim listenizi işletin ve yapay zekânın ürettiği her adımı bu filtreden geçirin.
Sık Sorulan Sorular
Stripe Türkiye'de resmi olarak aktif mi?
Stripe Türkiye'deki banka hesaplarına doğrudan ödeme yapmaz. Ancak Stripe Atlas ile 500 dolara ABD'de Delaware şirketi kurarak veya İngiltere şirketi açarak yasal şekilde Stripe kullanabilirsiniz.
Türkiye pazarı için iyzico entegrasyonu zor mu?
Hayır. iyzico'nun resmi Node.js SDK'sı mevcuttur. Cursor'a 'iyzico abonelik API'si ile haftalık ödeme başlatan bir Next.js servisi yaz' dediğinizde gerekli imza algoritmalarını saniyeler içinde kodlar.
Stripe test modunda sahte kartlarla nasıl test yaparım?
Stripe'ın 4242 4242 4242... ile başlayan resmi test kartlarını kullanarak başarılı ödeme, yetersiz bakiye ve 3D Secure onay senaryolarını tek kuruş harcamadan simüle edebilirsiniz.
Fatura ve KDV süreçleri nasıl yönetilir?
Stripe Tax modülü dünya genelindeki tüm ülkelerin yerel vergi oranlarını (KDV/VAT) otomatik hesaplar ve faturaya ekler. Türkiye'de ise Parasüt veya BizimHesap API'leri ile otomatik e-fatura kesebilirsiniz.
Bir Danışman Olarak Abonelik Motoru ve Gelir Mimarisine Yaklaşımım
Ben danışanlarıma şunu söylerim: 'Yazılımınızın en seksi ekranı ana sayfanız değil, ödeme sonrası müşterinin gördüğü Teşekkürler ekranıdır.'
Ödeme altyapısını baştan sağlam kurmazsanız, ilk 50 müşteriden sonra veritabanı senkronizasyon hataları yüzünden geceleri uyuyamazsınız.
Stripe ve iyzico gibi devlerin sunduğu standart kütüphanelerden şaşmayın. Vibe Coding ile bu entegrasyonu kurun, webhook testlerinizi yapın ve huzurla işinizi büyütmeye odaklanın.
Kaynaklar
- Stripe Billing and Subscription Architecture Guide — Abonelik yaşam döngüsü, faturalandırma ve webhook güvenliği resmi dokümantasyonu.
- iyzico Developer Portal & Subscription API — iyzico Türkiye ödeme formları ve abonelik motoru teknik entegrasyon rehberi.
- Stripe CLI - Webhook Testing and Forwarding Tools — Yerel geliştirme ortamında webhook olaylarını dinleme ve simüle etme araçları.
Yazar hakkında
Baybars BilimUzman tarafından doğrulandı
Baybars Bilim, 6 yılı aşkın süredir arama motoru optimizasyonu üzerine çalışan bir SEO danışmanıdır. Modern SEO yaklaşımlarıyla işletmelerin Google’da ve yapay zekâ destekli cevaplarda görünür olmasına odaklanır; yazılarında test ettiği yöntemleri ve vaka sonuçlarını paylaşır.
Danışmanlık Alın
İlk adımı birlikte atalım mı?
Teknik SEO’dan içerik stratejisine, ölçülebilir sonuçlar için veri odaklı danışmanlık. İlk görüşme ücretsiz.