The short answer
BR-E-09 fails when the cbc:TaxAmount of a cac:TaxSubtotal in category E is anything but zero. Set it to 0.00, then remove the same amount from cac:TaxTotal/cbc:TaxAmount, cbc:TaxInclusiveAmount and cbc:PayableAmount.
If VAT really is due on those supplies, they are not exempt, and the category on the lines and in the breakdown is what needs correcting.
What the rule checks
The rule reads the cbc:TaxAmount next to each cac:TaxCategory with cbc:ID of E under the VAT scheme in the root cac:TaxTotal, and requires it to equal zero as a number, so 0 and 0.00 both pass.
No rounding or tolerance applies. When tried, a tax amount of 0.40 in the exempt breakdown, with the totals following it, failed this rule and nothing else: BR-CO-17 let it through, because at a rate of 0 that rule only asks for an amount that rounds to zero as a whole number.
The document VAT total is not part of this test. When tried, 5.00 in the exempt breakdown with the VAT total left at 0.00 reported BR-CO-14 in addition to this rule and BR-CO-17.
| Term | Meaning | UBL element |
|---|---|---|
| BT-117 | VAT category tax amount | cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount |
| BT-118 | VAT category code | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID |
| BT-110 | Invoice total VAT amount | cac:TaxTotal/cbc:TaxAmount |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- The breakdown tax amount is calculated with a default rate for every category, instead of from the category's own rate.
- The item was taxed in the source system and reclassified as exempt later, but the stored tax amount was kept.
- VAT for the whole invoice is calculated once and spread over the breakdowns in proportion to their taxable amounts.
- A rounding difference from the other breakdowns is pushed into the last breakdown written, which is the exempt one.
How to fix it
- Confirm from your tax determination that the supplies in the exempt breakdown are exempt. If they are, their breakdown tax amount is
0.00. - Set
cbc:TaxAmountin the exemptcac:TaxSubtotalto0.00. - Recalculate
cac:TaxTotal/cbc:TaxAmountas the sum of the breakdown tax amounts, thencbc:TaxInclusiveAmountandcbc:PayableAmountfrom it. In the recorded example each of the three falls by 5.00. - If VAT is in fact due, give the lines the category that applies, such as
Swith its rate, and build that breakdown instead. That is a tax decision to take at source, not a change to make in the XML alone.
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: 5.00 of VAT in the exempt breakdown, carried into the totals
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">5.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">5.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>E</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cbc:TaxExemptionReason>Exempt from VAT</cbc:TaxExemptionReason>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="GBP">25.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="GBP">30.00</cbc:TaxInclusiveAmount>
<!-- allowance, charge, prepaid and rounding amounts omitted from this fragment -->
<cbc:PayableAmount currencyID="GBP">30.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>Fragment of the corrected invoice: no VAT in the exempt breakdown, and totals without it
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>E</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cbc:TaxExemptionReason>Exempt from VAT</cbc:TaxExemptionReason>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="GBP">25.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="GBP">25.00</cbc:TaxInclusiveAmount>
<!-- allowance, charge, prepaid and rounding amounts omitted from this fragment -->
<cbc:PayableAmount currencyID="GBP">25.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>The failing invoice charges 5.00 of VAT in the exempt breakdown and carries it through to a VAT total of 5.00, a total with VAT of 30.00 and an amount due of 30.00; the corrected invoice has 0.00, 25.00 and 25.00. The failing document also reports BR-CO-17: at a rate of 0 the breakdown tax amount has to round to zero, and 5.00 does not. The totals agree with one another, so BR-CO-14 and BR-CO-15 stay silent.
What the validator reported
- The failing invoice reports BR-CO-17 and BR-E-09. 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. An exempt credit note with 5.00 of tax in its breakdown reported this rule andBR-CO-17when tried. - Reported by the EN 16931 layer as a fatal finding at the exempt breakdown's
cac:TaxCategory. - Reverse-charge breakdowns have the same requirement under
BR-AE-09, and Zero rated breakdowns underBR-Z-09.
Related rules
- BR-CO-17 is reported beside this rule when the exempt tax amount does not round to zero
- BR-AE-09 requires a tax amount of zero in a reverse-charge breakdown in the same way
- BR-CO-14 fires as well if the breakdown tax amount and the VAT total are not changed together
- BR-E-10 requires the exemption reason in the same exempt breakdown
- Browse every rule in the reference
- Background: Understanding EN 16931 validation errors
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-24.1: source checked 2026-09-24, explanation last updated 2026-09-24.
The official definition of BR-E-09 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.
