By Theo Brandt ยท Updated
Retention guideChurn Prevention Emails: Dunning, Save Flows, Win-Back
Two different problems share the word churn: a card that fails and a customer who decides to leave. Each needs its own emails and its own stop conditions.
For most SaaS companies that bill by card, the best first pick for churn prevention email is Stripe's own customer email settings, because they are already there, cost nothing beyond Stripe's per-transaction fees and send the failed-payment message next to the retry schedule that decides whether the payment succeeds. When you outgrow them, a lifecycle tool becomes worth paying for. Pricing on the other tools below depends on volume, profiles or users, so check the table in this guide against your own counts.
Prices in this guide were taken from each vendor's pricing page on 7 October 2026. Each vendor's name links to the page the price came from. No recovery or save percentages are quoted, because none of the vendors covered here publishes a figure that holds for every business, and your own billing data is the only benchmark that matters.
Two lanes: involuntary and voluntary churn
Involuntary churn is a payment that fails because a card expired, a bank declined the charge or the balance was short. The customer usually wants to keep the product and simply needs a page where they can fix the card, so the email's job is to get them there quickly and without drama. Voluntary churn is a customer who has stopped finding value or has started the cancel process. The email's job there is to learn the reason and offer one alternative that fits it.
Start with the involuntary lane. It needs the least judgment, the success signal is clear (the invoice is paid), and Stripe already sends most of the messages. Once that lane is stable, add usage-decline and cancellation flows, which depend on product data you may still be collecting.
What Stripe already does
Stripe's documentation separates the retry from the email, and the two settings live in different places. On the retry side, Smart Retries decides when to try a failed payment again. The policy can be set to a number of tries within a chosen window, and the documentation gives 8 tries within 2 weeks as its recommended default. A custom schedule allows up to three retries, each a set number of days after the previous attempt. Some declines cannot be retried in the normal way: for a lost or stolen card, retries wait until a new payment method is detected. When recovery ends without a payment, your settings decide whether the subscription is canceled, marked unpaid, left past due or paused.
On the email side, Stripe's customer email settings let you turn on a message after each failed card payment, an expiring-card notice before a card expires, a reminder before a trial ends and renewal reminders. Each email can link to a page where the customer updates the payment method, either Stripe's hosted page or one of your own. The same documentation notes that a hosted link stops working once the subscription has moved to a state such as canceled or unpaid, so the email wording should not promise access that the billing settings will cut off.
Stripe's own pricing has no monthly platform fee on standard payments; the cost is the per-transaction fee on each successful charge, which you already pay. That is why the built-in emails are the default first step: they add no line to your software budget.
Comparison of the main options
The table below covers the options that fit a SaaS billing problem. Each row shows the entry plan, the billing view and the limit that matters most for churn flows.
| Tool | Best for | Starting price (plan and billing) | Key limitation for churn emails |
|---|---|---|---|
| Stripe built-in emails | A first version for any Stripe billing account | No monthly platform fee; standard per-transaction card fees apply | Limited wording and branching. No multi-step sequences by plan or usage. |
| Customer.io | Teams that want custom branches on usage, plan and billing events and have an engineer to send the events | Essentials at $100 a month, billed monthly; profile-based plans from $145 a month at 10,000 profiles | The price grows with profile count, and the branching depends on clean event data. |
| Loops | A small team that wants simple event-triggered emails with transactional sends on one plan | Early Stage plan at $0: up to 4,000 sends in any rolling 30 days to the 1,000 newest contacts; Growing Audience plan at $99 a month | The free plan adds a Loops footer and caps sends, so a busy failed-payment month can reach the limit. |
| Userlist | B2B products where the billing contact is not the daily user and company-level workflows matter | Basic at $149 a month for up to 10,000 users; Professional at $349 a month for the same user range | Priced by users, so it is hard to justify for a small team that only needs dunning. |
What it costs at realistic sizes
Pricing models differ. Customer.io charges by profiles, Userlist by users, and Loops by sends and subscribers. The table therefore lists the size each price applies to. Use it to find the row closest to your own volume, not to compare tools across rows that measure different things.
| Tool and plan | Size the price applies to | Monthly price | Yearly price |
|---|---|---|---|
| Customer.io Essentials 10k profiles | 10,000 profiles | $145 | Billed monthly only |
| Customer.io Essentials 20k profiles | 20,000 profiles | $235 | Billed monthly only |
| Customer.io Essentials 30k profiles | 30,000 profiles | $325 | Billed monthly only |
| Customer.io Essentials 50k+ profiles | 50,000 profiles and above | $505 and up | Billed monthly only |
| Loops Early Stage | Up to 4,000 sends in any rolling 30 days | $0 | Not listed |
| Loops Growing Audience | Unlimited sends to subscribers, with transactional sends included | $99 | Not listed |
| Userlist Basic | Up to 10,000 users | $149 | Not listed |
| Userlist Professional | Up to 10,000 users | $349 | Not listed |
| Stripe built-in emails | Per successful card transaction | No monthly platform fee | Not applicable |
Here is the arithmetic for a realistic month. Suppose 200 card payments fail and each customer receives a three-email dunning flow. That is 600 emails, which fits inside Loops' Early Stage limit of 4,000 sends in a rolling 30 days. The cost question appears when the rest of the business is added, so put dunning and the rest of the workload into one calculation before choosing.
Tool by tool: who each one fits
Stripe's built-in emails
What it does well: it is the only option that sits inside the billing system, so it knows the invoice state without any integration work. You can switch on the failed-payment, expiring-card and trial-ending emails, brand them, and point the update link at Stripe's hosted page or at your own billing page. Where it falls short: the wording is fixed in structure, and you cannot build a sequence that changes by plan, seat count or usage. Price: no monthly platform fee on standard payments, with per-transaction fees on charges. Pricing reference: Stripe pricing.
Customer.io
What it does well: it handles branching well when your product sends clean events. Teams can build a flow that waits for a usage event, checks the plan, and exits as soon as the invoice is paid. It suits a churn program that also covers onboarding, feature adoption and win-back, because they share one data model. Where it falls short: the price rises with the number of profiles, and the Essentials plan is billed monthly only in the listed tiers. Someone has to instrument the events, which takes engineering time that a small team may not have. Price: Essentials at $100 a month; Essentials at 10,000 profiles at $145 a month; 20,000 at $235; 30,000 at $325; 40,000 at $415; 50,000 and above from $505 a month. Startup program: the vendor's pricing page describes 12 months free for eligible early-stage companies that have raised under $10 million. Pricing reference: Customer.io pricing.
Loops
What it does well: it is simple to set up. Event-triggered emails and transactional sends sit on one plan, so a failed-payment message and a password reset use the same account. That suits a two- or three-person team that wants a dunning flow without a large setup project. Where it falls short: the Early Stage plan includes a Loops footer and caps sends at 4,000 in any rolling 30 days to the 1,000 newest contacts, which can be tight in a month with many failures. The paid Growing Audience plan removes that cap for subscribers. Price: Early Stage at $0; Growing Audience at $99 a month. Pricing reference: Loops pricing.
Userlist
What it does well: it is built for B2B products where the person who pays is not the person who logs in. Company-level segments let you message the billing contact on one account while the daily users receive product emails. Where it falls short: the pricing is based on users, so it costs more than a dunning-only setup needs, and the company-level features only justify the spend if you run that kind of workflow. Price: Basic at $149 a month for up to 10,000 users; Professional at $349 a month for up to 10,000 users, adding A/B split testing, conversion goals and advanced workflows. Pricing reference: Userlist pricing.
Decision table: which option fits your situation
Match your situation to the row that describes it most closely. Each row explains the reason the choice follows from the facts above.
| If you need | Pick | Because |
|---|---|---|
| A first failed-payment email this week, at no extra cost | Stripe's built-in emails | They are switched on in the Dashboard and add no software line to the budget. |
| Different flows by plan, usage and billing state, with an engineer on the team | Customer.io | Branching on event data is its core workflow, and the event work pays off across onboarding and win-back too. |
| Simple flows for a very small team and a very low send volume | Loops (Early Stage), moving to Growing Audience when the cap binds | One plan covers event emails and transactional sends, and the free tier covers a modest failure rate. |
| Company-level messaging, where the billing contact is a different person from the users | Userlist | Segments by company let you reach the right person on each account. |
| Churn flows plus a large newsletter list on the same account | Compare total send volume first | Per-email pricing and per-profile pricing diverge quickly at high volume, so calculate both at your real numbers. |
How to choose
Begin with three numbers from your billing account: the number of failed card payments in an average month, the number of active customers, and the total number of emails your business sends in that month. Multiply the first by the number of dunning emails per flow to get the dunning volume. Add the rest of your sends. That total tells you which volume row in the table applies, and it shows whether a per-email plan or a per-profile plan is cheaper for you.
Next, check which billing system you use, because that limits the integrations you can rely on. Stripe's built-in emails work with Stripe only. Customer.io and Loops rely on your own events or webhooks, so the work to send the failure event falls to your team.
Finally, decide who will maintain the flow. A flow that depends on usage data needs someone to keep the events accurate. A flow that only handles failed payments needs much less upkeep, which is a good reason to start with that lane alone.
Dunning timeline that works with any tool
Tie each message to a moment in the retry schedule, not to a calendar guess. The timeline below uses a custom schedule with three retries. Adjust the days to match your own policy.
| Moment | Message | What it must contain | Stop when |
|---|---|---|---|
| One month before the card expires | Heads-up, no pressure | Which card, the expiry month, and a link to update it | Card updated |
| First failure | Plain notice | Amount, plan name, link to the card-update page, and a clear line on whether access continues | Payment succeeds |
| Day before the last retry | Reminder with a date | What happens on that date and how to fix it in under a minute | Payment succeeds |
| After the final failure | Status change | What is paused or canceled, how to restore it, and who to reply to | New payment method added |
| Hard decline code | Immediate request for a new card | State that the card cannot be retried and ask for another one | New card added |
Keep the tone factual. Customers who see a failed payment are usually surprised or busy, not unwilling. Name the amount and the plan, give one button, and avoid wording that reads like a collections letter. Make sure the "what happens next" line matches the subscription end state you chose in your billing settings.
Voluntary churn: usage decline, cancellation and win-back
Voluntary churn needs product data. Useful signals include a drop in logins or in the core action your product exists for, a seat removed, a downgrade, a visit to the cancel page, or a support thread that ends in a complaint. Choose two or three signals you can measure reliably and use them as triggers. A long list of weak signals produces noisy emails that customers learn to ignore.
- Usage check-in. Trigger when the core action has not happened for a period you set from your own data. Send a short note from a named person that asks what changed and links to one useful resource.
- Cancellation save. Trigger at the cancel intent, usually from your own cancel flow. Ask for the reason, then offer only the alternatives that fit it, such as a pause, a smaller plan or fewer seats. Treat discounts with care, because a customer who learns that cancelling earns a coupon may cancel again next year.
- Win-back. Trigger after the subscription ends. Send when something relevant to the stated reason ships, rather than on a fixed schedule, and include a one-click way to resume.
Set the stop condition for each voluntary flow as well. A usage check-in should end when the core action happens again. A save flow should end when the customer resumes or the subscription ends. A win-back flow should end when the customer resumes or unsubscribes.
Setup checklist
Work through the steps in this order. Each one builds on the one before it, and the flow should not go live until the earlier steps have been checked.
| Step | What to do | Done when |
|---|---|---|
| 1. Turn on the built-in emails | Enable Stripe's failed-payment and expiring-card emails and point the link at the right page | A test invoice sends the expected email and the link opens the update page |
| 2. Set the retry policy | Choose the retry schedule and the subscription end state after the final failure | The end state matches the wording in each email |
| 3. Send the failure event | If you replace Stripe's emails, connect the failed-payment event to your email tool | The event arrives with the invoice link and the plan name |
| 4. Switch off the duplicate | Turn off the Stripe email that your new flow replaces | A test failure produces one message, not two |
| 5. Build the stop condition | Add exits for invoice paid and new payment method added | A customer who pays after the first email receives no further dunning |
| 6. Add voluntary triggers | Add usage-decline and cancel-intent flows once billing is stable | Each trigger has a named signal and a stop condition |
| 7. Review monthly | Compare your own counts of failed and recovered invoices, and of saves and resumes | The review uses your data, not a published rate |
For the stage before this one, read the trial conversion emails guide. For how to track churn emails without relying on open rates, read SaaS email metrics. For comparisons of platforms built for dunning, see best email platforms for SaaS dunning, and for the connection details, see Stripe email integration.
Verdict
Turn on Stripe's built-in failed-payment and expiring-card emails first, since they add no software cost and sit next to the retry logic. Move to your own sequences when you need different wording by plan, or when the same tool should handle usage decline and cancellation. Customer.io fits teams that have event data and an engineer. Loops fits a very small team with a low send volume. Userlist fits B2B products where the billing contact differs from the user. Whichever you choose, retries stay in your billing system, each email links to the card-update page, and every flow needs a clear stop condition.
Frequently asked questions
Should I use Stripe's built-in emails or a separate tool for dunning?
Start with Stripe's own customer emails. They cost nothing beyond Stripe's per-transaction fees and they sit next to the retry schedule. Add a lifecycle tool when you need your own wording, branches by plan, or sequences that also cover usage decline and cancellation. Customer.io and Loops can send those flows, and neither replaces Stripe's retry logic.
How many dunning emails should I send?
Match the count to your retry schedule rather than to a fixed number. A reasonable minimum is one message at the first failure, one shortly before the final retry, and one when the subscription status changes. Each one should link to the card-update page. If your schedule has more retries, add a message only when the customer's situation changes, such as a hard decline that needs a new card.
Can an email tool retry a failed card payment?
No. Retries happen in the billing system, whether that is Stripe's Smart Retries or a custom schedule in Stripe or Paddle. An email tool sends the message that gets the customer to update their payment method, and the billing system then collects the money. Customer.io and Loops work on the email side of that line.
What should stop a dunning flow?
The invoice becoming paid, a new payment method being added, and the subscription changing state are the three events that should end the flow. Check that your email tool listens for the paid event as well as the failure event, so a customer who pays after the first email does not receive the final warning.
What happens if Stripe and my email tool both send a failed-payment email?
The customer gets two messages about the same invoice, which looks careless and can confuse people about which link is correct. When you move to your own dunning emails, switch the matching Stripe email off in the Dashboard at the same time you turn your own flow on.
How do I measure whether churn emails work without relying on an industry rate?
Use your own billing data. Count invoices that had at least one failed attempt and see how many ended paid, split by whether the customer opened the dunning email or clicked the update link. For voluntary churn, compare accounts that went through the save flow with similar accounts that did not, over the same period. Keep the comparison in your own reporting rather than quoting a published rate.
Is a free plan enough to start?
It can be for a small product. Loops' Early Stage plan covers up to 4,000 sends in any rolling 30 days to the 1,000 newest contacts, with a Loops footer. Multiply your expected failed payments by the number of dunning emails per flow, then add the rest of your lifecycle mail, and compare that total with the plan limit.