Abonelik web uygulaması oluşturma adım adım kılavuzu: planlar, checkout, tekrarlayan faturalama, faturalar, vergiler, yeniden denemeler, analitik ve güvenlik en iyi uygulamaları.

Ödeme sağlayıcısını seçmeden veya veritabanını tasarlamadan önce aslında ne sattığınızı ve müşterilerin zaman içinde nasıl değişeceğini netleştirin. Çoğu faturalama sorunu, gerçekte gereksinim sorunlarıdır.
Erken dönemde riski azaltmanın faydalı bir yolu, faturalamayı sadece bir arka uç özelliği olarak değil, bir ürün yüzeyi olarak görmektir: ödeme akışı, izinler, e-postalar, analitik ve destek iş akışlarıyla temas eder.
Önce ürününüzün ticari şeklini seçin:
Örnekler yazın: “12 üyeli bir şirket ay ortasında 8 üyeye düşürür” ya da “Bir kullanıcı bir ay ara verir, sonra geri döner.” Eğer bunu net olarak tarif edemiyorsanız, güvenilir şekilde inşa edemezsiniz.
En azından şu adımlar ve sonuçlar belgelenmiş olmalı:
Ayrıca ödeme başarısız olduğunda erişime ne olacağını kararlaştırın: anında kilitleme, sınırlı mod veya bir hoşgörü penceresi.
Self-servis destek yükünü azaltır ancak bir müşteri portalı, net onay ekranları ve korunma önlemleri (ör. limitleri bozacak düşürmeleri engelleme) gerektirir. Yönetici tarafından yapılan değişiklikler ilk aşamada daha basittir, fakat iç araçlar ve denetim günlükleri gerekir.
Ürün kararlarını yönlendirecek birkaç ölçülebilir hedef seçin:
Bu metrikler hangi otomasyonların öncelikli olduğunu ve neyin bekleyebileceğini belirlemenize yardımcı olur.
Herhangi bir faturalama kodu yazmadan önce, gerçekten ne sattığınıza karar verin. Temiz bir plan yapısı destek taleplerini, başarısız yükseltmeleri ve “neden ücretlendirildim?” e-postalarını azaltır.
Yaygın modeller iyi çalışır, ancak faturalamada farklı davranırlar:
Model karıştırıyorsanız (ör. temel plan + koltuk başı + kullanım aşımı), mantığı şimdi belgeleyin—bu sizin faturalama kurallarınız olur.
İşinize uygunsa aylık ve yıllık sunun. Yıllık planlar genellikle şunları gerektirir:
Denemeler için karar verin:
Eklentiler mini-ürünler gibi fiyatlandırılıp faturalandırılmalı: tek seferlik mi yoksa yinelenen mi, miktar bazlı mı yoksa sabit mi, ve hangi planlarla uyumlu oldukları.
Kuponların basit korunma kuralları olmalı: süresi (tek seferlik mi tekrar eden mi), uygunluk ve eklentilere uygulanıp uygulanmadığı.
Grandfathered (eski fiyatı koruyan) planlar için, kullanıcıların eski fiyatı sonsuza kadar koruyup korumayacağını, plan değiştirdiklerinde iptal olup olmayacağını veya bir sonlandırma tarihine kadar mı devam edeceğini belirleyin.
Plan isimleri sonuçları çağrıştırmalı (“Starter”, “Team”)—iç etiketler yerine. Her plan için özellik limitlerini sade dille tanımlayın (ör. “3 projeye kadar”, “aylık 10.000 e-posta”) ve UI'de şunların gösterildiğinden emin olun:
Bir abonelik uygulaması yüzeyde basit görünür (“aylık tahsilat”), ama faturalama net bir veri modeli olmadıkça karmaşıklaşır. Temel nesnelerinizi adlandırarak ve ilişkilerini açıkça belirleyerek başlayın; böylece raporlama, destek ve kenar durumlar tek seferlik yamalara dönüşmez.
En azından bunları planlayın:
Yararlı bir kural: Planlar değeri tanımlar; Price’lar parayı tanımlar.
Subscription ve Invoice her ikisi de durumlara ihtiyaç duyar. Bunları açık ve zaman bazlı tutun.
Subscription için yaygın durumlar: trialing, active, past_due, canceled, paused. Invoice için: draft, open, paid, void, uncollectible.
Mevcut durumu ve bunu açıklayan zaman damgalarını/nedenleri saklayın (ör. canceled_at, cancel_reason, past_due_since). Bu, destek taleplerini çok daha kolay yapar.
Faturalama append-only bir denetim günlüğü gerektirir. Kim ne zaman ne yaptı kaydedin:
Açık bir çizgi çizin:
Bu ayrım self-servisi güvenli tutarken operasyonlara gerekli araçları verir.
Ödeme kurulumunuzu seçmek, yapacağınız en etkili kararlardan biridir. Geliştirme süresini, destek yükünü, uyumluluk riskini ve fiyatlandırmada ne kadar hızlı yineleme yapabileceğinizi etkiler.
Çoğu ekip için hepsi bir arada bir sağlayıcı (ör. Stripe Billing) yineleyen ödemeler, faturalar, vergi ayarları, müşteri portalları ve dunning araçlarına en hızlı yoldur. Esneklikten biraz ödün verirsiniz ama hız ve kanıtlanmış kenar durum işleme kazanırsınız.
Özel bir faturalama motoru, alışılmışın dışında sözleşme mantığınız, birden fazla ödeme işlemcisi kullanma ihtiyacınız veya faturalama ve gelir tanıma konusunda katı gereksinimleriniz varsa mantıklı olabilir. Maliyet süreklidir: prorasyon, yükseltme/düşürme, geri ödemeler, yeniden deneme programları ve çok fazla muhasebe işini siz inşa edip sürdüreceksiniz.
Barındırılan checkout sayfaları, hassas kart bilgileri sunucularınıza hiç değmediği için PCI uyumluluk kapsamınızı azaltır. Ayrıca yerelleştirmesi ve güncel tutulması (3DS, cüzdan ödemeleri vb.) daha kolaydır.
Gömülü formlar daha sıkı UI kontrolü sunabilir, ancak genellikle güvenlik sorumluluğunuzu ve test yükünüzü artırır. Erken aşamadaysanız, barındırılan checkout genellikle pragmatik varsayılandır.
Ödemelerin uygulamanız dışında gerçekleşeceğini varsayın. Sağlayıcı webhook'larını (olaylarını) abonelik durum değişiklikleri için tek gerçek kaynak olarak kullanın—ödeme başarılı/başarısız, abonelik güncellendi, ücret iade edildi gibi—and veritabanınızı buna göre güncelleyin. Webhook işleyicilerini idempotent ve yeniden denemeye dayanıklı yapın.
Kart reddi, süresi dolmuş kart, yetersiz bakiye, banka hataları ve chargeback durumlarında ne olacağını yazın. Kullanıcının ne göreceğini, hangi e-postaların gönderileceğini, erişimin ne zaman duraklatılacağını ve desteğin ne yapabileceğini tanımlayın. Bu, ilk başarısız yenileme geldiğinde sürprizleri azaltır.
Bu, fiyatlandırma stratejinizin çalışan bir ürüne dönüştüğü noktadır: kullanıcı bir plan seçer, öder (veya denemeye başlar) ve hemen doğru düzeyde erişim alır.
Hızla uçtan uca bir abonelik web uygulaması göndermeye çalışıyorsanız, vibe-coding tarzı bir iş akışı sizi detayları atlamadan hızlandırabilir. Örneğin Koder.ai'de plan katmanlarınızı, koltuk limitlerinizi ve faturalama akışlarınızı sohbetle tanımlayabilir, ardından oluşturulan React UI ve Go/PostgreSQL arka ucunu yineleyebilirsiniz; bu sırada gereksinimler ve veri modeli hizalanmış olur.
Fiyat sayfanız seçimi tereddütte bırakmayacak şekilde olmalı. Her katmanın önemli limitlerini (koltuklar, kullanım, özellikler), nelerin dahil olduğunu ve faturalama aralığı geçişini (aylık/yıllık) gösterin.
Akışı öngörülebilir tutun:
Eklentileri destekliyorsanız (ek koltuklar, öncelikli destek), nihai fiyat tutarlı olsun diye kullanıcıların bunları checkout öncesi seçmesine izin verin.
Checkout sadece kart numarası almak değildir. Kenar durumların ortaya çıktığı yerdir, bu yüzden baştan neleri zorunlu kılacağınızı belirleyin:
Ödemeden sonra sağlayıcının sonucunu (ve varsa webhook onayını) doğrulamadan özellikleri açmayın. Abonelik durumunu ve yetkilendirmeleri saklayın, ardından erişimi sağlamak (ör. premium özellikleri etkinleştirme, koltuk limitlerini ayarlama, kullanım sayacı başlatma) için işlem yapın.
Şunları otomatik olarak gönderin:
Bu e-postalar uygulamada görülenle tutarlı olsun: plan adı, yenileme tarihi ve nasıl iptal edileceği veya ödeme bilgilerinin nasıl güncelleneceği bilgisi.
Bir müşteri faturalama portalı, destek biletlerinin çözüldüğü yerdir—iyi bir durumda. Kullanıcılar faturalama sorunlarını kendileri çözebiliyorsa, churn, chargeback ve “faturamı güncelleyin” e-postaları azalır.
İşe temel olanlarla başlayın ve görünür olmalarını sağlayın:
Stripe gibi bir sağlayıcı entegre ediyorsanız, onların barındırılan portalına yönlendirebilir veya kendi UI'nızı oluşturup API çağrıları yapabilirsiniz. Barındırılan portallar daha hızlı ve daha güvenlidir; özel portallar marka ve kenar durumlar üzerinde daha fazla kontrol verir.
Plan değişiklikleri kafa karışıklığı yaratır. Portalınız açıkça göstermeli:
Prorasyon kurallarını önceden tanımlayın (ör. “yükseltmeler hemen uygulanır ve prorate ücret alınır; düşürmeler bir sonraki yenilemede uygulanır”). Ardından UI'nın bu politikayı yansıtmasını sağlayın ve açık bir onay adımı ekleyin.
Her ikisini sunun:
Erişim ve faturalama açısından ne olacağını her zaman gösterin ve bir onay e-postası gönderin.
Bir “Faturalama geçmişi” alanı ekleyin ve fatura/makbuz indirme bağlantıları, ödeme durumu (ödenmiş, açık, başarısız) gösterin. Bu aynı zamanda KDV numarası düzeltmeleri veya fatura yeniden düzenleme gibi kenar durumlar için /support yönlendirmesi vermek için iyi bir yerdir.
Faturalama sadece “PDF gönder” demek değildir. Ne ücretlendirdiğinizin, ne zaman ücretlendirdiğinizin ve sonrasında ne olduğunun kaydıdır. Fatura yaşam döngüsünü net modellediğinizde destek ve finans işleri çok daha kolay olur.
Faturaları durumlu nesneler olarak ele alın ve nasıl geçiş yapacaklarına dair kurallar koyun. Basit bir yaşam döngüsü şunları içerebilir:
Geçişleri açık tutun (ör. bir Open faturayı düzenleyemezsiniz; void edip yeniden düzenlemelisiniz) ve denetim için zaman damgalarını kaydedin.
Benzersiz ve insan tarafından okunabilir fatura numaraları oluşturun (genellikle ön ekli ardışık, ör. INV-2026-000123). Eğer ödeme sağlayıcınız numara oluşturuyorsa, o değeri de saklayın.
PDF'ler için ham dosyaları uygulama veritabanında saklamaktan kaçının. Bunun yerine saklayın:
İade işlemleri muhasebe ihtiyaçlarınıza uygun olmalı. Basit SaaS için ödemeyle ilişkilendirilmiş bir iade kaydı yeterli olabilir. Eğer resmi düzeltmeler gerekiyorsa, kredi notları destekleyin ve bunları orijinal faturaya bağlayın.
Kısmi iadeler satır öğesi netliği gerektirir: iade edilen tutarı, para birimini, nedeni ve hangi fatura/ödemeye ait olduğunu saklayın.
Müşteriler self-servis bekler. Faturalama alanınızda (ör. /billing) fatura geçmişini durum, tutar ve indirme bağlantılarıyla gösterin. Ayrıca finalize edilen faturaları/makbuzları otomatik e-posta ile gönderin ve aynı ekrandan talep üzerine yeniden gönderin.
Vergiler, abonelik faturalamasının en kolay yanlış gidebileceği konulardan biridir—çünkü ne tahsil edeceğiniz müşterinin nerede olduğuna, ne sattığınıza (yazılım mı yoksa “dijital hizmet” mi) ve alıcının tüketici mi yoksa işletme mi olduğuna bağlıdır.
Satış yapacağınız yerleri ve hangi vergi rejimlerinin geçerli olduğunu listeleyerek başlayın:
Emin değilseniz, bunu bir yazma işi yerine iş kararı olarak ele alın—erken danışmanlık alın ki faturaları sonra yeniden yapmanız gerekmesin.
Checkout ve faturalama ayarlarınız, vergiyi doğru hesaplamak için gereken asgari verileri yakalamalı:
B2B KDV için geçerli bir KDV ID sağlandığında ters yükümlülük veya muafiyet uygulanması gerekebilir—faturalama akışınız bunu öngörülebilir ve müşteriye görünür kılmalıdır.
Birçok ödeme sağlayıcısı yerleşik vergi hesaplama (ör. Stripe Tax) sunar. Bu, hata riskini azaltır ve kuralları güncel tutmaya yardımcı olur. Birçok bölgede satış yapıyorsanız, yüksek hacminiz varsa veya gelişmiş muafiyetler gerekiyorsa, kuralları sabit kodlamak yerine özel bir vergi servisini düşünün.
Her fatura/ücret için açık bir vergi kaydı saklayın:
Bu, “neden vergi alındı?” sorusunu yanıtlamayı, iadeleri doğru işlemenizi ve ileride temiz finans raporları üretmeyi kolaylaştırır.
Başarısız ödemeler abonelik işlerinde normaldir: kartlar süresi dolabilir, limitler değişebilir, bankalar ödemeyi engelleyebilir veya müşteriler ödeme bilgilerini güncellemeyi unutabilir. Göreviniz, kullanıcıları şaşırtmadan geliri geri kazanmak ve destek taleplerini azaltmaktır.
Net bir programla başlayın ve tutarlı tutun. Yaygın bir yaklaşım 7–14 gün içinde 3–5 otomatik yeniden deneme ve bununla eş zamanlı e-posta hatırlatmalarıdır; hatırlatmalar ne olduğunu ve ne yapılması gerektiğini açıklar.
Hatırlatmaları odaklı tutun:
Stripe gibi bir sağlayıcı kullanıyorsanız, yerleşik yeniden deneme kurallarına ve webhook'lara güvenin ki uygulamanız gerçek ödeme olaylarına tepki versin.
“Past-due” (ödeme gecikmesi) ne anlama geldiğini tanımlayın ve belgeleyin. Birçok uygulama, özellikle yıllık planlar veya kurumsal hesaplar için kısa bir hoşgörü süresi tanır.
Pratik bir politika:
Ne seçerseniz seçin, UI'da öngörülebilir ve görünür yapın.
Checkout ve faturalama portalınız kart güncellemeyi hızlı yapmalı. Güncellemeden sonra, en son açık faturayı hemen ödemeyi deneyin (veya sağlayıcının “şimdi yeniden dene” aksiyonunu tetikleyin) ki müşteriler anında çözümü görsün.
“Sadece ‘Ödeme başarısız’” gibi belirsiz mesajlardan kaçının. Nazik bir mesaj, tarih/saat ve sonraki adımları gösterin: başka bir kart deneyin, bankayla iletişime geçin veya fatura bilgilerini güncelleyin. Eğer bir /billing sayfanız varsa, kullanıcıları doğrudan oraya yönlendirin ve buton yazılarını e-posta ve uygulamada tutarlı hale getirin.
Abonelik faturalama akışınız “kur ve unut” halinde kalmayacak. Gerçek müşteriler ödeme yapmaya başladıktan sonra, ekibinizin üretimde elle veri düzenlemeden yardımcı olabileceği güvenli, tekrarlanabilir yollar gerekecektir.
En yaygın destek taleplerini karşılayacak küçük bir yönetici alanıyla başlayın:
Destek açısından bir etkileşimde çözüm sağlayan hafif araçlar ekleyin:
Her çalışan faturalamayı değiştirme yetkisine sahip olmamalı. Support (gör + not), Billing Specialist (iade/kredi) ve Admin (plan değişiklikleri) gibi roller tanımlayın. İzinleri sadece UI'da değil, sunucu tarafında da zorunlu kılın.
Her hassas yönetici eylemini kaydedin: yapan kişi, zaman, ne değişti ve ilgili müşteri/abonelik ID'leri. Logları aranabilir ve ihlal incelemesi için dışa aktarılabilir yapın ve kayıtları etkilenen müşteri profiline bağlayın.
Analitik, faturalama sisteminizi karar verici bir araca dönüştürür. Sadece ödemeleri toplamıyor—hangi planların işe yaradığını, müşterilerin nerede zorlandığını ve hangi geliri güvenle bekleyebileceğinizi öğreniyorsunuz.
Güvenilir uçtan uca hesaplayabileceğiniz küçük bir abonelik metrik setiyle başlayın:
Zaman noktasındaki toplamlar sorunları saklayabilir. Aynı hafta/ayda başlayan müşterileri karşılaştırabileceğiniz abonelik kohort görünümleri ekleyin.
Basit bir tutunma grafiği şu soruları yanıtlar: “Yıllık planlar daha iyi tutuyor mu?” veya “Geçen ay yapılan fiyat değişikliği 4. haftadaki tutunmayı düşürdü mü?”
Ana eylemleri olay olarak enstrümante edin ve bağlam ekleyin (plan, price, kupon, kanal, hesap yaşı):
Tutarlı bir olay şeması koruyun ki raporlama elle temizleme projesine dönüşmesin.
Aşağılar için otomatik uyarılar kurun:
Uyarıları ekibin gerçekten izlediği araçlara gönderin (e-posta, Slack) ve destek ekibinin hızlıca incelemesi için internal dashboard rotasına (/admin/analytics) bağlantı verin.
Abonelikler küçük ama maliyetli hatalarda başarısız olur: bir webhook iki kez teslim edilir, bir yeniden deneme tekrar ücretlendirir veya sızmış bir API anahtarı iade oluşturur. Aşağıdaki kontrol listesiyle faturalamayı güvenli ve öngörülebilir tutun.
Ödeme sağlayıcı anahtarlarını bir secret manager'da (veya şifreli ortam değişkenlerinde) saklayın, düzenli döndürün ve asla git'e commit etmeyin.
Webhookları her isteği doğrulanmamış girdi gibi ele alın:
Stripe (veya benzeri) kullanıyorsanız, ham kart numaralarının sunucularınıza hiç değmemesi için Checkout, Elements veya ödeme tokenları kullanın. PAN, CVV veya manyetik şerit verilerini asla saklamayın.
“Payment method” kaydederken sadece sağlayıcının referans ID'sini (örn. pm_...) ve görüntüleme için last4/marka/son kullanım tarihini saklayın.
Ağ zaman aşımı olur. Sunucunuz “abonelik oluştur” veya “fatura oluştur” gibi çağrıları tekrar ederse çift ücretleme olabilir.
Bir sandbox ortamı kullanın ve otomatik testler yazın ki şunları kapsasın:
Şema değişikliklerini üretime göndermeden önce, production-benzeri veride bir migration provası çalıştırın ve örnek geçmiş webhook olaylarını yeniden oynatarak hiçbir şeyin kırılmadığından emin olun.
Ekip hızlı iterasyon yapıyorsa, uygulamaya almadan önce hafif bir “planlama modu” adımı eklemeyi düşünün—ister bir iç RFC, ister araç destekli bir iş akışı olsun. Örneğin Koder.ai'de önce faturalama durumlarını, webhook davranışlarını ve rol izinlerini tasarlayıp, ardından uygulamayı snapshot ve geri alma imkanlarıyla oluşturabilirsiniz.