Email tools for churn prevention and win-back
Churn reaches a SaaS through two doors: customers who decide to leave and cards that simply fail. Stripe Billing and Paddle own the retry schedule for failed charges, so an email or sequence tool is judged on something narrower: what it sends when the billing system reports a failed invoice, a scheduled cancellation or an ended subscription, and what it does with quiet accounts before any of that happens. Below, tools are sorted by the five jobs they can do, each job has a sequence outline with triggers, timings and exit conditions, and the paid options are priced at 5,000, 10,000 and 25,000 people.
Pick by churn job
| Job | Shortlist | What decides it |
|---|---|---|
| 1. Quiet accounts (engagement decline) | Customer.io, Userlist, Intercom, Drip | Whether product events reach the tool, and whether the signal is per person or per company account |
| 2. Failed-payment notices (dunning) | Stripe or Paddle built-in emails first; Loops, Customer.io, Userlist, Drip; Churnkey or Baremetrics Recover as dedicated products; Resend or Postmark when your own code sends the notice | Retries always live in billing; you are choosing who writes and times the emails |
| 3. Cancellation save flows | Churnkey and Stripe's portal cancellation page for the in-app step; Userlist, Loops or Customer.io for the follow-up email | An email cannot intercept the cancel click, so the save has to start inside your product |
| 4. Win-back sequences | Loops, Customer.io, Drip, ActiveCampaign, Encharge | What it costs to keep former customers as contacts, and whether you can segment by cancel reason |
| 5. Renewal reminders and NPS | Stripe's renewal reminder emails; Userlist templates; Customer.io or ActiveCampaign for custom flows | How many customers are on annual plans, and whether a low score reaches a human |
Where billing stops and your email tool starts
Before comparing any email tool, read what your payment provider already does, because it decides how much an email tool has left to do.
Stripe Billing
According to Stripe's retry documentation, Smart Retries uses a model to choose retry times, and you set how many tries happen inside a window of 1 week, 2 weeks, 3 weeks, 1 month or 2 months. The recommended default is 8 tries within 2 weeks. The alternative is a custom schedule of up to three retries, each a set number of days after the previous one. When recovery fails you pick the outcome: cancel the subscription, mark it unpaid, leave it past due or pause it. Stripe's pricing page lists Smart Retries and recovery workflow automations as part of Billing, which it prices at 0.7% of Billing volume on pay-as-you-go or from $620 per month on a one-year contract.
One rule in that documentation changes what your emails should say: Stripe does not retry when no payment method is available or when the issuer returns a hard decline code such as lost_card, stolen_card or authentication_required. Retries stay scheduled for those invoices but only execute once a new payment method shows up. For a hard decline, waiting accomplishes nothing and the customer's email is the only path back.
Stripe also sends its own mail. Its customer email settings cover a notice after each failed card payment with a link to update the payment method, an expiring-card email one month before expiry, renewal reminders and a trial-ending reminder seven days before a trial closes. The link can point to a Stripe-hosted page or to your own subscription management page. In a sandbox these emails are not sent automatically, so test with an address on your verified domain or a team member's.
Paddle Billing
Paddle's changelog entry on default dunning says failed payments on automatically collected subscriptions are retried up to seven times over 30 days for every Paddle Billing account, and that an unpaid subscription is cancelled after those 30 days. The same entry lists optimized recovery emails as part of Paddle Retain's optional Payment Recovery, so plain default retries should not be assumed to include a customer email. Paddle's standard rate is 5% + 50¢ per transaction as a merchant of record, per its pricing page.
The event to listen for is subscription.past_due, which fires when a subscription has an unpaid transaction. If a retry succeeds the subscription returns to active and subscription.updated is sent; if recovery runs out it is paused or cancelled depending on your settings. For the customer-facing step, Paddle's payment details guide describes an update-payment-method transaction you open in Paddle.js, and recommends the customer portal link as the quicker route.
The split is therefore the same on both platforms. The provider decides when to try the card again and what happens to the subscription at the end. Your email tool decides what the customer reads in between, and it should read the provider's state before each send rather than assume it.
Wiring Stripe or Paddle events into each tool
Whichever tool you choose, the plumbing follows one pattern: the billing provider calls a webhook, something identifies the customer by email address or billing ID, and the event starts or stops a sequence. Stripe's subscription webhook guide is the reference for the event names, and it warns that events can arrive out of order or twice, so a handler should store event IDs and check the invoice's current status before it sends anything. The table shows how each candidate receives those events, based on its own documentation.
| Tool | How billing events arrive | What to check first |
|---|---|---|
| Loops | Built-in Stripe connection. Its Stripe docs list invoice.payment_failed, invoice.upcoming, invoice.paid, customer.subscription.deleted, .paused, .resumed and .trial_will_end as events that can start a workflow. | Contacts are matched on the Stripe customer's email, and only email and optionally full name are synced, so an email that must show the amount due needs data from elsewhere. Unlisted events are ignored. |
| Customer.io | A webhook-triggered automation that Stripe posts to. Its Stripe tutorial says to adapt the same setup for dunning emails on invoice.payment_failed. | The tutorial identifies the person by the email in the payload and sets the Stripe customer ID on the profile, so run the customer.created step first. |
| Intercom | Your backend posts to the Data Events API with an event name (the docs suggest a past-tense verb-noun such as updated-plan), a timestamp and up to 10 metadata keys. | The documented use is filtering and segmenting people by event; confirm in a trial workspace that a message can start from the event before building on it. |
| Userlist | Your backend sends users, companies and events through the Push API. Its integration list names no Stripe connector. | Userlist ships a three-email Failed Payment Recovery template and a Cancellation Survey template in its campaign templates; neither says which event starts it, so you define that. |
| Drip | Your backend records an event through the Events API, using the subscriber's email and an action name; a batch endpoint accepts up to 1,000 events per request. | Check the request limits against how many invoices fail on a bad day, since the standard cap is 3,600 requests an hour and batches are limited to 50 an hour. |
| Encharge | Encharge lists Stripe and Chargebee among its integrations and offers webhooks for anything else. | Confirm which Stripe events its integration surfaces as flow triggers before committing to a dunning flow there. |
| ActiveCampaign | Through your own backend or a connector that calls its API; no Stripe event list is on its pricing page. | Starter allows 5 actions per automation, which is tight for a dunning sequence with waits and status checks. |
Job 1: engagement-decline interventions
A quiet account is the one churn signal that billing data cannot show you, because the card still works. To catch it, the email tool needs an event from your own product, sent for the one action that proves the customer is getting value: a report exported, a campaign sent, a teammate invited. Decide on that single event first. Everything below depends on it, and an account that never fires it is the audience.
Quiet-account sequence: trigger, timings, exits
- Entry: a paying account at least 30 days old with no key event for 14 days and no open support conversation.
- Message 1, on entry: names the last thing the customer did and offers one next step, sent from a real person's address.
- Message 2, four days later: only if the key event still has not happened. Use a different angle, such as a template, an integration or a ten-minute setup task.
- Message 3, five days after that: three lines of plain text asking what got in the way, with replies landing in an inbox someone reads.
- Exits: the key event occurs (test the condition before every send, not only at entry), the subscription is cancelled or paused, or Message 3 goes out. After Message 3, hold the account out for 60 days so it cannot loop.
- Team products: build the segment on the company and write to the owner or admin when team-wide use falls, not to the one idle seat.
Customer.io
Customer.io's pricing page shows Essentials at $100 a month for 5,000 profiles and $145 at 10,000, with 1 million emails a month included. Its documentation covers people, events and segments, including timestamp conditions such as "within the past X days", which is what a quiet-account segment needs. Email, push, in-app messages and SMS are built in one place, so an account that ignores email can still be reached in the product. Essentials leaves out managed deliverability, and eligible companies that raised under $10M can get a full year free through its Startup Program.
Userlist
Userlist bills by tracked users: Basic is $149 a month for up to 10,000 users plus $10 per additional 1,000, and Professional is $349 for up to 10,000 plus $12 per additional 1,000. Professional adds A/B split testing, conversion goals and advanced workflow features. Its documentation has a company segments section, the feature that matters for the team-product variant above. Its billing page states a message allowance of five times your tracked users with a 500,000 floor, and $1 per 1,000 messages beyond it.
Intercom
Choose Intercom when the intervention should be a chat or in-app message rather than only an email. It prices Advanced at $85 per seat per month, the plan that adds the workflow automation builder, so three seats is 3 x $85 = $255 a month before any messaging. Email campaigns are charged per bulk email sent, and Proactive Support Plus is listed at $99 a month for 500 messages. It earns that cost only if support staff will answer the replies.
Drip
Drip prices by active people: $89 a month at 5,000 and $154 at 10,000, with unlimited sends and up to 50 workflows on those tiers. Workflows react to events, so the quiet-account sequence above works. The billing unit is the person, not the company, so a team-level signal would have to be calculated in your own app and sent in as an event.
Job 2: failed-payment emails (dunning)
Be exact about the division of labor here, because it is where most buying mistakes start. Retrying the card is billing's work: Stripe Billing or Paddle schedules the attempts. An email tool can only send notices when those systems report an event. That leaves four reasonable setups: Stripe's or Paddle's own emails and nothing more, a lifecycle tool that sends your branded sequence, a dedicated recovery product, or your own code sending each notice through a delivery API.
Failed-payment sequence, sized to a 14-day retry window
- Trigger: invoice.payment_failed on its first attempt (Stripe) or subscription.past_due (Paddle). Stretch the dates below to match your provider's window; Paddle's default is 30 days.
- Notice 1, within minutes: the charge did not go through, service continues for now, and one button leads to the Stripe-hosted portal or Paddle's update link. Show the same message as an in-app banner.
- No email per retry. With eight attempts in two weeks, mailing on each would send eight messages. Timers pace the sequence, not retry events.
- Notice 2 on day 3 and Notice 3 on day 7: each one re-reads the invoice status when its timer fires and sends nothing if the invoice is paid. Notice 3 states the date the account will be limited.
- Notice 4 on day 12: the final warning, with the exact date and time the subscription ends.
- Hard-decline branch: if the decline code is on Stripe's hard-decline list, skip the waiting and send a "new card needed" notice at once, since retries will not run until a new method exists.
- Exit: invoice.paid on Stripe, or subscription.updated returning to active on Paddle. Send one short "payment received" confirmation and leave the sequence.
- Terminal event: when the subscription cancels or pauses, send a message that explains how to restart, then hand the contact to the win-back sequence in Job 4.
- Suppression: hold promotional mail to the same address while the sequence is running.
Loops
Loops has the shortest path from Stripe event to email. Its Stripe documentation includes a walkthrough that starts from a "Stripe - Payment Failed" template, with the workflow trigger set to an event received from Stripe. Loops' pricing page offers a free plan limited to 4,000 sends in any rolling 30 days to your 1,000 newest contacts; paid plans scale by subscribers, $99 a month at 10,000 and $249 a month at 50,000 per its dated slider readout. Paid plans also include transactional sends. The constraint is data: only email and name come across from Stripe, so amounts and plan names are not available to merge into the notice.
Customer.io
Customer.io's tutorial draws the flow as Stripe webhook, identify the person, convert the webhook into an event, send messages, and says the same method covers dunning emails on invoice.payment_failed. For this sequence, forward invoice.paid as a second event and use it as the exit, and put the 3-, 7- and 12-day waits in the automation. Transactional email is part of every plan on its pricing page, so notices do not need a second product.
Userlist
Userlist's Failed Payment Recovery template is three emails: a first note that the charge did not go through, an "action required" email a few days past the billing date, and a final warning with a cancellation date and a data retention period. The template says to build it as a repeatable workflow so it runs every time a payment fails. It does not name the starting event or an exit, so you send those from your backend and add the paid-invoice exit yourself.
Drip
Drip fits when you already run it for other lifecycle mail. Record the failure through the Events API with the customer's email and an action name, then build a workflow with waits and a goal check. Its pricing page lists $39 a month for up to 2,500 people and $49 for up to 3,000, so a small list stays cheap.
Dedicated recovery products: Churnkey and Baremetrics
Churnkey sells cancel flows and payment recovery as one product. Its Starter plan is $250 a month billed yearly for teams with under $5k a month of churn volume, and includes Cancel Flows, Payment Recovery and Powerful Metrics. Price follows your average monthly churned revenue, and the page says it is fixed for 12 months. It supports Stripe, Chargebee, Maxio, Paddle and Braintree, and starts with a 14-day trial.
Baremetrics is subscription analytics first: Launch is $49 a month for businesses up to $360K ARR and Growth is $189 for $360K to $3.6M ARR. Its Payment Recovery add-on is +$129 a month on any plan and, per its Recover page, covers customizable email and SMS campaigns, in-app reminders and paywalls, and credit card capture forms, with the first 14 days free.
The arithmetic is simple. Launch at $49 plus Recover at $129 comes to $2,136 over twelve months; Churnkey Starter at $250 a month is 12 x $250 = $3,000 a year. Either one only pays for itself if it returns more money than that beyond what your provider's own retries and emails would have returned. Measure that baseline first: switch on Stripe's failed-payment emails for one billing cycle and note how much failed revenue is still unpaid when the retry window closes.
Notices sent from your own code: Resend and Postmark
If your app already handles Stripe or Paddle webhooks, a delivery API can send each notice from a template. The price of that choice is that you own the timers and exits: a small table keyed by invoice with the stage and the next send time, and a job that re-reads the invoice status before it mails anyone. Marketers cannot edit the sequence without a deploy.
Volume is rarely the issue. Suppose 300 invoices fail in a month and each runs through the four notices above: 300 x 4 = 1,200 messages. Postmark lists Basic, Pro and Platform at $15, $16.50 and $18 a month for 10,000 emails, and $55, $60.50 and $66 at 50,000. Resend has a free plan of 3,000 emails a month with a 100 per day cap, which a burst of notices on one billing day can hit, then Pro at $20 for 50,000 emails and $35 at 100,000.
Resend is no longer only a transactional API, either. Its Marketing tab prices by contacts: free at 1,000 contacts with 10,000 automation runs and 3 segments, then $40 a month at 5,000 contacts, $80 at 10,000 and $180 at 25,000. That makes it a candidate for the win-back job as well, if your team is comfortable building flows around its automations.
Job 3: cancellation save flows
The save starts before any email, because the customer who clicks cancel is on a page that you or Stripe control. That is the place for the first offer: a pause, a cheaper plan, a short reason question. Stripe's customer portal has a cancellation page, Churnkey's Starter plan includes Cancel Flows, and many teams build the screen in their own app. Email carries what happens afterwards.
The timing detail that matters comes from Stripe's cancellation documentation. Setting cancel_at_period_end to true sends customer.subscription.updated, and customer.subscription.deleted arrives only when the subscription actually ends, either at once or when that period runs out. A scheduled cancellation can be reversed by setting the flag back to false until the period ends, but a canceled subscription cannot be reactivated. Your save email therefore belongs on the updated event, while the customer is still paid up.
Scheduled-cancellation sequence
- Trigger: customer.subscription.updated where cancel_at_period_end is now true. Ignore updates that change nothing about cancellation.
- Message 1, within the hour: confirms the end date, says what happens to their data, links to a one-click undo, and invites a reply with the reason. Userlist's Cancellation Survey template is a good shape for this: one plain-text email whose only request is to hit reply and say why.
- Message 2, seven days before the end date: a single alternative you can afford, such as pausing payment collection, a lower plan or one discounted month. One offer, one button.
- Message 3, the day before: a plain statement that access ends tomorrow, with a data export link. This one is service information, not persuasion.
- Exit on reversal: when the flag goes back to false, stop the sequence and send a brief "nothing changes" note.
- Exit on end: when customer.subscription.deleted arrives, leave this sequence and enter the win-back sequence in Job 4.
- Reason capture: Stripe lets you update cancellation_details on a canceled subscription, so write the stated reason there and copy it to the email tool as a contact attribute for later segmentation.
Which email tool can run this depends on whether it can see the updated event. Loops' Stripe connector lists subscription created, paused, resumed, trial_will_end and deleted, but not updated, so with Loops alone the first message cannot go out until the subscription has ended. Customer.io receives whatever events you choose to send from a Stripe webhook endpoint, and Userlist and Drip take events from your backend, so for those three the trigger is yours to define.
Job 4: win-back sequences
Former customers come in two kinds, and they need different first messages. Someone who cancelled on purpose has a reason; someone whose subscription ended after the failed-payment window may not know it happened. Your billing events already separate them, since one ended after a dunning sequence and the other after a cancellation. Because Stripe will not reactivate a canceled subscription, every win-back link should open a fresh checkout for the same plan.
Win-back sequence with a hard stop
- Trigger: customer.subscription.deleted on Stripe or subscription.canceled on Paddle, with a branch on whether the account came out of a failed-payment sequence.
- Involuntary, day 2: the card on file kept failing, here is one link to start again on the same plan. No discount; the problem was administrative.
- Voluntary, day 3: one question about the reason, unless you already captured it at cancellation.
- Message 2, day 21: one product change that answers the stated reason. If nothing relevant has shipped, send nothing.
- Message 3, day 60: a single offer with an end date, matched to the reason: price reasons get the offer, feature reasons get the update.
- Message 4, day 120: a closing note saying you will stop writing and how to come back, then move the contact to a suppression list or remove it.
- Exits: a new subscription for the same customer, an unsubscribe, a spam complaint or a hard bounce.
- Streams: keep this promotional mail in a separate subscription topic from billing notices, honor unsubscribes in every win-back message, and check what your own market requires before mailing former customers.
The hidden cost of this job is list size, because former customers stay on the list for months. Each tool counts them differently, and that changes which one is cheapest for win-back.
Loops
Loops' free plan sends only to your 1,000 newest contacts, so once more than 1,000 people have joined since a customer left, that customer can no longer receive a win-back message on the free plan. On paid plans the price follows its slider: 4,788 subscribers cost $48 a month, 9,998 cost $99 and 24,339 cost $198, per the readouts on loops.so/pricing.
Customer.io
Customer.io counts a profile for the month if it existed at any point in the billing period, even if you delete it, according to its billing documentation. Clearing out former customers only lowers next month's bill. Past the plan's included profiles, each extra profile is $0.009 on Essentials.
Drip
Drip's pricing page ties cost to the number of active people and the emails you send, and shows $154 a month at 10,000 people and $369 at 25,000. Its workflow builder handles the day-based waits and the new-subscription goal as a stop condition.
ActiveCampaign
ActiveCampaign lists predictive and conditional content, which lets one win-back email swap its middle paragraph by stated reason. At 10,000 contacts its selector shows Starter at $149 a month and Plus at $189, but Starter caps automations at 5 actions and is not offered above 25,000 contacts. Four messages plus waits and exit checks add up to more than five actions, so read the action limit of any plan you pick before building this on it.
Encharge
Encharge prices Growth at $179 a month for up to 5,000 subscribers and $249 for up to 10,000, with unlimited flows and sends capped at 10 times your subscriber count. Extra email costs $100 per 100,000 sent. Premium adds transactional email, at $269 a month for 5,000 and $399 for 10,000, which puts the dunning notices and the win-back flow in one product.
Job 5: renewal reminders and NPS
Stripe's customer email settings already cover the basics. Turn on "Send emails about upcoming renewals" and it mails customers ahead of the renewal date, on the schedule you configure under its upcoming renewal events, but only for subscriptions set to charge automatically. A separate setting emails customers one month before a card on file expires. For monthly plans that is often enough. Annual plans are where your own reminder pays off, since a charge that lands once a year is the one customers forget they agreed to.
Annual renewal reminders without duplicating Stripe's
- Trigger: a renewal-date attribute on the contact, or Stripe's invoice.upcoming event, which Loops lists among its workflow triggers.
- Message 1, 45 days before: what the account did with the product this year, taken from your own data. No pitch and no discount.
- Message 2, 21 days before: the amount, the date, and a link for changing plan or payment method. If the card expires before the renewal date, say so here.
- Stripe's own reminder: set its days-before value inside the final week so the two sets of emails do not land together.
- Exits: the customer changes plan, schedules a cancellation (move to Job 3) or the renewal invoice is paid.
NPS survey with a human route
- Timing, our suggestion: 60 days after the first payment, then every 120 days, never within 14 days of a support escalation.
- Format: one question with the 0 to 10 scale as clickable links in the email, so a click records the score before the customer sees a form.
- Scores 0 to 6: notify a person to write back within a business day. An automated apology on a low score does harm.
- Scores 9 and 10: a review or referral request a week later, sent once.
- No answer: one reminder after five days, then stop.
Userlist is the quickest start for both outlines: its campaign templates include Upcoming Payment, Switch to Annual Billing, NPS Survey and Offer Support Proactively, written for a SaaS audience. Customer.io and ActiveCampaign can build the same flows from scratch, with more branching and more setup. Whichever tool you use, make sure the score lands as a contact attribute, otherwise the detractor route depends on someone reading a spreadsheet.
Customer success platforms: ChurnZero, Totango, Gainsight
These three are not sequence tools. They are workspaces for people who manage named accounts, collecting usage and support data into health scores and turning a change in score into a task for a customer success manager. Their pricing pages show no numbers: ChurnZero and Totango route buyers to a demo request, and Gainsight's pricing page says "Request Pricing" for its Customer Success product. All three are pricing on request, so none appears in the cost table below.
Gainsight's page does give one number that shows the intended scale. Its Customer Success Essentials tier includes 10 full users and 100 customers per user, which covers 10 x 100 = 1,000 customers; Enterprise includes 20 users and 200 customers per user, or 20 x 200 = 4,000. The product list on that page names customer 360 views, playbooks, health scorecards, surveys and digital journeys. If your base is 20,000 self-serve subscribers, a per-account platform is aimed at a different problem from the one you have.
A platform and a sequence tool usually coexist. The platform decides which account a human should call; the sequence tool sends the failed-payment notices, the cancellation follow-ups and the win-back mail for the thousands of accounts nobody will call. Neither replaces the retry settings in Stripe or Paddle.
What the tools cost at 5,000, 10,000 and 25,000 people
Every figure below is a monthly price read from the vendor's own page on 7 October 2026, using the entry plan that can run the sequences above. The billing unit differs from tool to tool, so the last column matters as much as the number. Where a vendor publishes a per-unit rate instead of a slider stop, the arithmetic is shown under the table.
| Tool and plan | 5,000 | 10,000 | 25,000 | What is counted |
|---|---|---|---|---|
| Loops paid plan | $48 (at 4,788) | $99 (at 9,998) | $198 (at 24,339) | Subscribers |
| Customer.io Essentials | $100 | $145 | $235 at 20,000; $325 at 30,000 | Profiles |
| Drip | $89 | $154 | $369 | Active people |
| ActiveCampaign Starter | $79 | $149 | $391 | Contacts |
| ActiveCampaign Plus | $145 | $189 | $389 | Contacts |
| Encharge Growth | $179 | $249 | $389 | Subscribers |
| Userlist Basic | $149 | $149 | $299 (formula) | Tracked users |
| Userlist Professional | $349 | $349 | $529 (formula) | Tracked users |
| Resend Marketing Pro | $40 | $80 | $180 | Contacts |
Userlist's formula comes from its pricing page: Basic includes 10,000 users for $149 and adds $10 per extra 1,000, so 25,000 users is $149 + 15 x $10 = $299. Professional is $349 plus $12 per extra 1,000, so $349 + 15 x $12 = $529. The same method gives $229 at 18,000 users and $369 at 32,000 on Basic, matching the stops its page shows. For Customer.io, the 25,000 case sits between the $235 and $325 stops, with extra profiles at $0.009 each on Essentials. Intercom is left out of the table because it bills per seat: on Advanced at $85 per seat per month, each added teammate adds $85 whatever the list size.
What the table hides is the cost of keeping former customers on the list for win-back. Take a product with 5,000 current accounts and add 5,000 former customers you still want to mail, for 10,000 contacts. If the tool counts them all, Loops rises from $48 to $99 a month, which is $612 more over a year. Customer.io goes from $100 to $145, or $540 more over a year; Drip moves from $89 to $154, ActiveCampaign Starter from $79 to $149 and Encharge Growth from $179 to $249, and each of those gaps is paid twelve times a year. Userlist Basic stays at $149 because 10,000 users are already inside the plan. Whether a vendor counts former customers depends on how you store them, so decide that before you import the list.
Dunning and cancellation mail is a separate and smaller bill. Under the sizing assumption used earlier, 1,200 failure notices a month fit inside the 10,000 emails that Postmark's entry price covers, and the 3,000-email free plan at Resend would also hold them, subject to its 100-a-day cap. Billing-side costs sit apart from all of this: Stripe lists 0.7% of Billing volume for pay-as-you-go, and Paddle takes 5% + 50¢ per transaction as merchant of record.
Choose A if, B if
Stripe's or Paddle's built-in emails alone if card failures are your only leak and their wording is acceptable; the cost is nothing beyond the Billing fee you already pay. Move to a sequence tool when you want more than the standard notices, such as timed steps, an in-app banner or a branch for hard declines.
Loops if you run on Stripe, send only email, and want a payment-failed workflow live the same afternoon; accept that amounts and plan names do not come across. Choose Customer.io instead if the notice has to quote the invoice, or if you need cancellation-scheduled events that Loops' connector does not list.
Customer.io if product events, billing events and several channels all feed the same flows, and you can live with $145 a month at 10,000 profiles and the rule that deleted profiles still count for the month. Choose Userlist instead if your customers are teams and the signal belongs to the company.
Userlist if you sell to teams, want ready-made failed-payment, cancellation and NPS templates, and prefer a flat entry of $149 a month that already covers 10,000 users. Skip it if you need a built-in Stripe connector, since its integration list names none.
Intercom if the save conversation is a chat and a person will answer it, at $85 per seat on Advanced. Skip it when the sequences are fully automated, because the seat price buys a team inbox you will not use.
Drip if the list is small and an event-driven workflow builder with unlimited sends is enough: $89 at 5,000 people. It is weaker than Userlist for company-level signals, since it bills and segments by person.
ActiveCampaign if a sales or success team works the same contacts in its CRM and wants the churn flows beside their pipeline. Avoid Starter for anything with waits and branches because of its five-action limit.
Encharge if marketers, not engineers, will own the flows and you want Stripe and Chargebee on its integration list. Expect $179 a month at 5,000 subscribers, and Premium if you want transactional email in the same account.
Churnkey or Baremetrics Recover if the cancel screen and payment recovery are the whole project and nobody wants to maintain them. Churnkey starts at $250 a month billed yearly; Baremetrics is Launch at $49 with Recover at $129 added.
Resend or Postmark if engineering already handles the billing webhooks and wants notices from code; Postmark is $15 a month at 10,000 emails on Basic and Resend Pro is $20 at 50,000. Add a lifecycle tool when marketing needs to edit the win-back mail.
ChurnZero, Totango or Gainsight if people own named accounts and a drop in health should create a task for a human. They add nothing for the accounts nobody will call.
Pitfalls when wiring churn email to billing
Two senders for one failure. If Stripe's failed-payment email is still switched on in the dashboard and your tool also fires on invoice.payment_failed, customers get two messages with two different links. Decide which system owns the notice, then switch the other off.
Race between events. A customer can fix the card within seconds of the first failure, and invoice.paid can reach your handler while the failure is still being processed. That is why each timer should look up the invoice's current status instead of trusting that an earlier exit already ran.
Testing in a sandbox. Stripe's documentation says its customer emails are not sent automatically from a sandbox. To see them, use an address on your verified email domain or a team member's address; to test your own tool's sequence, replay the event from the Stripe dashboard or CLI.
Dates that disagree. Stripe's renewal email prints the date in the customer's timezone, falling back to your account's timezone and then UTC. If your custom reminder prints a UTC timestamp, a customer near midnight can receive two emails naming different days.
Promises your systems cannot keep. A final-warning email that says data is kept for 30 days commits you to a deletion job on that schedule, and to keeping the data intact until then. Write the sentence only after someone has built the job.
Collisions across jobs. A customer who cancels during a failed-payment window can be in the dunning, cancellation and win-back sequences at once. Give each sequence a rank, and let a higher-ranked one pause the others.
Billing mail and promotion in one stream. A failed-payment notice is service information; a discount offer to a former customer is marketing. Send them through separate streams or subscription topics so an unsubscribe from one does not silence the other, and so a spam complaint on a win-back email cannot damage the sending reputation of the billing notices.
Moving an existing setup
From Stripe's own emails to a tool. Add a webhook endpoint that subscribes only to the events you use: invoice.payment_failed, invoice.paid, invoice.upcoming, customer.subscription.updated and customer.subscription.deleted. Build the sequence and run a test contact through every branch. Switch off Stripe's failed-payment email on the same day the live sequence starts, then read the first week of real failures end to end to confirm each stage sent once.
From one email tool to another. Failed-payment sequences move easily because their state lives in billing, so the new tool only needs the same trigger and the same exit event. Win-back moves less easily: export every contact with its cancellation date and stated reason as attributes, or the new sequence cannot branch. On tools that bill for any profile present during the month, such as Customer.io, expect to pay both vendors for the overlap month. The general checklist is in the sequence tools migration guide.
From Stripe to Paddle, or the reverse. Event names and shapes change: a Stripe failed invoice becomes a Paddle past-due subscription, and customer IDs differ, so match contacts by email address and rewrite every trigger and exit rather than copying them. Paddle's retry window and its email behavior also differ from Stripe's defaults, so re-time the notices against the new schedule before cutting over.
A sensible build order for a small team
Most teams should not start with the quiet-account sequence, however attractive it looks. It needs product events that someone has to instrument, and its effect is hard to see. Start with the jobs where your billing system hands you the trigger for free.
- Open the retry settings in Stripe or Paddle. Confirm the window, the final outcome for an unpaid subscription, and whether the provider's own failed-payment email is on. Half an hour of work, and it defines everything after it.
- Add the exit-aware failed-payment sequence only after one billing cycle shows how much failed revenue the provider's emails and retries leave unpaid. If the amount is small, a dedicated product costs more than it returns.
- Capture the cancellation reason on the cancel screen and write it to Stripe's cancellation_details, before building any offers. Offers without reasons are guesses.
- Build the win-back sequence once reasons exist to branch on, and send it only to contacts you are willing to pay to keep on the list.
- Add renewal reminders for annual plans, then NPS with its human route.
- Instrument the key product event last and switch on the quiet-account sequence.
Frequently Asked Questions
Who retries a failed subscription payment, Stripe or my email tool?
Your billing system does. Stripe's retry documentation describes Smart Retries, with a recommended default of 8 tries within 2 weeks, plus a custom schedule of up to three retries; Paddle's changelog says automatically collected subscriptions are retried up to seven times over 30 days. An email tool never touches the card. It reacts to the invoice.payment_failed or subscription.past_due event and sends the notice that asks the customer to fix the payment method.
Do I still need a dunning email tool if Stripe already emails customers?
Not always. Stripe can email the customer after each failed payment with a link to update the payment method, and it can also send expiring-card and renewal reminders. Add a lifecycle tool or a dedicated product such as Churnkey or Baremetrics Recover when you want your own copy, several timed steps, an in-app banner, or the failure visible beside the rest of the customer's history. Run one source of notices at a time so nobody receives two emails for one failed charge.
When should the save email go out for a customer who cancelled?
Stripe sends customer.subscription.updated when a cancellation is scheduled for the end of the period and customer.subscription.deleted only when the subscription actually ends. Trigger the save email on the first event: the customer is still paid up, and setting cancel_at_period_end back to false reverses the decision. After the deleted event the subscription cannot be reactivated, so any later message is a win-back that needs a fresh checkout link.
How long should a win-back sequence run?
Our suggestion is four messages over about four months, then silence: a reason question, a product-change note, an expiring offer and a closing note. Stop sooner on a new subscription, an unsubscribe or a spam complaint. Longer tails cost money on contact-priced tools, since Customer.io's pricing page shows $145 a month at 10,000 profiles, without giving the former customer anything new to hear.
Do ChurnZero, Totango or Gainsight replace sequence tools?
They solve a different problem. These customer success platforms organize health scores, tasks and playbooks for people who manage named accounts, and all three send pricing questions to a demo or pricing request. If nobody on your team will open an individual account, a sequence tool fed by billing events and product events covers more of your churn at a published price.