For the complete documentation index, see llms.txt. This page is also available as Markdown.

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.

Quick answer: A Stripe decline code is the processor's translation of the issuing bank's response. Soft codes (insufficient_funds, try_again_later, issuer_not_available, processing_error, most generic_decline and do_not_honor) are temporary and recover with well-timed retries. Hard codes (expired_card, lost_card, stolen_card, pickup_card, invalid_account, do_not_try_again, revocation_of_authorization) will not clear by retrying and need updated credentials or a new payment method. Retrying hard codes wastes network attempts and risks fines.

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

Stripe code
Meaning
Type
Retry?
FlyCode action
Reference

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_cvc

CVC check failed.

Hard

No

Outreach: re-enter card details.

incorrect_number

Card number is wrong.

Hard

No

Outreach: re-enter card.

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.

incorrect_zip

Postal code did not match.

Hard

No

Outreach: update billing address.

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_cvc

CVC value invalid.

Hard

No

Outreach: re-enter card.

invalid_expiry_month, invalid_expiry_year

Expiry values invalid.

Hard

No

Outreach: re-enter card.

invalid_number

Card number 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.

not_permitted

Payment not permitted for this card.

Hard

No

Backup method, 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.

reenter_transaction

Issuer rejected; resubmitting may work.

Soft

Yes

Timed retry.

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.

security_violation

Security rule at the issuer.

Hard

No

Backup method; outreach.

service_not_allowed

Service not allowed for this card.

Hard

No

Backup method; outreach.

stolen_card

Card reported stolen.

Hard

Never

No retry; backup method; generic outreach.

stop_payment_order

Cardholder placed a stop order.

Hard

Never

Stop charging; outreach to confirm intent.

testmode_decline

Test card used in live mode.

N/A

No

Not applicable.

transaction_not_allowed

Card cannot make this kind of transaction.

Hard

No

Backup method; outreach.

try_again_later

Temporary issuer condition.

Soft

Yes, within hours

Short-delay retry.

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:

Network code
Name
Usual Stripe code
Type

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.

Was this helpful?