troubleshooting 2026-04-18 11 min read the underwriting desk

Stripe "do not honor" decline: recovery playbook

3-minute scan
  • do_not_honor is the most frequent decline code in US card-not-present — usually issuer risk model, not fraud.
  • Blind retries fail. Retries with descriptor swap, rail swap, or 3DS step-up recover 30-45%.
  • Multi-brand operators with orchestration recover 2-3x what single-Stripe operators recover.
On this page

    Of every 100 failed charges on Stripe, roughly 30-40 come back as do_not_honor. It's the single most common decline code and the most misunderstood. The customer's bank has refused the charge without telling the acquirer exactly why. The playbook for recovering it is the same — but almost nobody runs it.

    1. What do_not_honor actually means

    ISO-8583 code 05. Issuer's risk model said no. It's not insufficient funds (separate code), not card invalid (separate code), not velocity limit (separate code). It's the issuer's internal signal that "this charge, on this card, right now, doesn't pass our model." Could be merchant descriptor, amount, time of day, BIN exposure, or 12 other signals the issuer doesn't share.

    2. Why blind retry fails

    Retrying the same charge through the same rail within 15 minutes hits the issuer's cached decision. You'll get the same decline. Retrying 60+ minutes later might get a different answer, but only ~18% of the time. Blind retry is the floor, not the ceiling.

    3. Lever 1: descriptor swap

    If your current charge goes out as "PEPTIDESRUS*SHOP" and declines, retrying as "RESEARCHLABS*ORDER" through a different MID (same legal entity, different brand descriptor) recovers about 18-25% of do_not_honor declines. The issuer sees a different merchant profile and re-scores. See descriptor strategy.

    4. Lever 2: 3DS step-up

    Re-presenting the charge as a 3D Secure authenticated transaction transfers liability from acquirer to issuer. Issuers approve 3DS-verified charges at materially higher rates after an unauthenticated decline — typical lift is 12-20% recovery. Your checkout needs a conditional 3DS retry flow, not always-on 3DS.

    5. Lever 3: MID/acquirer swap

    Routing the retry through a different acquirer entirely changes the issuer's view of the transaction. This is where multi-MID operators recover 15-25% that single-MID operators don't even see. Requires orchestration infrastructure (not just multiple Stripe accounts — those don't talk to each other).

    6. Lever 4: amount adjustment

    Some issuer models use round-amount signals. A $100.00 charge that declines sometimes succeeds at $99.47 because the round-number trigger isn't hit. This isn't a reliable lever by itself but is worth layering on for high-value-cart recovery.

    7. Lever 5: account updater

    Stripe's Card Account Updater auto-refreshes stored cards when issuers push updated credentials. For subscription charges with do_not_honor, enabling the updater recovers 8-15% over 60 days as issuer-side signals resolve.

    8. Stacking levers

    A full recovery sequence: original charge declines → wait 15 min → retry with descriptor swap → if declined, retry with 3DS step-up → if declined, retry through alternate MID → if declined, queue for updater → if still declined at 14 days, CS outreach. Each layer adds 8-25% recovery; the stack recovers 35-50% total.

    9. Reading the BIN concentration

    Pull 30 days of do_not_honor declines and cluster by BIN. If one BIN range produces 30%+ of declines, that's an issuer-specific pattern — likely your descriptor or MCC conflicts with their model. Fix the merchant-side signal rather than running recovery forever.

    10. Customer service script

    The customer sees a generic "payment failed" message. Your CS script: "Your bank returned a soft decline. Please try another card, re-submit, or contact your bank to pre-authorize the charge." Do NOT say "your card was declined" — that's framing the problem as the customer's fault and they'll dispute other charges on frustration.

    11. Subscription billing angle

    Subscription rebills get higher do_not_honor rates because issuers de-prioritize recurring MCC-5912 / 5499 charges. Stripe's Smart Retries help but don't do descriptor/MID swap. A recovery layer that routes the rebill through a different descriptor on attempt 2-3 recovers materially more. See subscription recovery.

    12. What multi-brand operators do differently

    Multi-brand operators on single-Stripe accounts can't rail-swap. Multi-brand operators on parent-account structures with 2-3 acquirers behind them can. The lift is typically 15-25% approval rate improvement across the portfolio — at 8-figure revenue, that's the full annual revenue of a small brand.

    13. Measuring recovery performance

    Track: recovery rate per lever (descriptor swap recovery %, 3DS step-up recovery %, MID swap recovery %), net revenue recovered, false positive rate (customers who would have re-purchased anyway). Without measurement, you can't tune the stack.

    14. What not to do

    • Don't blind-retry 5x in 15 minutes — flags the BIN and issuer
    • Don't blame the customer in messaging
    • Don't skip 3DS step-up because of friction — the friction is better than the lost revenue
    • Don't ignore BIN patterns — they're telling you something about your merchant profile

    Recovery checklist

    • Log raw network_reason code, BIN, amount, descriptor, 3DS status per decline
    • Configure descriptor pool (2-4 descriptors rotated across MIDs)
    • Build conditional 3DS step-up on retry
    • Enable Card Account Updater for subscriptions
    • Route retry through alternate acquirer if available
    • Measure per-lever recovery rate
    • Pull BIN concentration monthly to spot patterns

    Next steps

    Single-brand operators: implement lever 1 + 2 + 5. Recovery lift usually 15-25%. Multi-brand operators: the full orchestrated stack is what we build. See Stripe comparison, pricing, apply.

    Found this useful? Share it X LinkedIn Reddit HN Email

    FAQ

    How is do_not_honor different from generic_decline?
    generic_decline is Stripe's catch-all when they don't know the specific reason. do_not_honor is an explicit issuer code. They overlap in practice but the recovery patterns are similar.
    Does 3DS always recover do_not_honor?
    No — it recovers about 12-20%. Some issuers decline even authenticated retries. Stack with descriptor swap and MID swap.
    Is this fraud?
    Usually not. do_not_honor is an issuer risk signal, not a fraud confirmation. Treating every do_not_honor as fraud burns good customers.
    Can I turn on Stripe Smart Retries instead?
    Smart Retries handle timing-based retries well. They don't do descriptor swap or MID swap — those require either your own retry layer or an orchestration provider.
    What's the expected approval rate lift?
    2-4% of gross charges for well-tuned stacks. On $10M/yr volume that's $200-400k recovered revenue.

    Running multiple brands?
    multiflow was built for this.

    The Operator Briefing

    Twice-monthly. No fluff.

    Processor shutdowns, reserve-hold playbooks, reconciliation lessons, and the merchant-account decisions that save operators six-figure years. Delivered to your inbox — never spam.

    No spam. Unsubscribe in one click.

    We use essential cookies · Privacy