You can automatically recover failed Stripe payments by listening to Stripe's charge.failed or invoice.payment_failed webhook, then triggering a 3-email dunning sequence via Gmail — sent immediately, at Day 3, and Day 7. Built with n8n or Make.com, this recovers 20–40% of failed payments with zero manual effort.

Every subscription or recurring-payment business loses revenue to failed payments. Expired cards, insufficient funds, and bank declines happen constantly — and without an automated recovery system, most of that revenue is simply gone. Businesses that implement automated dunning sequences recover 20–40% of failed payments that would otherwise be lost.

This guide shows you how to build that system using free tools: Stripe webhooks, n8n or Make.com, Gmail, and Google Sheets. No developers, no paid dunning software, no SaaS subscription required.

Why do Stripe payments fail — and which failures can you recover?

Not all failed payments are equal. Understanding the failure reason tells you how recoverable it is:

Failure ReasonStripe CodeRecovery RateAction
Card expiredexpired_card40–60%Ask customer to update card
Insufficient fundsinsufficient_funds15–25%Gentle reminder, retry later
Card declined (soft)card_declined20–35%Ask customer to contact bank
Card declined (hard)do_not_honor5–10%Ask for new payment method
Lost/stolen cardlost_card / stolen_card~0%Don't email — high fraud risk
Wrong CVC/zipincorrect_cvc50–70%Ask customer to re-enter card details

The key insight: filter out lost_card and stolen_card failures before sending any recovery emails. Your workflow should check the decline code and skip emailing for these — Stripe itself flags them and will cancel the payment method.

What is a dunning sequence and how does it work?

A dunning sequence is a series of timed emails sent to a customer after a payment fails, designed to get them to update their payment details before their access is paused or their order is cancelled.

The optimal 3-email sequence for most businesses:

D0
Email 1 — Immediate (within 1 hour)
Subject: "Action needed: your payment didn't go through" — Friendly, direct. Include the amount, a card update link, and reassurance that their account is still active. No urgency yet. Recovery contribution: ~60% of all recovered payments come from this first email.
D3
Email 2 — Day 3 reminder
Subject: "Reminder: payment update needed" — Slightly warmer tone. Reference that the first email may have been missed. Include the same update link. Mention that access will continue for now but needs to be resolved. Recovery contribution: ~25% of all recovered payments.
D7
Email 3 — Day 7 final notice
Subject: "Final notice: update your payment by [date]" — Clear deadline. State that access pauses or order cancels if payment is not resolved by a specific date (usually 48–72 hours from this email). Include the update link prominently. Recovery contribution: ~15% of all recovered payments.

Important: Stop the sequence immediately if the customer pays. The workflow should listen for a invoice.payment_succeeded or charge.succeeded event and mark that customer as "recovered" in Google Sheets — preventing any further dunning emails.

How do you set up the Stripe payment recovery workflow — step by step?

1

Get your webhook URL from n8n or Make.com

In n8n: create a new workflow, add a Webhook node, set Method to POST, copy the Production URL. In Make.com: create a scenario, add a Webhooks module, copy the webhook address. You'll paste this URL into Stripe in the next step.

2

Register the webhook in Stripe

In your Stripe Dashboard: Developers → Webhooks → Add endpoint. Paste your webhook URL. Under "Events to listen to", select charge.failed and invoice.payment_failed. Also add invoice.payment_succeeded for recovery detection. Save. Note the Webhook Signing Secret — you'll need it to verify payloads in n8n.

3

Import the workflow template

Download the Peak Automations Payment Recovery template, extract the ZIP, and import the JSON into n8n (Workflows → Import) or Make.com (Scenarios → Import Blueprint). The workflow includes: webhook receiver → decline code filter → Google Sheets logger → Email 1 (immediate) → 3-day wait → Email 2 → 4-day wait → Email 3 → recovery check.

4

Connect Gmail and Google Sheets

Click the Gmail nodes and authenticate with your Google account via OAuth. Click the Google Sheets node, authenticate, and select (or create) a spreadsheet to serve as your failed payment dashboard. The workflow will log: customer email, amount, failure reason, date, current email step, and recovery status.

5

Edit the email templates

Open each of the three Gmail nodes and customise: replace [BUSINESS NAME], update the support email, and adjust the payment portal link. Use Stripe's Customer Portal URL for the card update link — enable it in Stripe under Settings → Billing → Customer Portal. Each email has placeholder copy you can use as-is or personalise.

6

Test with Stripe's test webhook tool

In Stripe Dashboard → Developers → Webhooks, select your endpoint and click "Send test webhook". Choose charge.failed as the event type. Confirm the workflow executes, the Google Sheet logs the entry, and Email 1 is sent to your test address. Check the execution log for any errors before going live.

What should the payment recovery emails actually say?

Email 1 — Immediate notification

Subject: Action needed: your recent payment didn't go through

Hi [Name],

We tried to process your payment of [amount] today, but unfortunately it wasn't successful. This sometimes happens when a card expires or has new details.

→ Update your payment details here [link]

Your account is still active — no action has been taken yet. Simply update your payment method and everything will continue as normal.

If you have any questions, reply to this email or contact support@[yourdomain.com].

[Your name]

Email 3 — Final notice (Day 7)

Subject: Final notice: please update your payment by [date + 48 hrs]

Hi [Name],

This is a final notice regarding the failed payment of [amount] on [date]. We've sent two previous emails but haven't heard back.

Your access will be paused on [date + 48 hrs] if payment is not resolved.

Update your payment details now [link]

If you've already resolved this, please ignore this message. If you're having trouble, reply and we'll help.

[Your name]

How do you track recovery rate in Google Sheets?

The workflow automatically logs each failed payment to a Google Sheet with these columns: Customer Email, Customer Name, Amount, Currency, Failure Reason, Stripe Customer ID, Date Failed, Email 1 Sent, Email 2 Sent, Email 3 Sent, Status (Pending / Recovered / Written Off).

When the workflow detects a invoice.payment_succeeded event for a customer in the sheet, it updates their Status to "Recovered" and stops any remaining emails. This gives you a live dashboard of your recovery performance over time.

To calculate your recovery rate: Recovered rows ÷ Total failed rows × 100. A well-tuned dunning sequence typically lands between 25–40% for SaaS businesses and 15–25% for e-commerce.

Should you build this yourself or use a pre-built template?

ApproachTime to BuildCostCustomisability
Build from scratch (n8n/Make)8–15 hoursFreeFull
Pre-built template (Peak Automations)20–30 minutes$97 one-timeFull — edit any node
Stripe's built-in Smart Retries0 (automatic)Included in StripeNone — black box
Paid dunning SaaS (Churnkey, Paysail)2–4 hours$50–$200/monthLimited to their UI

Note on Stripe Smart Retries: Stripe's built-in retry logic automatically retries failed subscription payments up to 4 times over several days. This is useful but it only handles retries — it doesn't send personalised customer emails or give you a recovery dashboard. Use Smart Retries alongside (not instead of) a dunning email sequence.

Get the pre-built Stripe Payment Recovery workflow

Complete n8n and Make.com workflow JSON, 3-email dunning templates, Google Sheets dashboard, and plain-English setup guide. Works in under 30 minutes.

$97 — one-time, no subscription
Get the Template →
See what's included →

Frequently asked questions

Industry benchmarks show 20–40% of failed payments can be recovered through automated dunning sequences. The recovery rate depends on the failure reason: expired cards (highest — 40–60%), insufficient funds (15–25%), and bank declines (10–20%). A 3-email sequence over 7 days captures the majority of recoverable payments.
invoice.payment_failed fires when a recurring subscription payment fails — it's the right event for SaaS or subscription businesses. charge.failed fires when any one-time charge fails — better for e-commerce or single purchases. If you have both, listen to both events and route them through the same dunning sequence.
Three emails over 7 days is the industry-standard sequence. Beyond 7 days, recovery rates drop sharply and you risk damaging the customer relationship. The final email should set a clear deadline — "your access will pause on [date]" — which significantly improves Day 7 recovery rates.
Yes. Use the charge.failed webhook event instead of invoice.payment_failed. The email sequence is the same — the customer receives a payment update link and a series of follow-up emails. For one-time payments, the urgency framing shifts: instead of "your subscription will pause", use "your order cannot be processed until payment is updated".
Enable Stripe's Customer Portal in your dashboard under Settings → Billing → Customer Portal, and turn on "Payment methods". The workflow calls Stripe's API to generate a unique, secure session URL for each customer and includes it in Email 1 automatically — no manual link creation needed.
The workflow listens for a invoice.payment_succeeded or charge.succeeded event. When Stripe fires that event for a customer already in your dunning sequence, the workflow updates their status in Google Sheets to "Recovered" and skips all remaining emails. This prevents sending a "final notice" email to someone who already paid.

Stop losing revenue to failed payments

The pre-built workflow handles everything — Stripe webhook, 3-email dunning sequence, recovery tracking, duplicate prevention. One-time purchase, runs forever.

$97 — one-time purchase, yours forever
Get the Payment Recovery Template →
Full product details →