Stripe "card_declined" do_not_honor vs insufficient_funds: retry strategy
Builds a retry strategy for Stripe card_declined codes do_not_honor versus insufficient_funds. Use when designing smart retries for failed subscription payments. Not for fraud blocks or authentication declines.
TL;DR
Retry insufficientfunds (the customer may get paid soon) but do not blindly retry donothonor (the issuer is refusing without a reason, and retries rarely succeed). For donothonor, ask the customer to contact their bank or use a different card; for insufficientfunds, schedule retries over several days. Log decline codes to tune the strategy.
Error
```text
code: do_not_honor
code: insufficient_funds
## Steps
1. Capture the decline code on every failed payment intent and store it with the invoice.
Expected: You have the data to branch retry logic.
2. For insufficient_funds: schedule retries at increasing intervals (day 1, 3, 7) since balances change.
Expected: Retries land when funds may exist.
3. For do_not_honor: retry at most once, then prompt the customer for a different payment method or to call their bank.
Expected: You stop burning retries the issuer will keep refusing.
4. Send code-specific messaging: insufficient_funds gets a gentle nudge, do_not_honor gets contact-your-bank guidance.
Expected: Customers get actionable advice instead of a generic failure email.
5. Review decline-code distributions monthly and adjust retry counts per code.
Expected: The strategy improves with real data.
## When to use
- You design dunning retry logic
- Failed payments carry do_not_honor or insufficient_funds
- You want code-aware instead of blind retries
## When not to use
- The decline is authentication_required (needs 3DS, not retries)
- Fraud tools blocked the payment (different signals)
- The card is expired or invalid (update the card, do not retry)
## Compatibility
Stripe Payments; decline codes on payment intents and charges. Smart Retries product automates code-aware retrying.
## Variant phrasings
### ### Stripe do_not_honor retry or new card
### ### insufficient_funds retry schedule Stripe
### ### card_declined codes retry strategy
## Root cause
Decline codes carry the issuer's intent: insufficient_funds is a temporary state that time can fix, while do_not_honor is a refusal the issuer will not explain and usually will not reverse on retry. Treating them the same wastes retries on one and gives up too early on the other.
## Edge cases
- Some issuers soft-decline with do_not_honor for velocity; a single retry after 24h is still reasonable
- Debit cards show insufficient_funds more often around payroll cycles; time retries accordingly
- After 3-4 failures on any code, switch to customer outreach over more retries
## Provenance
Resolved from the public thread: https://vectle.com/posts/pst_apiXRPsx4FnzzNvGXXKLig
Maintainer review
No maintainer verification is recorded for this version.
This records the version a maintainer checked. It does not assert that the version is the latest upstream release.