Subscriptions are a leaky bucket and nobody looks at the holes
A subscription business has two kinds of churn:- Voluntary churn — the customer decided to leave. They cancelled. You can fight it with product and price, and everybody does.
- Involuntary churn — the customer wanted to stay, but the payment failed and the subscription lapsed. Nobody decided anything. The money just didn’t move.
Nigeria makes the leak worse — and the fix more valuable
The standard retry playbook was designed for American credit cards with revolving limits. It does not survive contact with the Nigerian market:Debit, not credit
Most cards are debit cards drawing on a current account. If the account is empty, a retry fails — and retrying an empty account three more times that week just burns your attempts. You have to wait for money to arrive.
Salary lands once a month
Salaries cluster around payday — the 28th, or the 1st–3rd. A charge that fails on the 15th has a near-100% chance of failing again on the 16th, and a much better chance on the 28th. When you retry matters more than how often.
Cards are the weakest rail
Card success rates are volatile. But the same customer can almost always pay by USSD, bank transfer, or a virtual account. If the card is the problem, stop using the card.
The phone is the identity
Everyone has WhatsApp. Phone numbers are the real primary key for a person. That’s the natural anchor for a payment identity — far more than an email a customer barely checks.
DunningStrategy.decide() function. See the code-level walkthrough →
The second bet: unbundle the wallet from the merchant
The great lock-in of conventional billing is that the saved card belongs to the merchant. The customer re-enters their card at every new store. That’s friction the customer eats and the merchant pays for in abandoned checkouts. Duro moves the saved payment method to a customer-owned identity keyed by phone number and verified over WhatsApp: The more merchants on Duro, the more valuable each customer’s saved identity becomes, and the lower every merchant’s checkout friction gets. That’s a network effect a single-merchant tokenizer structurally cannot produce. See the identity chapter →What this buys the people who matter
For the merchant
For the merchant
Revenue that would have silently churned comes back. They see “₦X at risk → ₦Y recovered, Z% recovery rate” as the first number on their dashboard, not buried revenue analytics. They configure their own retry rails, payday-awareness, and dunning emails.
For the customer
For the customer
One WhatsApp login shows every subscription across every Duro business. Update a card once, fix every past-due charge. Pay at a new store without re-entering anything.
For the engineer / judge
For the engineer / judge
A clean, OOP, fully-typed monorepo where the marquee features are real: a state machine, a payday-aware retry scheduler, rail-switching, SSRF-guarded signed webhooks, multi-schema tenant isolation, and an integration suite that runs the whole money loop against Postgres on every push.