Email Templates

Stripe Payment Failed Email Templates (Copy-Paste, 2026)

5 ready-to-use email templates for Stripe payment failures — from the first alert to the final warning. Drop them into Resend, Postmark, or any transactional email provider.

By He Ze · RecoverKit · Updated March 2026 · 5 min read

Skip the setup — use RecoverKit instead

These templates are a starting point. RecoverKit connects to Stripe via OAuth and sends the entire D+1/D+3/D+7 sequence automatically — with smart stop conditions so emails stop the moment payment succeeds.

Connect Stripe Free →

Why Stripe's default payment failure emails underperform

Stripe does send a payment failure notification to customers — but it's plain-text, generic, and often lands in spam. Most SaaS businesses see open rates below 15% on these default emails.

The core problem: Stripe's default email doesn't tell the customer how to fix it. It notifies them of the failure but doesn't include a direct link to update their payment method. Customers have to log in, find their settings, and figure it out themselves — and most don't.

The templates below are designed to do three things that Stripe's defaults don't:

The most important rule: stop when payment succeeds

If you send a "final warning" after the customer has already updated their card, you destroy trust. Your recovery sequence must listen to invoice.payment_succeeded and stop immediately. This is the hardest part of DIY implementations — and why most break in production.

Where to get the card update link

Every template below uses a [CARD_UPDATE_LINK] placeholder. This is a link to Stripe's Customer Portal, pre-loaded for the specific customer.

Generate it via the Stripe API:

// Node.js / TypeScript const session = await stripe.billingPortal.sessions.create({ customer: customer.stripe_customer_id, return_url: 'https://yourapp.com/dashboard', }); const cardUpdateLink = session.url;

This link is unique to each customer and expires. Generate it fresh for each email send — don't store it.

Template 1: Day 1 — First alert (send within 2 hours of failure)

Keep it short and helpful. Don't alarm the customer — most payment failures are simple card issues they can fix in 60 seconds.

D+1
Subject: Quick note about your [Product] payment
Hi [First Name], Your payment of [amount] for [Product] on [date] didn't go through. This usually happens when a card expires, gets replaced, or is flagged by your bank. It takes about 60 seconds to fix: → Update your payment method: [CARD_UPDATE_LINK] Once updated, your subscription will continue without any interruption. If you have questions, just reply to this email. [Your Name / Team]

Why it works: No blame, no urgency pressure. Just a friendly heads-up with one clear action. The "60 seconds" framing reduces perceived effort.

Template 2: Day 3 — Gentle reminder (if D+1 had no action)

Slightly more direct. Acknowledge this is the second note, but keep the tone supportive. Mention what's at stake.

D+3
Subject: Still having trouble with your [Product] payment
Hi [First Name], We still haven't been able to process your payment of [amount] for [Product]. Your account is still active for now, but we'll need your payment updated to keep it running smoothly. It only takes a minute to fix: → Update payment method: [CARD_UPDATE_LINK] If you're experiencing any issues or have questions about your subscription, just reply to this email — we're happy to help. [Your Name / Team]

Why it works: "Your account is still active for now" creates mild urgency without panic. The offer to help reduces friction for customers who might have a more complex issue.

Template 3: Day 7 — Final warning before access pause

Be specific and concrete. State exactly when access will be paused. This email has the highest conversion rate because the urgency is real — use it honestly.

D+7
Subject: Your [Product] account will be paused tomorrow
Hi [First Name], We've been trying to process your payment of [amount] for [Product] for the past 7 days, but we haven't been able to reach you. Your account will be paused on [specific date — tomorrow's date] unless your payment is updated today. → Fix this in 60 seconds: [CARD_UPDATE_LINK] If you're experiencing financial difficulty or want to discuss your subscription, please reply to this email before [date] and we'll work something out. [Your Name / Team]

Only send this if you'll actually pause access

If you threaten to pause and don't follow through, customers learn to ignore your warnings. This email converts well precisely because the consequence is real. If you're not ready to pause access, don't send a D+7 — modify your D+3 instead.

Template 4: Payment updated — confirmation email

Send this immediately when invoice.payment_succeeded fires after a failed payment sequence. This email stops churn anxiety and closes the loop.

Recovery
Subject: Payment sorted — you're all set ✓
Hi [First Name], Your payment of [amount] for [Product] has been processed successfully. You're all set. No further action needed. Your subscription continues as normal. Thanks for updating your payment details — we know it's a small thing but it keeps your account running smoothly. [Your Name / Team]

Why it matters: Customers who received failure emails may feel anxious about their account status. This confirmation email restores confidence and reduces support tickets. Keep it short — don't over-thank.

Template 5: Card error-specific version (for expired_card)

If Stripe's webhook payload tells you why the payment failed, you can personalise the message. The card_error / expired_card decline code is the most common — here's a version optimised for it.

D+1 (Expired Card)
Subject: Your card on file for [Product] has expired
Hi [First Name], The card we have on file for your [Product] subscription expired on [card_expiry_month]/[card_expiry_year], so we weren't able to process your payment of [amount]. Adding a new card takes about 60 seconds: → Update payment method: [CARD_UPDATE_LINK] Your subscription will resume automatically once you've added a valid card. [Your Name / Team]

The Stripe webhook payload for a failed charge includes last_payment_error.decline_code and last_payment_error.code. Check for expired_card, insufficient_funds, and card_declined to personalise your messages.

How to wire these up in code

The technical implementation requires four pieces:

The hardest part isn't the emails — it's the stop condition. A cron job that doesn't check the latest payment status before sending will email customers who already paid. This is the most common failure mode in DIY dunning implementations.

See our full technical guide: Stripe Failed Payment Recovery: The Complete Guide.

Skip the build entirely

RecoverKit handles the entire sequence — webhooks, timing, stop conditions, and personalisation — without writing code. Connect your Stripe account via OAuth (read-only access) and the D+1/D+3/D+7 sequence runs automatically. Free during beta.

Open rate benchmarks by subject line type

Based on aggregated data from transactional email providers sending payment failure messages:

The highest-performing D+7 subject lines reference a specific consequence: "Your [Product] account will be paused tomorrow" consistently outperforms "Final notice: update your payment." Specificity signals authenticity — customers know it's a real deadline, not a template.

Automate the entire recovery sequence

Connect RecoverKit to your Stripe account and the D+1/D+3/D+7 sequence runs automatically — including smart stop conditions when payment succeeds. No code required.

Connect Stripe Free →

Read-only Stripe access · No credit card · Disconnect anytime