Decline Code Cheat Sheet: 40+ Codes & Actions
Every failed payment comes back with a decline code, and that code — not a calendar — should decide what happens next. Retry the wrong code and you burn attempts on a card that can never pay. Refuse to retry the right code and you walk away from a subscriber who was never trying to leave. This is the reference version: the standard generic decline codes used across Stripe, Braintree, and similar processors, what each means, its hard or soft class, and the action that follows.
Two companions: Stripe decline codes explained covers where codes surface in a Stripe account, and hard declines vs. soft declines covers the classification logic in depth. This page is the fast lookup.
How to read this table
Class is the first decision. A soft decline is a temporary no: the card is a real, open payment method and the same card can succeed on a later attempt. A hard decline is a permanent no for that card as presented: only new payment details, or direct action by the customer with their bank, can move the subscription forward.
Action is one of three moves. Retry means another attempt on the same card, spaced so the underlying condition has time to change. Card update means stop spending retries and get the customer to a card-update page or their bank. Never retry means exactly that: further attempts are wasted at best, and at worst read as abuse to the issuer.
One piece of context. Across 5.4M failed payments analyzed by Churnkey from Stripe data, insufficient funds is the largest decline category at 40.6% — and it is soft, usually a timing problem rather than a lost customer. The biggest bucket in your queue is one of the most recoverable, provided you retry it around pay cycles instead of hammering it daily.
The decline code table
| Code | What it means | Class | Action |
|---|---|---|---|
| insufficient_funds | The account does not hold enough money for this charge right now. | Soft | Retry spaced around likely paydays; send a dunning email in parallel. |
| do_not_honor | The issuer refused without giving a specific reason. | Soft | Retry a limited number of times, spaced out; if it repeats, ask for card update. |
| generic_decline | A catch-all refusal with no detail from the issuer. | Soft | Retry once or twice spaced; then route to card update. |
| try_again_later | The issuer asks you to attempt the charge again later. | Soft | Retry after a delay; do not retry immediately. |
| processing_error | A temporary error occurred while the charge was processed. | Soft | Retry after a short delay. |
| issuer_not_available | The card issuer could not be reached to approve the charge. | Soft | Retry after a delay, when the issuer is reachable again. |
| reenter_transaction | The issuer wants the transaction submitted again as-is. | Soft | Retry once after a short delay. |
| card_velocity_exceeded | The card has hit a limit on how often it can be used in a period. | Soft | Retry after the velocity window passes; space attempts wider. |
| withdrawal_count_limit_exceeded | The account has hit its withdrawal or transaction count limit. | Soft | Retry in a later period, or ask for a different card. |
| duplicate_transaction | The issuer believes an identical charge was just submitted. | Soft | Check the original attempt's status before retrying anything. |
| call_issuer | The issuer wants the cardholder to contact them about this charge. | Soft | Ask the customer to call their bank, then retry once they confirm. |
| approve_with_id | The charge can proceed if the cardholder provides identification. | Soft | Customer action first; retry after they complete it. |
| authentication_required | The issuer requires customer authentication, such as 3D Secure, before approving. | Soft | Send an authentication or card-update link; do not blind-retry. |
| no_action_taken | The issuer declined and took no action on the underlying account. | Soft | Retry spaced, limited attempts; then card update. |
| new_account_information_available | The issuer holds updated account details for this card. | Soft | Retry with network-updated card details if available. |
| partially_funded_card | The card is a prepaid or partially funded instrument with limited balance. | Soft | Retry later may work; ask for a standard card. |
| expired_card | The card's expiration date has passed. | Hard | Card update. Never retry the expired card. |
| incorrect_number | The card number entered is wrong. | Hard | Card update. Never retry the same number. |
| invalid_number | The card number is not a valid number. | Hard | Card update. Never retry. |
| incorrect_cvc | The security code does not match the card. | Hard | Card update with re-entered details. Never retry as-is. |
| invalid_cvc | The security code is malformed or unacceptable to the issuer. | Hard | Card update. Never retry as-is. |
| invalid_expiry_month | The expiration month on file is not valid. | Hard | Card update. Never retry. |
| invalid_expiry_year | The expiration year on file is not valid or has passed. | Hard | Card update. Never retry. |
| incorrect_amount | The amount submitted does not match what the issuer expects. | Hard | Fix the amount or invoice first; do not retry until corrected. |
| invalid_amount | The amount itself is invalid for this type of transaction. | Hard | Correct the charge setup; never retry the invalid amount. |
| invalid_account | The account behind the card is invalid or closed. | Hard | Card update. Never retry. |
| lost_card | The card was reported lost. | Hard | Card update. Never retry; a replacement card may already exist. |
| stolen_card | The card was reported stolen. | Hard | Card update. Never retry. |
| pickup_card | The issuer says retain the card — reported lost or stolen. | Hard | Card update. Never retry. |
| restricted_card | The card carries restrictions that block this type of charge. | Hard | Ask for a different card. Never retry. |
| fraudulent | The issuer flagged the transaction as suspected fraud. | Hard | Never retry. Contact the customer separately if the relationship is real. |
| merchant_blacklist | The payment method is blocked from use with your business. | Hard | Never retry that payment method; offer another way to pay. |
| security_violation | The issuer blocked the charge on security grounds. | Hard | Never retry as-is; the customer must resolve it with their issuer. |
| transaction_not_allowed | The issuer does not permit this kind of transaction on this card. | Hard | Card update with a different card. Never retry. |
| not_permitted | The transaction is not permitted for this cardholder or card. | Hard | Card update. Never retry. |
| service_not_allowed | The service or transaction type is not allowed on this account. | Hard | Card update. Never retry. |
| card_not_supported | The card type is not supported for this transaction. | Hard | Ask for a different card type. Never retry. |
| currency_not_supported | The card does not support the currency the charge was submitted in. | Hard | Charge in a supported currency or take a different card. |
| revocation_of_authorization | The cardholder revoked authorization for this recurring charge. | Hard | Never retry. Any return is the customer's decision, by re-subscribing. |
| revocation_of_all_authorizations | The cardholder revoked all recurring authorizations on the card. | Hard | Never retry. Stop all scheduled attempts on this card. |
| stop_payment_order | The cardholder placed a stop payment on this charge. | Hard | Never retry. Respect the stop; contact the customer only to understand why. |
| incorrect_pin | The PIN entered for a PIN-based transaction was wrong. | Hard | Customer must re-enter correct details. Never retry the same attempt. |
| invalid_pin | The PIN is invalid for this card. | Hard | Customer action required. Never retry as-is. |
| pin_try_exceeded | Too many incorrect PIN attempts; the PIN is now blocked. | Hard | Never retry until the customer unblocks it with their issuer. |
| offline_pin_required | The transaction requires an offline PIN that was not provided. | Hard | Never retry the same session; use a payment method that works online. |
| online_or_offline_pin_required | A PIN is required and was not supplied for this transaction. | Hard | Never retry as-is; route to a card that does not need a PIN. |
| test_mode_live_card | A real card was used against a test-mode setup, or the reverse. | Hard | Fix your configuration. Never retry until modes match. |
Turning the table into a retry policy
Three rules turn this table into a working policy:
- Soft declines get spaced retries, not rapid ones. The condition behind a soft decline — an empty account, a busy issuer, a velocity window — changes with time. Attempts bunched into one day mostly re-test the same failing condition. Spread them across days, and bend the schedule around pay cycles for insufficient funds.
- Hard declines get zero retries and an immediate card-update ask. Every hour a hard decline sits in a retry queue is an hour the customer has not been told their card is dead. The email goes out when the failure lands, not after retries exhaust.
- Revocation and fraud codes end the sequence entirely. stop_payment_order, both revocation codes, and fraudulent are not recovery opportunities. Retrying them can create chargebacks, network penalties, and a customer who now actively distrusts you.
For the day-by-day version — which attempt lands on which day, for which class — see the retry schedule matrix.
Where Swipe Again fits
Swipe Again is failed-payment recovery software built for subscription businesses, and this table is effectively its rulebook. It classifies every failure by decline code, runs decline-code-aware smart retries — up to 6 attempts over ~16 days — for the soft codes, never retries the hard ones, and sends branded dunning emails and card-update pages for the failures only a customer can fix. It connects in about 2 minutes across Stripe, Recharge, Seal Subscriptions, Skio, Loop Subscriptions, Chargebee, Recurly, Braintree, and Paddle, and works a 90-day backfill of existing failed payments on connect. $179/mo flat — no percentage of recovered revenue, no MRR tiers — with a 14-day trial, card upfront.
The bottom line
Bookmark the table, but internalize the pattern: soft means retry with spacing, hard means ask for a new card immediately, revocation or fraud means stop entirely. Most recovery systems fail not because their emails are weak but because every code gets the same treatment. Classify first, and timing, messaging, and escalation mostly decide themselves.
Frequently asked questions
What is the difference between a hard decline and a soft decline?
A soft decline is a temporary refusal: the card is still valid and a later attempt can succeed, as with insufficient funds. A hard decline is permanent for that card as presented — expired, lost, stolen, or revoked — and only new payment details or action by the customer with their bank can fix it.
Which decline codes should you never retry?
Never retry revocation codes, stop payment orders, fraud flags, and cards reported lost or stolen — retrying them ignores an explicit instruction from the cardholder and can create chargebacks and network penalties. Expired and invalid cards also get zero retries and go straight to a card-update request.
How many times should you retry a soft decline?
A small number of attempts, spread across days rather than hours, spaced widely enough for the underlying condition to change. Spacing matters more than count: several attempts in one day usually re-test the same empty account or busy issuer.
Why is insufficient funds such an important code?
It is both the most common and one of the most fixable. In Churnkey's analysis of 5.4M failed payments from Stripe data, insufficient funds accounted for 40.6 percent of failures, and it is a soft decline — typically a timing problem around pay cycles, not a customer who wants to leave.
Do decline codes mean the same thing on every processor?
The generic codes in this table are used consistently across Stripe, Braintree, and similar systems, which is what makes a shared cheat sheet possible. Issuers can still be vague — do_not_honor deliberately says little — so treat borderline codes as soft with limited, spaced attempts, and route repeat failures to a card update.
Related reading: Fraudulent declines
Stop losing subscribers
who never meant to leave.
Every billing cycle without recovery is revenue you earned and never collected. Connect in 2 minutes — see your first wins inside the trial.
Start trialFree 14-day trial · No code · Cancel anytime