Glossary
Decline codes
A decline code is the reason a card issuer (Visa, Mastercard, Amex, Discover) returned when it refused a charge. Every failed payment in Stripe, Adyen, Braintree, or any other processor comes with one. Reading them correctly is the difference between recovering 70% of failed payments and recovering 20%.
Why decline codes matter for recovery
The single biggest mistake in dunning systems is treating every failed payment the same way. A generic_decline and an insufficient_funds are not the same problem and should not be retried on the same schedule.
insufficient_funds→ wait until likely payday (3-5 days), retry.expired_card→ email the customer to update, do not retry the same card.stolen_card/lost_card→ stop. Do not retry. Card is dead.do_not_honor→ soft decline, retry after 24-48h with different MID if possible.generic_decline→ ambiguous, retry once with optimized timing.
Without code-aware logic, you waste retries on dead cards and miss the window on recoverable ones.
The most common Stripe decline codes
The codes you'll see most often, in order of frequency for typical e-commerce:
- generic_decline — most common, ambiguous, recoverable.
- insufficient_funds — highly recoverable with timing optimization.
- do_not_honor — recoverable, soft decline.
- expired_card — recoverable only via card-update flow.
- incorrect_cvc — recoverable, customer typo.
- card_velocity_exceeded — recoverable after cooldown.
- lost_card / stolen_card — not recoverable.
- fraudulent — not recoverable, do not retry.
How Omesta uses decline codes
Omesta reads the decline code on every failed charge in your Stripe account and routes the retry through one of 12 distinct recovery strategies. For example, an insufficient_funds decline on a Tuesday triggers a retry on the following Monday at 9am local time. An expired_card skips retries entirely and triggers a card-update email with a one-click update link.
See the full decline-code routing for which codes map to which strategy.
Where to find the decline code
In Stripe Dashboard, open any failed payment. The decline reason is under "Outcome." In the API, it's charge.outcome.reason and charge.failure_code. The card network's underlying code is also there for network-level analysis.
Ready to put decline-code-aware recovery to work on your store? Run a leak scan — you'll see your failed-payment volume broken down by decline code in two minutes.