On this page
The short answer
PEPPOL-EN16931-P0107 fails for each cac:TaxCategory carrying VATEX-EU-AE whose cbc:ID is not AE. The code says the customer accounts for the VAT under the reverse charge, and AE is the only category with that meaning.
The recorded example sells to a buyer in Germany with both VAT identifiers, a delivery date and a deliver-to country, in category K: an intra-community supply. Such a sale is often called a reverse charge, yet it has a code of its own, VATEX-EU-IC, and restoring that code is the correction.
What the rule checks
Every cac:TaxCategory whose exemption code upper-cases to VATEX-EU-AE is tested, and it passes only with the category AE. The category is trimmed but the code is not: when tried, a trailing space after VATEX-EU-AE hid it from this rule, while BR-CL-22 still accepted it.
A domestic reverse charge left at the standard rate is caught twice. When tried, VATEX-EU-AE in a Standard rated breakdown at 20 percent was reported by this rule and by BR-S-10.
The rest of the invoice is not examined. When tried, the recorded example with its breakdown and line switched to AE, still carrying VATEX-EU-AE, passed every layer, because it already had the seller and buyer VAT identifiers that BR-AE-02 needs. Whether AE or K is right is a VAT question the validator cannot answer.
| Term | Meaning | UBL element |
|---|---|---|
| BT-121 | VAT exemption reason code | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:TaxExemptionReasonCode |
| BT-118 | VAT category code | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- Every sale without VAT to a VAT-registered business in another member state is labelled reverse charge, whether goods or services are supplied.
- The exemption code comes from a reverse-charge flag on the customer, while the category comes from the kind of supply.
- A domestic reverse charge for particular goods or services is marked by the code alone, and the category stays
S.
How to fix it
- Tell the two treatments apart. Goods dispatched to a VAT-registered buyer in another member state are an intra-community supply,
KwithVATEX-EU-IC; a supply on which the buyer accounts for the VAT in another way, such as many cross-border services, isAEwithVATEX-EU-AE. - For an intra-community supply, as in the example, keep
Kand writeVATEX-EU-IC.BR-IC-10needs a reason on that breakdown, and the text would do on its own. - For a reverse charge, change the breakdown and its lines to
AE, with the rate0and no VAT amount, and make sure the VAT identifiers are present. - For a domestic reverse charge coded
Sby mistake, the category has to change too: a Standard rated breakdown may carry no exemption reason at all.
Validate your corrected invoice
Before and after
These are fragments, not complete documents. The complete synthetic documents they come from are linked below.
Fragment of the failing invoice: an intra-community breakdown with the reverse-charge code
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>K</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cbc:TaxExemptionReasonCode>VATEX-EU-AE</cbc:TaxExemptionReasonCode>
<cbc:TaxExemptionReason>Intra-community supply</cbc:TaxExemptionReason>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>Fragment of the corrected invoice: the intra-community breakdown carries VATEX-EU-IC
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>K</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cbc:TaxExemptionReasonCode>VATEX-EU-IC</cbc:TaxExemptionReasonCode>
<cbc:TaxExemptionReason>Intra-community supply</cbc:TaxExemptionReason>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>Only the exemption code differs: VATEX-EU-AE in the failing invoice, VATEX-EU-IC in the corrected one; the category K, the reason text and the amounts are unchanged. The failing document reports this rule and nothing else, because the text satisfies BR-IC-10 and no EN 16931 rule compares a code with its category.
What the validator reported
- The failing invoice reports PEPPOL-EN16931-P0107. The corrected document passes every layer with no findings.Download the failing XMLDownload the corrected XML
Recorded on phive 12.1.0 / phive-rules-peppol 4.5.6 / Saxon-HE 12.10, the engine behind the free validator, using synthetic data. A recorded result is regression evidence for these documents; it is not a certification.
Where it applies
- Applies to UBL
InvoiceandCreditNote. When tried,VATEX-EU-AEin the breakdown of an exempt credit note reported this rule. - A rule of the Peppol layer. On the EN 16931 layer,
BR-CL-22acceptsVATEX-EU-AEas a listed code in any category. - Category
AEbrings requirements of its own, among them the VAT identifiers ofBR-AE-02and a reason underBR-AE-10.
Related rules
- BR-AE-10 requires a reason on a reverse-charge breakdown, where VATEX-EU-AE belongs
- BR-IC-10 requires the reason on an intra-community supply breakdown, restored here as VATEX-EU-IC
- PEPPOL-EN16931-P0105 rejects the not subject to VAT code when it appears in a reverse-charge breakdown
- PEPPOL-EN16931-P0108 rejects the second-hand means of transport code in an intra-community breakdown
- Browse every rule in the reference
- Background: How Peppol invoice validation actually works
Scope and source
Written for Peppol BIS Billing 3.0.21 (May 2026), EN 16931 1.3.16, as applied to UBL 2.1 Invoice and CreditNote documents. Other profiles, syntaxes and releases can define this identifier differently. Guidance version 2026-09-28.1: source checked 2026-09-28, explanation last updated 2026-09-28.
The official definition of PEPPOL-EN16931-P0107 carries the normative wording and test. This page is our explanation of it, not a copy.
Guidance does not change the engine verdict. Fixing this finding does not mean the document passes every layer, and validation does not certify legal or tax compliance or transmit a document over Peppol.

