Glossary

Stripe Customer Cash Balance

A Stripe customer cash balance holds real money a customer has sent you by bank transfer that has not yet been matched to an invoice or a PaymentIntent, and which you can either apply to a future payment or return to their bank.

Also called: cash balance, customer cash balance, bank transfer balance, customer balance payment method

Definition

Stripe puts it in one line: "A customer's cash balance represents funds that they can use for payment." The funds are real, they are already inside Stripe, and they belong to a named customer rather than to you.

They arrive one of two ways. Stripe says it adds funds to the cash balance "when they overpay or send an amount using a bank transfer that isn't automatically reconciled with any outstanding payment". So a cash balance is what accumulates when somebody wires money and Stripe cannot work out what the money was for.

The reason this object needs explaining is that Stripe has two things a reasonable person would call a customer balance, and they behave nothing alike. One holds money. The other holds a promise. Confusing them is the single most common mistake in this corner of Stripe, and it changes both the accounting treatment and what you are allowed to do with the amount.

The second reason is that a cash balance is easy to accumulate and easy to forget. Nothing about it is an error state. A customer paid you, the money is sitting in Stripe with their name on it, and no invoice has been reduced by a cent.

Key points

  • +Stripe: "A customer's cash balance represents funds that they can use for payment."
  • +Funded by bank transfers, including overpayments and transfers Stripe could not match to anything outstanding.
  • +Stripe: "You can't add funds to the customer cash balance directly." It is not a wallet customers top up.
  • +Stripe calls it "only there as a reconciliation layer" and states plainly that "it's not a digital wallet or e-money".
  • +The funds can only be used for that customer's future payments or returned to that customer.
  • +A customer can hold cash balances in every currency you accept bank transfers in, each with its own funding instruction.
  • +Distinct from the invoice balance, which Stripe describes as representing "liability between you and the customer".
  • +Invoice balance funds cannot be used for payment. Cash balance funds can.
  • +Read it by retrieving the Customer and expanding the cash_balance field.
  • +The settings object carries reconciliation_mode, which is automatic by default.
  • +Spend it by creating a PaymentIntent with the customer_balance payment method type. It fails if the balance is short.
  • +Changes are modelled as cash balance transactions, each with a type naming what moved the money.
  • +funded, applied_to_payment, unapplied_from_payment and refunded_from_payment cover the ordinary lifecycle.
  • +return_initiated and return_canceled cover money going back to the customer's bank.
  • +funding_reversed and adjusted_for_overdraft exist because an ACH reversal can pull funded money back out.
  • +transferred_to_balance is the one type where the money stops being the customer's and becomes yours.

Two things called a customer balance, and only one of them is money

Stripe draws the line itself. Its documentation opens by saying that your customers might have associated balances containing two types of funds, cash and credit, and then separates them.

The cash balance is money. It arrived by bank transfer, it is available for payment, and Stripe will let you return it to the customer's bank account.

The other one is an invoicing construct. Stripe describes it this way: "In contrast to a cash balance, an invoice balance is an Invoices feature that represents liability between you and the customer." The operative restriction follows immediately: "You can't use invoice balance funds for payment, but you can apply them to offset future invoices." You change it by creating a Customer Balance Transaction adjustment, which is a bookkeeping entry rather than a movement of funds.

That difference decides the accounting question before you ask it. Money in a cash balance is money you are holding for somebody. A credit on the invoice balance is an obligation you have taken on. They are not the same amount, they are not the same account, and one of them exists only inside Stripe's invoicing logic.

The naming does not help. In older Stripe material and in a lot of community writing, credit balance is the term used for what the current documentation calls the invoice balance. If you are reading anything about customer balances, check which of the two the writer means before you act on it.

A reconciliation layer, not a wallet

It is tempting to read the cash balance as stored value, and Stripe closes that door explicitly.

First, you cannot fill it on purpose: "You can't add funds to the customer cash balance directly. This isn't a balance that customers can top up." Money only arrives as a side effect of a bank transfer that was not matched, or of an overpayment.

Second, it is limited in what it can do. Stripe says the balance is "only there as a reconciliation layer" and that "it's not a digital wallet or e-money", adding that "You can't use the cash balance for any other purpose besides future payments, or returns to the customer it's associated with". You cannot move it to a different customer, and you cannot convert it into general Stripe balance on a whim.

Third, it is per currency. Stripe: "A customer can have cash balances in all currencies that you accept bank transfer payments in, each with its own funding instruction." A customer who has wired you euros and pounds has two separate pots that do not offset each other, and listing changes for that customer returns transactions across all of the currencies at once.

That framing is the useful one for anybody reconciling. A cash balance is not a product feature you are offering. It is the holding pen Stripe uses for money that arrived without instructions.

The ledger: what actually moves a cash balance

Every change is a cash balance transaction with a type, and the type list is the clearest description of the object's whole lifecycle. Stripe documents nine of them.

Money in. funded means the customer made a bank transfer. Stripe notes these funds "might be automatically applied to PaymentIntents and invoices depending on the reconciliation procedure", and that when they are, you also see an applied_to_payment transaction.

Money applied. applied_to_payment is funds leaving the cash balance to pay a PaymentIntent, either automatically after funding arrives or through manual reconciliation.

Money coming back. unapplied_from_payment happens when a partially funded PaymentIntent is modified or cancelled and the funds return to the balance. refunded_from_payment is a successful PaymentIntent refunded to the cash balance rather than to a card or a bank account. In both cases Stripe says you can use the funds for future payments.

Money leaving for the customer. return_initiated is unspent funds heading back to the customer's bank account. return_canceled is that attempt being called off, either because you cancelled the refund before the customer submitted bank details or because Stripe could not collect those details.

The two ACH types are the ones worth reading twice, because they are the reason a cash balance is not a settled number. funding_reversed is funds "debited from the cash balance due to an ACH reversal". adjusted_for_overdraft is funds returned to the balance after an ACH reversal drove it negative. A cash balance can go negative and then be corrected, which is not the behaviour most people assume of a pot of money.

And one type changes ownership. transferred_to_balance is money moved out of the cash balance and into your Stripe balance "due to failed refunds or insufficient refund details". That is the point at which funds stop being the customer's money held by Stripe and start being yours.

Reading it, and spending it

The cash balance is not returned on a Customer by default. Stripe's instruction is to retrieve the Customer and expand the cash_balance field, which gives you an available map keyed by currency, plus a settings object.

That settings object carries one field worth knowing about: reconciliation_mode, which is automatic in Stripe's own example and by default. Automatic means Stripe tries to match incoming transfers against what you are owed. Manual reconciliation is available per customer and stops that matching, leaving every application of funds as a deliberate act. Which mode a customer is in changes whether an unexpected credit against an invoice is a feature or a bug, so it is the first thing to check when the behaviour surprises somebody.

Spending a cash balance is a normal PaymentIntent with an unusual payment method type. Stripe: "When your customer has a cash balance, you can use the funds immediately to make a payment up to the available amount", by creating a PaymentIntent with the customer_balance type. The rule is binary: "The payment succeeds if the cash balance has sufficient funds, and fails otherwise." There is no partial draw and no automatic top up, though Stripe points you at bank transfer funding to collect the difference.

One practical note for anyone building reports. The Dashboard shows a customer's balance in the Payment methods section of the Customer page, and the remaining balances view is where unreconciled money becomes visible as a list rather than as a surprise.

Why it matters for your books before anybody spends it

A cash balance sits in an awkward accounting position, and the awkwardness is genuine rather than a gap in anybody's tooling.

The money is inside Stripe. It is not in your Stripe balance and it will not be paid out to you. It is attached to a customer, and the two ordinary endings are that it pays one of their future invoices or that it goes back to their bank. Under either ending, no revenue of yours was created by the transfer arriving.

So the sale is not complete when the money lands. An invoice that a customer wired money for stays open until the funds are matched to it, and until that happens your accounts receivable and your Stripe activity disagree by exactly the unmatched amount. That is correct rather than broken, and it is the reason a customer insisting they paid can be right at the same time as an invoice being genuinely unpaid.

The long-tail ending is different, and it is the one that produces a QuickBooks record. When funds sit unreconciled for long enough, Stripe stops holding them for the customer and moves them to your balance. That movement, and its accounting treatment, is covered in full in the unreconciled payments guide linked below, along with the timeline that leads to it.

The one place a cash balance reaches QuickBooks

A cash balance is a Stripe-side object and, for almost its whole life, nothing about it belongs in QuickBooks. The money is not yours, the sale it might eventually pay for is already recorded through the invoice, and no balance transaction has occurred on your account.

Acodei's product documentation covers exactly one point of contact: payment_unreconciled. That is the balance transaction type Stripe creates when funds have sat in a customer's balance for more than ninety days and it moves them into your Stripe balance. Acodei imports it as a credit and records it as other income in QuickBooks, usually through the daily summary deposit for that date, and it increases the Stripe holding balance.

That is the whole of the documented behaviour, and the boundary is worth stating rather than blurring. Acodei's documentation does not describe reading a customer cash balance, reporting on unmatched funds, reconciling a bank transfer against an invoice, or writing anything to QuickBooks at the moment funds are received into a cash balance. Those are Stripe-side operations, and the visibility for them is in the Stripe Dashboard.

One consequence follows from that and is worth planning around. If you rely on bank transfers, the gap between money arriving in a customer's cash balance and that money being applied to an invoice is a period in which your books are correct and your Stripe activity looks like it disagrees with them. Nothing needs fixing during that window. It closes when the funds are matched.

Want to see this on your own Stripe data?

Start a free trial

Frequently asked questions

What is a Stripe customer cash balance?

Money a customer has sent you, held inside Stripe against that customer, which has not been matched to an invoice or a PaymentIntent. Stripe defines it as funds "that they can use for payment", and says balances build up when a customer overpays or sends a bank transfer that is not automatically reconciled with anything outstanding.

What is the difference between a cash balance and a credit balance in Stripe?

A cash balance is real money that arrived by bank transfer and can be used to pay or be returned to the customer's bank. The other balance, which current Stripe documentation calls the invoice balance, is an Invoices feature representing liability between you and the customer. Stripe says you cannot use invoice balance funds for payment, only apply them against future invoices.

Can a customer top up their Stripe cash balance?

No. Stripe states that "You can't add funds to the customer cash balance directly. This isn't a balance that customers can top up." It fills only as a by-product of bank transfers and overpayments, and Stripe describes it as a reconciliation layer rather than a digital wallet or e-money.

How do I see a customer's cash balance?

Through the API, retrieve the Customer and expand the cash_balance field, which returns the available amounts by currency and a settings object. In the Dashboard, the balance appears in the Payment methods section of that customer's page.

Can a customer have cash balances in more than one currency?

Yes. Stripe says a customer "can have cash balances in all currencies that you accept bank transfer payments in, each with its own funding instruction". The pots are separate and do not offset each other, and listing cash balance transactions for that customer returns changes across every currency.

What does reconciliation_mode do?

It decides whether Stripe tries to match incoming bank transfers against what you are owed. Automatic is the default. Manual reconciliation is set per customer and turns off automatic application, so funds stay in the cash balance until somebody applies them deliberately.

Can a Stripe cash balance go negative?

It can, temporarily. Stripe documents a funding_reversed transaction type for funds debited from the balance because of an ACH reversal, and an adjusted_for_overdraft type for funds returned to the balance after a reversal drove it negative.

Does a cash balance show up in QuickBooks?

Not while the money is still the customer's. Acodei's documentation covers one point of contact, the payment_unreconciled balance transaction Stripe creates when funds have sat unclaimed for more than ninety days and moves them to your balance. Acodei imports that as a credit recorded as other income, usually on that date's daily summary deposit, which increases the Stripe holding balance.

What customers say about running Stripe through Acodei

Stripe Verified Partner BadgeQuickBooks Intuit Badge
If you're testing out all the different Stripe/QuickBooks integration apps right now, let me save you some time. This one is the best one by far.
RyanOwner at Indie Music Academy
Works well and is really helpful for massive transactions. The support is really fast and helpful. 100% recommended.
AndresCo-founder and CEO at Kanguro Collections and Reinsurance

Related reading

More glossary terms

See the full glossary

Ready to try Acodei?

Connect Stripe to QuickBooks Online in minutes and let the fees, refunds, and payouts land where your accountant expects them.