Decline code
Invalid Expiry Month
`invalid_expiry_month` means Stripe rejected the charge because the expiration month submitted with the card is not a valid value, not a real month between 01 and 12, or not formatted the way Stripe expects. Stripe's own definition: "The expiration month is invalid." This is usually a form or entry problem rather than proof that the physical card itself is bad.
Why it happens
Most subscription businesses collect card details once at signup and again whenever a customer updates payment info. `invalid_expiry_month` tends to show up right after one of those update moments: a customer retypes their card into an update-payment form and mistypes the month field, transposes month and year, or a checkout integration passes the expiration data in the wrong format to Stripe. Because the value never reaches the issuing bank for a real authorization check, this decline happens on Stripe's own validation before the transaction gets that far.
How to fix it
Retrying the exact same submitted month will fail the exact same way every time, since the problem is the value itself, not network congestion or a temporary bank hold. That said, this is fundamentally a correctable data-entry issue: once the customer or the checkout form supplies a real, correctly formatted month, the charge can succeed immediately. The fix is correction, not persistence. Treat this as a form problem first. Check whether your checkout or payment-update flow is passing expiration data in the format Stripe's API expects, and whether client-side validation catches an out-of-range month before submission. On the customer-facing side, ask them to re-enter their card details rather than assuming the card is expired or invalid. Because this is squarely a data problem, a fast, specific nudge to fix the input gets more of these resolved than a generic "payment failed" message.
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