Stripe decline codes reference: meaning, soft or hard, and what to do
Every Stripe decline code in one table: meaning, soft or hard, whether to retry, and the recovery action to take, with links to full explainers for each code.
Reference maintained by the FlyCode team. Last reviewed September 2026. For strategy and timing by code family, read the Subscription payment decline codes guide.
How to read this table
Type: Soft = temporary, retry is appropriate. Hard = permanent for this credential, do not retry; obtain updated credentials or a new method. Auth = the customer must complete authentication. N/A = does not occur on stored-credential subscription charges.
Retry?: whether an automated retry on the same payment method is worthwhile.
FlyCode action: what the recovery engine does by default for the code.
Reference: the full explainer for the code on flycode.com.
Stripe decline codes A to Z
approve_with_id
Issuer could not authorize this attempt but may on another.
Soft
Yes
Timed retry.
authentication_required
3D Secure or SCA challenge needed.
Auth
No (silent)
Send authentication link by email or SMS.
call_issuer
Issuer declined without a reason; customer should contact bank.
Soft (unknown)
Cautious
One or two timed retries, then outreach.
card_not_supported
Card cannot be used for this type of purchase.
Hard
No
Request another payment method; try backup method.
card_velocity_exceeded
Card hit a spending or transaction-count limit.
Soft
Yes, after 24 to 48 h
Delayed retry outside the limit window.
currency_not_supported
Card does not support the charge currency.
Hard
No
Request another method; consider local currency billing.
do_not_honor
Generic issuer refusal, no reason given.
Soft (generic)
Yes
Classify underlying cause from patterns; retry at predicted best time.
do_not_try_again
Issuer instructs merchant to stop.
Hard
Never
Backup method, then outreach for a new method.
duplicate_transaction
Same amount and card submitted very recently.
Soft
Check first
Verify whether the earlier attempt succeeded before any retry.
expired_card
Card credentials are no longer valid; the issuer has replaced them.
Hard
No
Rely on Card Account Updater and network tokens; then backup method; then update request.
fraudulent
Stripe Radar or the issuer suspects fraud.
Hard
Never
No retry; review in Radar if legitimate; outreach with generic wording.
generic_decline
Unknown reason, or a Radar rule blocked it.
Soft (generic)
Yes
Classify from patterns; retry at predicted best time.
incorrect_pin, invalid_pin, offline_pin_required, online_or_offline_pin_required, pin_try_exceeded
PIN problems on card-present transactions.
N/A
N/A
Not applicable to subscriptions.
insufficient_funds
Not enough balance at this moment. Often 50 to 70 percent of subscription failures.
Soft
Yes
Retry around likely pay cycles at local morning hours; escalate to outreach only after timed retries.
invalid_account
Card or linked account is invalid or closed.
Hard
No
Backup method, then outreach.
invalid_amount
Amount invalid or over the allowed limit.
Soft
After check
Verify amount; split or retry after limit resets.
invalid_expiry_month, invalid_expiry_year
Expiry values invalid.
Hard
No
Outreach: re-enter card.
issuer_not_available
Issuer systems unreachable.
Soft
Yes, within hours
Short-delay retry; usually succeeds on the next attempt.
lost_card
Card reported lost.
Hard
Never
Network tokens may update; else backup method, then outreach with generic wording.
merchant_blacklist
Card matches a block list on your Radar settings.
Hard
Never
Review your Radar lists; generic outreach.
new_account_information_available
Credentials have changed; new details exist at the issuer.
Hard
No
Card Account Updater or network token refresh, then retry with updated credentials.
no_action_taken
Issuer declined without detail.
Soft (unknown)
Cautious
Limited timed retries, then outreach.
pickup_card
Issuer wants the card retained (lost, stolen or fraud).
Hard
Never
No retry; backup method; generic outreach.
processing_error
Error while processing.
Soft
Yes, within 24 to 48 h
Timed retry; investigate if it repeats.
restricted_card
Card restricted (often lost or stolen).
Hard
No
Backup method; generic outreach.
revocation_of_all_authorizations, revocation_of_authorization
Cardholder revoked authorization for recurring charges.
Hard
Never
Stop charging; outreach to confirm intent and collect a new method if wanted.
service_not_allowed
Service not allowed for this card.
Hard
No
Backup method; outreach.
stop_payment_order
Cardholder placed a stop order.
Hard
Never
Stop charging; outreach to confirm intent.
transaction_not_allowed
Card cannot make this kind of transaction.
Hard
No
Backup method; outreach.
withdrawal_count_limit_exceeded
Card hit its transaction-count limit.
Soft
Yes, after 24 h
Delayed retry.
Network response codes you will see alongside Stripe codes
Stripe also exposes the card network's response code on the charge outcome. The ones that matter most for subscriptions:
05
Do not honor
do_not_honor, generic_decline
Soft (generic)
14
Invalid card number
invalid_number, incorrect_number
Hard
41
Lost card
lost_card
Hard
43
Stolen card
stolen_card
Hard
51
Insufficient funds
insufficient_funds
Soft
54
Card credentials no longer valid
expired_card
Hard
57
Transaction not permitted to cardholder
transaction_not_allowed
Hard
59
Suspected fraud
fraudulent
Hard
61
Exceeds withdrawal amount limit
card_velocity_exceeded
Soft
65
Exceeds withdrawal frequency
withdrawal_count_limit_exceeded
Soft
91
Issuer or switch inoperative
issuer_not_available
Soft
96
System malfunction
processing_error
Soft
R0, R1, R3
Stop payment, revocation of authorization(s)
stop_payment_order, revocation_of_authorization
Hard
Mastercard additionally returns Merchant Advice Codes (01 updated information needed, 02 try again later, 03 do not try again, 21 recurring payment cancelled) that override the retry decision. See card network retry rules.
FAQ
Which Stripe decline codes should never be retried?
do_not_try_again, fraudulent, lost_card, stolen_card, pickup_card, stop_payment_order, revocation_of_authorization and revocation_of_all_authorizations, plus anything carrying Mastercard advice code 03 or 21. Retrying them can trigger network fines and harms your authorization rate.
Is generic_decline soft or hard?
Usually soft: it is a catch-all that most often hides insufficient funds, a temporary hold or a risk threshold. Pattern analysis (time of day, day of month, BIN, history) tells the two apart; FlyCode's classifiers do this per merchant.
Where do I see the network code in Stripe?
On the charge or payment intent, under outcome.network_decline_code (API) or the payment details view in the dashboard.
Related
Subscription payment decline codes guide for Stripe (strategy and timing by code family)
Decline Codes Explained in the Help Center
Full Stripe and Adyen decline code library on flycode.com
Was this helpful?