Payment Orchestrator
Subscription
Abonelikler

Abonelikler

Bir abonelik, bir müşteriyi bir plana bağlar ve faturalama motorunu çalıştırır: deneme süreleri, dönem faturaları, dunning, plan değişiklikleri ve iptal. Bu sayfa merchant API üzerinden yaşam döngüsünün tamamını anlatır.

Tüm endpoint'ler secret key'inizi Bearer token olarak kullanır ve https://api-gateway.lunixi.com/api/v1/subscriptions/subscriptions altındadır — segment bilerek iki kez geçer: ilk subscriptions ürün alanı, ikincisi bu kaynak grubudur. Liste endpoint'leri cursor pagination kullanır (pageSize, pageToken).

Yaşam döngüsü tek bakışta

Abonelik yaşam döngüsüDurum makinesi: abonelik denemeyle ya da doğrudan aktif başlar, duraklatılıp sürdürülebilir ve iptalle biter. İptal anında ya da dönem sonunda etkili olur.DENEME BİTTİskipTrial: truePAUSERESUMECANCELDenemeAktifDuraklatıldıİptalAÇIKLAMAFATURA ÜRETİRFATURA ÜRETMEZBİTİŞ
Fatura yalnız Aktif durumda üretilir. cancelAtPeriodEnd ile iptal, aboneliği dönem sonuna kadar Aktif tutar — o dönemin faturası yine kesilir.

Her geçiş bir webhook üretir — subscription.created, subscription.activated, subscription.paused, subscription.resumed, subscription.canceled — böylece sisteminiz polling yapmadan durumu yansıtabilir. Event tablosunun tamamı sayfanın sonunda.

Status değerleri

Aboneliğin status alanı tam olarak şu değerleri alır (liste endpoint'ini status ile filtreleyebilirsiniz):

statusAnlamı
PENDINGİleri tarihli başlangıç — startsAt henüz gelmedi
TRIALINGDeneme süresi devam ediyor
ACTIVECanlı — dönem faturaları oluşturulur ve tahsil edilir
PAST_DUEBir çekim başarısız oldu — dunning çalışıyor
UNPAIDDunning denemeleri tükendi — grace period çalışıyor
PAUSEDMerchant tarafından duraklatıldı
UPGRADEDYükseltme plan değişikliğiyle sona erdi — terminal
DOWNGRADEDDüşürme plan değişikliğiyle sona erdi — terminal
CANCELEDİptal edildi — terminal
EXPIREDFaturalama kuralının tekrar sayısı doldu — terminal

Entitlement'lar status ACTIVE veya PAST_DUE iken geçerlidir. Terminal status'lar (UPGRADED, DOWNGRADED, CANCELED, EXPIRED) bir daha başka duruma geçmez.

Abonelik oluşturma

Müşteriyi oluşturun (veya upsert edin)

Müşteriler kendi externalId'nizle PUT /api/v1/subscriptions/customers üzerinden upsert edilir; güvenle tekrar deneyebilirsiniz.

Kart kaydedin (otomatik tahsilat için)

Otomatik tahsilat yapacaksanız önce bir kart kaydedin (POST /api/v1/subscriptions/cards, paymentMethodToken ile) ve id'sini paymentCardId olarak geçin. Kart kaydı 3DS gerektirir — bkz. Başlarken.

Aboneliği oluşturun

idempotencyKey zorunludur — abonelik oluşturma para hareketi başlatabilir; key, ağ hatası sonrası tekrar denemenin asla ikinci bir abonelik yaratmamasını garanti eder.

curl -X POST https://api-gateway.lunixi.com/api/v1/subscriptions/subscriptions \
  -H "Authorization: Bearer at_live_5f3e2b1a..." \
  -H "Content-Type: application/json" \
  -d '{
    "customerId": "cust_01JX2F9K4T",
    "planId": "plan_01JX2G3M8V",
    "idempotencyKey": "order-84172-sub",
    "paymentCardId": "card_01JX2H5N1Q",
    "collectionMethod": "AUTO_CHARGE",
    "skipTrial": false,
    "startsAt": "2026-08-01T00:00:00Z"
  }'
{
  "success": true,
  "data": {
    "id": "sub_01JX5B8R3M",
    "customerId": "cust_01JX2F9K4T",
    "planId": "plan_01JX2G3M8V",
    "status": "TRIALING",
    "collectionMethod": "AUTO_CHARGE",
    "currentPeriodEnd": "2026-09-01T00:00:00Z"
  }
}
⚠️

Create'te idempotencyKey zorunludur. Key'i kendi iş nesnenizden türetin (örn. sipariş id'niz) — aynı key ile tekrar denendiğinde ikinci bir abonelik oluşmaz, orijinal abonelik döner.

Tahsilat yöntemleri

collectionMethodDavranış
AUTO_CHARGEHer dönem faturası kayıtlı karttan (paymentCardId / müşterinin varsayılan kartı) otomatik çekilir. Başarısız çekimler dunning'e girer.
SEND_INVOICEFatura kesilir, müşteri kendisi öder; otomatik kart çekimi yoktur.
MANUALOtomatik tahsilat yapılmaz — faturaları kendi sürecinizle veya retry-charge ile kapatırsınız.

Aboneliğin kayıtlı kartı kullanılamaz hâle gelirse (silindi, yenisi olmadan süresi doldu) platform subscription.payment_method_lost event'ini üretir ve yeni bir kart bağlanana kadar tahsilat MANUAL'e düşer. Ayrıntılar Faturalar sayfasında.

Deneme süreleri

Planın trialPeriodDays > 0 ise abonelik denemede başlar: entitlement'lar aktiftir, ancak deneme bitene kadar çekim yapılmaz. Denemeyi atlayıp hemen faturalamak için create'te skipTrial: true gönderin.

Deneme bitmeden önce platform subscription.trial_will_end event'ini üretir — müşteriye ödeme yöntemi eklemesini/onaylamasını hatırlatmak için kullanın. Deneme bitince ilk dönem faturası oluşturulur ve collectionMethod'a göre tahsil edilir; abonelik subscription.activated üretir.

EventNe zaman
subscription.createdAbonelik oluşturuldu (denemeli veya değil)
subscription.trial_will_endDeneme süresi dolmadan kısa süre önce
subscription.activatedİlk ücretli dönem başladı

İptal

POST /api/v1/subscriptions/subscriptions/:id/cancel

ModİstekDavranış
Anında{ "cancelAtPeriodEnd": false } (veya hiç göndermeyin)Abonelik hemen biter; entitlement'lar durur
Dönem sonunda{ "cancelAtPeriodEnd": true }Abonelik currentPeriodEnd'e kadar aktif kalır, sonra biter — yeni fatura kesilmez
curl -X POST https://api-gateway.lunixi.com/api/v1/subscriptions/subscriptions/sub_01JX5B8R3M/cancel \
  -H "Authorization: Bearer at_live_5f3e2b1a..." \
  -H "Content-Type: application/json" \
  -d '{ "cancelAtPeriodEnd": true }'

subscription.canceled event'ini üretir. Müşteriler müşteri portalı üzerinden kendi kendilerine de iptal edebilir — o yol, fraud koruması olarak ayrıca e-posta onay token'ı ister.

Duraklat & devam ettir

POST /api/v1/subscriptions/subscriptions/:id/pause faturalamayı askıya alır; otomatik yeniden başlatma zamanlamak için opsiyonel resumeAt gönderin. POST /api/v1/subscriptions/subscriptions/:id/resume hemen yeniden aktifleştirir.

curl -X POST https://api-gateway.lunixi.com/api/v1/subscriptions/subscriptions/sub_01JX5B8R3M/pause \
  -H "Authorization: Bearer at_live_5f3e2b1a..." \
  -H "Content-Type: application/json" \
  -d '{ "resumeAt": "2026-10-01T00:00:00Z" }'
 
# daha sonra, ya da resumeAt yerine:
curl -X POST https://api-gateway.lunixi.com/api/v1/subscriptions/subscriptions/sub_01JX5B8R3M/resume \
  -H "Authorization: Bearer at_live_5f3e2b1a..."

Duraklatılmışken dönem faturası oluşturulmaz. subscription.paused ve subscription.resumed event'lerini üretir.

Plan değiştirme (yükseltme / düşürme)

POST /api/v1/subscriptions/subscriptions/:id/change-plan — hedef newPlanId ve bir behavior ile:

behaviorEtkiEvent'ler
IMMEDIATEHemen geçer; faturalama bu andan itibaren yeni planı izlersubscription.upgraded veya subscription.downgraded
NEXT_PERIODGeçişi bir sonraki yenilemeye zamanlar; mevcut döneme dokunmazsubscription.plan_change_scheduled, geçiş gerçekleştiğinde subscription.pending_change_applied (+ upgraded/downgraded)
curl -X POST https://api-gateway.lunixi.com/api/v1/subscriptions/subscriptions/sub_01JX5B8R3M/change-plan \
  -H "Authorization: Bearer at_live_5f3e2b1a..." \
  -H "Content-Type: application/json" \
  -d '{
    "newPlanId": "plan_01JX2G9P7W",
    "behavior": "NEXT_PERIOD"
  }'

Yaygın desen: yükseltmeler IMMEDIATE (müşteri büyük planı hemen alır), düşürmeler NEXT_PERIOD (ödediği dönemi sonuna kadar kullanır).

Sorgulama, listeleme & audit

MethodPathNe yapar
GET/api/v1/subscriptions/subscriptionsAbonelikleri listeler (cursor pagination: pageSize, pageToken; customerId, status ile filtre)
GET/api/v1/subscriptions/subscriptions/:idTek abonelik — güncel plan ve dönem bilgisiyle
GET/api/v1/subscriptions/subscriptions/:id/audit-logsHer durum değişikliğinin kronolojik kaydı — create, cancel, plan değişikliği, pause işlemlerini kimin/neyin tetiklediği

Audit log, "bu müşterinin planı neden değişti?" gibi destek soruları için başvuracağınız araçtır — yukarıdaki her mutasyon zaman damgası ve kaynağıyla orada görünür.

Hatalar

DurumAnlamıNe yapmalı
400Doğrulama hatası (eksik idempotencyKey, bilinmeyen collectionMethod / behavior)Gövdeyi düzeltin; create'te idempotencyKey zorunlu
401Eksik/geçersiz Bearer keyAuthorization header'ını kontrol edin
404Abonelik, müşteri, plan veya kart bulunamadıId'lerin hesabınıza ait olduğunu doğrulayın
409Geçersiz durum geçişi (örn. duraklatılmamış aboneliği resume etmek, iptal edilmişi tekrar iptal etmek) veya idempotency çakışmasıÖnce aboneliği okuyun (GET …/subscriptions/:id) ve güncel status'a göre davranın

Webhooks

EventNe zaman
subscription.createdAbonelik oluşturuldu
subscription.activatedİlk ücretli dönem başladı (deneme sonrası veya hemen)
subscription.trial_will_endDeneme süresi dolmak üzere
subscription.paused / subscription.resumedDuraklat / devam ettir
subscription.plan_change_scheduledNEXT_PERIOD plan değişikliği zamanlandı
subscription.pending_change_appliedZamanlanmış değişiklik yürürlüğe girdi
subscription.upgraded / subscription.downgradedPlan yukarı / aşağı değişti
subscription.canceledİptal edildi (anında veya dönem sonunda)
subscription.payment_card_swappedAboneliğin bağlı kartı değişti
subscription.payment_method_lostKayıtlı kart kullanılamaz oldu — tahsilat MANUAL'e düştü

Teslimat, tekrar deneme ve imza doğrulaması için Webhooks sayfasına bakın.

Sonraki adımlar