The short answer
BR-Z-01 fails when VAT category Z appears on a line, a document-level allowance or a document-level charge, and cac:TaxTotal does not contain exactly one cac:TaxSubtotal with category Z. A breakdown is still required when its tax amount is nil. Add a single Zero rated breakdown that covers all the Zero rated content.
What the rule checks
The rule looks for cbc:ID of Z, under the VAT tax scheme, in any cac:ClassifiedTaxCategory or cac:TaxCategory in the document. If there is one, the number of Zero rated cac:TaxSubtotal elements in cac:TaxTotal under the document root must be exactly one.
Two Zero rated breakdowns fail just as none does. This differs from BR-S-01, which accepts several Standard rated breakdowns because Standard rates vary; the zero rate is a single rate, so one entry holds all of it.
The reverse case is not caught here. A Zero rated breakdown of 0.00 in an invoice with no Zero rated line, allowance or charge passes this rule, and passed the whole validation when we tried it.
Amounts are not examined. BR-Z-08 checks the Zero rated taxable amount and BR-Z-09 requires the tax amount to be zero.
| Term | Meaning | UBL element |
|---|---|---|
| BG-23 | VAT breakdown | cac:TaxTotal/cac:TaxSubtotal |
| BT-118 | VAT category code | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID |
| BT-151 | Invoiced item VAT category code | cac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory/cbc:ID |
| BT-95 | Document level allowance VAT category code | cac:AllowanceCharge[cbc:ChargeIndicator = false]/cac:TaxCategory/cbc:ID |
| BT-102 | Document level charge VAT category code | cac:AllowanceCharge[cbc:ChargeIndicator = true]/cac:TaxCategory/cbc:ID |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- Breakdowns are generated only for categories with a non-zero tax amount, so the Zero rated one never appears.
- The tax summary is taken from VAT postings in the ledger, and zero-rated sales produce no posting.
- One breakdown is written per line or per tax code, and two internal codes both map to
Z. - A Zero rated line was added late, for example a delivery item, after the breakdown had been built.
- A line carries
Zthrough a mapping default when the supply is really in another category. If so, the category is what needs correcting, at its source.
How to fix it
- Confirm from the source data that the items marked
Zare genuinely zero-rated supplies. The category describes the transaction and is not something to alter to silence the rule. - Sum the Zero rated content into one figure. In the recorded invoice that is the single Zero rated line of 10.00.
- Emit one
cac:TaxSubtotalwith thatcbc:TaxableAmount, acbc:TaxAmountof0.00, and acac:TaxCategorywithcbc:IDofZ,cbc:Percentof0and theVATtax scheme. - If the generator emitted several Zero rated breakdowns, merge them into that one rather than adding another.
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: line 2 is Zero rated, and the VAT breakdown has only a Standard rated entry
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">11.70</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">58.50</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">11.70</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>20</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:InvoiceLine>
<cbc:ID>2</cbc:ID>
<!-- quantity omitted from this fragment -->
<cbc:LineExtensionAmount currencyID="GBP">10.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Example zero-rated item</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>Z</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<!-- price omitted from this fragment -->
</cac:InvoiceLine>Fragment of the corrected invoice: one Zero rated breakdown for the 10.00 line
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">11.70</cbc:TaxAmount>
<!-- Standard rated breakdown unchanged, omitted from this fragment -->
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">10.00</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>The corrected invoice contains the Zero rated cac:TaxSubtotal (10.00 taxable, 0.00 tax, Z at 0) that the failing one lacks; nothing else differs. The failing document reports only BR-Z-01. The missing breakdown carried no tax, so the VAT total of 11.70 still equals the sum of the remaining breakdowns and the totals rules stay quiet.
What the validator reported
- The failing invoice reports BR-Z-01. 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, evaluated at the document root. A credit note with its Zero rated breakdown removed reports the same single rule. - Only category
Zunder theVATtax scheme counts. Exempt, reverse-charge and other nil-tax categories have their own rules and are not interchangeable with Zero rated.
Related rules
- BR-S-01 is the Standard rated counterpart, which accepts more than one breakdown
- BR-CO-17 checks the tax amount of every breakdown, including one at a rate of 0
- BR-CO-18 requires at least one VAT breakdown in every document
- 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-Z-01 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.
