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 declineThe 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 workexpired_cardHard declineThe card has passed its expiration date, so the charge can never succeed on the card currently on file.
Retrying will not helpdo_not_honorSoft declineA 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 workgeneric_declineSoft declineThe bank or Stripe Radar declined the charge without a specific reason. Catch-all when the issuer returns no detailed code.
Retrying can workcard_declinedSoft declineThe 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 workprocessing_errorSoft declineA temporary error occurred while processing the card, usually on the issuer or network side rather than with the card itself.
Retrying can worktry_again_laterSoft declineA temporary issue prevented the charge. The issuer is signaling that the same card may work shortly.
Retrying can workissuer_not_availableSoft declineStripe could not reach the card issuer to authorize the charge. This is a connectivity issue, not a card problem.
Retrying can workreenter_transactionSoft declineThe transaction could not be processed for an unknown transient reason and should be attempted again.
Retrying can workapprove_with_idSoft declineThe payment cannot be authorized yet because the issuer needs to confirm the cardholder's identity.
Retrying can workauthentication_requiredHard declineThe 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 helpincorrect_cvcHard declineThe CVC security code provided does not match the card. The charge will keep failing until correct details are entered.
Retrying will not helpinvalid_cvcHard declineThe CVC security code is not valid for this card.
Retrying will not helpincorrect_numberHard declineThe card number is incorrect, so the charge cannot be processed.
Retrying will not helpinvalid_numberHard declineThe card number is invalid or does not exist.
Retrying will not helpinvalid_expiry_monthHard declineThe expiration month on the card is invalid.
Retrying will not helpinvalid_expiry_yearHard declineThe expiration year on the card is invalid.
Retrying will not helpincorrect_zipHard declineThe ZIP or postal code failed address verification (AVS) with the issuer.
Retrying will not helpcard_not_supportedHard declineThe card does not support this type of purchase (for example, certain subscriptions or currencies).
Retrying will not helpcurrency_not_supportedHard declineThe card does not support the currency of the charge.
Retrying will not helpinsufficient_funds_savingsSoft declineThe linked savings account does not have enough balance to cover the charge.
Retrying can workcard_velocity_exceededHard declineThe customer has exceeded the balance, credit limit, or number of transactions the issuer permits in a window.
Retrying will not helpwithdrawal_count_limit_exceededSoft declineThe customer has hit the number of withdrawals or transactions their bank allows in a period.
Retrying can workfraudulentHard declineThe charge was flagged as likely fraudulent by Stripe Radar or the issuer. This can occasionally hit legitimate recurring charges.
Retrying will not helplost_cardHard declineThe card was reported lost. The issuer returns a generic decline to avoid tipping off potential fraud.
Retrying will not helpstolen_cardHard declineThe card was reported stolen. The issuer declines and withholds the specific reason.
Retrying will not helppickup_cardHard declineThe issuer has flagged the card (often lost, stolen, or compromised) and does not want it used.
Retrying will not helpmerchant_blacklistHard declineThe payment matches a value on the issuer's or Radar block list.
Retrying will not helpsecurity_violationHard declineThe issuer declined the charge for a security reason.
Retrying will not helpcall_issuerHard declineThe issuer wants to speak with the cardholder before approving the charge, often a fraud or verification hold.
Retrying will not helprestricted_cardHard declineThe card has a restriction (for example, a regional or usage limit) that prevents this charge.
Retrying will not helptransaction_not_allowedHard declineThe card does not permit this type of transaction.
Retrying will not helpnot_permittedHard declineThe issuer does not permit the charge.
Retrying will not helpinvalid_accountHard declineThe card or account is invalid or closed.
Retrying will not helpnew_account_information_availableHard declineThe card has new information (often a new number after reissue). The stored card is out of date.
Retrying will not helprevocation_of_authorizationHard declineThe cardholder revoked permission for this recurring charge with their bank.
Retrying will not helpstop_payment_orderHard declineThe cardholder placed a stop on this recurring payment with their bank.
Retrying will not helpduplicate_transactionSoft declineA transaction with the same amount and card was submitted very recently, so the issuer treated this as a duplicate.
Retrying will not helpHow 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.