Short answer
Catch the error after confirmPayment, check for code incorrect_cvc, and show a message on the CVC field instead of a generic decline. Keep the same PaymentIntent so the retry goes through the same payment. In tests, enter a CVC, because Stripe skips the check when it is empty, and use test card 4000000000000127 to see the decline.
Rather not fix it yourself? Stripe Billing Fix and Setup handles it at a fixed price, agreed before work starts.
What incorrect_cvc means, and the fix
01
The customer typed the code wrong
“The CVC number is incorrect.” Stripe, Decline codes (incorrect_cvc)
The bank compared the three or four digits with the card and they didn’t match. Nothing was charged.
02
Show the error on the CVC field
“The card’s security code is incorrect. Check the card’s security code or use a different card.” Stripe, Error codes (incorrect_cvc)
Name the field so the customer knows what to fix. An empty or short CVC is caught by the Payment Element before the bank sees it, so this decline means the digits were complete but wrong.
const { error } = await stripe.confirmPayment({ elements, confirmParams: { return_url: 'https://example.com/done' }, redirect: 'if_required', }); if (error?.code === 'incorrect_cvc' || error?.decline_code === 'incorrect_cvc') { showMessage('The security code doesn’t match this card. Check the 3 or 4 digits and try again.'); }03
Let the customer retry
“The customer needs to try again using the correct CVC.” Stripe, Decline codes (incorrect_cvc)
Keep the PaymentIntent and confirm it again with the corrected details. Don’t create a new one on every attempt.
04
Your tests never fail the CVC check
“Stripe skips the CVC check if you omit it, so the check can’t fail.” Stripe, Testing
If a test leaves the CVC empty, the check is skipped. Enter any three digits, and use card 4000000000000127 to see the incorrect_cvc decline.
05
Radar blocks CVC failures the bank allowed
“Enable this rule to block payments that fail a card issuer’s CVC verification check, unless Stripe evaluates it as low risk.” Stripe, Radar rules (CVC and AVS)
Some banks approve a payment even when the CVC check fails. A Radar rule can block those payments too. The customer then sees a generic decline (generic_decline) and the payment shows as blocked in the Dashboard, so an incorrect_cvc handler never runs. Check your Radar rules if many payments are blocked.
Checked against the vendor’s docs on : Stripe docs: Decline codes; Stripe docs: Error codes; Stripe docs: Testing; Stripe docs: Radar rules.
Rather hand it over?
Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.
- $950Stripe Billing Fix and SetupSubscriptions, webhooks, customer portal and failed payments set up or fixed, tested in Stripe test mode.See scope and start
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
- from $450AI-Built App RescueA Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way. This applies to the first 10 Launch Checks bought after October 30, 2026.See scope and start
“Working with Simon makes everything run so smoothly and better than I could ask for it. Amazingly communicative, extremely knowledgeable of coding and the backend processes. I strongly recommend.”
Related: Stripe expired_card · Stripe do_not_honor decline · Stripe card declined (generic_decline) · Stripe insufficient_funds · Stripe incorrect_number