FaturalandırmaAbonelik Yönetimi

Abonelik Yönetimi

Purvisor AI’daki abonelik akışının tamamı iyzico’nun barındırdığı ödeme formu üzerinden yürür — kart bilgin hiçbir zaman Purvisor sunucularına dokunmaz, doğrudan iyzico’ya girilir. Panelden abone ol, plan yükselt, kartını güncelle veya iptal et; arka planda bir webhook aboneliğinin gerçek durumunu (aktif, gecikmiş ödeme, iptal) sürekli Purvisor ile senkron tutar, sen elle bir şey işaretlemek zorunda kalmazsın.

Nasıl çalışır?

Panelde plan + dönem seç (Pro / Business × aylık / yıllık) → "Abone ol"

Fatura profili tam mı? (TCKN/VKN, adres, şehir, posta kodu, telefon)
   ├─ Eksik → HTTP 422 (billing_info_required / valid_phone_required)
   │          → Fatura bilgileri formu açılır
   └─ Tam → iyzico'nun barındırdığı ödeme (checkout) formu döner

Kart bilgisi iyzico'nun formunda girilir

iyzico → callback (/api/billing/subscribe/callback) → abonelik durumu kaydedilir

iyzico → webhook (/api/billing/iyzico/webhook) → kanonik durum senkronize edilir

Abonelik "active" → plan özellikleri açılır + planına dahil aylık dakika cüzdanına eklenir

Purvisor kart numarasını, CVV’yi veya son kullanma tarihini hiçbir zaman kendi veritabanında tutmaz. Tüm kart formu iyzico’nun kendi (PCI-DSS uyumlu) altyapısında açılır; Purvisor tarafında sadece abonelik referans kodu ve durumu (active, past_due, canceled gibi) saklanır.

Ön koşullar

  • Panelde tamamlanmış bir fatura profili: geçerli bir TCKN (bireysel) veya VKN (şirket), adres, şehir, posta kodu — bkz. Profil ve Fatura Bilgileri.
  • Hesap profilinde geçerli bir telefon numarası (E.164’e normalize edilebilir olmalı — örn. 05xx xxx xx xx veya +90 formatı).
  • Sadece Pro ve Business planlarına panelden self-servis abone olunabilir. Ücretsiz kademe için abonelik gerekmez (kayıt olduğunda zaten geçerlidir), Enterprise ise özel fiyatlandırma ve satış görüşmesi gerektirir. Plan karşılaştırması: Planlar.
  • Abonelikte aylık veya yıllık dönem seçebilirsin; yıllık dönemde aylık eşdeğer fiyat daha düşüktür. Fiyatlar USD listelenir, tahsilat güncel kurla TL olarak yapılır.
⚠️

Fatura profili eksikse abonelik başlatma isteği HTTP 422 döner — sahte/placeholder kimlik veya adres bilgisiyle ödeme başlatılmaz (iyzico üye işyeri sözleşmesi gerçek fatura bilgisi ister). Hata kodu billing_info_required ise kimlik/adres eksik demektir; valid_phone_required ise sadece telefon numarası eksik veya normalize edilemiyor demektir.

Abone olma

Plan seç

Panelde Faturalandırma → Planlar altında Pro veya Business’ı, ardından aylık/yıllık dönemi seç ve “Abone ol” butonuna tıkla.

📸 [Ekran görüntüsü: Faturalandırma → Planlar ekranı, plan kartları ve “Abone ol” butonu]

Fatura bilgilerini tamamla (gerekiyorsa)

Fatura profilin eksikse panel seni Profil ve Fatura Bilgileri formuna yönlendirir. TCKN/VKN, adres, şehir, posta kodu ve telefon numaranı gir, kaydet, abone olma adımına geri dön.

Ödeme formunu tamamla

Purvisor iyzico’dan bir checkout form alır ve panelde gömülü olarak açar. Kart numaranı, son kullanma tarihini ve CVV’yi bu formda girersin — form tamamen iyzico’nun alanıdır.

Onayı bekle

Form gönderildiğinde iyzico seni Purvisor’ın callback adresine yönlendirir; abonelik durumu aktif olursa panelde plan hakların (eşzamanlılık, adet limitleri, premium özellikler) hemen açılır. Aynı sonuç ayrıca webhook ile de doğrulanır (bkz. Webhook ile durum senkronu).

Planına dahil aylık dakika (Pro’da 300, Business’ta 1.000) doğrudan dakika cüzdanına eklenir ve takvim ayında yalnızca bir kez verilir — aylık ve yıllık aboneler için aynı şekilde işler. Bu grant tekilleştirilmiştir, aynı ay içinde ikinci kez yüklenmez.

Eski hesaplarda plan adı basic / starter / premium olarak görünebilir — bunlar sırasıyla Ücretsiz, Pro ve Business kademelerine karşılık gelir; ayrıca bir işlem yapman gerekmez.

Aynı anda sadece tek bir aktif (veya ödeme bekleyen) abonelik olabilir. Zaten aktif bir aboneliğin varken tekrar “Abone ol” denersen 409 active_subscription_exists hatası alırsın — önce mevcut aboneliği iptal etmen ya da yükseltme/düşürme akışını kullanman gerekir.

Plan yükseltme

Plan değiştirmek “iptal + yeniden abone ol” değildir — iyzico’nun upgrade akışı kullanılır, böylece kart tekrar girilmez ve gün bazlı ücret orantılaması (proration) korunur. Yükseltme isteğinde iki zamanlama seçeneği vardır:

SeçenekNe zaman etkin olurNe zaman kullanılır
NOW (varsayılan)Hemen — yeni plan hakların bu istekten sonra anında açılırDaha üst bir plana hemen geçmek istiyorsan
NEXT_PERIODBir sonraki fatura döneminde (yenileme webhook’u geldiğinde)Mevcut ödediğin dönemi tüketip sonra geçiş yapmak istiyorsan

NEXT_PERIOD seçilirse hedef plan pendingPlanType alanında bekletilir; kullanıcının erişim planı değişmez — aksi halde düşük fiyata anında üst tier erişimi verilmiş olurdu. Yeni dönem başladığında webhook bu bekleyen planı otomatik uygular.

Zaten bulunduğun plana “yükseltme” isteği göndermek 409 Zaten bu plandasınız hatası döner.

Ödeme başarısız olursa (yeniden deneme)

Kart reddi, yetersiz bakiye gibi nedenlerle bir yenileme ödemesi başarısız olursa abonelik durumu past_due (gecikmiş ödeme) olarak işaretlenir. Panelde “Ödemeyi yeniden dene” butonu bu durumda görünür:

  1. Purvisor iyzico’dan aboneliğin sipariş (order) geçmişini çeker.
  2. SUCCESS olmayan ilk siparişi bulur.
  3. O siparişi iyzico’nun /operation/retry uç noktasıyla yeniden dener.
⚠️

Yeniden deneme, başarısız ödemeden itibaren belirli bir süre içinde yapılmalıdır (iyzico dokümantasyonuna göre en fazla 160 gün) — bu pencere kapandıktan sonra abonelik iyzico tarafında EXPIRED olarak kapanır ve yeniden abone olman gerekir.

Yeniden deneme başarılı olup abonelik hemen ACTIVE durumuna dönerse, Purvisor bunu senkron olarak da işler: premium erişim tekrar açılır ve varsa eski iptal tarihinden kalan kısıtlama (premiumExpiresAt) temizlenir. Webhook geldiğinde aynı durum ayrıca kanonik olarak teyit edilir.

Kart güncelleme

Kartın süresi dolduysa veya değiştiyse, aboneliği iptal etmene gerek yok — sadece kartı güncelle:

  1. Panelde Kart bilgilerini güncelle butonuna tıkla.
  2. Purvisor iyzico’dan yeni bir checkout form alır (mevcut abonelik referans koduyla ilişkilendirilmiş).
  3. Yeni kart bilgilerini iyzico’nun formunda girersin; doğrulama için iyzico kart üzerinden küçük bir tutar (1 TL) çekip anında iade eder.
  4. Form tamamlandığında iyzico Purvisor’ın callback adresine yönlendirir ve abonelik kartın üzerinde devam eder.

Abonelik iptali

Panelde Aboneliği iptal et dediğinde:

  • İptal isteği iyzico’ya iletilir.
  • Abonelik veritabanında canceled olarak işaretlenir.
  • Mevcut ödediğin dönem sonuna kadar erişimin devam eder — eğer dönem bitiş tarihi (currentPeriodEnd) hâlâ ileri bir tarihse, premium erişimin o tarihe kadar (premiumExpiresAt) korunur ve dönem bitince otomatik düşer (ayrı bir cron işlemine gerek yoktur). Dönem bilgisi yoksa erişim hemen kesilir.

İptal, henüz iyzico tarafında hiç aktive olmamış (ödeme formu tamamlanmadan bırakılmış) bir abonelikte çalışmaz — bu durumda “Bu abonelik henüz iyzico tarafından aktive edilmedi” hatası alırsın; abonelik zaten aktif değildir.

Webhook ile durum senkronu

POST /api/billing/iyzico/webhook — iyzico’nun abonelik yaşam döngüsü olaylarını (ödeme başarılı/başarısız, yükseltme, iptal, süre dolumu) Purvisor’a bildirdiği uç nokta. Bu senin elle tetiklediğin bir şey değil, ama işleyişini bilmek “neden panelim hemen güncellenmedi” sorusuna cevap verir.

Güvenlik: Her istek X-IYZ-SIGNATURE-V3 başlığındaki imzayla doğrulanır (HMAC-SHA256, merchant secret key ile). İmza uyuşmazsa 401 invalid_signature döner ve olay hiç işlenmez.

Kanonik durum ilkesi: Webhook, payload’daki alanlara güvenmek yerine subscriptionReferenceCode ile iyzico’dan aboneliğin güncel halini yeniden çeker — böylece olay sırası karışsa veya payload eksik olsa bile Purvisor’daki durum her zaman iyzico ile birebir eşleşir.

iyzico durumları Purvisor’ın kendi durum değerlerine şöyle eşlenir:

iyzico durumuPurvisor durumuAnlamı
ACTIVEactiveAbonelik yürürlükte, erişim açık
PENDINGpendingÖdeme formu henüz tamamlanmadı
UNPAIDpast_dueYenileme ödemesi başarısız oldu
UPGRADEDactivePlan değişti, abonelik hâlâ yürürlükte
CANCELEDcanceledİptal edildi
EXPIREDexpiredSüre/deneme hakkı doldu

Webhook ayrıca NEXT_PERIOD yükseltmelerini de bu noktada uygular: abonelik active olduğunda ve fatura dönemi gerçekten yenilendiğinde (yeni dönem başlangıcı öncekinden ileriyse), bekleyen pendingPlanType otomatik olarak devreye girer.

Webhook, tanımadığı bir subscriptionReferenceCode veya abonelikle ilgisi olmayan olay türü görürse hata döndürmez — { ok: true, ignored: true } ile onaylar ki iyzico aynı olayı tekrar tekrar denemesin.

İşlem geçmişi

GET /api/billing/transactions panelde son 20 dakika hareketini döner — bu abonelik faturaları değil, dakika bakiyeni etkileyen hareketlerdir (kullanım ve dakika paketi satın alımları). Abonelik faturalarının kendisi iyzico tarafında tutulur; dakika paketleri ve tüketim için:

AlanAçıklama
typeusage (arama sırasında düşülen dakika) veya purchase (satın alınan dakika paketi)
amountDakika miktarı — usage için negatif, purchase için pozitif
costİşlemin parasal karşılığı (varsa)
packageNameSatın alınan paketin adı (sadece purchase işlemlerinde dolu)
balanceAfterİşlem sonrası kalan dakika bakiyesi
createdAtİşlem zamanı

Dakika paketleri ve fiyatlandırma detayı için: Dakika Paketleri. Dakikaların arama sırasında nasıl düşüldüğü için: Dakika Nasıl Düşülür?.

Sorun giderme

Belirti / Hata koduOlası neden / çözüm
422 billing_info_requiredFatura profilinde TCKN/VKN, adres, şehir veya posta kodu eksik/geçersiz → Profil ve Fatura Bilgileri formunu tamamla.
422 valid_phone_requiredProfildeki telefon numarası E.164’e normalize edilemiyor → geçerli bir telefon numarası kaydet.
409 active_subscription_existsZaten aktif (veya ödemesi gecikmiş) bir aboneliğin var → önce iptal et ya da yükseltme akışını kullan. Yarım kalmış (ödeme bekleyen) bir abonelik bu hatayı vermez; yeniden abone olma akışını başlatabilirsin.
503 plan_not_syncedSeçtiğin plan iyzico tarafında henüz oluşturulmamış (yönetici tarafında senkron gerekiyor) → Purvisor destek ile iletişime geç.
400 “abonelik henüz iyzico tarafından aktive edilmedi”Ödeme formu tamamlanmadan bırakılmış bir abonelik üzerinde iptal/yükseltme/kart güncelleme/yeniden deneme çağrılmış → önce ödeme formunu tamamla veya yeni abonelik başlat.
Ödeme başarısız, plan gecikmiş (past_due)Kart reddi/yetersiz bakiye → “Ödemeyi yeniden dene”yi kullan; hâlâ başarısızsa kartını güncelle.
409 “yeniden denenecek başarısız ödeme bulunamadı”iyzico tarafında SUCCESS dışı bir sipariş yok — ödeme aslında geçmiş olabilir, panel durumunu yenile.
Plan hakları hâlâ eski görünüyorNEXT_PERIOD yükseltmesi seçildiyse yeni plan ancak bir sonraki fatura döneminde uygulanır — bu beklenen davranıştır.
İptal ettim ama erişim hâlâ açıkBeklenen davranış — dönem sonuna kadar erişim korunur (cancelAtPeriodEnd); dönem bitince otomatik kapanır.

İlgili