Decline code
Card Declined
`card_declined` is Stripe's bare, no-detail decline outcome: the card was declined and no more specific reason code came back with it. It is a soft decline. Stripe sometimes returns this outcome alongside a Radar risk_level flag in the raw event data, but that risk_level is separate metadata, not part of the decline code itself. It helps to know how this differs from `generic_decline`. Both describe an unspecified decline, but `generic_decline` is the label Stripe applies when it has identified a broader unknown-reason scenario (including cases where Stripe's own Radar or Adaptive Acceptance system made the call). `card_declined` is the plainer, more literal "the card was declined" outcome, used when the network or issuer hands back a decline with essentially nothing attached beyond the fact of the decline. The distinction matters for engineers reading raw Stripe events, but for a merchant deciding what to do next, the practical response is the same either way: treat it as a soft, retryable decline rather than a dead end.
Why it happens
As with other soft, unspecified decline codes, recurring billing sees this more often than one-time checkout because automated bank fraud screening treats scheduled, merchant-initiated charges differently from customer-initiated ones. A charge that arrives at an odd hour as part of a batch billing run, or one that follows closely after other charges on the same card, is statistically more likely to get flagged without explanation. Because the code carries no specific detail, there's no way to distinguish a fraud-related decline from a limit-related one just by looking at the code string.
How to fix it
Yes. Without more specific information, the safe assumption is that whatever triggered the decline is transient: a momentary risk flag, a system-level check, a limit brushed up against. Retrying immediately rarely helps for the same reason it doesn't help with other soft codes: the condition that caused the first decline is usually unchanged seconds later. A delayed retry gives whatever triggered the block time to clear. Because this code carries no diagnostic detail, avoid building retry logic that assumes a specific cause. Treat it as a general soft decline: retry on a delay, watch card network retry caps, and don't jump straight to a customer email before giving at least one spaced-out retry attempt a chance to succeed.
How Foxhound recovers it
A Foxhound-scheduled silent retry runs first, timed for the specific decline pattern rather than an immediate repeat. If the retry succeeds, the customer never sees anything happened. If it does not, Foxhound moves to a dunning email sequence across the following weeks, written in the merchant's own brand voice, with a hosted card-update link on every email as a passive fallback channel.
Questions
See what this looks like on your account
The free audit shows what Stripe already recovered and what is still dying, no signup required.
Run your free audit