
stripe decline codes explained
Stripe Decline Codes Explained: When to Retry vs Request Action
Stripe Decline Codes Explained
Stripe decline codes are standardized error identifiers returned by card networks and issuing banks when a payment cannot be processed, categorized into soft declines (temporary issues where automatic retries may succeed) and hard declines (permanent blocks requiring customer action before any retry).
Soft Decline Codes: Retry-Safe Scenarios
Soft declines represent temporary payment failures where the underlying payment method remains valid and automatic retry logic may result in successful authorization. These codes account for approximately 20–30% of all declined transactions according to payment industry benchmarks.
Common soft decline codes include:
generic_decline– The most common soft decline, often issued when banks perform risk checks or experience temporary processing issuesissuer_not_available– The card issuer's authorization system is temporarily offline or unreachableprocessing_error– A technical error occurred during transaction processing at the network or issuer leveltry_again_later– Explicit instruction from the issuer that the transaction may succeed if retried after a delay
For soft declines, Stripe's Smart Retries feature automatically reattempts authorization using machine learning to identify optimal retry timing, typically within 24–72 hours. Manual retry attempts should implement exponential backoff (waiting progressively longer between attempts) to avoid triggering fraud detection systems.
Hard Decline Codes: Customer Action Required
Hard declines indicate permanent authorization failures that will consistently fail regardless of retry timing or frequency. These represent 70–80% of payment declines and require the customer to resolve the underlying issue before any successful charge can occur.
Critical hard decline codes include:
insufficient_funds– The account lacks available balance to cover the transaction amountcard_declined– Generic permanent decline, often due to issuer risk rules or account restrictionsexpired_card– The payment method has passed its expiration dateincorrect_cvc/incorrect_number/incorrect_zip– Card details provided do not match issuer recordslost_card/stolen_card– The card has been reported compromised and is permanently blockeddo_not_honor/do_not_try_again– Explicit issuer instruction to cease authorization attemptsfraudulent– Stripe's Radar or the issuer has flagged the transaction as fraudulentcard_not_supported– The card type is not accepted (e.g., prepaid cards when prohibited)currency_not_supported– The card cannot process transactions in the requested currency
Stripe's decline_code API Parameter
Stripe returns decline information in the last_payment_error.decline_code field of failed PaymentIntent or Charge objects. This code originates from the card network or issuing bank and follows standardized industry codes defined by Visa, Mastercard, American Express, and Discover.
Example API response excerpt:
"last_payment_error": {
"code": "card_declined",
"decline_code": "insufficient_funds",
"message": "Your card has insufficient funds."
}
The decline_code provides granular failure reasons, while the code field categorizes the error type at Stripe's API level.
Retry Strategy Best Practices
For soft declines:
- Enable Stripe Smart Retries for automatic optimization
- If implementing manual retries, wait at least 24 hours before first retry
- Limit retry attempts to 2–3 maximum to avoid issuer penalties
- Monitor retry success rates by decline code to refine logic
For hard declines:
- Never retry without customer intervention
- Prompt customers to update payment details or contact their bank
- Use Stripe's decline messages (available in
last_payment_error.message) to communicate specific action needed - For
insufficient_funds, consider offering alternate payment methods or reduced payment amounts
Decline Code Distribution
According to payment industry data, the most frequent decline codes are:
generic_decline(18–25% of declines)insufficient_funds(15–20%)card_declined(15–18%)do_not_honor(8–12%)expired_card(5–8%)
Decline patterns vary significantly by industry vertical, geographic market, and average transaction value. Subscription businesses typically see higher rates of insufficient_funds and expired_card, while one-time purchases generate more generic_decline and fraud-related codes.
Regulatory and Network Compliance
Card networks impose strict rules on retry behavior. Visa and Mastercard guidelines prohibit retrying hard decline codes without explicit customer action, and excessive retry attempts can result in merchant penalties or processing privilege revocation. Stripe's retry logic is designed to comply with these network rules automatically when Smart Retries is enabled.
Related
Free diagnostic
See exactly what's happening in your Stripe account
Connect your Stripe account and get a breakdown of every failed payment — which ones can be retried, which ones need customer outreach, and how much is recoverable. Takes 5 minutes. No credit card required until we recover $49.
Run free diagnostic