Decline code
Expired Card
`expired_card` means Stripe declined the charge because the expiration date on file for the card has already passed. Stripe's own definition is blunt: "The card has expired." The card is not being rejected for fraud, insufficient funds, or a bank-side hold. It is being rejected because the expiration date stored on the payment method is no longer valid.
Why it happens
Subscription billing charges the same stored card weeks or months after the customer first entered it. In that window, cards routinely get reissued: banks send new physical cards with new expiration dates (and sometimes new numbers) ahead of the old card's expiry, for security reasons or simple card-program refreshes. A customer may already be using their new card everywhere else while the old, expired one is still the only payment method on file with your subscription.
How to fix it
No. This is not a soft decline that clears up with time, and it is not a network hiccup. The expiration date is objectively wrong. Submitting the identical charge again, an hour later or a week later, produces the identical decline every time. No retry schedule fixes a data problem. The card networks run updater services, Visa's Account Updater and Mastercard's Automatic Billing Updater, that push new card details to merchants when a card is reissued or renewed. When it works, the card on file gets refreshed quietly before a charge ever fails. Coverage is real but uneven: it is strongest for major US-issued Visa and Mastercard cards, and noticeably weaker for cards issued outside the US, American Express cards, and smaller regional issuers. The `expired_card` failures you actually see are concentrated in that coverage gap. Because retrying wastes a charge attempt and delays the fix, the right response is to stop retrying and ask the customer directly. A message sent close to the known expiration date, before the next billing cycle even runs, prevents most of these failures outright. For the ones that still happen, a fast, clear request to update payment details is the only lever that works.
How Foxhound recovers it
Expired and stale-card declines do not recover through a repeat charge against the same card details. Foxhound skips straight to the card-update path: a hosted, no-login link goes out by email, and an expiring-card alert can fire ahead of the renewal date when the expiration is already visible on the stored card, so the update happens before the charge ever fails.
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