How to Reduce Involuntary Churn in a SaaS on Stripe
Involuntary churn is the customer who leaves without deciding to. Their card expired, their bank blocked a charge, or their bank wanted a confirmation that never happened. They did not cancel. The payment simply stopped.
Disclosure: we sell a failed payment recovery service. This checklist is ordered by what we would do first for our own product, and most of it is free inside Stripe. Stripe details were checked against Stripe's documentation on October 15, 2026.
How big is the problem?
Honestly, most public numbers come from vendors. Churnkey's analysis of 5.4 million failed payments put 22% of subscription cancellations down to failed payments, as reported by Gymdesk. Treat that as a signal, not a forecast for your business.
Your own number is the one that matters, so step 1 is to find it.
Step 1: Measure your leak after Stripe
Pull your invoices from the last 90 days and answer three questions:
- How many invoices failed on the first try, and for how many dollars?
- How many of those were paid within, say, 21 days?
- How many dollars are still unpaid?
The third number is your leak after everything Stripe already does. If it is small next to your revenue, stop here. You have better things to work on.
Step 2: Let Stripe fix what it can for free
Automatic card updates. Stripe "automatically attempts to update saved card details whenever a customer receives a new card", for example after an expiry or a lost card. Stripe says this is "widely supported in the United States", that international support "varies from country to country", and that "It isn't possible to identify cards that support automatic updates" (Stripe docs: how cards work). You can listen for payment_method.automatically_updated to see it happening.
Smart Retries. Stripe chooses when to retry a failed charge. You set how many tries and over how long, and "The recommended default setting is 8 tries within 2 weeks" (Stripe docs: Smart Retries). Find it under Billing, Revenue recovery, Retries.
Stripe's customer emails. Stripe can email customers after each failed payment, one month before a card expires, and when a payment needs 3D Secure confirmation, with reminders (Stripe docs: customer emails).
Turn these on before paying anyone for anything, including us.
Step 3: Know which failures retries can never fix
Stripe lists hard decline codes it cannot retry automatically, including lost_card, stolen_card, incorrect_number, revocation_of_authorization and authentication_required. For these, "the scheduled retries continue but the payment only executes if you obtain a new payment method" (Stripe docs: Smart Retries).
In plain words: for these customers, the clock is running and nothing will happen unless a human does something. That human is your customer, and the only way to reach them is a message with a link.
authentication_required deserves special attention. The card may be perfectly good. The bank wants the cardholder to approve the payment. See the email to send for payment_action_required.
Step 4: Send short emails that sound like a person
A short sequence over about ten days usually does the job:
- Day of failure: plain note, one link.
- About 2 days later: short reminder.
- About 5 days later: suggest a different card.
- The day before access changes: say exactly what will happen.
Split the wording by failure type. Copy ready templates are in our Stripe failed payment email templates.
One founder on Indie Hackers reported going from 35% to 65% recovery after moving to plain text emails with a one click update link and a separate path for authentication failures. He sells a competing tool and it is one person's account, so read it as a hint, not a benchmark.
Step 5: Use the right link
The link matters as much as the words. Your options are Stripe's own hosted page, the hosted invoice page, or a customer portal deep link straight to "update payment method". There is one trap worth knowing: Stripe retries on the subscription's own default payment method first, so if you only update the customer's default, "Stripe continues to retry on the subscription's default_payment_method" (Stripe docs: Smart Retries). Details in our guide to Stripe card update links.
Step 6: Decide what happens when retries run out
After the last retry, Stripe can cancel the subscription, mark it unpaid, leave it past_due, or pause it if eligible (Stripe docs: Smart Retries). Pick on purpose. In our opinion, for most small SaaS products, pausing or marking unpaid keeps the door open better than a hard cancel, because the customer can come back by paying the open invoice.
Step 7: Catch it before it fails
Expiring card emails and renewal reminders prevent some failures entirely. Stripe sends the expiring card email one month before expiry if you turn it on (Stripe docs: customer emails). For annual plans, a renewal reminder also cuts surprise disputes.
Step 8: Measure what actually worked
This is the step almost everyone skips, and it is where most recovery numbers go wrong.
When you send emails and Stripe retries at the same time, "recovered after our email" includes payments that would have come back anyway. To know what your emails add, randomly hold out 10 to 15% of failed invoices from your emails. Leave everything else the same. After 21 days, compare:
- recovery rate of the emailed group,
- recovery rate of the holdout group.
The difference, times the failed dollars you emailed, is your real lift. With small numbers it will be noisy, so look at it over a rolling 60 to 90 days rather than week by week, and be suspicious of small gaps.
We built our monthly proof report on this idea. It shows the measured lift after subtracting a safety margin for chance, counts only the payments made through our links, and sets the result next to our flat $49 a month price, so you can see whether it is worth it and cancel anytime if not. You can see a sample report on our pricing page.
The checklist
- Measure 90 days of failed and still unpaid dollars.
- Confirm automatic card updates and turn on Smart Retries.
- Turn on Stripe's failed payment, expiring card and confirmation emails, or replace them with your own.
- Treat hard declines and
authentication_requiredas "needs a human". - Send a short plain text sequence with one Stripe hosted link.
- Choose what happens after the last retry.
- Remind before renewals and expiries.
- Hold out a random slice and measure the real lift.
Sources
- Stripe docs, How cards work (automatic card updates): https://docs.stripe.com/payments/cards/overview
- Stripe docs, Automate payment retries: https://docs.stripe.com/billing/revenue-recovery/smart-retries
- Stripe docs, Automate customer emails: https://docs.stripe.com/billing/revenue-recovery/customer-emails
- Gymdesk, reporting Churnkey's failed payment analysis (vendor research): https://gymdesk.com/blog/gym-failed-payment-recovery
- Indie Hackers, founder thread on failed card churn (anecdote): https://www.indiehackers.com/post/most-founders-know-their-churn-rate-almost-none-know-how-much-of-it-is-just-failed-cards-659054c734
See your own number first. The free Leak Check takes a few totals from your own Stripe Dashboard and shows what is still lost after Stripe's retries. It runs in your browser with no Stripe access, and your numbers are never sent to us. If it is enough for our $49 a month plan to likely pay for itself (about $2,500 a month of failed payments across 20 or more failed payments), the plan will start with a 30 day free trial once it opens. The paid service is not open yet.