Stripe Zero Dollar and Negative Invoices in QuickBooks
A $0 Stripe invoice is two different documents wearing the same label, and only one of them belongs in QuickBooks. Plus what happens when an invoice total...
A SaaS company running a 14-day free trial creates hundreds of $0 invoices a month. Open QuickBooks and none of them are there. Nothing is broken, and that is the correct behavior, but almost nobody finds out until they are trying to work out why Stripe says 1,847 invoices and QuickBooks says 1,203.
The confusing part is that "$0 invoice" describes two completely different documents. One of them represents a real sale that somebody already paid for with credit. The other represents nothing at all. They look nearly identical in the Stripe Dashboard, and they get opposite treatment on the way to QuickBooks.
Negative invoices are the same story one step further. Stripe will happily produce an invoice whose total is below zero, and QuickBooks has no such thing as a negative invoice, so something has to give.
If you would rather not audit any of this by hand, Acodei syncs Stripe invoices and their payments into QuickBooks Online, with documented rules for the cases below. Start a free trial.
Why Stripe creates $0 invoices in the first place
Four separate mechanisms produce them, and it is worth being able to tell them apart because they mean different things to your books.
Free trials. Stripe's subscription documentation describes creating a subscription with trial_end set a few seconds into the future, which "first generates a 0.00 USD invoice," with the real invoice arriving after the trial ends. Every trial start produces one of these. The line items themselves are zero.
Full-coverage discounts. A 100% off coupon leaves line items at their normal price and drives the invoice total to zero through the discount. The sale nominally happened at full price and then was entirely discounted.
Customer credit covering the whole invoice. This is the important one. Stripe's invoice object reference defines amount_due as the "final amount due at this time for this invoice," and states plainly that if "there is account credit that can be applied to the invoice, the amount_due may be 0." The line items are real and non-zero. The customer simply is not being charged today, because a credit balance is absorbing it.
Amounts below Stripe's minimum charge. Stripe publishes a minimum chargeable amount per currency: 0.50 USD, 0.30 GBP, 0.50 EUR, 10 MXN, and so on. When an invoice comes in under that floor, the invoice workflow docs say "the invoice automatically transitions to paid status and Stripe debits the amount from the customer's credit balance." You did not get paid. The amount became a debit the customer carries into next month.
What Stripe does with them
None of these produce a charge. Stripe's workflow documentation is explicit that an invoice can reach paid without any PaymentIntent succeeding when it relates to a trial or free subscription, when amount_due is covered by credit balance or falls below the minimum charge amount, or when it is marked paid_out_of_band. In those cases, per the docs, "you receive the invoice.paid event, but no invoice.payment_succeeded event."
That detail matters more than it looks. Any reconciliation built on payment events will never see these invoices, because no payment event ever fires. They are only visible on the invoice events. If you have ever written a script that ties out Stripe to QuickBooks off charge.succeeded, this is the class of document it silently drops.
The distinction that decides everything
Here is the test that separates the two kinds of $0 invoice:
| Invoice shape | amount_due | Line items | Does it represent revenue? |
|---|---|---|---|
| Trial period, $0 plan | 0 | All $0 | No |
| Credit or 100% discount covering the total | 0 | At least one > $0 | Yes |
An invoice whose line items are all zero is a placeholder. There is no sale in it. Posting it to QuickBooks would add a document with no amounts to your Accounts Receivable and inflate your invoice count for no reason.
An invoice with real line items and an amount_due of zero is a genuine sale. The revenue exists. It was settled with credit instead of cash. Leaving it out of QuickBooks means your revenue is understated by exactly the amount the credit absorbed.
Acodei's Invoice Sync keys on precisely this difference. The documented rule for the Enable $0 Invoices setting is that it allows invoices whose amount_due is 0 and which have at least one line item greater than zero to sync. Pure $0 invoices are still skipped. The edge-case rules say the same thing from the other direction: a $0 invoice webhook with line items above zero syncs as a regular invoice, and an invoice containing only $0 line items is ignored and not synced.
Two things about that setting are worth knowing before you go looking for it. It defaults to Off, so out of the box no $0 invoice syncs at all, including the ones that do represent revenue. And it is an admin-portal setting rather than a switch in your dashboard, so turning it on is a request to Acodei rather than something you toggle yourself.
So when a $0 invoice with real line items does not appear in QuickBooks, the first thing to check is not whether something failed. It is whether the setting was ever turned on.
Negative invoices: how you end up with one
Stripe will not let you owe a customer money on an invoice, but it will absolutely produce an invoice whose total is negative.
The usual route is a mid-cycle subscription change. Stripe's proration documentation states that "credit prorations are issued when customers downgrade their subscriptions or cancel subscription items before the end of their billing period," and the resulting invoice carries a negative line item like -166 described as "unused time on Silver plan." If that credit is larger than whatever new charges are on the same invoice, the total goes below zero. Stripe's own proration examples show an invoice with "total": -250.
What Stripe does next is the part people get wrong. It does not refund the difference. The documentation states that "negative prorations aren't automatically refunded and positive prorations aren't immediately billed, although you can do both manually." The excess lands on the customer credit balance, where the sign convention is that negative values are a credit reducing what the customer owes. From there it applies to the next invoice, capped at that invoice's total, with anything left over carrying forward again.
Credit notes work differently and are worth separating out, because people reach for them expecting the same result. A credit note reduces the amount due on an existing invoice without recording a payment, and if it takes an open invoice to zero the invoice flips to paid. But Stripe caps them: "the sum of all credit notes issued for an invoice can't exceed the total amount of the invoice." A credit note cannot drive an invoice negative. Only line-item math can.
What lands in QuickBooks
QuickBooks Online has no negative invoice. A document that reduces what a customer owes is a Credit Memo, which is a different object with different behavior in A/R.
Acodei's documented handling for a negative invoice total, meaning credits exceed charges, is to convert it to a Credit Memo, or to split it into a credit memo plus a $0 invoice, depending on amount_paid. Which of the two you get is determined by how much had already been paid on the invoice.
Two honest caveats here, because this is the least settled corner of Invoice Sync.
The first is that a separate admin setting called Handle Negative Invoices, which would detect negative line items and applied balance and convert them to Credit Memos, is documented as not released. The conversion behavior above is what ships today, and there is no additional setting to switch on.
The second is that Acodei's product documentation records an open issue against negative invoice handling, alongside a related one on applied-balance validation. If you run a lot of mid-cycle downgrades, this is a corner worth spot-checking after sync rather than assuming. The general case of an invoice total that does not agree between the two systems is covered in why your Stripe and QuickBooks invoices do not match.
Separately, credit notes have their own path: a credit_note.created event becomes a QuickBooks Credit Memo, linked to the invoice where possible and otherwise posted to the customer.
A worked example
A customer on a $200/month plan downgrades to a $50/month plan halfway through the billing period.
Stripe computes roughly $100 of unused time on the old plan as a credit proration and roughly $25 for the remainder of the period on the new plan. The invoice carries a -100 line and a +25 line. Total: -75.
Nothing is refunded. The customer's balance moves to -7500, a credit. Next month's $50 invoice finalizes, the credit applies up to that invoice's total, amount_due becomes 0, and $25 of credit carries forward again.
In QuickBooks you should expect a Credit Memo for the negative invoice, then next month an invoice whose amount_due is zero but whose line items are real. That second one is exactly the shape that the Enable $0 Invoices setting governs. With the setting off, next month's $50 of revenue never reaches your books, even though the sale happened. Worth sitting with: the invoice that goes missing here is not the trial placeholder anyone would expect to lose. It is the one after a downgrade, carrying real revenue.
When a $0 invoice did not sync, check these in order
- Are the line items actually zero? If yes, it will never sync, and that is correct. Nothing to fix.
- Is
Enable $0 Invoiceson? If the line items are non-zero and the invoice is missing, this is almost always the reason. It is off by default and admin-side. - Did the invoice finalize? Invoice Sync mirrors finalized Stripe invoices. A draft invoice has not entered the pipeline yet.
- Is Invoice Sync itself enabled for the company? It is a paid-plan feature, toggled per company under Account Mapping ▸ Premium Features.
- Is the currency zero-decimal? Zero-decimal currencies such as JPY are documented as not yet supported, and that limitation is separate from anything above.
- Still wrong? Acodei's guidance is to resync from the Data Feed rather than manually altering transactions in QuickBooks. A resync deletes the invoice and payment and adds them again.
Frequently asked questions
Why is my Stripe invoice count higher than my QuickBooks invoice count?
Trial invoices are the usual explanation. Every trial start generates a 0.00 invoice with zero line items, and those are deliberately not synced because they contain no sale. Compare only invoices with non-zero line items before concluding something is missing.
Does a $0 invoice mean I did not earn revenue?
Not necessarily, and this is the whole point. If the line items are zero, there is no revenue. If the line items are real and credit or a discount absorbed the balance, the revenue is real and only the cash collection is zero.
Why did my invoice get marked paid when nobody paid it?
Stripe marks an invoice paid without any charge when it is a trial or free subscription, when credit balance covers it, when it falls below the minimum chargeable amount, or when it is marked paid out of band. You get invoice.paid and no invoice.payment_succeeded.
Can a Stripe invoice total actually be negative?
Yes. Credit prorations from downgrades and cancellations create negative line items, and if they exceed the charges on the same invoice the total goes below zero. Credit notes cannot do this, because Stripe caps them at the invoice total.
What happens to money Stripe owes my customer after a downgrade?
It is not refunded automatically. It becomes a credit on the customer balance and applies against future invoices, capped at each invoice's total, until it is used up.
Does a negative invoice become a negative invoice in QuickBooks?
No, because QuickBooks has no such document. It converts to a Credit Memo, or splits into a credit memo plus a $0 invoice depending on how much had been paid.
How do I get historical $0 invoices into QuickBooks?
Resync the affected dates from the Data Feed rather than recreating them by hand in QuickBooks. Resyncing is the documented path for getting records that are missing or wrong into the right state.
The short version
"$0 invoice" is two different documents wearing the same label. One is a trial placeholder with nothing in it, and it should stay out of QuickBooks. The other is a real sale settled with credit, and leaving it out understates your revenue by exactly the credit applied. The setting that separates them defaults to off, which means the default behavior is the conservative one and also the one that loses real revenue after a downgrade.
Negative invoices are less ambiguous and more mechanical: Stripe produces them from proration credits, never refunds them automatically, and QuickBooks receives a Credit Memo because it has no other honest way to represent the same thing.
Acodei syncs Stripe invoices, payments, credit notes, and applied balances into QuickBooks Online. If you want the neighboring case where credit only partly covers an invoice, that is covered in Stripe customer balance and credits in QuickBooks, and the credit note path is covered in Stripe credit notes in QuickBooks. Start a free trial.
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.