# Net prices, gross prices, and tax 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`](/api/projects/taxCategories.md#taxrate): - `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](/urn?urn=ctp%3Aapi%3Atype%3ATaxMode) 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](/urn?urn=ctp%3Aapi%3Atype%3ATaxCalculationMode) 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`: | Field | Value | | --- | --- | | Line Item price | EUR 27.50 | | Quantity | 40 | | `includedInPrice` | false (net) | | Tax rate | 0.20 | | Taxed Item Price: `totalNet` | EUR 1,100.00 | | Taxed Item Price: `totalGross` | EUR 1,320.00 | | Calculation | 27.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. ## Related pages - [Area overview page with navigation](/learning-model-b2b-commerce.md) - [Previous page: High-precision pricing](/learning-model-b2b-commerce/configure-b2b-pricing/high-precision-pricing.md) - [Next page: Unit-based pricing](/learning-model-b2b-commerce/configure-b2b-pricing/modeling-unit-based-pricing.md)