> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tahsilat.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Abonelik Yaşam Döngüsü

> Abonelik durumları, otomatik tahsilat, yeniden denemeler, bildirimler, iptal ve webhook davranışı

Bu sayfa, ilk ödemeden sonra bir aboneliğin nasıl ilerlediğini anlatır. Abonelik oluşturma için [Abonelik Oluşturma](https://docs.tahsilat.com/api-reference/subscriptions/index.md) sayfasına bakın.

***

## Abonelik durumları

| Durum | Başlık | Açıklama |
| :- | :- | :- |
| 5 | İlk Ödeme Bekleniyor | Panelden oluşturulan abonelik linki henüz ödenmedi. İlk ödemeyle Aktif olur. |
| 1 | Aktif | Abonelik çalışıyor; sonraki tahsilat tarihinde otomatik çekim yapılır. |
| 2 | Ödeme Bekliyor | Son dönem tahsilatı başarısız oldu; yeniden deneniyor ya da dönem başarısız kapandı. Başarılı bir tahsilatla yeniden Aktif olur. |
| 3 | İptal Edildi | Firma ya da müşteri aboneliği iptal etti, ya da sağlayıcıdaki plan kapandı veya kurulamadı. Yeni tahsilat yapılmaz. |
| 4 | Tamamlandı | Sağlayıcı yönetimli planda planlanan tüm dönemler tahsil edildi. |

***

## Otomatik tahsilat

Her dönem, müşteriye tekrar sorulmadan tahsilat yapılır. Çekimi POS'a göre Tahsilat (saklanan kartla) ya da ödeme kuruluşu (kendi planıyla) yapar; ikinci durumda Tahsilat vadesi gelen dönemi kuruluştan sorgulayıp sonucu işler. Her tahsilat:

* **Ayrı bir işlem kaydı** oluşturur. İşlem, yeni bir `transaction_id` alır ve panelde "Abonelik" rozetiyle listelenir.
* Başarılıysa `payment_status = 1 (success)`, başarısızsa `payment_status = 2 (fail)` olarak kaydedilir; iki durumda da `transaction_status = 2 (completed)` olur. Sağlayıcı sonucu geç bildiriyorsa işlem bir süre `payment_status = 3 (incomplete)` olarak görünebilir ve sağlayıcıdan sonuç gelince kesinleşir.
* Tanımlı webhook adresinize bildirim gönderir (aşağıya bakın). Tahsilat'ın çektiği POS'larda her deneme için, kuruluşun çektiği POS'larda dönem sonuçlandığında bir kez.
* E-posta gönderir: başarılı tahsilatta müşteriye abonelik tahsilat e-postası ve standart ödeme makbuzu, firmaya standart makbuz; başarısız tahsilatta müşteriye ve firmaya uyarı (yalnız dönemin ilk denemesinde).

Abonelik detayında her dönem şu durumlardan biriyle listelenir: Planlandı, Başarılı, Başarısız, Atlandı, Yeniden Deneniyor.

### Başarısız tahsilat ve yeniden deneme

Tahsilat başarısız olursa abonelik **Ödeme Bekliyor** durumuna geçer. Tahsilatı Tahsilat'ın yaptığı POS'larda aynı dönem **günde bir kez, en fazla 10 kez** denenir (ilk deneme dahil); yeniden denemeler e-posta üretmez, müşteriye günde bir hatırlatma e-postası (kart güncelleme bağlantılı) gönderilir. Sağlayıcının kendi plan altyapısıyla çalışan POS'larda yeniden denemeyi sağlayıcı yapar, Tahsilat sonucu saat başı sorgulayıp kaydeder.
Müşteri bu sırada e-postadaki bağlantıdan kartını güncelleyebilir; bir sonraki deneme yeni kartla yapılır. Firma da abonelik detayındaki **Şimdi Tekrar Dene** düğmesiyle çekimi hemen başlatabilir; son denemeden sonra en az 60 dakika geçmiş olmalıdır ve deneme, dönemin 10 denemesinden biri olarak sayılır. Bu düğme yalnız Tahsilat'ın çektiği POS'larda görünür.

Deneme hakkı dolduğunda dönem **Başarısız** olarak kapanır; abonelik iptal edilmez, **Ödeme Bekliyor** durumunda kalır ve bir sonraki dönemde tekrar denenir. Başarılı bir dönem tahsilatıyla yeniden **Aktif** olur. Aboneliği sonlandırmak istiyorsanız panelden iptal etmelisiniz.

> [!WARNING]
>
> Yeniden denemeler ve bildirimler yalnızca canlı ortamda çalışır. Test ortamında otomatik tahsilat yapılmaz.

***

## İptal

**Firma tarafından:** panelde Abonelikler listesinden, abonelik detayından ya da ilk ödemenin işlem detayındaki "Aboneliği İptal Et" butonuyla.
İptal anında abonelik **İptal Edildi** olur, planlanan tahsilatlar durur; daha önce alınan ödemeler iade edilmez (gerekirse işlem üzerinden iade yapılır).

**Müşteri tarafından:** hoş geldin ve tahsilat e-postalarındaki "Aboneliği İptal Et" bağlantısı, müşteriyi imzalı bir onay sayfasına götürür. Müşteri onayladığında abonelik iptal edilir ve müşteriye iptal e-postası gönderilir.

> [!NOTE]
>
> Abonelik linki (Abonelikler → Abonelik Oluştur ile üretilen) tek kullanımlıktır ve iptalde kapanır. Tahsilat Link ile oluşturulan çok kullanımlı linkler, bekleyen ya da aktif başka abonesi kaldığı sürece açık kalır. Henüz ödenmemiş (İlk Ödeme Bekleniyor) bir abonelik iptal edildiğinde müşteriye e-posta gitmez.

***

## Kart güncelleme

Müşteri, e-postalardaki "Kartı Güncelle" bağlantısıyla yeni kart bilgisini girer ve kayıtlı telefonuna gelen SMS kodunu onaylar; telefonu kayıtlı olmayan müşteri kartını bu sayfadan güncelleyemez. Yeni kart kaydedilir (sağlayıcı yönetimli planlarda sağlayıcıdaki plan da güncellenir) ve bir sonraki tahsilat bu kartla yapılır. İptal edilmiş abonelikte kart güncellenemez; firma tarafından kart güncellenemez.

***

## Webhook ve işlem sonucu

Abonelik tahsilatları için ayrı bir olay türü yoktur; her tahsilat normal bir ödeme işlemi gibi aynı webhook ile bildirilir ve
[İşlem Sonucu Sorgulama](https://docs.tahsilat.com/api-reference/transaction-result.md) ile sorgulanabilir. Aboneliğe bağlı işlemlerde `subscription` bloğu bulunur; abonelik dışı işlemlerde bu alan `null` döner. Aynı dönemin eski denemeleri de sorgulandığında aynı `subscription_id` ve `cycle_number` değerini döner.

* İlk ödeme: ödeme isteğinizde aldığınız `transaction_id` ile gelir, `subscription.cycle_number` değeri `0`'dır.
* Sonraki tahsilatlar: her dönem ve Tahsilat'ın çektiği POS'larda her yeniden deneme için yeni bir `transaction_id` üretilir. `cycle_number` yalnız dönem değişince artar, aynı dönemin denemelerinde aynı kalır. İlk ödemede gönderdiğiniz `metadata` her dönem işlemine kopyalanır, böylece kendi sipariş/müşteri anahtarınızla eşleştirme yapabilirsiniz.

```json Webhook yükü (abonelik tahsilatı, 2. dönem) theme={null}
{
  "transaction_id": 75690998341504,
  "amount": 49900,
  "currency_code": "TRY",
  "installment_count": 1,
  "payment_status": 1,
  "payment_status_text": "success",
  "transaction_status": 2,
  "transaction_status_text": "completed",
  "transaction_message": "Abonelik tahsilatı başarıyla tamamlandı.",
  "transaction_code": "A12345",
  "payment_method": 1,
  "payment_method_text": "is_3d",
  "pre_auth": false,
  "created_at": "2026-12-05T09:00:03+03:00",
  "start_at": "2026-12-05T09:00:03+03:00",
  "end_at": "2026-12-05T09:00:05+03:00",
  "metadata": [
    { "merchant_id": "1234567", "key": "order_id", "value": "ORD-10045" }
  ],
  "subscription": {
    "subscription_id": 19464539815644,
    "status": 1,
    "cycle_number": 1,
    "next_billing_at": "2027-01-05T09:00:03+03:00",
    "cancelled_at": null,
    "status_text": "active",
    "is_initial_payment": false
  },
  "formatted_amount": "499.00"
}
```

**subscription.subscription\_id** `integer`

Aboneliğin kimliği. Panelde Abonelikler listesindeki "Abonelik Numarası" ile aynıdır.

**subscription.status** `integer`

Aboneliğin sorgu anındaki güncel durumu (yukarıdaki tablo); olayın gerçekleştiği andaki durum değildir. `status_text` aynı değerin metin karşılığıdır: `pending`, `active`, `past_due`, `cancelled`, `completed`.

**subscription.cycle\_number** `integer`

Bu işlemin kaçıncı dönem olduğu. `0` ilk (3D Secure) ödemedir; `is_initial_payment` bu durumda `true` döner.

**subscription.next\_billing\_at** `datetime`

Planlanan bir sonraki tahsilat tarihi. İptal sonrası güncellenmez; `cancelled_at` doluysa bu alanı dikkate almayın.

**subscription.cancelled\_at** `datetime`

Abonelik iptal edildiyse iptal tarihi, aksi halde `null`.

SDK ile okuma:

```php PHP theme={null}
$event = Webhook::constructEvent($payload, $signature, $webhookSecret);

if ($event->subscription !== null) {
    $subscriptionId = $event->subscription['subscription_id'];
    $cycleNumber = $event->subscription['cycle_number'];
    $isFirstPayment = $event->subscription['is_initial_payment'];
}

$transaction = $tahsilat->transactions->retrieve($event->transaction_id);
$subscriptionStatus = $transaction->subscription['status_text'] ?? null;
```

> [!TIP]
>
> Başarısız bir dönem tahsilatı da aynı yapıyla gelir: `payment_status = 2 (fail)`. Webhook, abonelik durumu güncellenmeden oluşabildiği için `subscription.status` ve `next_billing_at` bir önceki değeri gösterebilir; güncel durum için işlem sonucunu sorgulayın.
> Sisteminizde aboneliği `subscription_id` ile, dönemi `cycle_number` ile takip edin ve dönemi yalnız başarılı sonuçla ödenmiş sayın. Aynı `cycle_number` için birden fazla başarısız webhook gelebilir.

***

## Panelde abonelik yönetimi

**Abonelikler** menüsünde tüm abonelikler durum, müşteri, ürün, tutar, sonraki çekim tarihi ve ödenen/hatalı dönem sayısıyla listelenir.
Her satırda aboneliğin aylığa ve yıllığa normalize edilmiş tutarı ("Aylık Toplam Kazanç", "Yıllık Toplam Kazanç") ayrıca gösterilir.

Abonelik detayında:

* Abonelik numarası, müşteri, tutar, sonraki tahsilat tarihi, oluşturma ve varsa iptal tarihi
* Onay (Mandate): onay tarihi ve IP adresi (kabul edilen metin kayıt altındadır)
* Son aktiviteler ve aboneliğe bağlı ödeme linki
* Geçmiş işlemler: ilk ödeme ve her dönemin tahsilat kaydı
* Metadata düzenleme ve iptal

Liste durum ve tarih aralığına göre filtrelenebilir, Excel olarak dışa aktarılabilir.

***

## Bildirim özeti

| Olay | Müşteri | Firma |
| :- | :- | :- |
| İlk ödeme (abonelik başladı) | Hoş geldin e-postası (iptal ve kart güncelleme bağlantıları); canlıda kısa SMS | Ödeme makbuzu (abonelik ibaresiyle) + webhook |
| Dönem tahsilatı başarılı | Abonelik tahsilat e-postası + ödeme makbuzu | Ödeme makbuzu + webhook |
| Dönem tahsilatı başarısız (ilk deneme) | Uyarı e-postası (kart güncelleme bağlantısı) | Uyarı e-postası + webhook |
| Yeniden denemeler | Günde bir hatırlatma e-postası | Tahsilat'ın çektiği POS'larda her deneme için webhook; kuruluşun çektiği POS'larda dönem sonuçlanınca tek webhook |
| İptal | İptal e-postası | Panelde durum güncellenir |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.