# Dunning Letter: Templates, Stages, and Examples (2026)

> What a dunning letter is, the four escalation stages, what each notice must include, and copy-paste dunning letter templates for B2B invoices and SaaS.
- **Author**: Deepak Jangir
- **Published**: 2026-10-07
- **Category**: Billing, SaaS
- **URL**: https://dodopayments.com/blogs/en/dunning-letter

---

An invoice is 20 days overdue. You send a polite nudge, hear nothing, and then the next email you write is either too soft to get action or so sharp that the customer forwards it to their CFO with a complaint. Most founders write these messages from scratch, under pressure, one account at a time. That is the problem a set of dunning letters solves.

This guide covers the letter itself: what it is, the four escalation stages, what every notice must contain, how tone should change from one stage to the next, and full templates you can copy. If you want the broader strategy, start with our explainer on [what dunning management is and why it matters](https://dodopayments.com/blogs/dunning-management). If you need a ready-made email cadence for failed card renewals, read the [14-day subscription dunning recovery sequence](https://dodopayments.com/blogs/subscription-dunning-recovery-sequence).

## What Is a Dunning Letter?

A dunning letter is a written notice that tells a customer a payment is overdue or has failed, states exactly what is owed, and asks them to pay by a specific date. It is usually one of a series, with each letter escalating in urgency until the account is paid, suspended, or handed to collections.

Today a dunning notice is almost always an email, sometimes backed by an in-app banner or a physical letter for large B2B balances. Its job is to remove every excuse for not paying. Dunning letters show up in two very different contexts, and mixing them up is a common mistake.

| Dimension | B2B overdue invoice letter | B2C / SaaS failed-payment notice |
| --- | --- | --- |
| Trigger | Invoice passes its due date unpaid | Card or wallet renewal charge fails |
| Who reads it | Accounts payable, finance contact, sometimes the buyer | The individual subscriber |
| Usual cause | Approval delays, lost invoice, cash flow, disputes | Expired card, insufficient funds, bank decline |
| Key fix | Pay the invoice by bank transfer or card | Update the payment method |
| Must reference | Invoice number, PO number, payment terms | Plan name, renewal date, failure reason |
| Escalation endpoint | Late fees (if contracted), credit hold, collections | Service paused, then subscription cancelled |
| Tone ceiling | Formal and firm | Helpful, then clear about access loss |

The B2C case is mostly involuntary: the customer wants the product, their card just did not work (see [how failed payments drive involuntary churn](https://dodopayments.com/blogs/involuntary-churn-failed-payments)). The B2B case is often a buyer-side process problem, so the letter needs references their finance team can match.

## The Four Dunning Process Stages

Most dunning programs use three or four letters. Four gives you room to escalate without jumping from "friendly" straight to "we are cutting you off."

```mermaid
flowchart TD
    A["Payment fails or invoice goes overdue"] --> B["Stage 1: Friendly reminder"]
    B -->|Paid| G["Account current, send receipt"]
    B -->|No response| C["Stage 2: Second notice"]
    C -->|Paid| G
    C -->|No response| D["Stage 3: Final notice"]
    D -->|Paid| G
    D -->|No response| E["Stage 4: Suspension or collections notice"]
    E -->|Paid| G
```

Here is how the stages compare at a glance.

| Stage | Typical timing (B2B invoice) | Typical timing (SaaS renewal) | Tone | Primary goal |
| --- | --- | --- | --- | --- |
| 1. Friendly reminder | A few days after due date | Same day or day after failure | Warm, assumes oversight | Get paid with zero friction |
| 2. Second notice | 1-2 weeks overdue | A few days after failure | Neutral, direct | Confirm receipt, surface blockers |
| 3. Final notice | 3-4 weeks overdue | About a week after failure | Firm, specific consequences | Create a real deadline |
| 4. Suspension / collections | After final deadline passes | When retries and grace period end | Formal, factual | Execute the stated consequence |

The timings are starting points, not rules. Your contract terms set the B2B clock. If you invoice on [Net 30 payment terms](https://dodopayments.com/blogs/payment-terms-net-30), a first reminder three days past due is reasonable. For subscriptions, automated card retries run in parallel with the letters, which is why SaaS sequences are compressed into days rather than weeks.

## What Every Dunning Notice Must Contain

Every dunning letter should let the reader pay without replying to ask a question. If they must email you for the invoice PDF or a payment link, you have added a week to the cycle.

Include these elements in every letter:

- **Amount owed** in the customer's billing currency, including any tax already charged on the invoice.
- **Original due date** or the date the renewal charge failed.
- **Invoice number** (B2B) or subscription ID and plan name (SaaS). A clean [invoice numbering system](https://dodopayments.com/blogs/invoice-number) makes this easy for the customer's AP team to match.
- **A direct payment link** or customer portal link that opens on the exact invoice or subscription.
- **What happens next**, stated plainly, with a date.
- **A named contact** and reply-to address that reaches a human.

For SaaS failed payments, add the failure reason in plain language. "Your bank declined the charge for insufficient funds" is actionable; a raw error code is not. Our guide to [credit card decline codes](https://dodopayments.com/blogs/credit-card-decline-codes) maps the common ones.

## Tone by Stage: How a Dunning Letter Should Escalate

Tone should escalate in clarity, not in hostility. Each letter should be more specific than the last about deadlines and consequences, while staying professional enough that you would be comfortable if it were forwarded to the customer's CEO.

- **Stage 1** assumes good faith. Most overdue payments are oversights or expired cards.
- **Stage 2** is neutral and direct. Ask whether something is blocking payment and offer alternatives.
- **Stage 3** is firm. Name the date and the consequence, and say this is the last notice before action.
- **Stage 4** is factual. Confirm what happened, what is owed, and how to restore the account.

## Legal and Fair-Collection Cautions

Dunning letters are subject to consumer protection and debt collection rules in many places, and those rules differ by country, state, and whether the debtor is a consumer or a business. This section is general guidance, not legal advice. Have counsel review your final notices, especially anything that mentions fees, credit reporting, or collections.

General principles that keep you on safe ground almost everywhere:

- **Only state consequences you will actually carry out.** Threatening action you will not take can create liability on its own.
- **Only charge late fees or interest your contract allows.** If your terms say nothing about late fees, the letter should not invent one.
- **Be accurate about the amount.** Overstating a balance, even by mistake, undermines the notice.
- **Do not contact third parties** about a consumer's debt, and avoid language that is harassing, deceptive, or implies you are a law firm or government body.
- **Keep records** of every notice and respect opt-outs where the law requires it.
- **Separate service notices from debt collection.** Pausing access is a service update. Handing a debt to an agency triggers different, often stricter, rules.

For SaaS selling to consumers, the simplest approach is to keep stage 4 a service notice and avoid collections language for small balances.

## Dunning Letter Templates for Each Stage

Below are copy-paste templates for both contexts. Replace anything in curly braces. Keep the subject lines; they matter as much as the body.

### Stage 1: Friendly Reminder Template (B2B Invoice)

```text
Subject: Reminder: Invoice {invoice_number} was due on {due_date}

Hi {customer_name},

A quick reminder that invoice {invoice_number} for {amount_due} was due on {due_date} and is still showing as open on our side.

If it is already in your payment run, thank you and please ignore this note. If not, you can pay by card or bank transfer here: {payment_link}

Invoice PDF: {invoice_pdf_link}
PO number: {po_number}

Thanks,
{sender_name}
{company_name} | {billing_contact_email}
```

### Stage 1: Friendly Reminder Template (SaaS Failed Payment)

```text
Subject: Your {plan_name} payment didn't go through

Hi {customer_name},

We tried to charge {amount_due} for your {plan_name} renewal on {failed_date}, but the payment was declined ({failure_reason}).

Your account is still active. To keep it that way, update your payment method here: {update_payment_link}

It takes under a minute, and we will retry the charge as soon as your details are updated.

Thanks,
The {company_name} team
```

### Stage 2: Second Notice Template

```text
Subject: Second notice: {invoice_number} is {days_overdue} days overdue

Hi {customer_name},

Invoice {invoice_number} for {amount_due} is now {days_overdue} days past its due date of {due_date}. We have not received payment or a reply to our earlier reminder.

If something is blocking payment, such as a missing PO, an incorrect billing address, or a question about the charges, reply to this email and we will sort it out the same day.

Pay now: {payment_link}

Regards,
{sender_name}
{company_name} Accounts Receivable | {billing_contact_email}
```

### Stage 3: Final Notice Template

```text
Subject: Final notice: action required by {final_deadline}

Hi {customer_name},

This is our final notice regarding {invoice_number} for {amount_due}, originally due on {due_date}.

If payment is not received by {final_deadline}, we will {consequence}, as described in section {terms_section} of our agreement dated {agreement_date}.

Pay now: {payment_link}

If you have already paid, please send the remittance details to {billing_contact_email} so we can match it. If you need a payment plan, reply before {final_deadline} and we will discuss options.

Regards,
{sender_name}
{company_name}
```

Replace `{consequence}` with something concrete and contractually supported, for example "suspend access to your workspace" or "place the account on credit hold."

### Stage 4: Suspension or Collections Notice Template

```text
Subject: Your {company_name} account has been suspended

Hi {customer_name},

As we notified you on {final_notice_date}, payment for {invoice_number} ({amount_due}) was not received by {final_deadline}. As a result, access to {product_name} has been suspended as of {suspension_date}.

Your data is retained until {data_retention_date}. To restore access immediately, pay the outstanding balance here: {payment_link}

If the balance remains unpaid after {data_retention_date}, {next_action}.

For questions, contact {sender_name} at {billing_contact_email}.

{company_name}
```

Only fill in `{next_action}` with something you will really do, such as "the subscription will be cancelled" or, for B2B balances where your contract allows it, "the account will be referred to our collections partner."

## Dunning Email Examples: What Good Looks Like

The best dunning email examples are short, specific, and have one call to action. Compare a weak stage 2 with a strong one.

Weak: "We noticed your account has an outstanding balance. Please make payment at your earliest convenience to avoid any disruption."

Strong: "Invoice INV-2026-0412 for $1,200 was due on September 15 and is now 14 days overdue. If a PO or approval is holding it up, reply and we will fix it today. Pay here: {payment_link}."

The weak version has no amount, reference, or date. The strong one can be acted on by someone in AP who has never heard of you. The same goes for subject lines: "Invoice INV-2026-0412: 14 days overdue" beats "Action needed".

Put the payment link above the fold, send B2B letters from a real person, and stop the sequence the moment payment lands. If your invoices are generated automatically, pull dunning letters from the same data; our guide to [automated invoices for SaaS](https://dodopayments.com/blogs/automated-invoices-saas) covers keeping them in sync.

## Automating Dunning Letters with Webhooks

For subscriptions, dunning letters should be triggered by payment events, not sent by hand.

Dodo Payments has built-in [Subscription Dunning](https://docs.dodopayments.com/features/recovery/subscription-dunning) that sends up to four emails per sequence when a subscription goes on hold, goes past due during a grace period, or is cancelled from the customer portal. Default delays are 1, 3, 5, and 7 days, and each email links to the customer portal to update the payment method. It works alongside automatic [payment retries](https://docs.dodopayments.com/features/recovery/payment-retries), and since September 2026 you can also trigger a [manual payment retry](https://docs.dodopayments.com/features/recovery/manual-retry) and configure subscription grace periods so customers keep access while the letters go out. Recovery features are free to enable, and you pay 5% only on revenue that is actually recovered, per the [Dodo Payments pricing page](https://dodopayments.com/pricing).

For custom letters, in-app banners, or alerts to an account manager, listen to webhooks and pick the stage yourself. The relevant events are `payment.failed`, `subscription.on_hold`, `subscription.past_due`, `dunning.started`, and `dunning.recovered`. The [recovery webhook reference](https://docs.dodopayments.com/developer-resources/webhooks/intents/recovery) documents the `trigger_state` field on `dunning.started`, which tells you whether the subscription is `past_due`, `on_hold`, or `cancelled`.

Dodo webhooks follow the Standard Webhooks spec, so verify the signature before you trust the payload. Here is a minimal Express handler:

```typescript
import express from 'express';
import { Webhook } from 'standardwebhooks';

const app = express();
const wh = new Webhook(process.env.DODO_WEBHOOK_SECRET!);

type Stage = 'friendly_reminder' | 'second_notice' | 'final_notice' | 'suspension';

// Your own store. recordFailure is idempotent and returns the first failure time.
declare function recordFailure(subscriptionId: string): Promise<Date>;
declare function alreadySent(subscriptionId: string, stage: Stage): Promise<boolean>;
declare function sendLetter(customerId: string, subscriptionId: string, stage: Stage): Promise<void>;
declare function stopSequence(subscriptionId: string): Promise<void>;

function pickStage(daysSinceFailure: number): Stage {
  if (daysSinceFailure < 3) return 'friendly_reminder';
  if (daysSinceFailure < 6) return 'second_notice';
  return 'final_notice';
}

app.post('/webhooks/dodo', express.raw({ type: 'application/json' }), async (req, res) => {
  const rawBody = req.body.toString('utf8');

  try {
    wh.verify(rawBody, {
      'webhook-id': req.header('webhook-id') ?? '',
      'webhook-signature': req.header('webhook-signature') ?? '',
      'webhook-timestamp': req.header('webhook-timestamp') ?? '',
    });
  } catch {
    return res.status(401).send('Invalid signature');
  }

  const event = JSON.parse(rawBody);
  const data = event.data;

  switch (event.type) {
    case 'payment.failed':
    case 'subscription.past_due':
    case 'dunning.started': {
      if (!data.subscription_id) break; // one-time payments use a different flow
      const firstFailure = await recordFailure(data.subscription_id);
      const days = (Date.now() - firstFailure.getTime()) / 86_400_000;
      const stage = pickStage(days);
      // Several events can fire for one failure, so never send the same stage twice.
      if (await alreadySent(data.subscription_id, stage)) break;
      await sendLetter(data.customer_id ?? data.customer?.customer_id, data.subscription_id, stage);
      break;
    }
    case 'subscription.on_hold':
      // Renewals have stopped: this is the stage 4 service notice.
      await sendLetter(data.customer?.customer_id, data.subscription_id, 'suspension');
      break;
    case 'dunning.recovered':
    case 'subscription.renewed':
      await stopSequence(data.subscription_id);
      break;
  }

  res.json({ received: true });
});

app.listen(3000);
```

Verify against the raw body, since parsing JSON first breaks the signature check, and always stop the sequence on recovery events. If you also use Dodo's built-in dunning emails, let one system own customer-facing email, or customers will get duplicates. See the [webhooks overview](https://docs.dodopayments.com/developer-resources/webhooks) for endpoint setup and retries.

Letters only work when the payment underneath can succeed. Pair them with smart [payment retry logic](https://dodopayments.com/blogs/payment-retry-logic), an [account updater service](https://dodopayments.com/blogs/account-updater-service), and the tactics in [how to reduce payment declines](https://dodopayments.com/blogs/reduce-payment-declines).

## FAQ

### What is a dunning letter?

A dunning letter is a written notice that tells a customer a payment is overdue or has failed, states the amount and due date, and asks them to pay by a set deadline. It is usually part of a sequence that escalates from a friendly reminder to a final notice and then to suspension or collections.

### How many dunning letters should I send before suspending an account?

Three to four is the common range: friendly reminder, second notice, final notice, and a suspension or collections notice. SaaS sequences often run over about a week alongside retries, while B2B invoice sequences stretch over several weeks.

### What should a dunning notice include?

Include the amount owed, the due date or failed charge date, the invoice number or subscription reference, a direct payment link, the consequence if unpaid, and a contact. Later stages add an exact deadline.

### Is a dunning letter the same as a collections letter?

No. A dunning letter comes from the business itself and aims to get paid while keeping the customer. A collections letter usually follows failed dunning, often from a third-party agency, and faces stricter rules in many jurisdictions.

### Can I automate dunning letters for subscriptions?

Yes. Dodo Payments can send dunning emails automatically when a subscription goes on hold, past due, or is cancelled, and you can also listen to webhooks such as `dunning.started` and `subscription.on_hold` to send your own letters. Recovery is free to enable and costs 5% only on revenue that is recovered.

## Final Take

A good dunning letter is boring: exact amount, exact reference, one link, one deadline, and a consequence you will enforce. Write your four stages once, keep B2B and subscription letters separate, and trigger them from payment events.

If you run subscriptions, [Dodo Payments](https://dodopayments.com) handles the letters, retries, and grace periods for you as the Merchant of Record, alongside [subscription billing](https://dodopayments.com/billing) and global tax. Check [pricing](https://dodopayments.com/pricing) to see how recovery fees only apply to revenue you get back.
---
- [More Billing articles](https://dodopayments.com/blogs/category/billing)
- [All articles](https://dodopayments.com/blogs)