The short answer
BR-Z-10 fails when the cac:TaxCategory of a VAT breakdown with category Z holds cbc:TaxExemptionReason or cbc:TaxExemptionReasonCode. Take the element out; the Zero rated breakdown needs only its category, a rate of 0 and the VAT scheme.
Zero rating and exemption are separate treatments. If the supply is really exempt, it belongs in category E, where a reason is required instead of forbidden.
What the rule checks
The rule reads each cac:TaxCategory with cbc:ID of Z under the VAT scheme in a cac:TaxSubtotal of the root cac:TaxTotal, and fails when either reason element appears in it.
A code without text fails as well. When tried, a Zero rated breakdown carrying only a cbc:TaxExemptionReasonCode of VATEX-EU-132 was reported by this rule.
The wording is never read. Zero rated, which merely repeats the category, is enough to fail it.
Item categories on the lines are outside this rule. When tried, a reason inside a Zero rated line's cac:ClassifiedTaxCategory left the document valid, with only the warning UBL-CR-601.
| 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 export writes a description for every breakdown, and the zero-rate tax code in the source system has one, such as
Zero rated. - Zero-rated and exempt supplies share one tax code, and the exemption wording attached to it reaches both.
- A breakdown was switched from
EtoZand its reason element came along. - The reason field is mapped for all nil-VAT categories together, without separating those that need it from
Z, which forbids it.
How to fix it
- Remove
cbc:TaxExemptionReasonandcbc:TaxExemptionReasonCodefrom thecac:TaxCategoryof the Zero rated breakdown. - Read what the reason said before discarding it. If it describes an exemption rather than zero rating, the supply belongs in category
Eon the lines and in the breakdown, and the reason moves with it. - Stop the export from writing reason elements for
Zbreakdowns, whatever the tax code holds.
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: reason text inside the Zero rated tax category
<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>
<cbc:TaxExemptionReason>Zero rated</cbc:TaxExemptionReason>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>Fragment of the corrected invoice: the Zero rated breakdown without a reason
<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>The failing invoice has cbc:TaxExemptionReason with the text Zero rated in its Zero rated breakdown, the second cac:TaxSubtotal, and the corrected invoice has no reason there. That is the only difference, and the failing document reports only BR-Z-10.
What the validator reported
- The failing invoice reports BR-Z-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 credit note with the same text in its Zero rated breakdown reported this rule when tried. - Reported by the EN 16931 layer as a fatal finding at the Zero rated breakdown's
cac:TaxCategory. - Standard rated breakdowns are under the same ban through
BR-S-10. Exempt breakdowns work the other way round and need a reason underBR-E-10.
Related rules
- BR-S-10 forbids exemption reasons on Standard rated breakdowns in the same way
- BR-E-10 requires a reason on an exempt breakdown, the category to use if the supply is exempt
- BR-Z-01 requires exactly one Zero rated breakdown when Zero rated content exists
- 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-Z-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.
