insufficient_funds: what this Stripe decline code means and why the card itself is fine
lane: retry_gentleinsufficient_fundsThe card has insufficient funds to complete the purchase. Stripe's suggested next step is for the customer to use an alternative payment method.
What it means
The issuer compared the amount with what the cardholder had available and said no. On a debit card that means the account balance. On a credit card it means the remaining credit line, which is how a customer with plenty of cash still trips this on a card that is near its limit. The card is valid and the account is open; the issuer had no problem with you or with the transaction. The problem was the number.
That makes it unusual. Most decline codes tell you nothing, or tell you something you can't act on. This one tells you the exact reason, and the reason changes on its own: pay lands, a transfer clears, a statement payment posts, a hotel hold drops off. Nothing on your side is broken, so the decision left to you is when to ask again.
Two things make it messier than it sounds. Issuers check available balance, which is the posted balance minus pending authorisations, so a car-rental hold or a fuel pre-authorisation from another merchant can push the card under your amount while the customer's banking app still shows enough. And the check happens in the card's currency after conversion, with the issuer's own margin added, so a charge that fits comfortably in your currency can miss by the size of that margin. Neither of these shows up in the decline; you get the same code either way.
On the card networks this is response code 51, which issuers use for empty debit accounts and for credit lines that are used up. Stripe returns it as error code card_declined with decline_code insufficient_funds, and the same value appears as outcome.reason on the Charge. Some limit-related declines come back under other codes instead, card_velocity_exceeded in particular, so an issuer enforcing a per-transaction or daily cap won't always report it as this one.
Why it happens
Balance below the amount
The debit account or prepaid card holds less than the renewal amount. This is the most literal reading, and the one that fixes itself on the customer's payday rather than on your billing date.
Credit limit reached
Credit cards return the same code when the available line is used up. The cardholder may have money in the bank and no idea the card is at its ceiling.
Pending holds from other merchants
Hotels, car rentals, fuel pumps and some restaurants authorise more than they settle, and the hold reduces available balance until it drops off. Banking apps often show the posted balance, so the customer sees money the issuer doesn't count.
Currency conversion
The issuer evaluates the amount in the card's currency after conversion, with its own margin on top. A charge that fits in your currency can miss by that margin.
Spend-limited cards
Virtual cards, corporate cards with budgets and some prepaid programmes report a per-card or per-period cap as insufficient funds even when the account behind them is fine. Nothing about the customer's finances follows from it.
Common mistakes
Retrying straight away
The balance hasn't changed since the decline. Immediate reattempts fail the same way, and to the issuer a burst of them reads as automated hammering. They also count against the reattempt limits Visa and Mastercard apply to a declined card, and Stripe itself starts refusing attempts on a card that has been declined too many times, with a card_decline_rate_limit_exceeded error.
Asking for a new card
The card works. An email saying there is a problem with it sends the customer to a form where they re-enter the same details, or gets ignored because from their side nothing is wrong. Save the update request for codes that describe a fault with the card.
Cancelling after the first failure
Few decline reasons clear on their own as reliably as this one. Ending the subscription because a renewal bounced once turns a timing problem into churn, and the customer usually never finds out why.
Telling the customer they have no money
If you email at all, say the bank declined the charge and you will try again. 'Insufficient funds' in a subject line is inaccurate for a credit card that hit its limit and reads as an accusation to everyone else.
How Lirova handles it
Lirova routes insufficient_funds to retry_gentle, the lane for spaced-out retries, rather than to request_update. The reasoning follows from the code. The card is valid and the issuer had no objection to the transaction, so asking the customer to replace the card would be wrong, and retrying the card straight away would be pointless. What changes is the balance, and it changes on the customer's timetable.
The retry schedule differs by decline reason. This is the lane where attempts are spread out rather than stacked, because you are waiting for the customer's money to arrive rather than for a transient error to clear.
FAQ
Does insufficient_funds mean the card is invalid?
No. The issuer accepted the card and the account and declined only the amount. The same card usually goes through once the balance or the available credit changes, which is why asking the customer for a different card is normally the wrong response to this code.
Should I retry an insufficient_funds decline?
Yes. It is one of the few decline codes where a later attempt on the same card has a real chance without anyone doing anything. Spacing matters more than volume: the balance moves on the customer's pay cycle, and Visa and Mastercard count reattempts per card, so leave real time between attempts.
Why was the card declined for insufficient funds when the customer says they have money?
The issuer checks available balance, which is the posted balance minus pending authorisations from other merchants, and on credit cards it checks remaining credit rather than cash. Charges in a foreign currency are evaluated after conversion. The number in the customer's banking app is often not the number the issuer used.
Does insufficient_funds show up as card_declined in Stripe?
Yes. Stripe returns error code card_declined for issuer declines and puts the specific reason in decline_code, which here is insufficient_funds. The same value appears as outcome.reason on the Charge. If you only log the top-level code you lose the one detail that makes this decline easy to handle.
What should I tell a customer whose payment failed for insufficient funds?
Keep it neutral: the bank declined the charge and you will try again. Don't put the code or the phrase 'insufficient funds' in the subject line. On a credit card it is often inaccurate, since the limit rather than the balance was the problem, and on a debit card it comes across as blame.
Related codes
Updated 2026-09-01