38 codes · 12 recoverable on retry

Stripe decline codes

Every Stripe decline code, what it actually means, and the one thing most references skip: whether retrying the charge will help, or whether you need to reach the customer.

38 codes

insufficient_fundsSoft decline

The card is valid, but the account does not have enough balance or credit to cover the charge at the moment it was attempted.

Retrying can work
expired_cardHard decline

The card has passed its expiration date, so the charge can never succeed on the card currently on file.

Retrying will not help
do_not_honorSoft decline

A generic refusal from the issuing bank with no specific reason given. The ambiguity is intentional, so the bank does not reveal fraud logic.

Retrying can work
generic_declineSoft decline

The bank or Stripe Radar declined the charge without a specific reason. Catch-all when the issuer returns no detailed code.

Retrying can work
card_declinedSoft decline

The issuer declined the charge. Stripe surfaces a more specific decline_code where the bank provides one; otherwise this is the high-level result.

Retrying can work
processing_errorSoft decline

A temporary error occurred while processing the card, usually on the issuer or network side rather than with the card itself.

Retrying can work
try_again_laterSoft decline

A temporary issue prevented the charge. The issuer is signaling that the same card may work shortly.

Retrying can work
issuer_not_availableSoft decline

Stripe could not reach the card issuer to authorize the charge. This is a connectivity issue, not a card problem.

Retrying can work
reenter_transactionSoft decline

The transaction could not be processed for an unknown transient reason and should be attempted again.

Retrying can work
approve_with_idSoft decline

The payment cannot be authorized yet because the issuer needs to confirm the cardholder's identity.

Retrying can work
authentication_requiredHard decline

The card requires Strong Customer Authentication (3D Secure) under PSD2, common for EU and UK cards. A silent off-session charge fails until the customer authenticates.

Retrying will not help
incorrect_cvcHard decline

The CVC security code provided does not match the card. The charge will keep failing until correct details are entered.

Retrying will not help
invalid_cvcHard decline

The CVC security code is not valid for this card.

Retrying will not help
incorrect_numberHard decline

The card number is incorrect, so the charge cannot be processed.

Retrying will not help
invalid_numberHard decline

The card number is invalid or does not exist.

Retrying will not help
invalid_expiry_monthHard decline

The expiration month on the card is invalid.

Retrying will not help
invalid_expiry_yearHard decline

The expiration year on the card is invalid.

Retrying will not help
incorrect_zipHard decline

The ZIP or postal code failed address verification (AVS) with the issuer.

Retrying will not help
card_not_supportedHard decline

The card does not support this type of purchase (for example, certain subscriptions or currencies).

Retrying will not help
currency_not_supportedHard decline

The card does not support the currency of the charge.

Retrying will not help
insufficient_funds_savingsSoft decline

The linked savings account does not have enough balance to cover the charge.

Retrying can work
card_velocity_exceededHard decline

The customer has exceeded the balance, credit limit, or number of transactions the issuer permits in a window.

Retrying will not help
withdrawal_count_limit_exceededSoft decline

The customer has hit the number of withdrawals or transactions their bank allows in a period.

Retrying can work
fraudulentHard decline

The charge was flagged as likely fraudulent by Stripe Radar or the issuer. This can occasionally hit legitimate recurring charges.

Retrying will not help
lost_cardHard decline

The card was reported lost. The issuer returns a generic decline to avoid tipping off potential fraud.

Retrying will not help
stolen_cardHard decline

The card was reported stolen. The issuer declines and withholds the specific reason.

Retrying will not help
pickup_cardHard decline

The issuer has flagged the card (often lost, stolen, or compromised) and does not want it used.

Retrying will not help
merchant_blacklistHard decline

The payment matches a value on the issuer's or Radar block list.

Retrying will not help
security_violationHard decline

The issuer declined the charge for a security reason.

Retrying will not help
call_issuerHard decline

The issuer wants to speak with the cardholder before approving the charge, often a fraud or verification hold.

Retrying will not help
restricted_cardHard decline

The card has a restriction (for example, a regional or usage limit) that prevents this charge.

Retrying will not help
transaction_not_allowedHard decline

The card does not permit this type of transaction.

Retrying will not help
not_permittedHard decline

The issuer does not permit the charge.

Retrying will not help
invalid_accountHard decline

The card or account is invalid or closed.

Retrying will not help
new_account_information_availableHard decline

The card has new information (often a new number after reissue). The stored card is out of date.

Retrying will not help
revocation_of_authorizationHard decline

The cardholder revoked permission for this recurring charge with their bank.

Retrying will not help
stop_payment_orderHard decline

The cardholder placed a stop on this recurring payment with their bank.

Retrying will not help
duplicate_transactionSoft decline

A transaction with the same amount and card was submitted very recently, so the issuer treated this as a duplicate.

Retrying will not help

How to use this

Soft declines vs hard declines

Stripe returns two fields on a failed charge: a high-level code (usually card_declined) and a granular decline_code from the issuing bank. The decline_code is what tells you how to respond.

Soft declines (insufficient funds, do_not_honor, processing errors) are temporary, so a smartly timed retry often succeeds. Hard declines (expired card, incorrect CVC, lost or stolen card) will fail every retry, they need the customer to update their card or contact their bank. Matching the response to the code is what separates a 25% recovery rate from 57%. See how to recover failed Stripe payments.

Recover declined charges automatically

SubRevival reads each decline code and responds correctly: retries the soft ones on smart timing and emails the customer for the hard ones, with a hosted card update page. $19/mo flat, 5-minute Stripe OAuth.