Short answer
Show the same message as a generic decline and don’t retry the same card. Open the payment in the Dashboard and read the Radar outcome and risk insights. If many fraudulent declines arrive in a short time, treat it as card testing and add rate limits or a CAPTCHA to checkout.
Rather not fix it yourself? Stripe Billing Fix and Setup handles it at a fixed price, agreed before work starts.
Why Stripe flags the payment, and the fix
01
Stripe suspects the payment is fraud
“By default, a score of 65 or above indicates elevated risk, while a score of 75 or above indicates high risk.” Stripe, Risk evaluations
Open the payment in the Dashboard and read the risk level. On Radar plans that show a score, it runs from 0 to 99. By default a high risk payment is blocked before the bank is asked, so the customer isn’t charged.
02
The app shows the real reason
“Don’t report more detailed information to your customer.” Stripe, Decline codes (fraudulent)
Telling a fraudster the payment looked fraudulent helps them adjust. Catch the card error and show one generic message for fraudulent, lost_card and stolen_card.
try { await stripe.paymentIntents.confirm(paymentIntentId); } catch (err) { const hide = ['fraudulent', 'lost_card', 'stolen_card', 'merchant_blacklist']; if (err.type === 'StripeCardError' && hide.includes(err.decline_code)) { console.error('card declined', err.decline_code); // for your logs only return res.status(402).json({ message: 'Your card was declined. Try another card or contact your bank.' }); } throw err; }03
A burst of declines is card testing
Many small payments with different cards, often from the same IP address, mean someone is testing stolen cards. Rate limit the payment endpoint, add a CAPTCHA, and require sign-in before checkout.
04
A real customer was blocked
“If Stripe Radar blocks a payment that you know is legitimate, you can remove the block by viewing the payment in the Dashboard and clicking Add to allow list.” Stripe, Risk evaluations
If you know the customer is real, open the payment in the Dashboard and click Add to allow list, then ask them to pay again. Allow-listing doesn’t retry the payment for you.
Checked against the vendor’s docs on : Stripe docs: Decline codes; Stripe docs: Declines; Stripe docs: Risk evaluations; Stripe docs: Review payments.
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 lost_card and stolen_card · Stripe generic_decline · Stripe card_velocity_exceeded · Stripe dispute (chargeback)