Most conversations about payment recovery start after a charge has failed. Retry strategies, dunning sequences, cancel flows — all reactive. Fix the damage after it's already been done.
There's a category of email almost no one talks about that prevents the damage in the first place: pre-dunning. These are messages you send before a payment fails, warning the customer about something that's about to cause a problem.
The math on pre-dunning is better than anything you can do after the fact. A well-timed "your card expires next month" email converts to an updated card 40–60% of the time. A "heads up, your annual renewal is in 7 days" email catches the budget-owner before an invoice bounces. Meanwhile, the best dunning sequence in the world recovers maybe 50% of what's already failed.
The best failed payment is the one that never failed.
The Three Pre-Dunning Emails Every SaaS Should Send
You don't need a complex lifecycle program. Three simple emails, triggered by specific Stripe events, handle the majority of preventable failures.
1. The expiring card email
Trigger: Customer's card expires in the next 30 days.
Every Stripe subscription includes the card's expiration month and year. A daily job that finds cards expiring in the next 30 days and emails those customers is maybe 40 lines of code and eliminates a huge chunk of expired_card failures.
The key details:
- Send the email 30 days before, not the day of. Customers need time to find the new card.
- Include a direct link to the billing portal, prefilled for this customer. "Click here to update" converts far better than "log in and go to billing."
- Be casual, not alarming. This isn't a crisis — you're doing them a favor by reminding them.
- Send a second, shorter reminder 7 days before expiration if they haven't updated.
Sample subject line: "Heads up — the card on your ChurnShield account expires next month"
Sample body:
Hi , Quick note — the credit card on file for your ChurnShield subscription expires at the end of . Updating it now takes about 20 seconds and keeps your service uninterrupted. [Update payment method] No rush, but wanted to flag it before it became a problem. — The ChurnShield team
2. The pre-renewal email (for annual plans)
Trigger: Annual subscription renewing in 7 days.
Annual renewals fail more often than monthly ones — the amounts are larger, they hit budgets that may have shifted, and the card on file might be 11 months stale. A 7-day heads-up does two things:
- Gives the customer time to confirm the card is still good, update it if not, or expense-code the renewal.
- Reduces involuntary cancellations from people who forgot they had an annual plan and would otherwise reverse-charge the renewal.
This email should not be a pitch to upgrade or a nervous "please don't churn" message. It's a factual reminder. Transparency here builds trust; surprise renewals erode it.
For B2B SaaS with invoicing workflows, this email often needs to reach the finance contact, not just the primary user. ChurnShield supports a separate billing email on the subscription for exactly this reason.
3. The "your card was just updated" confirmation
Trigger: Customer updates their card through the portal, or Stripe's Account Updater silently swaps in a new card number.
This one seems like a minor nicety but it's actually a quiet churn preventer. Account Updater (Stripe's automatic card refresh from Visa/Mastercard) silently swaps card numbers when a customer gets a replacement card. Great when it works — but sometimes customers have already updated their card manually on your product and get confused when they see a new charge on a card number they didn't expect.
A simple "your payment method was updated — here's the last 4 digits" email prevents the confused-customer support ticket and, more importantly, prevents chargebacks from customers who thought they'd canceled.
The Pre-Dunning Emails You Probably Shouldn't Send
Not every pre-emptive email is a good idea. A few that look useful on paper but backfire:
"Your monthly charge is coming up in 3 days"
On monthly subscriptions, this is noise. It reminds the customer that they're being charged every month, which makes them think about whether they still need your product — right before they're charged. This is the opposite of what you want. Reserve pre-renewal emails for annual and multi-month plans.
"We noticed your usage is low this month"
Well-meaning retention teams love this one. Customers hate it. You've essentially reminded them they're paying for something they're not using and given them an opening to cancel. If usage is genuinely low, focus on activation (show them a feature they haven't tried, share a best-practice guide) — don't lead with the fact that you're watching their usage.
"Your trial ends in 3 days and will convert to paid"
This one's controversial. Transparent trial-end reminders are ethical and reduce refund requests, but they do depress conversion rates by 15–25%. If you're going to send them, frame them as "your trial ends soon — here's how to get the most out of your remaining days" rather than "we're about to charge you."
Implementation: What to Wire Up in Stripe
If you want to build pre-dunning yourself, here's the minimum viable setup:
- Daily job: expiring cards. Query all active subscriptions, find cards with
exp_monthandexp_yearin the next 30 days, filter to ones you haven't already emailed, send. - Webhook:
invoice.upcoming. Stripe fires this 7 days before a subscription renewal by default (configurable). Filter to annual plans and send the pre-renewal email. - Webhook:
customer.source.updatedorpayment_method.attached. Send confirmation of payment method change.
The tricky parts are deduplication (don't email the same customer twice in 5 days), timezone-aware send times (don't hit European customers at 3 AM), and handling edge cases like paused subscriptions and grace periods. None are hard individually, but the combination is where projects slip from "weekend work" to "2-week rollout."
ChurnShield's pre-dunning layer
ChurnShield includes pre-dunning out of the box — expiring card alerts at 30 and 7 days, annual renewal heads-ups, and payment method confirmation emails. All use AI-personalized copy that adjusts tone based on the customer's tenure and plan size. Run a free audit and the report will tell you how many expiring cards you have in the next 30 days.
What to Expect From Pre-Dunning
In the aggregate, here's what a well-run pre-dunning program tends to shift:
- Expired card failures drop 60–80%. Customers who are reminded usually update. Those who don't were likely leaving anyway.
- Annual renewal failures drop 25–40%. The 7-day heads-up is the biggest lever.
- Support tickets about "unexpected charges" drop significantly. Hard to measure unless you tag them, but almost every SaaS sees this.
- Overall involuntary churn drops 15–30%. Not because pre-dunning catches every failure, but because it removes the most preventable ones — and reactive dunning then works better on what remains.
Pre-dunning doesn't replace retry logic or dunning sequences. It sits above them, reducing the volume of work everything downstream has to do. The best payment recovery stack has all three layers: prevent what you can, retry what's recoverable, and dun what's left.
Start With the Easy Win
If you do nothing else from this post, add the expiring card email. It's the smallest amount of work, it fires on the most predictable trigger, and it prevents the single most common preventable failure in any Stripe account.
Everything else — pre-renewal, payment method confirmations, trial-end framing — is refinement. Start with cards. The rest follows.