OpenSettle supports three autopay modes. Each makes a different trade-off between friction, wallet compatibility, and renewal certainty. Most merchants ship with invoice-and-pay, then promote allowance mode as the default over time.
The lowest-common-denominator. We email the customer a renewal link 7 days, 3 days, and 1 day before the renewal date. They click, sign the transaction, and the subscription renews. Works on every wallet on every chain. Expect a renewal success rate in the 85–92% range.
The card-on-file of crypto. On signup, the customer approves a capped spending allowance to our Subscription contract. On each renewal, the contract pulls the pre-agreed amount. No further customer action needed. Supports every EVM chain and Tron (TRC-20 is ERC-20 compatible). Expect 96–98% renewal success.
const sub = await os.subscriptions.create({
customer: "cus_9fX0a2E1",
price: "price_pro_monthly",
settlement: { chain: "base", token: "USDC" },
autopay: "allowance",
allowance: {
// cap is 2.5× the monthly rate by default
multiplier: 2.5,
// revoke automatically if unused for 90 days
auto_revoke_after_days: 90,
},
});For customers on smart wallets (Safe, Coinbase Smart Wallet, Privy, et al.), we request a scoped session key: cap, duration, and allowed target. No per-renewal signature, and the customer can revoke the session at any time. Currently on Ethereum, Base, Arbitrum, and Polygon.
When a renewal fails (insufficient balance, revoked allowance, network issue), we emit a subscription.past_due webhook, retry once an hour for 48 hours, and email the customer with a recovery link. You can disable dunning or customize it under Settings → Dunning.
trialing — subscription created with a trial period.active — current and paid.past_due — renewal failed; dunning engaged.paused — paused by merchant or customer.canceled — ended. Terminal state.