Tax·Reference·9 min·Updated 2026-10-05
Intra-EU VAT
Charge the right VAT across EU borders, including the zero-rated cases, and be able to explain any rate on any invoice.
Business requirement
Invoice customers inside and outside the EU, applying domestic VAT, intra-EU rules and export zero-rating — and let finance justify every line to an auditor.
Why it is not trivial
Three separate traps. The rate has to follow the right country. The tax code has to change with the country, which nothing native does. And a zero-rated line and an untaxed line look identical on the invoice while meaning completely different things.
Recommended architecture
Resolve from the billing profile (see Bill-To driven taxation), carry a tax zone on the account, and place the treatment on the line with a Manual policy (see country-driven tax code).
Load zero rates explicitly. A row that says “this is zero-rated” is a different fact from a missing row, and only one of them is defensible.
Salesforce components
Select one to open its detail.
Flow
Scroll the diagram sideways
Two things decide everything here. First, it is the country of the billing profile that commands the rate, not the address on the order — verified in both directions on two orders with different addresses and the same profile. Second, no native mechanism varies the tax code by country: TaxTreatmentItem has no geographic field, and the standard decision table takes a code as input and returns a rate, so it can never produce one.
Implementation
- Tax zone as a picklist on the account, maintained by finance rather than derived — overrides are a real requirement, not an edge case.
- One rate row per code × country × period, including the zeros.
- A flow that maps zone to tax code on quote line create and update.
- Policy set to Manual so repricing does not undo it.
Watch out
- A zone that looks zero-rated may not be. One territory commonly assumed to be outside VAT turned out to sit inside a neighbouring country's VAT zone at the full domestic rate — confirmed against the rate table rather than against the meeting notes. Check the table, not the room.
- The tax code never reaches
InvoiceLine.TaxCode. Expose it through a formula on the treatment if finance needs to see it on the line.
Alternatives
An external tax engine removes the rate-maintenance burden and is the right answer at real scale or in the United States. For a handful of EU countries with stable rates, it adds a dependency and a cost for rules you can express in a table.