← Blog/Developer

Crypto Subscription Billing: How to Accept Recurring Crypto Payments

May 29, 2026 · 7 min read

Crypto has no native recurring billing. But you can build subscription payments that work better than cards: no failed charges, no declined cards, no involuntary churn. Here is how.

Card subscription billing fails for 5–15% of recurring charges — declined cards, expired cards, bank blocks. Each failed charge means involuntary churn. Crypto subscription billing has a different failure mode: you must remind customers to manually pay each cycle. But when they do pay, it never fails. For the right business, this trade-off significantly reduces churn.

How Crypto Subscription Billing Works

Unlike cards, crypto blockchains don't have a "pull" mechanism. You can't charge a customer's wallet automatically — the customer must initiate each payment. Crypto subscription billing therefore works on a "push" model: send the customer an invoice each period, they pay it, your service continues. Your system tracks payment status and manages access accordingly.

Billing Cycle Architecture

javascript
// Simplified subscription billing scheduler async function processBillingCycle() { const dueSubscriptions = await db.subscriptions.findDue(); for (const sub of dueSubscriptions) { // Create a new invoice for this billing period const invoice = await bekena.invoices.create({ amount: sub.plan.price, currency: sub.preferredCurrency, orderId: `sub_${sub.id}_${Date.now()}`, webhookUrl: `${process.env.BASE_URL}/webhook/bekena`, metadata: { subscriptionId: sub.id, period: getCurrentPeriod() }, expiresIn: 86400, // 24-hour payment window }); await db.invoices.save(invoice); await emailService.sendPaymentRequest(sub.customer.email, invoice); } } // Run daily via cron // 0 9 * * * node billing-scheduler.js

Handling Access and Grace Periods

When an invoice is created but not yet paid, you have a decision: keep service active (grace period) or restrict immediately. Most subscription businesses use a 3–7 day grace period: send the invoice, send reminders at day 1, 3, and 7, then restrict if unpaid. Bekena's webhook fires immediately on payment, so you can reinstate access instantly when payment arrives.

javascript
// Webhook handler for subscription payments app.post("/webhook/bekena", async (req, res) => { verifySignature(req); const { type, data } = JSON.parse(req.body); if (type === "payment.confirmed") { const { subscriptionId } = data.metadata; const sub = await db.subscriptions.findById(subscriptionId); // Extend subscription by one billing period await db.subscriptions.extend(subscriptionId, sub.plan.period); await emailService.sendReceipt(sub.customer.email, data); // Reinstate if it was restricted if (sub.status === "past_due") { await activateSubscription(subscriptionId); } } if (type === "invoice.expired") { const { subscriptionId } = data.metadata; await sendPaymentReminder(subscriptionId); } res.status(200).send("ok"); });

Reducing Involuntary Churn with Smart Reminders

  • ✓Send invoice 3 days before renewal date — customers appreciate advance notice
  • ✓Include exact crypto amount and network in the reminder (reduce friction at payment)
  • ✓Provide a direct payment link to a hosted invoice page
  • ✓Send a final reminder 24 hours before invoice expiry
  • ✓Consider in-app notifications in addition to email
  • ✓Make the payment page mobile-friendly with a QR code

Why Crypto Subscription Churn is Often Lower

Crypto users who subscribe to services are typically more engaged customers — they went out of their way to pay with crypto, often because they value the service or prefer privacy. Involuntary churn from failed card charges (estimated 5–8% of subscriptions monthly) disappears completely. Voluntary churn (customers who decide to cancel) is the only type you need to manage.

Stablecoin vs Volatile Crypto for Subscriptions

Always bill subscription services in stablecoins (USDT or USDC). Billing in BTC or ETH creates confusion about the actual dollar price and can make customers feel over- or under-charged depending on market movements. State prices in USD, bill in USDT, display the crypto amount at time of invoice generation.

Note: Bekena supports subscription billing through the Invoices API with webhook delivery, idempotency keys, and automatic retry notifications for expired invoices. No additional subscription management SDK required.

Ready to accept crypto payments?

Start with a free sandbox account

Create Free Account →

Related articles

Developer

Understanding Idempotency Keys in Payment APIs

Developer

How to Properly Verify Bekena Webhooks (With Code Examples)

Industry

Why SaaS Companies Add Crypto as a Payment Option