Decline code
Invalid Number
`invalid_number` means the card number submitted with the charge failed basic format or checksum validation. Stripe's own definition: "The card number is incorrect." It carries the same practical meaning as `incorrect_number`, a submitted card number that doesn't check out, though Stripe may surface it in slightly different circumstances depending on where in the validation process the number gets rejected.
Why it happens
Like its close sibling, this decline clusters around moments of manual card entry: initial signup, a payment-method update after a failed charge, or a customer switching cards. A single mistyped or transposed digit, an extra digit, a missing digit, any of these can cause a card number to fail Stripe's format check before the transaction goes anywhere near the issuing bank. This is a data-entry issue, not a statement about whether the customer's actual card works.
How to fix it
Retrying the same malformed card number produces the same failure indefinitely. There's no backoff period or attempt count that turns an invalid number into a valid one. Resolution requires the customer to submit a correct number, not more attempts at the same one. Honesty about current handling matters more than a tidy story here. Foxhound's decline classifier sorts recognized declines into one of four named buckets: soft, network, expired, or fraud, plus an unknown bucket for anything unrecognized, and `invalid_number` isn't given a dedicated case in the four named buckets. Any code the classifier doesn't specifically recognize falls to the unknown bucket, which fails closed rather than retrying: no automatic retry runs. That means an `invalid_number` failure goes straight to a card-update email rather than a silent retry, which is the correct outcome since no retry can succeed against a number that failed basic validation in the first place. That's why sending the customer straight to the payment-update page to re-enter their card number is the right fix, not a retry: it works regardless of how the underlying decline gets classified.
How Foxhound recovers it
This code has no dedicated bucket in the recovery engine's classification sets, so it fails closed rather than defaulting to a silent retry: no repeat charge runs against a code Foxhound cannot classify. Recovery goes straight to the same email sequence expired cards get, carrying the hosted card-update link, until this code earns its own bucket.
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