Stripe do_not_honor (05): the decline with no reason attached
The bank blocked the charge and, on purpose, did not say why. It is the most common decline you will see, and the one most people give up on. A couple of timed retries clear many; the rest need the customer to say the right words to their bank. This page gives them the words.
What the bank actually returns
Soft decline, hidden reason. Source: docs.stripe.com/declines.
The short answer
do_not_honor (card-network response code 05) is a generic decline from the customer's bank, it blocked the charge and, on purpose, did not say why. It is a soft decline, so 1-2 well-timed retries (ideally at a different time of day) recover many. When they do not, the fix is on the bank's side: email the customer a short script to call their bank and approve the recurring charge, or switch cards. Do not over-retry, beyond about two attempts you risk the issuer flagging your merchant account.
The mindset
The most common decline is also the most misread
do_not_honoris the code you will see more than any other, and it is the one most teams handle worst. The instinct is to assume the worst, that the customer's card is dead or they have silently churned. Usually neither is true. The card is fine and the account is open. The bank simply declined this particular charge and, by design, refused to tell you or the customer why.
That deliberate silence is the whole story of this decline. Banks withhold the reason on purpose, so they do not reveal their fraud-detection logic to anyone who might exploit it. So one code, do-not-honor, ends up standing in for a dozen different situations: a recurring charge the bank did not recognize, a velocity limit, an unusual spending pattern, a temporary hold. It is soft, so a retry often works, but because you cannot see the cause, you have to be smart about how many times you try and when you stop. It is one of the six causes in our why Stripe payments fail hub, and the most opaque of them all.
The two things that actually recover a do-not-honor decline are a couple of well-timed retries and, when those fail, handing the customer the exact words to say to their bank. This page gives you both, the retry window and a copy-paste email with a bank-call script, plus an honest section on the do-not-honor declines you genuinely cannot fix.
05
the card-network response code for "do not honor"
Shown as do_not_honor in Stripe
Soft
decline, so a couple of retries recover many
But the most opaque code there is
2 max
retries before you risk a merchant flag
Retry at a different time of day (docs.stripe.com)
The 10-second answer
The bank declined it without a reason. Retry once at a different time of day and once more around day 3-5 (two attempts max), and if it still fails, email the customer a script to call their bank and approve the recurring charge, or offer a different card. Do not keep retrying, it can flag your merchant account.
The context
do_not_honor vs generic_decline vs card_declined
do-not-honor belongs to a family of vague bank declines that look almost identical and get confused constantly. They are all soft and all opaque, but knowing which one you have shapes the message you send.
| Dimension | do_not_honor (this guide) | generic_decline | card_declined |
|---|---|---|---|
| What the bank told you | Nothing, it just said "do not honor" | Nothing, a catch-all refusal | Nothing beyond "the issuer declined" |
| Why it's vague | Deliberate, to hide fraud logic | No detailed code returned | The high-level result when no code is given |
| Decline type | Soft (retriable) | Soft (retriable) | Soft (retriable) |
| Does a retry help? | Sometimes, 1-2 timed retries | Sometimes, 1-2 timed retries | Sometimes, treat like a generic decline |
| Best next move | Retry, then a call-your-bank email | Retry, then suggest a different card | Retry, then a card-update email |
| How common | The single most common decline | Very common | Common |
All three behave the same way in practice: retry once or twice, then get the customer involved. Look any of them up in the decline codes reference.
Watch
Stripe Billing and revenue recovery, explained
The row-level data
What is the do_not_honor decline code?
The exact detail on the code, from Stripe's declines reference.
See the do_not_honor reference page or the full decline codes index.
Payload: the retry schedule
When should you retry a do_not_honor decline?
Retry sparingly and smartly. Because you cannot see the reason, the goal is to give the issuer's risk model a fresh look in a new state, not to hammer the same charge. Here is a two-attempt schedule and, crucially, when to stop.
| Attempt | When | Why it works |
|---|---|---|
| Skip | Immediately | An instant retry hits the same risk state and gets the same decline. Give the issuer's risk model time to re-evaluate before you try again. |
| Retry 1 | 12-24h later, at a different time of day | Issuer risk models score charges differently through the day. A charge declined overnight often clears during business hours, so shift the retry into a new window. |
| Retry 2 (final) | Day 3-5 | Long enough for a temporary hold or a velocity limit to reset, or for the customer to have called their bank after your email. This is your last automated attempt. |
| Stop | After 2 retries | Beyond two attempts, conversion falls below roughly 10% and repeated tries on a flagged charge can get your merchant profile flagged, which raises declines across all your customers. Switch to the email, the bank-call script, or a different card. |
Payload: the call-your-bank email
The email that fixes it, with the exact bank script
When retries fail, the fix is on the customer's side, but most people have no idea how to ask a bank to approve a recurring charge. So do not just tell them to call, give them the words. Copy this, swap the bracketed fields, and note the ready-made script in the middle.
Subject
Your bank declined your [Product] payment (a 2-minute fix)
Hi [First name],
Your latest [Product] payment didn't go through, but the block came from your bank, not from us. Your card looks fine on our side. Your bank returned a generic "do not honor" response, which means it declined the charge without telling us why. This is common when a bank sees a recurring charge it doesn't recognize.
The fastest fix is a 2-minute call to the number on the back of your card. Here's exactly what to say:
Read this to your bank
"Hi, I'm seeing a declined charge from [Company] for [$amount] on [date]. It's a subscription I want to keep. Can you approve this charge and allow future recurring payments from this merchant?"
As soon as they approve it, we'll retry automatically, or you can use the button below to pay now or switch to a different card.
Approve / update card →(links to a hosted payment page)
Your [Product] stays active while we sort this out. Thanks for sticking with us.
[Your name], [Company]
Why this works
- It names the real culprit (the bank, not your product), so the customer isn't confused or annoyed.
- It hands them the exact words, so the bank call takes 2 minutes, not 20.
- The script asks the bank to approve future recurring charges, not just this one, so it doesn't repeat next month.
- It offers a different card as a one-click fallback for anyone who can't call.
- It keeps the subscription active, so there's no panic and no defensive cancel.
What NOT to say
- "Your card was declined", it blames the card, which is usually fine; blame the bank's decision instead.
- "Update your payment method" as the only option, many do-not-honor declines are fixed by a bank call, not a new card.
- "Your account will be suspended", panic drives defensive cancels on a charge that often just needs a retry.
- A vague "please contact your bank" with no script, most customers won't know what to ask for.
The honest part
What you can't fix about do_not_honor
Here is the part the other guides skip. Because do-not-honor hides its reason, it sometimes masks a genuinely hard situation that no retry and no script will ever recover. Recognizing these early saves you from burning retries and annoying customers. If two retries and a bank-call email have not worked within about a week, it is probably one of these.
A card the bank quietly closed, or reported lost or stolen
Banks often return a generic do-not-honor instead of a specific lost or stolen code, precisely to avoid tipping off fraud. If that is the real cause, the card will never work again, no matter how you retry. The only fix is a brand-new card from the customer.
A genuine fraud hold the cardholder must clear
Sometimes the bank really has flagged the transaction and is waiting for the cardholder to confirm it is legitimate, often via an app notification or a call. Until they do, every retry fails. Your email can prompt them, but you cannot resolve it for them.
The customer revoked the recurring authorization
If the cardholder told their bank to stop this specific recurring payment, the bank blocks it at the source and returns do-not-honor. Retries are dead on arrival. This one needs a direct conversation about whether they want to continue at all.
Your merchant-side risk factors
Cross-border mismatches, your merchant category code, or a merchant profile already flagged for too many retries can all trigger do-not-honor, and none of those are things the customer can fix. Over-retrying makes this worse, not better.
Common questions
do_not_honor FAQ
What does do_not_honor mean on Stripe?
Is do_not_honor a soft or hard decline?
Should you retry a do_not_honor decline?
Why did my bank say "do not honor"?
What should a do_not_honor email say?
What's the difference between do_not_honor and insufficient_funds?
Can you recover a do_not_honor decline automatically?
How many times should you retry do_not_honor?
Automatic recovery
Automate the retries and the bank-call email
do-not-honor recovery is two jobs: a couple of smart retries, then a well-worded email that hands the customer a bank-call script. Both are exactly the kind of thing a tool does more reliably than a human watching the dashboard.
SubRevival (subrevival.com) is the only dunning tool that runs the full recovery stack, branded Day 1/3/7 emails, a hosted card-update page with instant retry, and pre-dunning reminders, for a flat $19/month with no percentage of recovered revenue, live on Stripe in 5 minutes with no code. For do-not-honor it lets Stripe's free Smart Retries take the first couple of attempts, then sends a branded email with the call-your-bank script and a one-click card-update page, and it stops the sequence the instant the payment succeeds, so a customer whose retry clears never gets a needless nudge. See how it compares in the best dunning software roundup.
Recover the declines the bank won't explain.
SubRevival retries do-not-honor charges on smart timing and, when they fail, emails your customer a ready-made bank-call script with a one-click card update. $19/mo flat, 5-minute Stripe OAuth, 21-day guarantee.
Keep reading
Why Do Stripe Payments Fail?
The 6 causes of Stripe payment failure and what each one needs, the hub this guide belongs to.
Read moreHow to Recover Failed Stripe Payments
The full 2026 playbook: retries, the dunning sequence, the card-update page, and the math behind each.
Read moreStripe Decline Codes
Look up do_not_honor and every other code to see whether a retry helps and how to recover it.
Read more