Business & Growth

What Is Dunning and How Does It Recover Failed Payments?

Learn how businesses automatically recover failed payments and keep customers happy — without losing revenue to expired cards.

Scroll to start

The Gentle Art of Getting Paid

Every month, thousands of subscription payments fail. Maybe a customer's credit card expired. Maybe they hit their spending limit. Maybe there was a bank glitch. The customer usually wants to keep their subscription — but if no one asks them to fix it, they drift away silently.

Dunning is the name for a smart, automated follow-up process that businesses use to recover those failed payments. Instead of just giving up and cancelling the account, the business sends a series of friendly messages asking the customer to update their payment information.

Think of it like a landlord politely reminding a tenant that the rent check bounced — except the landlord sends three emails, a text, and a final notice before taking any action. The goal is always to help the customer stay, not to punish them.

Failed Payments Are a Silent Revenue Killer

Most businesses spend a lot of time worrying about getting new customers. But keeping existing customers who want to stay is often easier — and more profitable. Failed payments are one of the biggest threats to that retention.

Here's the surprising part: most customers whose payments fail don't know it happened. They assume the subscription is still active. Then one day their access gets cut off and they feel blindsided. Many never come back.

A well-run dunning campaign can recover 20–40% of failed payments that would otherwise be lost forever. For a business making $50,000 per month in subscriptions, that could mean tens of thousands of dollars saved every year — just by asking customers nicely to update their card.

💡 Key Insight

Most customers who fail to pay don't want to cancel — they just need a gentle reminder and an easy way to fix their payment info. The dunning process exists to give them that chance.

Why Payments Fail

Expired cards, insufficient funds, bank declines, and outdated billing addresses are the most common causes — most are fixable.

✉️

What Dunning Does

Sends timed, friendly reminders at each stage — from a soft heads-up to a final notice before service is paused.

💰

The Business Impact

20–40% of failed payments can be recovered. For subscription businesses, that's real money sitting in the dunning pipeline.

The Dunning Timeline

A typical dunning sequence plays out over 7–14 days. Each step gets slightly more urgent, but always stays helpful. Here's how it usually goes:

The Dunning Sequence
⚠️
Payment Fails
First charge attempt is declined
Day 0
📧
Soft Reminder
Friendly email asking to update card info
Day 1–3
📱
Second Notice
More urgent reminder with direct link
Day 4–6
Final Warning
Account suspension notice if no update
Day 7–10
Resolved
Customer updates card, billing resumes
Recovery!

The best dunning emails do three things: explain what went wrong, show how to fix it in one click, and remind the customer why their subscription is worth keeping. They never guilt-trip or threaten — they make it easy to say yes.

A Simple Dunning Script

Here's what a basic dunning system looks like in code. This is a simplified version of what payment platforms like Stripe can handle automatically. The idea: detect a failed payment, then queue up reminders on a schedule.

dunning.py
# A simplified dunning flow
from datetime import datetime, timedelta

def handle_failed_payment(customer, invoice):
    # Step 1: Send a soft reminder email right away
    send_email(customer, "We couldn't charge your card",
               "No worries — update your payment info here:",
               update_link(customer))

    # Step 2: Schedule a second reminder for 3 days later
    schedule_email(
        customer,
        send_date=datetime.now() + timedelta(days=3),
        subject="Reminder: Update your payment details"
    )

    # Step 3: Schedule a final warning for 7 days later
    schedule_email(
        customer,
        send_date=datetime.now() + timedelta(days=7),
        subject="Last chance — update your card today"
    )

    # Step 4: Mark account for review if still unpaid after 10 days
    if not is_paid(invoice, days=10):
        flag_for_review(customer)
        notify_support(customer)

This is the core logic. In practice, tools like Stripe handle all of this automatically through their dunning and retry logic features — you just configure how many days between attempts and how many total retries to allow before marking the invoice as lost.

Knowledge Check

Test what you learned with this quick quiz.

Quick Quiz — 3 Questions

Question 1
What is the main goal of a dunning process?
Question 2
What percentage of failed payments can a good dunning campaign typically recover?
Question 3
Why do most customers whose payments fail NOT主动 cancel their subscriptions?
🏆

You crushed it!

Perfect score on this module.