Glossary

Stripe Tax Transaction

A Stripe Tax Transaction is the record Stripe Tax keeps each time your tax liability is assumed or reduced, either a sale (type transaction) or a partial or full reversal of an earlier one.

Also called: tax transaction, Stripe tax reversal, tax transaction reversal, Tax Transactions API, tax_transaction_id

14-day free trial · card required · cancel anytime

Definition

Stripe's API reference describes the object in two fields. Its posted_at timestamp marks "when the tax liability is assumed or reduced", and its type is either transaction, which "represents a customer sale or order", or reversal, which "represents a partial or full reversal of an earlier transaction". Every tax transaction has an ID beginning with tax_.

They are the ledger underneath Stripe Tax reporting. Each row of an itemized tax export carries a tax_transaction_id, and Stripe defines the export's type column as the object that triggered the creation of the tax transaction: checkout, credit_note, external, invoice, payment_intent or refund. If you use Stripe Invoicing, Subscriptions or Checkout with automatic tax, Stripe creates these records for you. If you calculate tax yourself through the Tax API, creating them is your job.

For anyone keeping books in QuickBooks, the tax transaction is the unit that explains Stripe's number. The balance in your sales tax liability account is compared against a Stripe figure, and that figure is the sum of these records: sales added, reversals subtracted. When the two disagree, the explanation is almost always a specific tax transaction or a missing one.

Key points

  • +IDs begin with tax_, and the type is either transaction (a sale) or reversal.
  • +posted_at is when the liability is assumed or reduced. tax_date decides which tax rules and rates apply.
  • +A reversal offsets an earlier transaction with amounts of the opposite sign and points back to the original.
  • +Stripe says tax transactions are immutable. You correct one by reversing it, never by editing it.
  • +Summarized exports add sales into total_tax_collected and reversals into total_tax_refunded. filing_tax_payable is the difference.
  • +Upheld disputes and failed payments on finalized invoices do not lower the tax Stripe reports.

Transactions and reversals

A sale creates a tax transaction of type transaction. It records each line item's amount and tax along with the customer's address details, and from its posted_at time the tax counts toward what you owe.

A refund or cancellation doesn't change that record. Stripe says tax transactions are immutable. Instead, a second record of type reversal offsets the first. In Stripe's words, reversal transactions "offset an earlier transaction by having amounts with opposite signs", so a sale recorded at 50 USD might later have a full reversal of -50 USD. In the itemized export, a reversal row carries reversal_original_tax_transaction_id, the ID of the transaction it reversed.

Reversals come in two modes. A full reversal undoes the whole original. A partial reversal undoes specific line item amounts, the shipping cost, or a flat amount that Stripe spreads across whatever is left to refund, in proportion. Stripe allows up to 30 partial reversals for each sale, and reversing more tax than you collected returns an error.

Two details trip people up. A full reversal doesn't affect earlier partial reversals of the same sale, so Stripe says to fully reverse those partials as well, or the refund is counted twice. And because nothing can be edited, a mistaken partial refund is undone by fully reversing the reversal itself.

What moves the tax Stripe reports

Stripe's reporting documentation lists the operations that increase the total tax reported: a customer completing a Checkout payment (including through Payment Links), finalizing an invoice, moving an invoice from uncollectible to paid, voiding a credit note, and creating a tax transaction through the Tax API.

It lists the operations that decrease it: voiding an invoice, marking an invoice uncollectible, creating a credit note, refunding a charge associated with an invoice or a Checkout Session, and creating a reversal through the Tax API. In the summarized export, the tax-refunded columns aggregate reversal transactions only.

The third list is the one that explains most mismatches with QuickBooks: operations Stripe does not reflect in tax reports at all. A failed or canceled payment on a finalized invoice doesn't lower reported tax, because the tax was recorded when the invoice finalized. A dispute upheld by the cardholder's bank doesn't lower it either. Stripe's example is a 100 USD disputed sale with 10 USD of exclusive tax, which still shows 10 USD of tax collected. Refunds of uncaptured amounts on a partially captured payment are also left out.

So if you reversed the tax on a lost dispute in QuickBooks, your liability account will sit below Stripe's figure by that amount, and no tax transaction in Stripe will account for the difference.

The dates on a tax transaction

A tax transaction carries more than one date, and they answer different questions.

In the itemized export, transaction_date is "the time at which the tax liability is assumed or reduced", in the time zone you asked for when exporting, with a UTC twin alongside it. tax_date is "the time used to determine the tax rules and rates". effective_at_utc is the time the tax transaction was created. For invoices, Stripe considers the transaction effective on the date the invoice finalizes and doesn't recalculate the tax afterwards.

Through the Tax API, you can set tax_date up to 31 days in the past or in the future, and Stripe warns that a future date is not guaranteed to match the rules and rates actually in force on that day.

Which period a reversal lands in depends on the report. Stripe's location reports include a refund in the same period as the original transaction, even if the refund happened much later, and Stripe doesn't allow reassigning it. That is why a quarter you already filed can look different when you reopen its location report.

Creating them yourself with the Tax API

Most Stripe businesses never touch a tax transaction directly. Stripe recommends the built-in Stripe Tax integrations for Invoicing, Subscriptions and Checkout, and a simplified PaymentIntents integration that handles tax transactions and reversals automatically.

The custom Tax API is for flows that need control over when transactions are recorded and how refunds are reversed. There, you calculate tax, take payment, and then create the tax transaction from the calculation, which Stripe allows until the calculation expires 90 days after it was created. Each transaction needs a reference, a custom unique identifier such as an order number, and each reversal needs its own unique reference, such as the order number with a refund suffix. Those references are what appear in the exports, so they are what you match against your own records.

Skip that step and you have collected the tax, but Stripe has no record of it. Stripe notes that its Tax Transactions page shows transactions, not calculations, so a calculation that was never turned into a transaction never reaches your reports.

One warning from Stripe applies to anyone refunding through the API: reversing part of a line item's tax so that the tax is no longer proportional to the subtotal makes tax reporting unreliable. Stripe recommends fully reversing the transaction and creating a new one instead.

Reversals and Acodei's tax sync

Acodei's tax sync requires Stripe Tax to be active in your Stripe account. For United States QuickBooks companies, Acodei's documentation describes the Tax Product method, where all Stripe Tax amounts are rolled into a single line on a non-inventory product tied to a liability account, and users file from Stripe's tax reports and pay from that liability account.

On the refund side, Acodei's documentation notes that when a refund is made at the payment level without an item breakdown, Stripe doesn't always provide line-level detail, so the refunded tax can't always be determined and may need a manual adjustment in QuickBooks. A refund made through a credit note carries that line-level detail.

Want to see this on your own Stripe data?

Start a free trial

14-day free trial · card required · cancel anytime

Frequently asked questions

What is a Stripe Tax Transaction?

It is the record Stripe Tax creates when tax liability is assumed or reduced. A sale creates one of type transaction, and a refund or cancellation creates one of type reversal that offsets it. Stripe's tax exports and reports are built from these records, and each has an ID beginning with tax_.

What is a tax transaction reversal?

A reversal is a tax transaction that offsets an earlier one with amounts of the opposite sign. It can be full, undoing the whole sale, or partial, undoing specific line items, shipping, or a flat amount. In the itemized export it points back to the original through reversal_original_tax_transaction_id.

Can I edit or delete a Stripe tax transaction?

No. Stripe says tax transactions are immutable. You correct one by creating a reversal. Even a mistaken partial refund is undone by fully reversing that partial reversal, which leaves both records visible in your exports.

Why didn't a lost dispute lower the tax in my Stripe report?

Stripe doesn't decrease reported tax for disputes upheld by the cardholder's bank. Its example is a 100 USD disputed sale with 10 USD of exclusive tax, which still reports 10 USD collected. If you reversed that tax in QuickBooks, your liability account will be lower than Stripe's figure by the same amount.

Do I have to create tax transactions myself?

Only with the custom Tax API. Stripe Invoicing, Subscriptions and Checkout with automatic tax record them for you, and Stripe's simplified PaymentIntents integration handles transactions and reversals automatically. With the custom API, you create each transaction from a calculation within 90 days, or the sale never reaches your tax reports.

Why does a refund show up in an earlier period?

Stripe's location reports include a refund in the same period as the original transaction, even if the refund happened much later, and Stripe doesn't allow reassigning it. A quarter you already filed can therefore show a lower figure when you reopen its location report.

What customers say about running Stripe through Acodei

Stripe Verified Partner BadgeIntuit QuickBooks
★★★★★
“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.

14-day free trial · card required · cancel anytime