Skip to content

Cookie settings

Choose which kinds of cookies you allow. You can change your choice at any time via Cookie settings at the bottom of every page. Privacy statement

Necessary

Always on

Needed to log in, keep your cart and remember your choices. These are always on.

Which cookies?
  • weboke_sessie, weboke_klant, weboke_remember: your session and staying logged in
  • weboke_basket: your cart
  • wkBtwIncl: showing prices with or without VAT
  • wok_cookies: your cookie choice, 12 months

Measures which ad leads to a visit or order, so we do not pay for ads that do nothing.

Which cookies?
  • Google Ads via Google Tag Manager (_gcl_au, _gcl_aw), up to 90 days
  • OpenAI Ads, ads in ChatGPT
  • wok_aff: which partner referred you to us (affiliate programme), 60 days

4.6

Country and language

Each country has its own site, with prices and VAT for that country.

View

Module 4 · 4.1

Setting up VAT in WooCommerce

Module 4: VAT, shipping and payments · Reading time: 11 minutes

Learning objective: After this lesson you can set up VAT in WooCommerce correctly for sales in your own country, explain what each setting does and track down a rounding difference or a wrong price.

Key concepts: VAT rate, standard and reduced rate, prices entered including or excluding VAT, calculate tax based on, tax classes, rate table, priority, rounding, display in the shop and at checkout, price display suffix, B2B, reverse charge, intra-Community supply, VIES

This lesson explains the rules as they apply on 9 November 2026. It is not legal or tax advice. If you are unsure about your situation, ask a lawyer, your trade association or your accountant.

Why VAT is harder in a shop than in an invoicing program

On an invoice you enter one amount, one rate and one customer. In a web shop, software calculates the VAT for every cart, every country, every shipping method and every coupon code, thousands of times a day. One wrong setting then ends up in every order. And the consumer sees it straight away: the law requires you to show consumers the total price including taxes (EU: Article 6(1)(e) of Directive 2011/83/EU; the Netherlands: Articles 6:230m(1)(e) and 3:15d(2) of the Dutch Civil Code (BW); Germany: Art. 246a § 1 EGBGB; see lesson 5.1).

WooCommerce only calculates VAT once you switch it on: WooCommerce > Settings > General, tick Enable tax rates and calculations. The Tax tab then appears. If the box is unticked, every price is just a number without any VAT logic, and your accounts are only correct if all your prices happen to have the same rate.

The rates in the three example countries

CountryStandard rateReduced ratesExample reduced
Netherlands21%9% and 0%many foodstuffs
Belgium21%12%, 6% and 0%many foodstuffs
Germany19%7%many foodstuffs

Which rate applies to which product is set out in each country's rules; a teapot is standard rate, while loose tea may qualify for a reduced rate. If in doubt, ask your accountant. You can find the current rates of all EU countries in the European Commission's TEDB database (see Further reading). You will need this in lesson 4.2.

The settings one by one

The Tax tab holds the choices that most often go wrong.

Prices entered with tax. Do you enter €24.20 in the product as the consumer price, or €20.00 excluding VAT? For a shop selling to consumers, "yes, I will enter prices inclusive of tax" is usually the most practical: the price you enter is the price the customer sees, even after rounding. For a wholesaler working with prices excluding VAT, "no" makes more sense. Choose once and do not change it when you already have products: WooCommerce does not convert your existing amounts. If you switch later, all your prices become 21 percent higher or lower in one go.

Calculate tax based on: the Customer shipping address (default), the Customer billing address or the Shop base address. If you only sell in the Netherlands, it makes little difference. If you sell in more EU countries above the threshold from lesson 4.2, you need the shipping address: that is where the goods arrive.

Shipping tax class: by default "Shipping tax class based on cart items". There is a quirk: if there is one product with the standard rate in the cart, WooCommerce uses that rate for shipping, even if the cart also contains a product with a different rate. Whether that is right for your situation is a question for your accountant; some countries split shipping costs proportionally.

Rounding: "Round tax at subtotal level, instead of rounding per line". WooCommerce warns that inconsistent settings for entry and display lead to differences of a cent; the Use recommended settings button aligns them.

Additional tax classes: besides Standard, Reduced rate and Zero rate exist by default. You create a rate table for each class. You choose the class for each product.

Display prices in the shop and Display prices during cart and checkout: including or excluding tax. For consumers: including. With the Price display suffix you add text after the price, such as "incl. VAT". For a shop serving both consumers and businesses, you can use {price_excluding_tax} to show both: "incl. VAT ({price_excluding_tax} excl. VAT)".

The rate table

Each row in a rate table has: country code, state code, postcode, city, rate %, tax name, priority, compound and shipping (whether the rate also applies to shipping costs). For Theehuis Example, which only sells in the Netherlands:

ClassCountryRateNameShipping
StandardNL21.0000BTWyes
Reduced rateNL9.0000BTWyes

If you leave state, postcode and city empty, the row applies to the whole country. A * as the country means "any country": do not use it for VAT, because your shop will then charge 21 percent to a customer in Germany.

About priority: WooCommerce takes only the first matching rate per priority. Several rates at once (rarely needed in Europe) each get a different priority. Compound means tax on tax; that does not occur for ordinary VAT in the EU, so leave it off.

Worked example and a rounding trap

Theehuis Example enters prices including VAT. A teapot costs €29.95. WooCommerce calculates back: 29.95 / 1.21 = 24.75 excluding VAT, and 5.20 VAT. A packet of tea at €4.95 with 9 percent: 4.95 / 1.09 = 4.54, VAT 0.41.

A customer buys three packets of tea. Rounded per line: 3 × 0.41 = 1.23. Rounded at subtotal: 14.85 / 1.09 = 13.62, VAT 1.23. The same here, but with other quantities it can differ by a cent. That is not a WooCommerce error, but a result of the choice. Pick one, agree it with your bookkeeping, and do not change it in the middle of a quarter.

Selling to businesses

To a Dutch business you simply charge Dutch VAT; the business deducts it. If you sell goods to a business in another EU country with a valid VAT identification number, it is usually an intra-Community supply: you charge 0 percent and the business declares the VAT in its own country (the VAT is reverse charged). For this you must check the VAT identification number in VIES, the European Commission's verification system, and report the supply separately in your VAT return and in the EC Sales List (opgaaf intracommunautaire prestaties) to the Belastingdienst (Dutch Tax Administration). WooCommerce does not do this itself: you need an extension that asks for the VAT identification number at checkout, checks it in VIES and then charges no VAT. If something goes wrong with that check, you simply charge VAT. Have your accountant look at it before you switch this on.

In practice: this is how it looks in WooCommerce

  1. Settings > General: fill in the store address, tick the tax calculations box.
  2. Settings > Tax: prices entered including tax, calculate based on shipping address, display including tax, suffix "incl. VAT".
  3. Standard rates: row NL 21%, name BTW, shipping on. Reduced rate: NL 9%.
  4. For each product under Product data > General: tax status "Taxable" and the correct tax class.
  5. Test: put a product in the cart, enter a Dutch address and check whether the VAT amount matches your calculator.

Summary

  • Switch on tax calculation and decide once whether you enter prices including or excluding VAT.
  • Consumers always see the price including VAT; a suffix makes this clear.
  • One rate table per class; per priority the first matching rate counts; no * as country.
  • Rounding differences of a cent come from your choice of rounding per line or at subtotal.
  • Selling to businesses in other EU countries (reverse charge) requires a VAT identification number check in VIES and an extension.

Quiz

1. Theehuis Example has 200 products with prices including VAT and switches "Prices entered with tax" to "no". What happens?



2. What happens if you enter a * as the country for 21 percent in the rate table?



3. A Belgian business with a valid VAT identification number buys teapots from a Dutch shop. What is usually the rule?



4. Why can the VAT on an order differ by a cent from your own calculation?



Exercise

Exercise A4.1: Are your prices including VAT correct? Enter your shop's address, the slug or address of one product, that product's price excluding VAT, the VAT rate and whether you sell to consumers or only to businesses. The program requests the product through the Store API (/wp-json/wc/store/v1/products?slug=...), a public entry point any visitor can use. It works out the displayed price (prices.price divided by 10 to the power of currency_minor_unit) and compares it with your price excluding VAT times (1 + rate).

  • Green for consumers: the displayed price is your price including VAT (to within 2 cents).
  • Orange: there is no indication such as "incl. VAT" next to the price (in price_html), or the currency is not euro.
  • Red for consumers: the shop shows the price excluding VAT, or a price that matches neither (check the rate, the product's tax class and "Prices entered with tax").

For "businesses only", both the price including and excluding VAT are fine, with the tip to state clearly which it is. Note: the Store API shows prices as set under "Display prices in the shop", and for a visitor without an address it uses the store address.

Exercise A4.1: Are your prices including VAT correct?






What you enter and what we find isn't stored. Your browser remembers your answers and whether you've passed the exercise. If you're signed in, we only save that you got the exercise (almost) right in My courses; you can delete that there too.

Further reading

One moment…

Set up your domains

For each domain, arrange the nameservers, the link to your hosting and who becomes the owner.

Loading your domains…