If you run a subscription business on Stripe, somewhere between 5% and 12% of your monthly recurring revenue will fail to charge each cycle. Cards expire. Banks decline. Limits get hit. The industry term is involuntary churn — your customers didn't choose to leave, their payment method just stopped working.
Why Stripe Smart Retries fall short
Stripe's default Smart Retries solve part of the problem. Stripe will retry a failed invoice on an ML-driven schedule, and on average that recovers around 30% of failed charges. That sounds great until you do the math: 70% of failed revenue is still walking out the door.
The retry algorithm has no way to reach the customer. If a card has genuinely expired, no number of retries will fix it — only the cardholder can. That is the gap a recovery flow is designed to close.
Layering an SMS recovery flow on top
The single highest-leverage thing you can layer on top of Smart Retries is a synchronous SMS to the customer the moment a charge fails — with a secure one-tap link to update their card. We see SMS recovery flows close the gap from 30% to between 65% and 78% recovered revenue, depending on industry.
Speed is everything. A card expiring this week is much more recoverable on day 1 than day 5, because the customer still remembers the service and has not started looking for alternatives.
The implementation playbook
The playbook is straightforward: subscribe to Stripe's invoice.payment_failed webhook, enrich the event with the customer's phone number, send an immediate SMS via Twilio (or WhatsApp Business where appropriate), and host the recovery form on a PCI-compliant page using Stripe Elements.
That's exactly what DunningJet automates end-to-end — you connect Stripe, point Twilio at the integration, and the recovery flow runs without engineering work.