Email automation
Dutch BTW for invoicing agents: the edge-case cheatsheet
Reverse charge, KOR, ICP, mixed rates: the Dutch BTW rules every invoicing agent gets wrong on its first run, and what to wire up before you trust it with real money.

It is Thursday at 18:42. Your client's invoicing agent has just emailed a €4,800 invoice to a Belgian general contractor. It charged 21% BTW on the line items and added a polite Dutch footer. It should have charged 0%, printed BTW verlegd, and included the customer's BTW number on the document. By Monday this becomes a correction invoice, an irritated buyer, and a footnote in next quarter's aangifte.
Most invoicing agents we ship break on Dutch BTW the first week. Not because LLMs cannot read tax law, but because the rules look like one rule with a few exceptions and turn out to be six rules in a trench coat. Here is the cheatsheet we now bake into every Dutch invoicing agent before it goes anywhere near a real client list.
Three rates, and the 9% trap
The Netherlands has three statutory BTW rates: 21% general, 9% reduced, and 0%. An agent that defaults everything to 21% will be wrong roughly once a week for any business that touches food, lodging, books, or transport.
The 9% list (officially Tabel I of the Wet OB) is the one agents underestimate. It covers food and non-alcoholic drinks, books and ebooks, medicines, repair of shoes, clothing, and bicycles, hairdressing, lodging in hotels and campsites, passenger transport, and admission to cultural events. A florist invoicing a delivery to a restaurant is on 9%. The same florist invoicing the same restaurant for a styling consultation is on 21%. Your agent has to read the line item, not the customer.
Mixed-rate invoices must split BTW per line. Do not let the agent average two rates into one footer total. The Belastingdienst will reject it on audit and any reasonable accountant will email you about it within a week.
BTW verlegd: the reverse-charge minefield
This is where most agents lose money. Under verleggingsregeling the buyer reports the BTW instead of the seller. The seller charges 0%, prints BTW verlegd, and lists the buyer's BTW number. Get this wrong in either direction and someone overpays €1,000 on a €5,000 invoice.
The rule fires in at least five common cases:
- Construction subcontracting between Dutch businesses. Subcontractor invoices contractor with verlegd, even though both are Dutch.
- Cleaning of immovable property between Dutch businesses. Same logic as construction.
- Intra-EU B2B services (Article 44 of the EU VAT Directive). Dutch seller, EU business buyer with valid VAT number, reverse charge applies.
- Mobile phones, laptops, tablets, game consoles, and integrated circuits over €10,000 between Dutch businesses.
- Old metals and waste between Dutch businesses.
For the EU case the agent must validate the buyer's VAT number against VIES at the moment of invoicing and store the timestamp of the check. A VIES result from three months ago is not evidence. We log every check as a JSON record next to the invoice.
type VatCheck = {
invoice_id: string;
vat_number: string; // e.g. "BE0123456789"
vies_valid: boolean;
vies_name: string | null;
vies_address: string | null;
checked_at: string; // ISO timestamp
request_id: string; // VIES consultation number
};
// Persist this row before the invoice PDF is generated.
// If vies_valid === false, fall back to charging local BTW
// at the seller's domestic rate and flag for human review.
KOR: the customer who does not charge BTW
The kleineondernemersregeling (KOR) lets Dutch businesses under €20,000 in annual revenue opt out of BTW entirely. They do not charge BTW, they do not reclaim it, and their invoices must carry a specific phrase: Vrijgesteld van btw o.g.v. art. 25 Wet OB.
If your agent is running invoicing for a KOR-registered client it must:
- Never include a BTW line.
- Print the exemption clause on every invoice.
- Track cumulative revenue against the €20,000 ceiling and warn before crossing it. The moment a KOR business crosses the threshold mid-year they re-enter the normal regime for the rest of the year. The agent needs to know this before line 401 of the spreadsheet, not after.
ICP and OSS: the EU rules that look optional
Two adjacent rules trip up agents that handle any cross-border work.
ICP (intracommunautaire prestaties) covers B2B sales of goods or services to a VAT-registered business in another EU country. Charge 0%, print Intracommunautaire levering or Intracommunautaire dienst, and file an ICP declaration alongside the regular aangifte. The agent must include the buyer's verified VAT number on the invoice.
OSS (One Stop Shop) covers B2C digital services and distance sales of goods across the EU. Once a Dutch seller crosses €10,000 in total cross-border B2C sales in a calendar year, they must charge the buyer's local VAT rate instead of Dutch BTW. A German consumer gets 19%, a French consumer gets 20%, a Hungarian consumer gets 27%. The agent needs a current EU VAT rate table and the discipline to check it quarterly.
Margin scheme, prepayments, and other quiet edges
A handful of cases come up less often but matter when they do.
Margin scheme (margeregeling) for second-hand goods, art, and antiques means BTW is calculated on margin instead of total price. The invoice cannot show BTW as a separate line. It must include a phrase such as Margeregeling, kunst.
Prepayments are taxable at receipt, not at delivery. If your agent invoices a 30% deposit in November and delivers in February, the November invoice owes BTW for Q4. We have seen agents postpone the BTW to the final invoice and silently misstate two quarters in a row.
Bad-debt relief is reclaimable one year after the invoice due date if the customer has not paid and you can document the chase. The agent should flag invoices crossing 365 days unpaid as candidates for the next aangifte.
Foreign currency invoices must show the BTW amount in EUR using the ECB rate or the customs rate on the invoice date. Charging in USD and reporting the EUR equivalent six weeks later at a different rate is a slow audit problem.
The mandatory fields nobody remembers
An invoice missing any of these is technically not an invoice under Dutch law, which means your customer cannot reclaim the BTW. The agent should refuse to send anything that fails this check.
- Sequential invoice number with no gaps within a series.
- Invoice date, separate from delivery date if they differ.
- Seller name, address, and BTW number.
- Buyer name and address. BTW number is mandatory for B2B EU and for reverse-charge transactions.
- Description and quantity per line.
- Unit price excluding BTW.
- BTW rate and BTW amount per line if rates differ.
- Total excluding BTW, BTW total, and total including BTW.
- Any applicable exemption or reverse-charge clause in plain Dutch.
How we wire this into an agent
The cheatsheet above is not a prompt. It is a set of pre-flight checks the agent runs before the LLM ever writes a line of invoice text. The flow we use:
- Classify the transaction (B2B vs B2C, domestic vs intra-EU vs export, goods vs services).
- Apply the rule table to pick rate and clause. If two rules collide, fail closed and route to a human.
- Validate any VAT number against VIES and store the consultation ID.
- Compose the invoice with deterministic templates. The LLM only fills the line descriptions, never the BTW math.
- Validate the final document against the mandatory-fields checklist before sending.
The agent gets to be creative inside the brackets. Everything outside the brackets is code.
When we built the invoicing agent for a Rotterdam construction firm, the thing we ran into was the verlegd-versus-21% split on mixed jobs: same customer, same week, one invoice with reverse charge for the subcontracted labour and one without for the supplied materials. We ended up adding a per-line classifier that defers to the human on any line it scores below 0.9 confidence. The same pattern is in every Dutch invoicing AI agent we ship.
The smallest thing you can do today: open the last twenty invoices your business sent, count how many of the nine mandatory fields are present on each, and write the number on a sticky note. That number is the ceiling on what any agent can reliably produce for you.
Key takeaway
Dutch BTW is six rules in a trench coat. Pre-classify every transaction in code before the LLM writes anything, and fail closed when two rules collide.
FAQ
Does my agent need to validate every VAT number against VIES?
Only on B2B EU invoices where you apply reverse charge or a 0% intra-community supply. Store the consultation ID with the invoice. A VIES result older than the invoice date is not evidence.
What happens if my agent charges 21% by mistake on a reverse-charge invoice?
You issue a credit note for the wrong invoice and a new invoice with the correct treatment. The customer cannot reclaim BTW you charged in error, so the longer it sits the more uncomfortable the conversation gets.
Can the LLM calculate BTW directly?
Do not let it. Use deterministic code for the math. The LLM picks the rate and writes the line descriptions, the code multiplies the numbers and checks the totals.
Is the KOR threshold per calendar year?
Yes, €20,000 in turnover per calendar year. Cross it and you exit the scheme for the rest of that year plus a fixed lock-out period before you can opt back in.