Decline codes decoded
The 12 decline codes that drive 90% of recovery outcomes.
4 min read•Updated April 1, 2026
Stripe exposes dozens of decline codes. The ones that matter most for recovery strategy:
Soft declines (retryable)
- insufficient_funds: 48-hour retry. Typically clears by next paycheck.
- do_not_honor: 72-hour retry. Generic bank refusal, often clears.
- card_velocity_exceeded: 24-hour retry. Customer hit their daily limit.
- issuer_not_available: 15-minute retry. Network blip.
- processing_error: Immediate retry. Stripe-side issue.
Hard declines (stop retrying)
- stolen_card / lost_card: Cancel subscription immediately.
- fraudulent: Cancel immediately, flag for review.
- pickup_card: Cancel immediately.
- incorrect_number / invalid_expiry: Update-card email only, no retry.
Context-dependent
- generic_decline: Single retry at 48h; if it fails again, go straight to update-card email.
- expired_card: Update-card email immediately; no retries help.
- card_not_supported: Update-card email; the customer needs to switch cards.
Omesta routes each decline through the correct path automatically. You can override the routing per-code in Settings → Recovery → Decline routing.