Stripe decline code: expired_card
Stripe's wording: "The card has expired." The documented next step is short — the customer needs to use another card. No retry of the same details will succeed.
expired_cardHard decline
Retrying the same request will fail the same way.
What it means
The expiry date on the card has passed. `expired_card` appears in both of Stripe's tables: as a decline code with the description above, and as an error code with the fuller "The card has expired. Check the expiry date or use a different card." It also appears among the local payment method decline codes, where the charge outcome reason is `partner_expired_card` and it means the card registered with a wallet or provider has expired rather than one you hold directly.
Common causes
- The card genuinely expired and has been replaced with a new one.
- A stored PaymentMethod holding an expiry that was never refreshed after reissue.
- The expiry entered wrongly at checkout — a transposed month and year will fail even on a valid card.
- For a wallet or local payment method, the underlying card registered with the provider has expired.
How to fix it
- Ask the customer for current card details, which is Stripe's documented step.
- Enable the card account updater on your Stripe account so reissued cards refresh automatically before a subscription charge fails.
- Validate the expiry client-side before submitting. An obviously past date does not need a network round trip to reject.
- For subscriptions, watch the `customer.source.expiring` webhook and prompt for new details ahead of the failure rather than after it.
Tools that help
Frequently asked questions
- Can I avoid expired-card failures on subscriptions?
- Largely, yes. Stripe's card account updater refreshes reissued card details automatically for participating issuers, and the `customer.source.expiring` webhook fires ahead of the expiry so you can ask the customer before a charge fails. Both are considerably cheaper than recovering a lapsed subscription afterwards.