How we made subscriptions feel like card-on-file without giving up self-custody
The ERC-20 allowance pattern is the quiet unlock. Here's how we designed subscriptions around it so customers pay us zero attention and merchants stop losing renewals.
The headline problem of stablecoin subscriptions is simple: wallets don't auto-charge the way cards do. A crypto renewal is a whole new signature. If you rely on that signature every month, you will lose a double-digit percentage of renewals to friction alone.
We knew this going in. The answer we converged on — after building and discarding three other models — is the ERC-20 allowance pattern, dressed up as a subscription.
The allowance pattern, in one paragraph
When a customer sets up a subscription, they sign one transaction authorizing a bounded spending allowance to our Subscription contract. On each renewal, our contract calls transferFrom on the token, pulls the pre-agreed amount, and splits it atomically. The customer never signs anything again until they want to change something.
Why this is safe
- The allowance is capped — typically 2–3× the monthly amount, not infinite.
- The customer can revoke or lower the allowance from their wallet at any time.
- Our Subscription contract can only transfer to a Router contract, which enforces the split.
- Every pull emits an on-chain event that the customer sees in their wallet activity.
function chargeSubscription(uint256 subId) external {
Subscription memory sub = subs[subId];
require(block.timestamp >= sub.nextChargeAt, "too early");
require(!sub.paused, "paused");
// Pull via the customer's pre-approved allowance
IERC20(sub.token).transferFrom(
sub.customer,
address(router),
sub.amount
);
// Router splits atomically to merchant + platform
router.splitFor(subId);
subs[subId].nextChargeAt = block.timestamp + sub.interval;
emit SubscriptionRenewed(subId, sub.amount);
}What this feels like to the customer
They sign up. They approve. They never see us again until the subscription ends or they choose to change it. It feels like card-on-file because, functionally, that's what it is — a revocable, capped, auditable on-chain pull authorization.
Results so far
Across live merchants, renewal success is 98.4% on allowance subscriptions vs. 89.2% on invoice-and-pay. That nine-point delta is real money over a year, and it's the single highest-leverage feature we've shipped.