DunningKit

← All articles · 6 min read · 2026-05

Annual subscriptions and failed payments — the harder game

Most dunning literature is implicitly about monthly subscriptions: card fails Tuesday, retry Thursday, recover or churn within a week. Annual contracts behave completely differently. The dollar values are 12× larger, the renewal happens once a year, and aggressive dunning damages renewal trust more than it recovers revenue.

What's different

DimensionMonthlyAnnual
Charge size$50–$500$1,200–$60,000
Retry urgencyDays matter (next charge in 30 days)Weeks acceptable (next charge in 365 days)
Failure modeMostly soft declinesMostly card-doesn't-fit-amount or 3DS friction
Decision-makerSelf-serve (often)Procurement (usually)
Right toolAutomated dunningHuman renewal motion + ACH/wire fallback

Why standard dunning hurts annual contracts

Imagine you've just signed a $24,000 annual deal with a Series-A startup. The card on file is the founder's personal Amex. Renewal happens 12 months later. The card was rotated 3 months ago because Amex sent a new one with a different number. The charge fails on day 365.

If your standard dunning fires:

The customer wanted to renew. The card is dead because of an issuer-side rotation. Your dunning automation just turned a frictionless renewal into a stressful interaction. You may "recover" the charge but you've damaged the renewal relationship and made the customer 30% more likely to evaluate competitors next year.

What to do instead

1. Don't run automated dunning on annual charges over $1,000

Threshold this in your dunning automation. Charges above $1,000 should go to a human queue, not the automation. Your CSM or finance contact reaches out personally:

Subject: Renewal payment for [CompanyName] — quick question

Hi [name],

Looks like the card we had on file for [CompanyName]'s annual renewal didn't go through. Common cause is the card got rotated since we set up auto-renewal — totally normal, just need to grab a new one.

Two options:

1. Updated card on file: [Stripe payment-method update link]

2. Pay by ACH/wire: reply to this and we'll send an invoice. Many of our larger customers prefer this for annual.

No rush — service stays on as scheduled while we sort this out.

— [CSM name]

This converts at 90%+ for annual contracts. The "no rush, service stays on" line is the magic. The customer feels respected; they update the payment method when it's convenient (usually within 2–3 business days), and the recurring relationship is intact.

2. Default to ACH/wire for annual contracts above $5,000

For annual contracts that big, credit cards are the wrong instrument anyway. Either the card has a low limit and the charge gets flagged as unusual, or the card has a high limit but the customer's finance team doesn't want $X big charges on a card they have to reconcile. ACH/wire is the right default; collect a card as backup.

Stripe makes this straightforward via us_bank_account payment methods or invoiced billing.

3. Renewal "60-day pre-warm" beats post-failure dunning

The most effective recovery on annual contracts is to never have the failure in the first place. 60 days before the renewal date, send a friendly "renewal coming up" email that includes:

This pre-empts about 60% of would-be card failures because the customer takes 30 seconds to update the card before it ever gets charged.

Soft-fail mode for annual: retry quietly

If you do choose automated retries on annual charges (smaller annual contracts, <$1,000), the retry timing should be much more spaced out than monthly:

Stripe's Smart Retries default schedule for monthly subscriptions is too aggressive for annual. Customise the schedule in Stripe Billing settings or override in your own dunning logic.

The pause-vs-don't-pause question

For monthly subscriptions, pausing service after the dunning window is standard. For annual contracts, pausing is almost always the wrong move:

For annual: extend service for 30 days while you work the renewal manually. If the customer has gone genuinely dark for 30 days, then move to suspension — but at that point it's probably already a churn, not a recovery.

How DunningKit handles this

The DunningKit CLI's analysis distinguishes failed charges by interval (monthly vs annual) and surfaces them separately, with annual charges flagged as "human-touch recommended" rather than fed into automated retry sequences. The hosted tier (when it ships) lets you set per-plan rules — automated for sub-$500, semi-automated for $500–$5k, human-only above $5k.

Apache 2.0 on GitHub · pip install dunningkit

Notify me when v0.1 ships: