Skip to main content

Recurring Crypto Payments: How Crypto Subscriptions Work in 2026

· 7 min read
OrcaRail
Crypto payment rails for web2 apps

Recurring crypto payments let a customer pay a subscription in USDC, USDT, or another token every week, month, or year. The problem: crypto has no "card on file". A wallet never hands its keys to a merchant, so you can't just charge it again next month.

This guide explains the three ways to bill crypto subscriptions, what each one costs you and your customer, and how to set them up with OrcaRail.

Why recurring crypto payments are hard​

With a card, the customer gives you a card number once and you charge it every month. Crypto works the other way round. Every transfer is a push signed by the wallet owner. Nothing leaves the wallet unless its owner signs.

So a crypto subscription needs one of two things:

  • the customer signs a payment every cycle, or
  • the customer signs a permission once that lets a specific address pull a limited amount later.

Every crypto billing product is a version of one of these.

Three ways to bill a crypto subscription​

MethodHow it worksCustomer effortWorks on
Payment link per cycleYou send a new invoice or payment link each period; the customer pays itOne payment per cycleEvery chain, including Bitcoin
Allowance pull (auto-charge)Customer approves a capped token allowance once; you pull each periodOne approval, then nothingEVM (ERC-20) and Solana (SPL delegation)
Prepaid / escrowCustomer deposits several periods up front into a contract or balanceOne large depositDepends on the product

Payment links are the simplest and work everywhere, but customers forget, so churn is higher. Allowance pull feels like a card subscription: the customer approves once and is charged on schedule. Escrow locks up the customer's money, which most people don't like. We explain why we chose allowance pull in Why allowance-pull subscriptions.

How allowance-pull subscriptions work​

On EVM chains, ERC-20 tokens like USDC have an approve(spender, amount) function. The customer approves a spender address for a total, for example 120 USDC for 12 monthly charges. Each month, the spender calls transferFrom for 10 USDC. On Solana, the same idea uses SPL token delegation.

What makes this safe for the customer:

  • The cap is on-chain. The spender can never pull more than the approved amount.
  • The customer can revoke at any time with approve(spender, 0) on EVM, or by revoking the delegation on Solana. Wallets and revoke tools show these approvals.
  • No private keys are shared. The customer keeps full control of the wallet.

What it means for you: a charge can still fail if the wallet doesn't have enough tokens on the billing date. Your billing system has to handle that (see below).

Recurring crypto payments with OrcaRail​

OrcaRail subscriptions support both main methods. You choose one per subscription with collection_method:

  • send_payment_link (default): each cycle, OrcaRail creates a payment link for the period and can email it to the payer. Works on every supported network.
  • auto_charge: the payer approves once (ERC-20 allowance on EVM, SPL delegation on Solana), and OrcaRail pulls the period amount each cycle. Auto-charge doesn't run on Bitcoin.

Payers can also switch between the two from the hosted flow. If a payer revokes auto-charge, the subscription switches back to payment links.

Other features you'd expect from a billing system:

  • Intervals: day, week, month, or year, with interval_count and an optional total_cycles.
  • Trials: trial_period_days or trial_end, plus a subscription.trial_will_end webhook about 3 days before the trial ends (Trials).
  • Statuses: trialing, active, past_due, paused, canceled, completed.
  • Webhooks for every step, including subscription.payment_link.paid (cycle paid, by link or auto-charge) and subscription.payment_link.payment_failed (auto-charge pull failed) (Subscription webhooks).
  • SDKs: Node.js, PHP, and Laravel Cashier (Subscription SDKs).

OrcaRail is also moving the auto-charge spender from an OrcaRail hot wallet to a public on-chain contract (EVM) and program (Solana). The payer flow stays the same: approve once, revoke any time. See the non-custodial overview.

Create a crypto subscription​

A monthly 10 USD plan, paid in a stablecoin, with a 14-day trial:

POST /api/v1/subscriptions
{
"description": "Pro Plan",
"amount": "10.00",
"currency": "usd",
"token_id": "<USDC token id>",
"network_id": "<Base network id>",
"interval": "month",
"trial_period_days": 14,
"payer_email": "[email protected]"
}

The subscription starts in trialing. Get the token and network IDs from GET /payments/networks and GET /payments/networks/:id/tokens. Full steps: Create a subscription.

Then handle the webhooks in your backend:

  • subscription.payment_link.paid: give or extend access for this cycle.
  • subscription.payment_link.payment_failed and subscription.past_due: tell the customer, and keep access for a short grace period or downgrade.
  • subscription.trial_will_end: remind the customer to approve auto-charge or pay the first link.
  • subscription.canceled and subscription.completed: end access at the right time.

Build and test all of this in a free sandbox organization with test USDC from the testnet faucets before you go live.

You sell…Use
SaaS, memberships, API plans (monthly)auto_charge, with payment links as the fallback
Annual plans or high-value invoicessend_payment_link: one deliberate payment per cycle
Customers paying in BTCsend_payment_link (no auto-charge on Bitcoin)
Customers who don't want to grant approvalssend_payment_link

Many teams offer both and let the customer choose on the hosted page.

Tips that reduce failed charges​

  1. Approve a cap that matches the plan. Ask for amount × cycles (for example 12 months), not an unlimited allowance. Customers trust a clear number more.
  2. Pick a cheap network. Base, Arbitrum, Optimism, Polygon, and Solana keep gas low for each pull.
  3. Remind before the billing date. Use subscription.trial_will_end and your own reminder before each cycle so customers top up their wallet.
  4. Show the schedule. On your subscribe page, show the amount, the interval, the first charge date, and how to cancel.
  5. Keep a fallback. When a pull fails, send the period's payment link so the customer can still pay that cycle.

FAQ​

Can you set up recurring payments with crypto?​

Yes. Either the customer pays a new payment link each cycle, or the customer approves a capped token allowance once and the merchant pulls each period. OrcaRail supports both.

Is auto-charge safe for the customer?​

The customer approves a fixed maximum on-chain, keeps the private keys, and can revoke the approval at any time from their wallet. The spender can't pull more than the approved amount.

Which tokens and networks support crypto auto-charge?​

Tokens that follow the ERC-20 allowance standard on EVM chains (USDC, USDT, and others), and SPL tokens on Solana. Bitcoin doesn't have token allowances, so Bitcoin subscriptions use payment links.

What happens if the customer's wallet is empty on the billing date?​

The pull fails, you get subscription.payment_link.payment_failed, and the subscription can move to past_due. The customer can then pay the period with a payment link or top up the wallet.

How much do crypto subscriptions cost with OrcaRail?​

The hosted fee is 0.5% per completed transaction after the first 1,000 free transactions, and self-hosted software has no OrcaRail fee. See Pricing.


Subscriptions · Subscriptions docs · Start in the sandbox