VAT
VAT is applied after price rules and currency conversion, and before rounding. Every price you query comes back both excluding and including VAT for the tax area you ask for.
VAT Handling
VAT behaviour is controlled primarily by the pricelist, not the SKU. The SKU contributes the VAT class, while the pricelist defines how VAT should be applied.
VAT Modes
Every pricelist has a vat_mode:
NET: stored prices exclude VAT. VAT is added.GROSS: stored prices include VAT. VAT is extracted for the price excluding VAT.
VAT Rates
The rate comes from the article's VAT class in the query's tax area, and the rate for that (tax area, VAT class) pair in force at the query's as_of. Rates have start dates, so a rate change can be scheduled, and changing a rate needs no change to any pricelist.
The VAT Baseline
A new tenant comes with:
- the VAT classes
STANDARD,REDUCED,REDUCED_2,SUPER_REDUCED,ZEROandEXEMPT; - 31 tax areas: the EU countries,
GB,NO,CHandIS; - each country's national VAT rates in force in October 2026, from 2020-01-01.
REDUCED, REDUCED_2 and SUPER_REDUCED hold a country's reduced rates, highest first. A country with fewer reduced rates has no rate in the classes left over: an article given such a class there cannot be priced in that tax area, and a query for it fails with 400. ZERO and EXEMPT are 0 % everywhere. Regional rates, such as those on Madeira or the Greek islands, are not included.
| Tax area | STANDARD | REDUCED | REDUCED_2 | SUPER_REDUCED | |
|---|---|---|---|---|---|
AT | Austria | 20 | 13 | 10 | 4.9 |
BE | Belgium | 21 | 12 | 6 | — |
BG | Bulgaria | 20 | 9 | — | — |
CH | Switzerland | 8.1 | 3.8 | 2.6 | — |
CY | Cyprus | 19 | 9 | 5 | 3 |
CZ | Czechia | 21 | 12 | — | — |
DE | Germany | 19 | 7 | — | — |
DK | Denmark | 25 | — | — | — |
EE | Estonia | 24 | 13 | 9 | — |
ES | Spain | 21 | 10 | 4 | — |
FI | Finland | 25.5 | 13.5 | 10 | — |
FR | France | 20 | 10 | 5.5 | 2.1 |
GB | United Kingdom | 20 | 5 | — | — |
GR | Greece | 24 | 13 | 6 | — |
HR | Croatia | 25 | 13 | 5 | — |
HU | Hungary | 27 | 18 | 5 | — |
IE | Ireland | 23 | 13.5 | 9 | 4.8 |
IS | Iceland | 24 | 11 | — | — |
IT | Italy | 22 | 10 | 5 | 4 |
LT | Lithuania | 21 | 12 | 5 | — |
LU | Luxembourg | 17 | 14 | 8 | 3 |
LV | Latvia | 21 | 12 | 5 | — |
MT | Malta | 18 | 12 | 7 | 5 |
NL | Netherlands | 21 | 9 | — | — |
NO | Norway | 25 | 15 | 12 | — |
PL | Poland | 23 | 8 | 5 | — |
PT | Portugal | 23 | 13 | 6 | — |
RO | Romania | 21 | 11 | — | — |
SE | Sweden | 25 | 12 | 6 | — |
SI | Slovenia | 22 | 9.5 | 5 | — |
SK | Slovakia | 23 | 19 | 5 | — |
Rates in percent. Which goods take which rate is up to each country: give each article the class that matches its rate in each tax area you sell in, as described below.
When a country changes a rate, add the new rate with the date it takes effect; the old rate stays in force until then. For example, if Sweden's 12 % rate went to 13 % from 1 January 2028:
POST /vatrate
Content-Type: application/json
{
"tax_area_code": "SE",
"vat_class_code": "REDUCED",
"rate": 13.0,
"start_date": "2028-01-01T00:00:00Z"
}
Add tax areas, classes and rates of your own the same way, in the API or under VAT in the console.
Article-TaxClass Mapping
An article's VAT class in a tax area decides which VAT rate applies to it there. An article without a class in a tax area is STANDARD, so you assign a class only to articles that are not standard-rated.
How It Works
The mapping is a three-way relationship:
- Article (SKU) — the product being priced
- Tax Area — the geographical region (e.g.,
SEfor Sweden,DEfor Germany) - VAT Class — the tax category (e.g.,
STANDARD,REDUCED,ZERO,EXEMPT)
When a price query specifies a tax_area, Quantaprice looks up the article's VAT class for that area, then resolves the VAT rate from the tax area's rate table.
Example
An article SKU-123 sold in Sweden and Germany:
| SKU | Tax Area | VAT Class | Effective VAT Rate |
|---|---|---|---|
| SKU-123 | SE | STANDARD | 25% |
| SKU-123 | DE | REDUCED | 7% |
The same product can have different VAT classes in different tax areas — for example, food items may be standard-rated in one country but reduced-rated in another.
Managing Mappings
Assign a VAT class to an article for a specific tax area:
POST /article-taxclass
Content-Type: application/json
{
"sku_code": "SKU-123",
"tax_area_code": "SE",
"vat_class_code": "STANDARD",
"start_date": "2025-01-01T00:00:00Z"
}
The start_date field supports historical and scheduled changes — if a product's tax classification changes (e.g., due to regulatory changes), you can record the new mapping with a future start date.
Query an article's VAT class for a specific tax area:
GET /article-taxclass/SKU-123/SE
List all mappings for a tax area:
GET /article-taxclass/by-area?tax_area=SE
Interaction With Other Pricing Features
Inheritance
Every pricelist sets its own VAT mode; it is not inherited.
Bundles
VAT is computed per component, with each component's own VAT class, so bundles with mixed VAT classes are taxed correctly.
Scheduled Updates
VAT rates and article VAT classes take a start date, so changes can be scheduled; see Scheduled Updates.
Historical Pricing
"As of" queries use the VAT configuration that was active at that time.
Summary
The article's VAT class in the tax area you query gives the VAT rate; the pricelist's VAT mode says whether its prices include VAT. VAT is applied after rules and currency conversion, before rounding.
See also
- Currencies — VAT precision is configured per currency.
- Rounding — rounding is applied after VAT in the pricing pipeline.
- Bundles — how per-component VAT works for bundle SKUs.
- API Reference — full spec for the
/article-taxclass,/taxarea,/vatclassand/vatrateendpoints.