The Fatal Flaw in Stripe Dunning Emails: Why One Size Doesn't Fit All Payment Failures

stripe dunning emails

The Fatal Flaw in Stripe Dunning Emails: Why One Size Doesn't Fit All Payment Failures

9 min readApril 15, 2026

The Fatal Flaw in Stripe Dunning Emails: Why One Size Doesn't Fit All Payment Failures

Last month, I watched a founder lose $47,000 in monthly recurring revenue because of three generic dunning emails. His Stripe dashboard showed hundreds of failed payments, and his automated email sequence was firing the same message for every failure: "Your payment failed. Please update your billing information."

The problem wasn't that customers weren't receiving the emails. The problem was that half of those customers didn't need to update their billing information at all. They just needed to wait for payday.

This is the most expensive mistake I see SaaS founders make with dunning emails: treating all payment failures the same way. When Stripe sends you a webhook for a failed payment, it includes a decline code that tells you exactly why the payment failed. But most founders ignore this crucial information and send the same generic recovery email regardless of whether the customer's card expired or they simply don't have enough money in their account right now.

The Two Types of Payment Failures

Payment failures fundamentally split into two categories, and understanding this distinction will transform your recovery rates.

The first type is timing problems. These are soft declines where the payment infrastructure itself is working fine, but something temporary prevented the transaction. The most common example is insufficient funds. The customer's card is valid, their bank account exists, but they just don't have enough money available at this exact moment. Maybe it's the 30th of the month and their salary doesn't arrive until the 1st. Maybe they had an unexpected expense this week. The key insight is that this problem resolves itself with time.

The second type is communication problems. These are hard declines where something fundamental is broken in the payment chain. An expired card is the classic example. The customer can wait as long as they want, but that card with the 2023 expiration date isn't suddenly going to work in 2024. The only solution is for the customer to take action and provide new payment information.

Here's where most founders go wrong: they send the same urgent "update your payment method now" email for both scenarios. This creates two problems. First, customers with timing issues get annoying emails telling them to fix something that isn't broken. Second, customers with communication issues don't get the specific guidance they need to actually solve their problem.

Why Generic Dunning Emails Backfire

When you send an "update your billing information" email to a customer whose payment failed due to insufficient funds, you're essentially telling them their payment method is broken when it isn't. This creates confusion and frustration. The customer logs into their account, sees the same card they've been using for months, and can't figure out what they're supposed to update.

Worse, it trains customers to ignore your dunning emails. When someone gets an email saying "update your payment method" but their payment method is fine, they learn that your emails aren't trustworthy. Then, when their card actually does expire six months later, they delete your email without reading it because they remember the last time you cried wolf.

I've seen this pattern play out dozens of times. A founder implements generic dunning emails, sees low engagement rates, and concludes that dunning emails don't work. But the problem isn't with dunning emails as a concept. The problem is sending the wrong message to the wrong customer at the wrong time.

The Insufficient Funds Email Strategy

When Stripe returns a decline code of insufficient_funds, your email should acknowledge the real situation. The customer doesn't have a broken payment method. They have a timing issue. Your message should reflect this understanding.

Instead of "Please update your payment information," try something like "We'll automatically retry your payment in a few days. No action needed unless you'd like to use a different card."

This approach does several important things. First, it reduces customer anxiety by explaining that the situation is normal and temporary. Second, it sets the expectation that you'll handle the retry automatically. Third, it gives the customer an easy out if they want to switch to a different funding source.

The key is to frame this as a temporary inconvenience rather than a crisis requiring immediate action. Most customers with insufficient funds know they have insufficient funds. They don't need you to tell them to fix their finances. They need you to be understanding and patient while they figure it out.

The Expired Card Email Strategy

Expired card failures require the opposite approach. This is a communication problem that only the customer can solve, and waiting won't help. Your email needs to create urgency while making the solution as simple as possible.

The subject line should be clear about what happened: "Your card ending in 1234 has expired." The email body should explain exactly what the customer needs to do and make it as frictionless as possible to do it.

This is where many founders make another mistake. They send customers to a generic "update billing information" page where they have to re-enter their entire payment method. But for an expired card, the customer only needs to update the expiration date and CVV. The card number itself is still valid.

If your billing system supports it, pre-populate the card number and ask only for the new expiration date and security code. This reduces the customer's effort and increases your conversion rate.

Reading the Decline Codes

Stripe provides detailed decline codes that tell you exactly why a payment failed, but you need to know how to interpret them. The most common codes fall into clear patterns.

Timing problems include insufficient_funds, but also temporary network issues, processing errors, and some types of fraud blocks. These are situations where the same payment might succeed if you try again later with no changes.

Communication problems include expired_card, incorrect_cvc, invalid_expiry_date, and card_declined where the issuer has permanently blocked the card. These require customer action to resolve.

Some codes are ambiguous. A generic "card_declined" could mean the bank is having temporary issues, or it could mean the customer has permanently closed their account. For ambiguous codes, err on the side of treating them as timing problems initially, but escalate to communication problem messaging if multiple retries fail.

The Retry Strategy

Your email strategy should align with your retry strategy. For timing problems like insufficient funds, space your retries out over several days or weeks. Many customers get paid on predictable schedules, so retrying on the 1st and 15th of the month often works better than retrying every day.

For communication problems, retries won't help until the customer takes action. You might retry once to account for temporary network issues, but after that, focus your energy on getting the customer to update their information rather than repeatedly charging a card you know is expired.

This is another area where generic approaches fail. I've seen systems that retry expired cards dozens of times, generating fees and annoying customers, while barely retrying insufficient funds cases that might succeed with a little patience.

Measuring Success

The success of your dunning email strategy isn't just about recovery rates. It's about customer experience and long-term retention. A customer whose insufficient funds issue resolves naturally after a few days with minimal hassle is more likely to stick around than a customer who gets bombarded with urgent emails about a problem they can't immediately solve.

Track your metrics by decline code. You should see higher recovery rates for timing problems and faster resolution for communication problems. But also watch for signs of customer frustration: support tickets, cancellations, and complaints.

The Technical Implementation

Implementing decline-code-specific dunning emails requires some webhook handling, but it's not complicated. When Stripe sends you a payment failure webhook, extract the decline code and route the customer into the appropriate email sequence.

Most email automation tools can handle this with tags or custom fields. Tag customers based on their decline code, then trigger different email sequences for different tags. The key is making sure your system can distinguish between "expired_card" and "insufficient_funds" from the start.

Beyond the First Email

Your email sequence should also vary by decline type. For insufficient funds, you might send a gentle reminder after a week, then a final notice after two weeks. For expired cards, you might send an immediate email, a reminder after three days, then escalate to phone calls or in-app notifications.

The goal is to match your persistence to the problem. Timing problems often resolve themselves with patience. Communication problems require active intervention from the customer.

The Bigger Picture

Getting dunning emails right is about more than just recovering failed payments. It's about building trust with your customers by showing that you understand their situation and respond appropriately. When you send the right message at the right time, customers feel like you're on their side rather than just trying to extract money from them.

This trust pays dividends beyond payment recovery. Customers who feel understood are more likely to upgrade, refer others, and stick around during tough times. They're also more likely to proactively update their payment information before problems occur.

The next time you see a failed payment in your Stripe dashboard, don't just see a billing problem. See a communication opportunity. Ask yourself: is this a timing problem or a communication problem? Then send the email that actually helps.

Free diagnostic

See exactly what's happening in your Stripe account

Connect your Stripe account and get a breakdown of every failed payment — which ones can be retried, which ones need customer outreach, and how much is recoverable. Takes 5 minutes. No credit card required until we recover $49.

Run free diagnostic