On this page
The short answer
BR-Z-09 fails when the cbc:TaxAmount beside a cac:TaxCategory of Z in the VAT breakdown is not zero. Set it to 0.00, and take the same amount off the VAT total, the total with VAT and the amount due; in the recorded example that removes 4.50 from each.
The 4.50 is 20 per cent of the 22.50 Zero rated taxable amount, the mark of a tax calculation that applied the Standard rate to every breakdown. If VAT really is due, the supplies are not Zero rated and the category must change at source.
What the rule checks
The rule runs on every Zero rated cac:TaxCategory under the VAT scheme in the root cac:TaxTotal and reads the cbc:TaxAmount of its cac:TaxSubtotal. That amount must equal zero as a number, so -0.00 passed when tried.
No rounding is allowed. When tried, 0.01 in the Zero rated breakdown, with the totals raised to match, failed this rule alone.
BR-CO-17 is looser at a rate of 0 and only fails once the amount rounds to a whole number other than 0. At 0.50 it joined this rule when tried, and at the recorded 4.50 it fires too.
The VAT total is outside this rule. With 4.50 in the Zero rated breakdown but the VAT total left at 0.00, the invoice reported BR-CO-14 alongside 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:
- Every breakdown is taxed with the document's default rate instead of its own
cbc:Percent. - The item was Standard rated when the order was taken and Zero rated at invoicing, and the stored VAT amount survived the change.
- The invoice VAT is calculated once and apportioned across the breakdowns by taxable amount.
- Penny rounding differences from the Standard rated breakdowns are posted to the last breakdown written, which happens to be the Zero rated one.
How to fix it
- Check the tax code of the Zero rated lines, allowances and charges. If they are Zero rated, their breakdown tax amount is
0.00. - Set
cbc:TaxAmountin the Zero ratedcac:TaxSubtotalto0.00. - Re-sum
cac:TaxTotal/cbc:TaxAmountfrom the breakdowns, then recalculatecbc:TaxInclusiveAmountandcbc:PayableAmount: 27.00 becomes 22.50 in the recorded example. - If VAT is truly due on those supplies, move them to the category and rate that apply, such as
Sat 20, and build that breakdown instead of taxing a Zero rated one.
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: 4.50 of VAT in the Zero rated breakdown, carried into the totals
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">4.50</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">22.50</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">4.50</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>Z</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<!-- line and tax exclusive amounts omitted from this fragment -->
<cbc:TaxInclusiveAmount currencyID="GBP">27.00</cbc:TaxInclusiveAmount>
<!-- allowance, charge, prepaid and rounding amounts omitted from this fragment -->
<cbc:PayableAmount currencyID="GBP">27.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>Fragment of the corrected invoice: no VAT in the Zero rated breakdown, and totals without it
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">22.50</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>Z</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<!-- line and tax exclusive amounts omitted from this fragment -->
<cbc:TaxInclusiveAmount currencyID="GBP">22.50</cbc:TaxInclusiveAmount>
<!-- allowance, charge, prepaid and rounding amounts omitted from this fragment -->
<cbc:PayableAmount currencyID="GBP">22.50</cbc:PayableAmount>
</cac:LegalMonetaryTotal>The Zero rated cbc:TaxAmount and the VAT total are 4.50 in the failing invoice and 0.00 in the corrected one, and the total with VAT and the amount due are 27.00 against 22.50; nothing else differs. The failing document also reports BR-CO-17, which accepts a tax amount at a rate of 0 only when it rounds to zero, and 4.50 does not. The totals agree with one another, so BR-CO-14 and BR-CO-15 stay quiet.
What the validator reported
- The failing invoice reports BR-CO-17 and BR-Z-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. A credit note made from the recorded example reportedBR-CO-17andBR-Z-09when tried. - Reported by the EN 16931 layer as a fatal finding at the Zero rated breakdown's
cac:TaxCategory. - Exempt and reverse-charge breakdowns have the same requirement of zero, under
BR-E-09andBR-AE-09.
Related rules
- BR-CO-17 checks every breakdown tax amount, and is looser at a rate of 0
- BR-Z-08 checks the taxable amount of the same Zero rated breakdown
- BR-CO-14 checks the VAT total against the sum of the breakdown tax amounts
- BR-E-09 is the exempt counterpart, with the same requirement of zero
- 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-28.1: source checked 2026-09-28, explanation last updated 2026-09-28.
The official definition of BR-Z-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.

