The short answer
BR-AE-10 fails when a VAT breakdown with category AE has neither cbc:TaxExemptionReason nor cbc:TaxExemptionReasonCode in its cac:TaxCategory. Add the reason: the text Reverse charge, or the equivalent standard wording in the language of the invoice, or the reason code that means reverse charge, VATEX-EU-AE. Sending both is allowed.
The category is not the problem. If the supply is under reverse charge, AE stays and the missing statement is added.
What the rule checks
The rule selects each cac:TaxCategory with cbc:ID of AE under the VAT tax scheme, inside cac:TaxTotal/cac:TaxSubtotal beneath the document root. It passes when that element has a cbc:TaxExemptionReason child, a cbc:TaxExemptionReasonCode child, or both.
A code on its own is enough. The valid reverse-charge fixture with its text replaced by a cbc:TaxExemptionReasonCode of VATEX-EU-AE passes every layer.
Only presence is tested, not meaning. Arbitrary text passes, and so did an unrelated code from the same list, VATEX-EU-132, on a reverse-charge breakdown. A clean result is therefore no evidence that the stated reason is the right one; that remains your responsibility.
A code must still come from the VATEX code list. One that is not on the list satisfies this rule but is rejected by BR-CL-22.
An empty cbc:TaxExemptionReason element counts as present here, and is then rejected by PEPPOL-EN16931-R008, which forbids empty elements.
The rule reads the VAT breakdown only. The category on a line or on a document-level allowance or charge is not where this reason is looked for.
| Term | Meaning | UBL element |
|---|---|---|
| BT-118 | VAT category code | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID |
| BT-120 | VAT exemption reason text | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:TaxExemptionReason |
| BT-121 | VAT exemption reason code | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:TaxExemptionReasonCode |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- The source system prints the reverse-charge statement as a footer on the PDF, and nothing maps it into the structured tax data.
- The reason is held on the tax code and the export reads only category and rate.
- The mapping writes exemption reasons for category
Eand was never extended toAE. - Empty strings are stripped before serialising, and the reason field was blank for this tax code.
- The reason was written somewhere other than the VAT breakdown.
How to fix it
- Establish from the tax determination that the supply really is under reverse charge. If it is, keep category
AE. Changing the category to make the finding go away would misstate the transaction. - In the
cac:TaxCategoryof theAEbreakdown, addcbc:TaxExemptionReasonwith the reverse-charge wording, orcbc:TaxExemptionReasonCodewithVATEX-EU-AE, or both. - Keep the UBL order inside
cac:TaxCategory:cbc:ID,cbc:Percent,cbc:TaxExemptionReasonCode,cbc:TaxExemptionReason, thencac:TaxScheme. With the text placed before the code, the XSD layer rejects the document and the EN 16931 and Peppol layers do not run. - Hold the reason against the tax code in the source system so that every reverse-charge document gets it, rather than patching single invoices.
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: a reverse-charge breakdown with no reason
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>AE</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>Fragment of the corrected invoice: the reason text sits between the rate and the tax scheme
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>AE</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cbc:TaxExemptionReason>Reverse charge</cbc:TaxExemptionReason>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>The corrected invoice has cbc:TaxExemptionReason with the text Reverse charge in the AE tax category; the failing one has no reason element at all. Nothing else differs, and the failing document reports only BR-AE-10.
What the validator reported
- The failing invoice reports BR-AE-10. 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. A reverse-charge credit note without the reason reports the same rule. - Only category
AEunder theVATtax scheme is in scope. Exempt breakdowns have the parallel ruleBR-E-10. - The other reverse-charge rules still apply:
BR-AE-09fires when the breakdown carries a tax amount, andBR-AE-02fires when the seller VAT identifier is missing. Adding the reason does not settle those.
Related rules
- BR-E-10 asks for the same reason fields on an exempt VAT breakdown
- PEPPOL-EN16931-R008 rejects a reason element that is present but empty
- BR-CO-09 checks the country prefix on the seller and buyer VAT identifiers in the document
- BR-CO-17 checks the breakdown tax amount against its rate, which is 0 for reverse charge in the recorded fixture
- Browse every rule in the reference
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-20.1: source checked 2026-09-20, explanation last updated 2026-09-20.
The official definition of BR-AE-10 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.
