Recurring payments
Recurring crypto billing without chasing every payer.
Fixed intervals, optional trials, and a status lifecycle you already know. Choose how each cycle is collected: a hosted link the payer clicks, or an on-chain approval OrcaRail pulls from automatically.
Two collection methods
Pick the collection method when you create a subscription. Payment links are the default. Auto-charge needs a one-time on-chain approval and runs on EVM and Solana only.
Default
Payment links
OrcaRail creates a hosted checkout link for each billing cycle and can email it to the payer.
On-chain pull
Auto-charge
The payer approves once. Each cycle the billing job pulls the period amount without the payer doing anything.
What the payer actually approves
Auto-charge is a wallet permission, not a stored card. The payer grants it once, sees the amount and interval before signing, and can withdraw it at any time without contacting you.
EVM
The payer sets an ERC-20 allowance for the spender address on the subscription. OrcaRail uses transferFrom each period.
Solana
The payer delegates SPL token authority to the spender. OrcaRail pulls the period amount using that delegation.
Revoking
The payer removes the allowance or delegation on-chain whenever they want. Telling OrcaRail too switches the subscription to payment links instead of letting the next pull fail.
Auto-charge is moving to a fully non-custodial spender: a public SubscriptionHub contract on EVM and an Anchor program on Solana. The payer flow stays the same and only the spender address changes. See the non-custodial overview.
Status lifecycle
The billing states you already know, adapted for on-chain settlement.
- trialing
- In a trial period. No payment is required until the trial ends.
- active
- Billing normally. Each cycle is collected by the chosen method.
- past_due
- A cycle payment failed or went overdue. Retries continue until the limit is reached.
- paused
- Paused — for example when a trial ends and no payment method is set.
- canceled
- Canceled immediately, at period end, or after retries were exhausted.
- completed
- Every cycle in total_cycles has been billed.
Webhook events
Every transition arrives as a signed webhook, so your own database never has to poll.
subscription.created
A subscription was created.
subscription.payment_link.created
A payment link was created for the cycle.
subscription.payment_link.paid
A cycle was paid — the link settled or the auto-charge pull succeeded.
subscription.payment_link.payment_failed
An auto-charge pull failed for the cycle.
subscription.trial_will_end
Reminder sent three days before a trial ends.
subscription.past_due
The subscription moved to past_due.
See it run before writing any code
The demo creates a real subscription and walks the approval flow end to end.
