Skip to Content
Which VAT Rate to Charge

Which VAT rate to charge on an EU sale

Every VAT API sells rates. Several sell a calculation: send an amount and a country, get the amount times that country’s rate. It answers a question — what does Germany charge? — that is almost never the one an invoice asks, which is: what do I charge this buyer?

Four facts decide that, and “amount × country rate” uses one of them:

  1. Is the buyer a business registered for VAT — and can you show it?
  2. Where is the buyer, or where do the goods arrive?
  3. What are you selling — goods, electronically supplied services, other services?
  4. How much do you sell to consumers in other member states — over or under €10,000 a year?

For a cross-border B2B sale, the usual answer is 0 % — and the buyer’s country rate, the number the calculation multiplies by, is the one rate that is certain not to appear on your invoice.

This page lays out the structure of the EU rules, quoted from the texts. It is not tax advice: there are exceptions, national variations and special schemes it does not cover. When the answer matters, your accountant decides.


The table

For a seller established in one EU member state, selling into the EU VAT area:

You sellToOn your invoiceRule
Anythinga buyer in your own member stateyour country’s ratea domestic sale
Goods shipped to another member statea business identified for VAT there0 %, exemptArt. 138(1)
Servicesa business in another member stateno VAT — the buyer accounts for itArt. 44 and 196
Goods shipped to another member statea consumertheir country’s rate, over €10,000Art. 33 and 59c
Electronically supplied servicesa consumer in another member statetheir country’s rate, over €10,000Art. 58 and 59c
Other servicesa consumergenerally your country’s rateArt. 45
Goods shipped out of the EU VAT areaanyone0 %, exportArt. 146

Only the consumer rows ever put the buyer’s country rate on the invoice — and only above a threshold.


Goods to a business: the VAT number is a condition

Article 138(1) exempts a supply of goods shipped to another member state when the buyer is “identified for VAT purposes in a Member State other than that in which the dispatch or transport of the goods begins and has indicated this VAT identification number to the supplier.”

That last clause arrived with Directive 2018/1910, applied from 1 January 2020. Before, a valid VAT number was evidence; since, it is a condition of the exemption itself. Paragraph 1a adds that the exemption does not apply if the supply is missing from, or wrong in, your recapitulative statement.

So the question is not what rate Germany charges. It is whether this buyer’s number is registered — which is VIES’s question, not a rates table’s. The invoice then carries “reference to the applicable provision of this Directive … or any other reference indicating that the supply … is exempt” (Art. 226(11)).

Services to a business: reverse charge

For services, the place of supply between businesses is “the place where that person has established his business” (Art. 44) — the buyer’s country. VAT there “shall be payable by any taxable person … to whom the services … are supplied” when the supplier is established elsewhere (Art. 196). You charge none, and the invoice says so, in the Directive’s own words: “the mention ‘Reverse charge’” (Art. 226(11a)).

The buyer’s rate does apply — in the buyer’s own VAT return, not on your invoice.

Consumers: the €10,000 line

For consumers the defaults flip by product:

  • Goods shipped to another member state are supplied “where the goods are located at the time when dispatch or transport of the goods to the customer ends” (Art. 33) — the consumer’s country.
  • Electronically supplied services are supplied “where that person is established, has his permanent address or usually resides” (Art. 58) — the consumer’s country.
  • Other services default to “the place where the supplier has established his business” (Art. 45) — yours, with a long list of exceptions.

Article 59c then switches the first two back to your country for small sellers: when you are established in one member state only, and your cross-border consumer sales across the whole EU do “not in the current calendar year exceed EUR 10 000 … nor did it do so in the course of the preceding calendar year.” Cross the line during the year and the consumer’s country applies from that point.

No API knows your total. That line is your ledger’s, and it is the single fact that most changes what a consumer invoice says.


What a rates table is for

Once the rules say you charge a member state’s VAT — a domestic sale, or a consumer sale over the threshold — you need that member state’s rates. That part is reference data, and VerifNow publishes it without a key: the VAT rates of the 27 member states, from the Commission’s TEDB.

{ "countryCode": "FR", "standardRate": 20, "reducedRates": [2.1, 5.5, 10], "situationOn": "2026-07-01" }

Which of those applies still depends on what you sell: 20 % for most things, a reduced rate for foodstuffs, books, some medicines. Mapping a product to its rate needs the product’s classification in each member state, and that is a tax engine’s job. The endpoint gives you the list; it does not pick from it.

Regional rates, and the two that are not EU VAT

TEDB also lists rates for parts of a member state — Corsica, Madeira, the Azores, Jungholz and Mittelberg, some Aegean islands. VerifNow returns them apart from the national list, so a mainland customer is never charged a Corsican rate.

Two of them are a different kind of thing. The Directive “shall not apply” to the Canary Islands or to the French territories of Article 349 TFEU — Guadeloupe, French Guiana, Martinique, Mayotte, Réunion, Saint-Martin (Art. 6(1)). The Directive calls them “third territories” (Art. 5(3)), and goods “dispatched or transported to a destination outside the Community” are exempt (Art. 146).

So a shipment from Germany to a consumer in Réunion is an export for EU VAT — not a distance sale through the OSS at the 8.5 % TEDB shows for the overseas departments. That 8.5 %, like the Canary Islands’ 7 %, is a local rate, not one you charge from elsewhere in the Union.


Where is the consumer? The evidence rules

For electronically supplied services, “the consumer’s country” needs proof. Council Implementing Regulation 282/2011 presumes the consumer is where the supplier places them “on the basis of two items of non-contradictory evidence” (Art. 24b(d)), from a list in Article 24f:

Art. 24fEvidenceFrom VerifNow
(a)the billing address—
(b)the IP address, or any geolocation—
(c)“the location of the bank account used for payment”ibanDetails.country_code
(d)the Mobile Country Code of the customer’s SIM cardnot the same thing as a phone number’s country
(e)the fixed land line through which the service is suppliednot the same thing as a phone number’s country
(f)“other commercially relevant information”phone and VAT country codes, at most

The honest row is (c): an IBAN’s first two letters are the country of the account, and VerifNow returns them structured, on a validated number. A phone number’s country is weaker than it looks. The regulation asks for the SIM’s network code and for the line the service travels over, and a number typed into a form is neither.

Below €100,000 of such cross-border supplies, one item suffices, provided it comes from “a person involved in the supply of the services other than the supplier or the customer” — a bank or payment provider, for instance (Art. 24b, second paragraph).


In code

The decision for one sale, both parties in the EU VAT area. It returns the standard rate when VAT is charged; picking a reduced rate for your product is yours.

import { VerifNow } from '@verifnow/sdk'; const client = new VerifNow({ apiKey: process.env.VERIFNOW_API_KEY! }); type Supply = 'goods' | 'digital' | 'services'; interface Treatment { rate: number; // on your invoice; 0 when you charge none country?: string; // whose rate, when you charge one mention?: string; // what the invoice must say reason: string; } /** VIES says EL for Greece; ISO says GR. */ const same = (a: string, b: string) => a.replace('GR', 'EL') === b.replace('GR', 'EL'); export async function vatTreatment(sale: { sellerCountry: string; // where you are established buyerCountry: string; // where the buyer is, or where the goods arrive buyerVatNumber?: string; supply: Supply; overEuThreshold: boolean; // your cross-border consumer sales > €10,000, this year or last }): Promise<Treatment> { const domestic = same(sale.buyerCountry, sale.sellerCountry); if (sale.buyerVatNumber && !domestic) { const vat = (await client.validateVat(sale.buyerVatNumber)).vatDetails; if (vat?.registered === true && same(vat.countryCode ?? '', sale.buyerCountry)) { return sale.supply === 'goods' ? { rate: 0, mention: 'Exempt intra-Community supply, Art. 138 Directive 2006/112/EC', reason: 'Goods to a business identified for VAT in another member state' } : { rate: 0, mention: 'Reverse charge', reason: 'Services to a business in another member state' }; } // registered false — or null, VIES unreachable: not shown to be B2B. Treated as a consumer // sale here; see the checkout article for charging now and re-checking later. } const consumerCountry = !domestic && sale.overEuThreshold && sale.supply !== 'services' ? sale.buyerCountry : sale.sellerCountry; const rates = await client.vatRate(consumerCountry); return { rate: rates.standardRate, country: rates.countryCode, reason: domestic ? 'Domestic sale' : `Consumer sale, ${rates.countryCode} rate` }; }

Needs @verifnow/sdk 1.8.0 or later for vatRate. In Java, io.verifnow:verifnow-spring 2.8.0 or later exposes vatRate(String).

What it does not do, on purpose: reduced rates by product, the “other services” exceptions, special schemes, sales from outside the EU, and exports. Each of those is a rule, and a rule applied silently is worse than one your code has to name.


In short

  • A country’s VAT rate is reference data. The rate on an invoice is a decision.
  • Cross-border B2B is usually 0 %, and the condition is the buyer’s registered VAT number — for goods, a condition of the exemption since 2020.
  • A consumer’s country rate applies to goods and electronically supplied services only above €10,000 of cross-border consumer sales.
  • The Canary Islands and the French overseas territories are outside the EU VAT area: their rates are local, and a shipment there is an export.
  • Of the location evidence the rules accept, an IBAN’s country is the one a validator can give you cleanly; a phone number’s country is not the SIM code the regulation asks for.

Where this leaves you

Nothing in this decision is a rate lookup until the last step. The steps before it are a registration check with a receipt, a country from the buyer’s bank account, and your own sales total. VerifNow does the first two on the same key that validates the rest of the form, and publishes the rates for the last step free.

Sources: Council Directive 2006/112/EC, consolidated 14 April 2025  — Articles 5, 6, 33, 44, 45, 58, 59c, 138, 146, 196, 226 · Council Directive (EU) 2018/1910  · Council Implementing Regulation (EU) No 282/2011, consolidated 1 July 2022  — Articles 24b, 24f · Taxes in Europe Database  (European Commission)

Last updated on