Decline code
Invalid CVC
`invalid_cvc` means the security code submitted with the charge failed validation against the issuing bank's records. Stripe's own definition mirrors `incorrect_cvc`: "The CVC number is incorrect." Stripe applies the two codes in slightly different contexts internally, but for a merchant trying to recover the payment, the practical meaning is the same: the code the customer entered did not check out.
Why it happens
As with its close relative `incorrect_cvc`, this shows up most often around a payment-details update: a customer re-entering their card after a prompt to fix a failed payment, switching to a different card, or simply retyping information and getting the security code wrong. Nothing about the customer's underlying account or card standing is in question. A single field submitted with the charge didn't pass the bank's check.
How to fix it
Resubmitting the identical incorrect code will fail again, and again after that. There is no waiting period, no backoff schedule, and no number of attempts that turns a wrong security code into a right one. The only thing that changes the result is the customer supplying the correct code. Be straightforward about what your systems actually do here before promising customers anything specific. Foxhound's decline classifier sorts declines into four named buckets: soft, network, expired, and fraud, with an unknown bucket for anything unrecognized. `invalid_cvc` is not one of the codes given a dedicated case in the four named buckets. Anything not specifically recognized falls to the unknown bucket, which fails closed rather than retrying: no automatic retry runs. So today, an `invalid_cvc` failure goes straight to a card-update email rather than a silent retry, which is the correct outcome here since a retry has no real chance of correcting a submitted security code that simply doesn't match. That's the same reason skipping straight to a card-update message, rather than a retry, is the right call: framing the outreach plainly, without over-explaining the CVC mismatch, keeps the ask simple, confirm your card details.
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