← Decline Codes
Soft Decline

Stripe Decline Code · Glossary

card_declined

card_declined is Stripe's master catch-all decline code — it fires when the issuing bank refuses a transaction but doesn't pass back a more specific reason like insufficient_funds or do_not_honor.

Recoverable·25–45%·Updated May 2026

What It Means

What card_declined actually means.

card_declined is Stripe's master catch-all decline code — it fires when the issuing bank refuses a transaction but doesn't pass back a more specific reason like insufficient_funds or do_not_honor. Think of it as the parent code that sits above all other decline types: when Stripe can't map the bank's refusal to a named code, everything falls here by default.

Not sure if this code is recoverable for your specific situation? Use the Stripe Failure Lookup →

Why It Happens

The root causes.

  • 1Fraud detection triggeredThe bank's risk engine flagged the transaction as suspicious due to unusual merchant, amount, or geography — without sending a specific fraudulent code back
  • 2Card reported lost or stolenThe issuer has silently blocked the card but returns a generic decline to avoid tipping off a potential fraudster
  • 3Incorrect card detailsWrong CVV, expiry date, or billing address that the bank catches on its end before returning a more specific code
  • 4Card type restrictionThe bank or card network has blocked a specific transaction category (subscriptions, international merchants, digital goods) without specifying why
  • 5Stripe Radar blockStripe's own fraud prevention layer, Radar, may have blocked the transaction before it even reached the issuer — returning card_declined with a blocked decline reason internally
  • 6Velocity or spending limitsCustomer has hit a daily or weekly transaction count limit set by their bank, triggering a silent generic decline

What NOT to Do

Common mistakes that make it worse.

Don't treat it like insufficient_funds and blindly retry on a payment cycle schedule

card_declined has a completely different recovery path from funds-related failures. Scheduling Day 3, Day 7, Day 14 retries without diagnosing which sub-reason caused the decline is the most common mistake — and leads to retry waste, issuer flags, and zero recovery on hard-decline sub-types.

Don't send a single generic dunning email and wait

Because card_declined can mean everything from a wrong CVV to a stolen card, a one-size-fits-all "your payment failed" email performs poorly. Your communication has to branch: different message for new customers (higher fraud signal) vs. long-tenure subscribers (more likely a card restriction or data issue).

Don't skip the Stripe Radar check

If the card_declined came from Radar — not the bank — retrying will keep failing regardless of timing. Always inspect outcome.type and outcome.reason in the Stripe charge object before triggering any retry logic.

Retry Timing

Optimal retry schedule.

AttemptTimingRationale
Radar blockDo NOT retry — investigate rule triggerPause; fix Radar rule first
Issuer decline (generic)1 retry after 24 hrs, then customer actionDay 1, then Day 5
Incorrect card data suspectedPrompt card update immediatelyDay 0 — card update CTA
Lost/stolen signalHard stop — request new payment methodDay 0 — no retry
Long-tenure customer, first-time decline2 retries then bank-contact emailDay 2, Day 7

Global caps for card_declined: Never exceed 3 retry attempts total. This code has a higher hard-decline probability than insufficient_funds, and excessive retries damage your merchant standing with card networks.

card_declined requires a triage-first approach — the retry timing completely depends on the sub-signal you extract from the charge object.

Smart signal: Check outcome.network_status in the Stripe charge object — if it reads declined_by_network, the bank declined it. If it reads not_sent_to_network, Radar blocked it. This single field splits your recovery path into two completely separate workflows.

Recovery Benchmark

What good looks like.

MetricResult
Overall recovery rate (all sub-types)25–45%
Radar block sub-type recovery5–10% (requires rule fix)
Issuer generic decline recovery30–40% with proper retry + email
Recovery via alternate payment method+18–25% lift on top of retries
Recovery without any triage (blind retry)~10–15%
Share of all Stripe declinesLargest single category

A 40%+ overall recovery rate on card_declined is achievable only if you split your workflow by sub-signal. Teams that treat card_declined as a monolithic code and run uniform retry logic rarely exceed 20–25% recovery.

At Scale

How to handle it at scale.

Automated

  • Webhook trigger: On invoice.payment_failed → check failure_code === 'card_declined' → immediately fetch the charge object and inspect outcome.type and outcome.reason before any further action
  • Decision fork in automation:
  • outcome.type === 'blocked' → Pause all retries → alert internal team to review Radar rules
  • outcome.network_status === 'declined_by_network' → Enter standard retry sequence (Day 1, Day 5)
  • outcome.reason === 'highest_risk_level' → Hard stop; queue for manual fraud review
  • Card update flow — Day 0: If customer is new (< 60 days), trigger an immediate card update email — higher probability that card details are stale or mistyped
  • Alternate payment method prompt — Day 5: If all retries fail, present PayPal, UPI, bank transfer, or BNPL option — this segment has the highest alternate-method conversion of any decline code

Manual Escalation

  • Radar-blocked accounts: Human review of every Radar-blocked card_declined for high-ACV customers before deciding to whitelist or permanently block
  • Repeat card_declined pattern (3+ months): Manual outreach — this signals either a card that's been permanently restricted or a customer using a card they no longer actively manage
  • Enterprise/high-ACV accounts: Assign a CSM or account owner to personally walk through payment method update — card_declined on a $500+/month account is worth 15 minutes of human time

FAQs

Frequently asked questions.

What does the Stripe card_declined error mean?

card_declined is Stripe's generic catch-all decline code, returned when the issuing bank refuses a transaction without providing a specific reason, or when Stripe Radar blocks the payment before it reaches the bank. It is the parent code for all card refusals that cannot be mapped to a more specific decline type.

What are the most common causes of a card_declined error in Stripe?

Common causes include bank fraud detection triggering a generic block, a lost or stolen card being silently declined, incorrect card details like a wrong CVV or expiry date, Stripe Radar blocking the transaction internally, card type restrictions for subscriptions or international merchants, and daily spending or velocity limits set by the bank.

Is card_declined a soft or hard decline in Stripe?

card_declined can be either a soft or hard decline depending on the underlying sub-reason. You can determine this by checking the outcome.type and outcome.network_status fields in the Stripe charge object. If Radar blocked it, treat it as a hard decline. If it was a generic issuer decline, it may be retried carefully.

Should I ask customers to update their card when Stripe returns card_declined?

It depends on the sub-reason. For new customers where incorrect card details are suspected, an immediate card update prompt is the right response. For long-tenure customers where a bank restriction is more likely, a bank-contact email is more appropriate. Sending a blanket card-update request for all card_declined failures reduces email performance and adds unnecessary friction.

How many times should I retry a Stripe card_declined failure?

Never exceed 3 retry attempts for card_declined. First check the Stripe charge object's outcome fields to determine if the block came from Radar or the bank. If Radar blocked it, do not retry at all until the rule is reviewed. For issuer declines, retry at Day 1 and Day 5, then pivot to an alternate payment method offer.

Before you retry

Most card_declined failures are retried on the wrong schedule — which recovers the payment about 30% of the time. The other 70% leaves permanently. See what this code is actually costing at your MRR before deciding how to handle it.

See what card_declined costs me →

Stop leaving revenue on the table

card_declined is recoverable. Most teams don't have the retry logic to prove it.

Recurflux handles code-specific retry scheduling, adaptive dunning, and dispute intelligence across all 30 Stripe decline codes. Connect in under 5 minutes.