Glossary

Stripe Tax Behavior

Stripe tax behavior is the setting on a Price, inclusive, exclusive or unspecified, that tells Stripe Tax whether the amount already contains tax or whether tax is added on top of it.

Also called: tax_behavior, Stripe inclusive vs exclusive pricing, Include tax in prices, Automatic tax behavior

14-day free trial · card required · cancel anytime

Definition

Every Price in Stripe has a tax_behavior field. Stripe defines it as specifying "whether the price is considered inclusive of taxes or exclusive of taxes," with three values: inclusive, exclusive and unspecified. Stripe Tax needs an answer before it can calculate, so either the Price carries one or the account default in the Stripe Tax settings supplies it.

Exclusive means the price is net and tax goes on top. A 100.00 USD price with an 8% rate charges the customer 108.00 USD. Inclusive means the price already contains the tax, so the customer pays the price and Stripe works backwards to the tax inside it. A 100.00 EUR price sold to a German consumer at 19% VAT charges 100.00 EUR, of which 15.97 EUR is VAT and 84.03 EUR is the net sale.

For the books, that difference is the whole point. With exclusive pricing your revenue per sale is fixed and the customer total moves with the tax rate. With inclusive pricing the customer total is fixed and your revenue moves with it.

Key points

  • +Three values on a Price: inclusive, exclusive or unspecified.
  • +The account default lives in the Stripe Tax settings under Include tax in prices.
  • +Automatic makes USD and CAD prices exclusive and every other currency inclusive.
  • +Once a Price or currency option is set to inclusive or exclusive, it cannot be changed.
  • +It cannot be set by customer location. Different markets need different Prices or currency options.
  • +Inclusive prices keep the customer total fixed, including on reverse charge sales.

Where the setting lives: the Price, the currency option, or the account default

The most specific setting wins. A Price can carry its own tax_behavior. A multi-currency Price can also set currency_options.<currency>.tax_behavior, so its EUR amount can behave differently from its USD amount. Stripe says a top-level tax_behavior "configures the Price's default currency," while the currency option version configures each additional currency.

Where a Price leaves tax_behavior unspecified, the account default applies. Stripe's API reference says the field is "only required if a default tax behavior was not provided in the Stripe Tax settings." You set that default in the Stripe Tax settings, under Include tax in prices, and it covers every Price without its own value.

Prices you never save get the same choice. When a Checkout Session or invoice builds a price on the fly with price_data, the tax_behavior goes inside price_data. Shipping rates carry a tax_behavior of their own, so shipping can be inclusive on an order whose products are exclusive.

What Automatic actually does

The default has three options: Automatic, Inclusive and Exclusive. Stripe recommends Automatic and describes it this way: "For the currencies USD and CAD the tax behavior is exclusive. For all other currencies the tax behavior is inclusive." It works on multi-currency Prices too, one currency at a time.

So Automatic keys on the currency of the price, not on the customer. A US company that sells only in US dollars gets exclusive pricing everywhere, including to customers in Germany or Australia, who then see VAT or GST added at checkout. The same company adding a EUR price gets inclusive pricing on that price, for every customer who pays in euros.

Stripe is explicit that location plays no part: Stripe "doesn't choose tax behavior based on customer location or tax jurisdiction, and you can't configure tax behavior by customer location or tax jurisdiction." If you want customers in one market to see tax-inclusive prices and customers in another to see tax added, you need a separate Price or currency option for each, and your integration has to choose between them.

Why it locks, and what changing your mind costs

Stripe's API reference: "Once specified as either inclusive or exclusive, it cannot be changed." The same applies to a currency option. A Price still at unspecified can be given a value later. A Price already committed either way cannot be flipped.

Changing approach therefore means new Prices. You create the replacements with the behavior you want, move new sales and subscriptions onto them, and archive the old ones. The history stays as it was: every invoice line keeps the Price, and the tax behavior, that produced it.

That is useful when you reconcile. If a period mixes old and new Prices, some lines will have tax inside the amount and some on top of it. Stripe's itemized tax export includes a tax_behavior column, so you can sort the lines before you add them up.

Inclusive prices, reverse charge and exempt customers

Stripe states the rule for inclusive prices plainly: "the amount your customer pays remains constant, regardless of the tax amount (zero or positive). This applies to sales subject to reverse charge as well."

That has a consequence most people only notice in the revenue report. Take one 100.00 EUR inclusive price. A German consumer pays 100.00 EUR, of which 84.03 EUR is revenue. A French consumer at 20% pays 100.00 EUR, of which 83.33 EUR is revenue. A business customer whose sale falls under the reverse charge also pays 100.00 EUR, and all 100.00 EUR is revenue, because no tax is charged. Stripe describes it from the price side: if no tax applies, the tax-inclusive price is the unit price, and if tax applies, the unit price is lower.

With an exclusive price the arithmetic runs the other way. Revenue per sale is fixed at the price, and the customer pays more or less depending on the rate. Neither is wrong. They are different promises, one to your customer and one to your revenue line, and the tax behavior is where you choose which one to keep.

Tax behavior is not the same as a tax rate's inclusive flag

Stripe has two inclusive switches, and they belong to two different ways of doing tax. tax_behavior on a Price is what Stripe Tax reads when it calculates tax automatically. A manually created Tax Rate, the txr_ object you attach yourself, carries a separate inclusive field, which Stripe describes as specifying "if the tax rate is inclusive or exclusive."

If you calculate tax with Stripe Tax, the Price's tax_behavior is the one that matters. If you attach your own Tax Rates, check the inclusive flag on each rate. When an export and an invoice seem to disagree about whether tax was included, first check which of the two switches applies to that line.

In the itemized export, Stripe notes that for inclusive prices the subtotal already includes tax and the total remains tax-inclusive. A subtotal column summed across a mix of inclusive and exclusive lines is not a net sales figure.

Inclusive and exclusive tax in Acodei

Acodei syncs the tax that Stripe Tax calculates, so this applies when Stripe Tax is active in your Stripe account. Acodei's Stripe Tax settings ask their own question, whether tax is inclusive or exclusive, and that answer needs to match how your Stripe prices behave.

Acodei's documentation says that choosing Inclusive automatically turns on manual inclusive tax calculation, so invoice totals in QuickBooks align with Stripe's final tax calculations, and that neither inclusive nor exclusive tax is generally counted as revenue. On a daily summary, the inclusive breakdown is done at the summary level, and the documentation notes that partial or daily summary scenarios can sometimes produce rounding differences.

The documentation describes one setting for the account. It does not cover an account whose prices mix both behaviors, which is what Automatic produces for a business that sells in US dollars and in another currency, so raise that combination with Acodei support before you rely on it. The related guide to inclusive and exclusive tax on Stripe invoices in QuickBooks, linked below, walks through what each setting does to a synced invoice.

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 tax_behavior in Stripe?

It is the field on a Stripe Price that says whether the amount includes tax (inclusive), has tax added on top (exclusive), or is unspecified. Stripe Tax reads it to calculate tax. Where a Price leaves it unspecified, the default tax behavior in your Stripe Tax settings applies.

What does the Automatic tax behavior setting do in Stripe?

Automatic picks the behavior from the price's currency. Stripe makes USD and CAD prices exclusive and prices in every other currency inclusive. It does not look at where the customer is, so a USD price is exclusive for a customer in Germany too.

Can I change a Stripe price from exclusive to inclusive?

No. Once a Price, or a currency option on a Price, is set to inclusive or exclusive, Stripe does not allow it to be changed. Create a new Price with the behavior you want, move new sales to it, and archive the old one. A Price still at unspecified can be given a value later.

Can Stripe show tax-inclusive prices to some countries and exclusive prices to others?

Not from one setting. Stripe does not choose tax behavior by customer location, and you cannot configure it that way. You need a separate Price or currency option for each approach, and your integration selects the right one for each market.

Why did my revenue change when a customer was charged no tax on an inclusive price?

Because inclusive pricing keeps the customer total fixed. Stripe says the amount the customer pays stays the same whether the tax is zero or positive, including on reverse charge sales. When no tax applies, the whole price is revenue. When tax applies, the tax comes out of the same price.

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