Stripe Customer Balance and Credits in QuickBooks
Stripe applies customer credits and debits to the next invoice automatically, so the amount charged stops matching the value of the sale. Here is what...
A customer overpays a $1,200 invoice by $300. Next month Stripe bills them $1,200 again, charges their card $900, and marks the invoice paid. Your bank gets $900. Your revenue for the month is $1,200. Both numbers are correct.
Now the question that decides whether your books close cleanly: what should the QuickBooks invoice say?
There is a real answer, and it depends on one setting. Get it wrong and either your Accounts Receivable understates what you sold, or your A/R and your Stripe invoice stop agreeing on the amount. This post covers where these balances come from, what Stripe actually does with them, and how the two possible QuickBooks treatments differ.
If you would rather not hand-reconcile any of this, Acodei syncs Stripe invoices and their payments into QuickBooks Online, including applied balances. Start a free trial.
What a Stripe customer balance is
A customer balance is a running credit or debit that Stripe carries on the customer record, separate from any individual invoice. It is not a credit note, and it is not a refund. It sits on the customer and waits for the next invoice.
The sign convention trips up nearly everyone, because it is the opposite of what most people guess. In Stripe's documentation, negative values are treated as a credit, meaning a reduction in the amount owed by the customer. Positive values are treated as a debit, an increase in the amount the customer owes you. A customer who is owed $300 has a balance of -30000 in the API.
Stripe applies it automatically. The docs are explicit: the invoice balance automatically applies to the next invoice finalized for the customer, a credit balance is applied up to the invoice total amount, and a debit balance applies the full balance to the invoice. One constraint matters for anyone billing internationally: the invoice balance and the invoice currencies must match. A EUR credit will not reduce a USD invoice.
Where these balances come from
Most businesses have customer balances without knowing it, because three of the four sources are automatic.
Overpayments. A customer pays $1,500 against a $1,200 invoice. The extra $300 becomes a credit waiting for next month.
Manual dashboard adjustments. Under Customer invoice balance in the Stripe Dashboard, Adjust balance lets you set an adjustment type of credit or debit, an amount, and an internal note. Support teams use this constantly to make goodwill gestures. It is the source most likely to surprise the person doing the books, because nothing about it looks like an accounting transaction at the time.
Sub-minimum amounts due. Stripe documents that when the amount due on an invoice is less than the minimum chargeable amount, the invoice is marked as paid and the amount owed moves to the invoice balance as a debit. A $0.28 usage invoice does not get charged. It gets carried forward.
Subscription downgrades. Stripe notes that prorations from downgrading a subscription can indirectly create credits that reduce the amount due on the next invoice.
That last pair is why customer balances are endemic in usage-based and seat-based SaaS billing rather than rare.
The two fields that tell you what happened
Every Stripe invoice carries the before and after picture, and reading them is how you audit any of this.
starting_balance is documented as the starting customer balance before the invoice is finalized. ending_balance is the ending customer balance after finalization, and it stays null until the invoice is actually finalized, which Stripe describes as happening roughly an hour after successful webhook delivery or when payment collection is attempted.
amount_due is where the effect lands. Stripe's invoice object reference says the amount due may be 0 if there is account credit that can be applied to the invoice, and that a positive starting_balance, meaning the customer owes money, is also taken into account. The sentence that matters most for reconciliation is the last one: the charge that gets generated for the invoice will be for the amount specified in amount_due.
So on our example invoice: subtotal is 120000, total is 120000, starting_balance is -30000, amount_due is 90000, and the charge is $900. The $1,200 never stopped being the value of what you sold. Stripe simply collected less cash for it this month.
The QuickBooks fork in the road
Here is the actual accounting question. You sold $1,200 of service. You collected $900. The other $300 was settled by a credit the customer had already paid you in a previous period.
Treatment one records the QuickBooks invoice at $1,200 with a $300 offsetting line, so the invoice nets to the $900 Stripe charged. The QuickBooks document mirrors the Stripe document exactly, line for line, and the payment that follows matches it to the penny.
Treatment two records the QuickBooks invoice at the full $1,200 with no offset, and lets A/R carry the full value of the sale. The payment applied against it is $900, leaving $300 outstanding on that invoice until you clear it against the credit you are separately tracking.
Neither is wrong. They optimize for different things, and the tradeoff is genuinely symmetric:
- The mirroring approach keeps Stripe and QuickBooks reconcilable document-by-document. Every invoice total in QuickBooks equals the matching Stripe invoice total, so a mismatch is always a real error rather than an expected difference. The cost is that your A/R and your revenue reporting show an invoice for less than the sale was worth.
- The gross approach keeps A/R honest about the value of what you sold, which is what most accountants want from A/R. The cost is that your QuickBooks invoice and your Stripe invoice legitimately disagree, so you lose the ability to treat any difference as a red flag.
If you have ever chased a Stripe and QuickBooks invoice mismatch that turned out to be nothing, this is one of the reasons it happens.
What Acodei does, and the setting that flips it
Acodei's Invoice Sync mirrors finalized Stripe invoices into QuickBooks, reproducing every line item and the tax lines your mapping settings allow. It is available on paid plans and is toggled per company under Account Mapping, in the Premium Features block.
On applied balances, Acodei defaults to the mirroring approach. Acodei includes the applied balance, the starting_balance value, as a line item on the QuickBooks invoice, so the invoice reflects the exact amount Stripe charged. Your $1,200 invoice arrives in QuickBooks carrying a $300 applied-balance line and nets to $900.
The alternative is a setting called Skip 'Applied Balance' as line item on Invoice, enabled through the Acodei admin portal. With it on, Acodei ignores the applied balance and creates the invoice at the full gross amount, subtotal plus tax, so that QuickBooks A/R reflects the full value of the sale. That is the gross approach, and it is a deliberate choice you ask for rather than a default you drift into.
There is a third path worth knowing about: when credit sync is enabled, the applied balance is skipped at invoice creation rather than posted as a line.
Once the invoice exists, payment behaves normally. When the Stripe invoice is paid, whether by a successful charge, a manual payment according to your settings, or a credit balance offset, Acodei creates a QuickBooks Payment Receipt or Credit Memo and applies it to the invoice it already created. That automatic application depends on QuickBooks Automatic Application being turned on, which is worth checking before you conclude something is broken. Payments land in whichever holding account you configured, Undeposited Funds or a regular asset account.
Two things Acodei deliberately does not do here. Stripe fees are never added to invoices, because that would break the invoice total, and are handled through sales receipts, deposits, or expenses under your fee rules instead. And there is no two-way credit balance sync: Acodei's documentation states plainly that it is not being pursued, though customer balances in Stripe can be tracked over time. If you adjust a customer's balance in QuickBooks, nothing flows back to Stripe. Stripe remains the system of record for the balance itself.
The rough edges
This is the part most vendors leave out, and you should know it before you turn anything on.
The applied-balance path has two open issues in Acodei's own tracker: one on invoice amount validation when an applied balance is present, and one on handling invoices with negative line items. Neither makes the feature unusable, but if you run high volumes of credit-carrying invoices, expect to check rather than assume.
That second issue points at a related case. When credits exceed charges, the invoice total goes negative, and a negative invoice is not really an invoice at all. Acodei converts it to a Credit Memo, or splits it into a credit memo plus a $0 invoice, depending on amount_paid. This is a different mechanism from the applied-balance line, and it is the correct one, because QuickBooks has no coherent representation of an invoice for a negative amount.
Validation is narrower than people assume, in both directions. Acodei compares the final QuickBooks invoice against the Stripe invoice amount to make sure they match exactly, but that check only applies when tax is enabled. When recording an invoice payment, it separately checks that the correct payment amount was applied and that the payment is linked to the correct invoice. Knowing which check runs when saves time when you are trying to work out why something passed.
One more constraint that catches multicurrency businesses: zero-decimal currencies such as JPY are not supported.
Customer balance is not a credit note
These two get conflated constantly, and they behave differently enough that mixing them up will cost you a close.
A credit note reduces a specific invoice. It points at that invoice, it reduces that invoice's total, and in Acodei a credit_note.created event becomes a QuickBooks Credit Memo, linked to the invoice when possible and otherwise posted to the customer. If you want the mechanics, Stripe credit notes and proration credits in QuickBooks covers it.
A customer balance points at nothing. It sits on the customer and reduces whatever invoice happens to be finalized next. That difference is why they need different treatments in QuickBooks: a credit note is an adjustment to a sale you already recorded, while an applied balance is a payment method for a sale you are recording now.
How to check what yours is doing
Three steps, in order.
- In Stripe, open a recent invoice for a customer you suspect has a balance and read
starting_balanceandamount_due. Ifamount_dueis lower thantotal, a balance was applied. - Open the matching QuickBooks invoice. If it carries an applied-balance line and nets to the charged amount, you are on the default. If it shows the full gross with no offset, the skip setting is on.
- Decide which you want, and make it deliberate. If you are switching, do it at a period boundary, because a file with both treatments in the same month is genuinely hard to explain later.
If you find historical records that are wrong, resync from the Data Feed rather than hand-editing QuickBooks. A resync deletes the records and adds them again, which is why Acodei's own best-practice guidance is to resync rather than alter transactions by hand in QuickBooks. The same care applies to the invoices marked paid outside Stripe workflow.
FAQ
What is a Stripe customer balance?
It is a credit or debit Stripe carries on the customer record rather than on any single invoice, and it applies automatically to the next invoice that finalizes. In the API a negative value is a credit that reduces what the customer owes, and a positive value is a debit that increases it.
Why is my Stripe invoice total different from what the customer was charged?
Because a customer balance was applied. The invoice total is the value of the sale, and amount_due is what Stripe actually charges after applying any balance. Stripe generates the charge for amount_due, so a $1,200 invoice with a $300 credit produces a $900 charge.
Should my QuickBooks invoice show the gross amount or the amount charged?
Both are defensible. Mirroring the amount charged keeps Stripe and QuickBooks documents comparable one to one. Recording the gross amount keeps A/R reflecting the full value of the sale. Acodei defaults to including the applied balance as a line item so the invoice matches what Stripe charged, and a setting in the admin portal switches it to the full gross amount instead.
Does a customer balance in QuickBooks sync back to Stripe?
No. Acodei's documentation states that two-way credit balance sync is not being pursued, although customer balances in Stripe can be tracked over time. Stripe stays the system of record, and adjustments made in QuickBooks stay in QuickBooks.
What happens when a customer's credit is larger than the invoice?
The invoice total goes negative, and it stops being an invoice. Acodei converts it to a Credit Memo, or splits it into a credit memo plus a $0 invoice, depending on how much was paid. QuickBooks has no sensible way to represent a negative invoice, so the conversion is the correct behavior rather than a workaround.
Where do customer balances come from if I never created one?
Usually overpayments, support team adjustments in the Stripe Dashboard, subscription downgrade prorations, or invoices below the minimum chargeable amount being carried forward as a debit. Three of those four happen without anyone deciding to create a balance.
The short version
A customer balance separates the value of a sale from the cash collected for it, and QuickBooks needs you to pick which one the invoice represents. Acodei's default mirrors Stripe, so the QuickBooks invoice matches the charge. The admin setting records the full gross instead, so A/R matches the sale. What you cannot do is leave it undecided, because then you are reconciling two systems that disagree for reasons nobody wrote down.
Acodei syncs Stripe invoices, their payments, credit notes, and applied balances into QuickBooks Online, with the fee and payout side handled through Balance Transaction Mapping rather than left as an unexplained deposit difference. Start a free trial or see how the rest of the reconciliation works in the Stripe fees guide.
Automate your Stripe to QuickBooks sync
Save hours every month. Acodei automatically syncs your Stripe transactions, invoices, and payouts to QuickBooks Online.
How Acodei handles this in your stack
Stripe to QuickBooks Integration
Automatically sync Stripe payments, fees, refunds, and payouts to QuickBooks Online. Real-time, accurate, and audit-ready — no manual exports, no spreadsheets.
Advanced Product Mapping
Map Stripe products to QuickBooks with rule-based logic on product ID, price ID, metadata, and account. Set rule priority and extend mapping to refunds and fees.
Automated Invoice Sync
Bring Stripe invoices into QuickBooks and auto-apply payments and credit memos, with numbering, invoice matching, and quantity tracking to cut double-entry.
Multi-Currency Mastery
Sync Stripe transactions across currencies with automatic exchange rate handling, currency-specific customer records, and invoice-level multicurrency.
Class Mapping
Map Stripe products to QuickBooks classes for scalable categorization and multi-entity reporting, enabling precise insights without manual effort.
Historical Data Import
Backfill historical Stripe data into QuickBooks by month range. Preview volume and cost before syncing so reporting starts from a complete baseline.
How to Connect Stripe to QuickBooks Online
Connect Stripe to QuickBooks Online in minutes. Acodei links both accounts with secure OAuth and syncs payments, fees, refunds, and payouts automatically.
Reconcile Stripe Payments in QuickBooks
Reconcile Stripe in QuickBooks Online automatically. Acodei splits out fees, matches payouts to deposits, and keeps every charge audit-ready.
Get more operational finance guides like this one
We will only send high-value product and finance content.