Kripto ile Abonelik Ödemesi: Yenileme Faturalarıyla Kurulum
Kripto ile abonelik ödemesi nasıl alınır? Otomatik çekim olmadan yenileme faturası, hatırlatma, ek süre ve order_id ile tekrarlayan ödeme akışı kurun.

Kripto ile abonelik ödemesi almak isteyen işletmelerin ilk sorusu genellikle şudur: "Müşterinin cüzdanından her ay otomatik çekim yapabilir miyim?" Kısa cevap hayır. Ama bu, kripto ile abonelik satamayacağınız anlamına gelmez. Bu rehberde otomatik çekimin neden mümkün olmadığını ve yenileme faturalarıyla sağlam bir abonelik akışını nasıl kuracağınızı adım adım anlatıyoruz.
Kriptoda neden otomatik çekim yok?
Kart ödemesinde müşteri kart bilgisini bir kez verir, satıcı da her ay tutarı çeker. Kripto ödemede ise para yalnızca müşteri kendi cüzdanından gönderdiğinde hareket eder. Satıcının müşterinin cüzdanından para çekme yetkisi yoktur. Bu, kriptonun hem güvenlik avantajı hem de abonelik modelindeki temel farktır. Aynı özellik chargeback olmamasını da sağlar. Ayrıntılar chargeback nedir yazımızda.
Açık olalım: MercanPay'de yerleşik bir abonelik ya da otomatik tekrarlayan ödeme özelliği yoktur. Abonelik mantığını kendi sisteminizde kurar, her dönem için bir fatura oluşturursunuz. İyi haber şu ki bu yaklaşım basit, şeffaf ve müşteri açısından tanıdıktır. Birçok hizmet zaten "yenileme hatırlatması + ödeme linki" modeliyle çalışır.
Yenileme faturası modeli nasıl çalışır?
Akışın özeti şöyledir:
- Müşteri ilk ödemeyi yapar ve aboneliği başlar.
- Dönem bitimine birkaç gün kala sisteminiz yeni bir fatura oluşturur.
- Müşteriye e-posta ya da mesajla ödeme linki gönderilir.
- Ödeme gelince webhook ile abonelik bir dönem uzatılır.
- Fatura ödenmeden süresi dolarsa ertesi gün yeni bir fatura ile tekrar hatırlatılır.
- Ek süre (grace period) boyunca da ödeme gelmezse erişim askıya alınır.
Bu modeli oyun, VPN ve hosting gibi sektörlerde de önermiştik. Bkz. oyun, VPN ve hosting sektöründe kripto ödeme.
Adım 1: Abonelik kaydını kendi tarafınızda tutun
Veritabanınızda her abonelik için en azından şu bilgileri saklayın:
| Alan | Örnek | Açıklama |
|---|---|---|
subscription_id |
42 |
Aboneliğin kimliği |
plan |
pro-aylik |
Plan ve fiyat |
period_end |
2026-12-09 |
Mevcut dönemin bitişi |
status |
active |
active, grace, suspended |
renewal_attempt |
1 |
Bu dönem için kaçıncı fatura |
Adım 2: Yenileme faturasını oluşturun
Yenileme faturası için USD fiyatlı fatura kullanmak mantıklıdır: fiyatınız her ay aynı kalır, müşteri ise TRX ya da USDT ile ödemeyi seçer. Aşağıdaki PHP örneği her gün çalışan bir zamanlanmış görevden çağrılabilir:
<?php
require 'vendor/autoload.php';
use MercanPay\MercanPay;
$zp = new MercanPay('https://mercanpay.com', getenv('MERCANPAY_API_KEY'));
function createRenewalInvoice(MercanPay $zp, array $sub): array
{
// Her dönem ve her deneme için benzersiz, ama tekrar çalıştırmada aynı kalan bir order_id
$orderId = sprintf('sub-%d-%s-%d', $sub['id'], $sub['period_end'], $sub['renewal_attempt']);
return $zp->createUsdInvoice($sub['price_usd'], [
'order_id' => $orderId,
'description' => 'Pro plan yenileme · 1 ay',
'expires_in_minutes' => 1440,
'success_url' => 'https://uygulamam.com/hesap/abonelik',
'metadata' => [
'subscription_id' => $sub['id'],
'period_end' => $sub['period_end'],
],
]);
}
$invoice = createRenewalInvoice($zp, $sub);
sendRenewalEmail($sub['email'], $invoice['payment_url'], $invoice['expires_at']);
Burada iki önemli ayrıntı var.
order_id tasarımı. Aynı order_id ile tekrar istek gönderdiğinizde yeni fatura açılmaz, mevcut fatura döner. Bu sayede zamanlanmış görev yanlışlıkla iki kez çalışsa bile müşteriye iki fatura gitmez. Ancak aynı order_id, süresi dolmuş bir fatura için de mevcut faturayı döndürür. Bu yüzden bir fatura ödenmeden süresi dolduğunda renewal_attempt değerini artırarak yeni bir order_id üretin. Bu konuyu order_id ile fatura-sipariş eşleştirme yazımızda ayrıntılı ele alıyoruz.
Geçerlilik süresi. Faturalar en fazla 24 saat (1440 dakika) açık kalır. Abonelik yenilemesinde en uzun süreyi seçmek, müşteriye e-postasını görüp ödemesi için zaman tanır. Süre dolarsa ertesi gün yeni bir fatura gönderirsiniz.
Adım 3: Webhook ile aboneliği uzatın
Ödeme kesinleşince gelen invoice.paid ya da invoice.overpaid olayında aboneliği uzatın:
$event = json_decode($body, true); // imza doğrulandıktan sonra
$inv = $event['data']['invoice'];
if (in_array($event['type'], ['invoice.paid', 'invoice.overpaid'], true)) {
$subId = $inv['metadata']['subscription_id'];
// Yeni dönemi "bugünden" değil, önceki dönemin bitişinden başlatın
extendSubscription($subId, $inv['metadata']['period_end'], $event['id']);
}
Dikkat edilecek noktalar:
- Uzatmayı önceki bitiş tarihinden hesaplayın. Müşteri iki gün erken öderse iki gün kaybetmemeli, iki gün geç öderse de fazladan gün kazanmamalı.
- Olay kimliğiyle tekrarları eleyin. Aynı olay birden fazla gelebilir. Aynı dönemi iki kez uzatmamak için
$event['id']değerini kaydedin. - Geç ödemeleri kabul edin. Süresi dolmuş bir faturaya gelen ödeme de bakiyenize yazılır ve webhook'ta
data.payment.latealanıtrueolur. Müşteri ödediyse aboneliği uzatmak doğru olandır.
İmza doğrulamayı webhook imzası doğrulama rehberinde, tüm olayları webhook olay türleri yazısında bulabilirsiniz.
Adım 4: Hatırlatma ve ek süre politikası
Otomatik çekim olmadığı için hatırlatma akışınız, aboneliğin devamlılığını belirleyen en önemli parçadır. Makul bir takvim örneği:
- Dönem bitimine 3 gün kala: İlk yenileme faturası ve e-posta.
- Fatura süresi dolarsa: Ertesi gün yeni fatura ile ikinci hatırlatma.
- Dönem bitiminde: Abonelik "ek süre" durumuna geçer, erişim devam eder.
- Ek süre sonunda: Ödeme yoksa erişim askıya alınır. Müşteri istediği zaman yeni bir ödemeyle geri dönebilir.
Ek sürenin uzunluğu sizin iş kararınızdır. Hizmetin maliyeti ve müşteri ilişkiniz bu kararı belirler.
Plan değişikliği ve iptal
Abonelik mantığı sizin sisteminizde çalıştığı için plan değişikliği ve iptal de tamamen sizin kontrolünüzdedir:
- Plan yükseltme: Müşteri dönem ortasında daha üst bir plana geçmek isterse, kalan süreyi hesaba katan bir fark tutarı belirleyip bu tutar için ayrı bir fatura oluşturabilirsiniz.
- Plan düşürme: Değişikliği bir sonraki yenileme faturasına yansıtmak en sade yoldur.
- İptal: Müşteri iptal ettiğinde yeni yenileme faturası oluşturmayı durdurun. Otomatik çekim olmadığı için ayrıca bir "ödeme talimatını" kaldırmanız gerekmez. Bu, kripto aboneliğin müşteri açısından en şeffaf yanlarından biridir.
Müşteri deneyimini iyileştirmek için ipuçları
- Çok aylık planlar sunun. 3, 6 ya da 12 aylık ön ödemeli planlar, müşterinin daha seyrek ödeme yapmasını sağlar ve yenileme sürtünmesini azaltır.
- USDT'yi öne çıkarın. USDT dolara sabitlenmeye çalışan bir stabil coin olduğu için müşteri her ay aşağı yukarı aynı tutarı öder. Ayrıntılar kripto ödemede kur riski yazımızda.
- E-postada net bilgi verin. Tutar, son geçerlilik zamanı ve "yalnızca TRON (TRC20) ağını kullanın" notu mutlaka yer almalı.
- Hesap sayfasında durum gösterin. Müşteri, aboneliğinin ne zaman bittiğini ve bekleyen bir fatura olup olmadığını kendi panelinde görebilmeli.
- Fiyatı sade tutun. Ağ ücretleri ödeme sayfasındaki tutara dahildir; müşterinin gördüğü fiyat sizin ilan ettiğiniz fiyattır.
Sık sorulan sorular
MercanPay otomatik abonelik yeniliyor mu?
Hayır. Yerleşik bir abonelik özelliği yoktur. Her dönem için API ile ya da panelden fatura oluşturursunuz, abonelik mantığı sizin sisteminizde çalışır.
Faturayı neden bir ay açık bırakamıyorum?
Faturalar en fazla 24 saat geçerlidir. Bu, özellikle TRX gibi dalgalı coinlerde kurun güncel kalmasını sağlar. Uzun süreli bekleme yerine günlük hatırlatma ve yeni fatura yaklaşımını kullanın.
Müşteri yanlışlıkla iki faturayı da öderse ne olur?
İki ödeme de bakiyenize yazılır. Fazla ödemeyi bir sonraki döneme kredi olarak tanımlayabilir ya da bakiyenizden müşterinin adresine çekim yaparak iade edebilirsiniz.
Web sitem yoksa abonelik satabilir miyim?
Küçük ölçekte evet. Her ay panelden fatura oluşturup linki gönderebilirsiniz. Abone sayısı arttıkça API ile otomatikleştirmek daha verimli olur.
MercanPay ile başlayın
Yenileme faturalarıyla kripto abonelik akışı kurmak için satıcı başvurunuzu yapın. API ayrıntıları ve tüm alanlar dokümantasyonda.


