Recurring Crypto Payments: How Crypto Subscriptions Work in 2026
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
| Method | How it works | Customer effort | Works on |
|---|---|---|---|
| Payment link per cycle | You send a new invoice or payment link each period; the customer pays it | One payment per cycle | Every chain, including Bitcoin |
| Allowance pull (auto-charge) | Customer approves a capped token allowance once; you pull each period | One approval, then nothing | EVM (ERC-20) and Solana (SPL delegation) |
| Prepaid / escrow | Customer deposits several periods up front into a contract or balance | One large deposit | Depends 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_countand an optionaltotal_cycles. - Trials:
trial_period_daysortrial_end, plus asubscription.trial_will_endwebhook 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) andsubscription.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,
}
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_failedandsubscription.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.canceledandsubscription.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.
Payment link or auto-charge: which should you use?
| You sell… | Use |
|---|---|
| SaaS, memberships, API plans (monthly) | auto_charge, with payment links as the fallback |
| Annual plans or high-value invoices | send_payment_link: one deliberate payment per cycle |
| Customers paying in BTC | send_payment_link (no auto-charge on Bitcoin) |
| Customers who don't want to grant approvals | send_payment_link |
Many teams offer both and let the customer choose on the hosted page.
Tips that reduce failed charges
- 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. - Pick a cheap network. Base, Arbitrum, Optimism, Polygon, and Solana keep gas low for each pull.
- Remind before the billing date. Use
subscription.trial_will_endand your own reminder before each cycle so customers top up their wallet. - Show the schedule. On your subscribe page, show the amount, the interval, the first charge date, and how to cancel.
- 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.
