Complete reference of Stripe's top 15 decline codes with soft vs hard categories, retry guidance, and action items for each.
Stripe decline codes split into soft declines (temporary, retryable) and hard declines (permanent, don't retry). Soft declines include insufficient_funds, processing_error, and try_again_later. Hard declines include stolen_card, lost_card, and do_not_honor. Knowing the difference determines your recovery strategy.
card_declined (generic, ~35% of failures) — bank gave no specific reason, retry after 24hrs. insufficient_funds (~25%) — soft decline, retry around paydays (1st/15th). expired_card (~15%) — hard decline, customer must update. do_not_honor (~10%) — bank-specific block, customer calls bank. processing_error (~5%) — Stripe/bank glitch, retry immediately.
In the Stripe API response, the decline_code field tells you the reason. Cross-reference with the payment_method_details.card.network to see if the card network allows retries. Soft declines on Visa/Mastercard allow up to 15 retries within 30 days before the bank blocks the merchant.
For insufficient_funds: enable Smart Retries (Stripe retries at optimal times). For expired_card: trigger a card update email via dunning. For authentication_required: your checkout needs 3D Secure (SCA). For do_not_honor: customer must call their bank. For fraudulent: review in Stripe Radar, do not retry.
Go to Payments → filter Failed → Export. The CSV includes decline_code and amount columns. Pivot by code to find your top 3 failure reasons — these typically account for 80% of lost revenue.
The average SaaS company has a 2-3% decline rate. Above 5% signals a systemic issue. Track your decline rate monthly (failed ÷ total attempts) and break down by code. Stripe’s Smart Retries recover ~15% of soft declines automatically if enabled.
Install Coby on Stripe and ask anything — like a teammate who never sleeps.
Install Coby on your Stripe account in 30 seconds. Free to start, no credit card required.