Net prices, gross prices, and tax

Configure net versus gross pricing and the tax calculation that B2B invoicing depends on, and know when to bring in an external tax provider.

Ask about this Page
Copy for LLM
View as Markdown

After completing this page, you should be able to:

  • Distinguish net from gross pricing using the includedInPrice flag.

  • Select the tax calculation and rounding modes that match a B2B invoice.

  • Recognize when the built-in tax engine is insufficient and an external provider is required.

B2B and B2C diverge sharply on tax presentation. A consumer storefront usually shows tax-inclusive prices; a B2B buyer is almost always quoted and invoiced on net prices, with tax added as a separate line. On top of that, B2B orders carry high quantities, so the exact point at which tax is applied (and how the result is rounded) can move the invoice total by a meaningful amount. This page covers the configuration that controls all of that.

Net versus gross: the includedInPrice flag

Whether a price is net or gross is a property of the Tax Rate, set by includedInPrice:
  • includedInPrice: false: the price is net; tax is calculated on top and added (bottom-up). The buyer's price plus tax is the gross amount. This is the typical B2B configuration.
  • includedInPrice: true: the price is gross; tax is already contained in the price and is calculated out of it (top-down).
After calculation, the Cart's taxedPrice exposes both sides: totalNet (before tax) and totalGross (after tax). For a B2B invoice that quotes net and adds tax, includedInPrice: false gives you the net figure as the basis and the gross figure as the payable total.

How tax is set: TaxMode

Use TaxMode to decide where rates or amounts come from. For B2B, the usual choice is between letting commercetools select straightforward rates with Platform, or integrating a tax provider through External or ExternalAmount when the tax logic is too complex for project configuration.
The built-in Platform tax engine suits simple, rate-based regimes such as a single VAT rate per country. It is not sufficient for complex jurisdictions: United States sales tax, for example, combines state, county, and city rates and frequently changes. For those cases, integrate a dedicated tax service through External or ExternalAmount. Treating complex tax as a configuration problem inside commercetools is a common and costly modeling mistake.

Where tax is applied: TaxCalculationMode

Because amounts are rounded at each calculation step, the order of "multiply by quantity" and "apply tax" changes the total. Use TaxCalculationMode to decide whether tax is calculated at Line Item level or unit-price level.
For the same Line Item, the two modes can produce different totals. On a single low-quantity line the difference is usually trivial; across a B2B invoice with high quantities it accumulates. Choose the mode your invoicing and tax authority require, and apply it consistently. The companion taxRoundingMode (separate from the priceRoundingMode you met for high precision) determines how each tax calculation step is rounded.

Worked example: Atlas EU net invoicing

Atlas Corporate's EU division buys 40 service kits at EUR 27.50 each, with an external Tax Rate of 20% and includedInPrice: false. Under taxCalculationMode: LineItemLevel with taxRoundingMode: HalfEven:
FieldValue
Line Item priceEUR 27.50
Quantity40
includedInPricefalse (net)
Tax rate0.20
Taxed Item Price: totalNetEUR 1,100.00
Taxed Item Price: totalGrossEUR 1,320.00
Calculation27.50 × 40 × (1 + 0.20)
Because includedInPrice is false, EUR 1,100.00 is the quoted net basis and tax is added on top to reach EUR 1,320.00 gross, the net-quote, tax-added shape a B2B invoice expects. Had includedInPrice been true, EUR 1,100.00 would have been treated as gross and the net derived out of it instead. Switching taxCalculationMode to UnitPriceLevel would tax the EUR 27.50 unit price before multiplying, which can produce a different gross once rounding is applied at the unit level.

Key takeaways

  • includedInPrice on the Tax Rate sets net (false, bottom-up) versus gross (true, top-down); B2B typically uses net.
  • The Cart's taxedPrice exposes both totalNet and totalGross after calculation.
  • TaxMode decides where rates or amounts come from; use External or ExternalAmount when a dedicated tax service owns the calculation.
  • Complex jurisdictions such as US sales tax require an external tax provider; the built-in engine is not designed for them.
  • TaxCalculationMode (LineItemLevel versus UnitPriceLevel) changes when tax is applied relative to the quantity, which matters at B2B volumes; taxRoundingMode controls rounding at each step.

Test your knowledge