Skip to content

Stripe payment errorStripe: “Your card has insufficient funds” (insufficient_funds)

A payment fails with card_declined and decline_code insufficient_funds, or a refund, transfer or payout fails because of your balance. These are two different problems with similar names: one is about the customer’s card, the other is about the money in your Stripe account.

Short answer

If the decline_code is insufficient_funds, the customer’s bank said no. Nothing in your code is broken: show a clear message and let them pay with another card or method. If the error code is balance_insufficient, or a refund is stuck as pending, your own available Stripe balance is too low: wait for pending funds to become available (or top up if a refund is pending), then retry.

Which balance is short, and the fix

  1. 01

    The customer’s card: decline_code insufficient_funds

    “The card has insufficient funds to complete the purchase.” Stripe, Decline codes (insufficient_funds)

    The issuer declined the charge for lack of funds or credit. Show a plain message and offer another payment method. Retrying the same card right away rarely helps; check outcome.advice_code on the Charge before any automatic retry.

  2. 02

    Show the right message to the customer

    “The customer needs to use an alternative payment method.” Stripe, Decline codes (insufficient_funds)

    Stripe’s next step for this code is another payment method, so the checkout should keep the customer on the page with the error and a way to switch cards. For subscriptions, send them to update the card instead of retrying the same one.

  3. 03

    Your Stripe balance: refunds stuck as pending

    “Refunds use your available Stripe balance (not including pending amounts).” Stripe, Refunds

    A refund draws on your available balance, not money that is still pending. If the available balance is too low, a card refund waits as pending until funds arrive; you can also top up the balance.

  4. 04

    Your Stripe balance: transfers and payouts with balance_insufficient

    “Stripe can’t complete this operation because the associated account doesn’t have enough available balance.” Stripe, Error codes (balance_insufficient)

    With Connect, a transfer to a connected account or a payout fails when the available balance can’t cover it. Stripe doesn’t retry it for you: once funds are available, make the transfer again.

    // check the available balance first
    const balance = await stripe.balance.retrieve();
    console.log(balance.available); // [{ amount, currency }]

Checked against the vendor’s docs on : Stripe docs: Decline codes; Stripe docs: Card declines; Stripe docs: Error codes; Stripe docs: Refunds; Stripe docs: Connect account balances.

Rather hand it over?

Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.

Related: Stripe card declined: generic_decline · Stripe subscription stuck incomplete · Stripe Connect onboarding incomplete · Stripe “No such PaymentMethod”

Questions

More on this error

How do I test the insufficient funds decline?

Use Stripe’s test card 4000000000009995 in test mode. It returns card_declined with decline_code insufficient_funds, so you can check what your checkout shows.

Is it safe to tell the customer the real reason?

For insufficient_funds, Stripe’s next step is that the customer uses another payment method, so saying the card was declined for insufficient funds is fine. Codes such as fraudulent and lost_card should be shown as a generic decline.

Can buy now, pay later options help?

Stripe suggests adding a buy now, pay later option to reduce declines from insufficient funds. Check that it fits your products and countries first.

Can you fix it for me?

If one bug is the whole problem, the App Fix Ticket covers it: a written diagnosis first, then the fix. If the app has more going on, the Launch Check is a written check of the whole app. Each issue found is rated critical, high, medium or low, with where it is and how it was confirmed. 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.

A different error?

Describe it and get a written quote

Send the error and what you were doing. You get a written scope, a fixed price and a timeline; Simon replies by email, usually within one business day.