Insufficient funds declines: retry on payday, not on a timer
insufficient_funds means the card is valid but the balance is too low. The fix is timing the retry.
Why the default retry fails
A fixed schedule, day one, day three, day seven, treats every decline as the same problem. For an empty balance it mostly retries into the same empty balance. The customer never sees a thing; they just get an email later saying their subscription was cancelled, and by then they have moved on.
The schedule that works
- Wait 24 hours. Some balances refill the same day; a retry before that only annoys the bank.
- Retry on the next 1st or 15th, whichever comes first. Salaries, benefits and invoice payments cluster on those two days in most countries. Retry in the morning, local time, after deposits clear.
- Retry on the following payday too if the first one fails. Two paydays covers a monthly and a fortnightly pay cycle.
- Then email. Only after the payday retries, and only with a fresh card-update link, in case the answer is a different card.
If the customer is on an annual plan, skip step one and go straight to the payday retry plus an email the same day. A failed annual charge is a whole year of revenue, and Recurly's data puts recovery on failed annual invoices at about 23% against 53% for monthly. Time is against you.
The email, in one screen
Short, no drama, one link. Something like: "Your card was declined for insufficient funds when we tried to renew your plan. We will try again automatically on the 1st. If you would rather use a different card, here is a link that takes ten seconds." No red banners, no countdown. The customer has money trouble this week, not a grudge against your product.
How to know it is insufficient funds in the first place
Stripe's failed-invoice event does not include the decline code; it lives on the payment intent. The decline code guide shows the three-line fetch, and the free workflow on GitHub does it and routes insufficient_funds to its own branch, so you can attach exactly this schedule.
What it adds up to
At $10k MRR, failed payments run roughly $900 a month. Stripe's own retries recover about half. Payday timing plus a short sequence takes that to about 70%, which is another $170 a month, every month, from customers who never chose to leave. RevGuard's Stripe workflow ships with this schedule already wired, alongside the hard-decline and technical-error branches, for $79 once.