Short answer
Show a clear message that asks for another card or for the customer to contact the bank. Don’t retry the same card in a loop. For subscriptions, let your retry schedule try again later and email the customer a link to update the card.
Rather not fix it yourself? Stripe Billing Fix and Setup handles it at a fixed price, agreed before work starts.
What the code means, and the fix
01
The customer reached a limit on the card
“The customer has exceeded the balance, credit limit, or transaction amount limit available on their card.” Stripe, Decline codes (card_velocity_exceeded)
The bank set the limit, so only the cardholder can change it. It can be the credit limit, the available balance, or a limit on the transaction amount.
02
The app needs to read the decline code
The error type is card_error with code card_declined, and decline_code says why. On a PaymentIntent it is in last_payment_error. In Stripe.js, confirmCardPayment doesn’t throw: it resolves with { error }, and the code is error.decline_code. Show a message for this code instead of a generic failure.
// server side (Node); piId and pmId: your PaymentIntent id and the new payment method id try { await stripe.paymentIntents.confirm(piId, { payment_method: pmId }); } catch (err) { if (err.type === 'StripeCardError' && err.decline_code === 'card_velocity_exceeded') { // ask for another card, or for the customer to contact the bank } }03
Retrying the same card right away
“The customer needs to contact their card issuer for more information.” Stripe, Decline codes (card_velocity_exceeded)
A limit doesn’t reset in seconds, so repeated tries fail the same way. Many failed tries in a row can also look like card testing. Stop after the decline and ask for another payment method, and attach it to the same PaymentIntent instead of creating a second one, so one order stays tied to one charge.
04
Renewals fail at the start of the month
A renewal may fail when other charges have used up the card’s limit that day. Let Smart Retries or your retry schedule try again on a later day, and send the customer a link to update the card, such as the customer portal.
Checked against the vendor’s docs on : Stripe docs: Decline codes.
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 insufficient_funds · Stripe do_not_honor · Stripe generic_decline · Stripe card_not_supported