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.

No wallet approval and no allowance to manage.
Works on every supported network, including Bitcoin.
Where a subscription lands when an auto-charge approval is revoked or runs out.

On-chain pull

Auto-charge

The payer approves once. Each cycle the billing job pulls the period amount without the payer doing anything.

EVM and Solana only — Bitcoin does not support subscription pulls.
The payer sets the approved amount and number of cycles.
A failed pull moves the subscription to past_due and notifies the payer.

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.

Choose your language

Choose your language