Stripe decline codes: a cheat sheet with hard vs soft declines
Stripe decline codes in plain English, sorted into hard and soft declines, with the next step for each code and the advice code to check before you retry.
The ChargeBell Team
Updated October 1, 2026. 8 min read.

Stripe decline codes tell you why a card payment failed. A declined payment can also carry an advice_code, which tells you whether another attempt makes sense. This cheat sheet lists the common codes, sorts them into hard and soft declines, and gives the next step for each. For subscription renewals, let your Stripe Billing retry settings decide when to retry unless you have a reason to step in.
Read the code before you retry
An expired card or a card reported lost needs a new payment method. An issuer outage or a processing error may clear on the next attempt. For everything in between, check the advice_code, your Billing retry settings, and the payment status in Stripe. Stripe's decline code reference has the full list.
Hard vs soft declines
A hard decline means the same card will not work for this charge, so retrying wastes attempts. A soft decline means the issuer refused this attempt but a later one, or one after the customer acts, can succeed. Stripe's decline code table does not label codes as hard or soft. The closest signal Stripe gives you is the advice_code on the charge outcome.
- do_not_try_again. Treat this as a hard decline. Do not use the card again for the same transaction, and ask the customer for another payment method.
- try_again_later. Treat this as a soft decline. Stripe says you can retry, and the customer should contact their issuer if later attempts also fail.
- confirm_card_data. Some card details were wrong. Ask the customer to check the number, expiry date, CVC, or address before trying again.
Card networks limit how many times you can retry a single charge. Stripe's card decline guide recommends at most eight retries for charges that allow them, because issuers can read extra retries as fraud and decline more of your good payments.
| Type | Common Stripe decline codes | What to do |
|---|---|---|
| Hard decline | expired_card, lost_card, stolen_card, pickup_card, fraudulent | Ask for another payment method. Do not retry the same card. |
| Soft decline | insufficient_funds, processing_error, issuer_not_available, authentication_required | Retry later, or after the customer authenticates or adds funds. |
| Fix the details | incorrect_cvc, incorrect_number, incorrect_zip | Ask the customer to re-enter the card details, then try again. |
| Unknown reason | generic_decline, do_not_honor, call_issuer | Check the advice code. Ask the customer to call their issuer or use another card. |
Stripe decline codes and the next action
The table below is a sample of card decline codes, not a frequency ranking. The next actions follow Stripe's code descriptions and its card decline guide. Open the payment in Stripe when the customer or payment method needs a different path.
| Code | What it means | Next action |
|---|---|---|
| generic_decline | The issuer declined for an unknown reason, or Stripe Radar or Adaptive Acceptance blocked the payment. | Check the payment in Stripe for a block and an advice code. If the issuer declined it, ask the customer to call their issuer or use another method. |
| insufficient_funds | The card does not have enough funds for this purchase. | Stripe's next step is another payment method. For a subscription, check your Billing retry schedule before adding manual attempts. |
| do_not_honor | The issuer declined for an unknown reason. | Ask the customer to call their issuer or use another payment method. Do not promise that a timed retry will work. |
| expired_card | The card has expired. | Ask the customer for another card. |
| incorrect_cvc | The CVC is wrong. This is often a typo. | Ask the customer to enter the correct CVC and try again. |
| incorrect_number | The card number is wrong. | Ask the customer to enter the correct card number. |
| lost_card / stolen_card | The card was reported lost or stolen. | Ask for another payment method. Show the customer the generic_decline message, not the real reason. |
| fraudulent | Stripe suspects the payment is fraudulent. | Do not retry. Show the customer the same message you would show for generic_decline. |
| authentication_required | The issuer requires authentication such as 3D Secure. | Send the customer through authentication. For an off-session payment, ask them to come back and pay on-session. |
| card_velocity_exceeded | The customer went over the balance, credit limit, or transaction amount limit on the card. | Ask the customer to call their issuer or use another payment method. |
| processing_error | An error occurred while processing the card. | Try again. If it fails again, ask the customer to call their issuer. |
| call_issuer | The issuer declined for an unknown reason. | Ask the customer to call their issuer for details. |
| pickup_card | The customer cannot use this card for this payment. It may have been reported lost or stolen. | Ask the customer to call their issuer or use another card. Do not mention suspected fraud. |
A safe retry workflow
- Open the payment in Stripe. Read the decline code, the
advice_code, and the payment method. Check whether Radar blocked the payment or the issuer declined it. - Pick the customer action. Depending on the code, ask the customer to authenticate, fix their card details, call their issuer, or use another payment method. Never show
fraudulent,lost_card, orstolen_cardto the customer. - Check Billing before you retry. Smart Retries picks retry times for eligible subscription invoices. Follow your dunning settings and Stripe's retry guidance instead of a fixed payday rule.
- Confirm the outcome. Wait for a successful payment in Stripe before you mark the account recovered. The first failure alert does not tell you what the retry plan is.
When the same card cannot work
An expired card, or one reported lost or stolen, needs a new payment method. For subscriptions, send the customer to Stripe's hosted page for updating a payment method if you use it. Keep fraud-related decline codes out of customer emails. Check the new card and the next payment status in Stripe before you restore access or close the support ticket.
Get declined payment alerts in Slack
ChargeBell sends a critical Slack alert when it receives payment_intent.payment_failed. The alert shows the amount, the customer name or email when Stripe has one, and Stripe's failure message. It does not show the decline code or a retry date, so open the linked payment in Stripe for those. ChargeBell does not alert on Stripe's separate invoice.payment_failed event today, which also fires when an invoice has no saved payment method. The failed payment alerts guide covers the follow-up, and the Stripe Slack integration page shows every alert type.
ChargeBellAPP
⚠️ A $49.00 payment didn't go through
Lena at Fernworks · Your card has insufficient funds.
Check Stripe to see if it will be retried. · View in Stripe
Key terms
Frequently asked questions
What is the difference between hard and soft declines?
A hard decline means the card will not work for this charge, for example an expired, lost, or stolen card. A soft decline means this attempt failed but a later one can succeed, for example after an issuer outage or once the customer authenticates. In Stripe, check the advice_code. do_not_try_again works like a hard decline and try_again_later like a soft one.
What does generic_decline mean in Stripe?
generic_decline means the issuer declined for an unknown reason, or Stripe Radar or Adaptive Acceptance blocked the payment. Check the payment in Stripe for a block and an advice code. If the issuer declined it, ask the customer to call their issuer or use another payment method.
Should I retry an insufficient_funds decline?
A later attempt can work, but Stripe's recommended next step is another payment method. For subscription invoices, check your Billing retry settings and the advice code instead of guessing a payday schedule.
Which Stripe decline codes should never be retried?
Do not retry the same card after lost_card, stolen_card, fraudulent, or expired_card. For pickup_card, ask the customer to call their issuer or use another card. An advice_code of do_not_try_again also means you should stop retrying that card.
How many times can I retry a declined card in Stripe?
Stripe recommends at most eight retries for charges that allow retries. Card networks limit retries on a single charge, and issuers can treat extra attempts as fraud.


