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.
| Dimension | Monthly | Annual |
|---|---|---|
| Charge size | $50–$500 | $1,200–$60,000 |
| Retry urgency | Days matter (next charge in 30 days) | Weeks acceptable (next charge in 365 days) |
| Failure mode | Mostly soft declines | Mostly card-doesn't-fit-amount or 3DS friction |
| Decision-maker | Self-serve (often) | Procurement (usually) |
| Right tool | Automated dunning | Human renewal motion + ACH/wire fallback |
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.
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.
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.
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.
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.
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.
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