On this page
The short answer
BR-Z-08 fails when the cbc:TaxableAmount of the Zero rated breakdown differs from the Zero rated content of the document: the net amounts of lines in category Z, plus root-level charges in Z, minus root-level allowances in Z. In the recorded example that is 25.00 + 4.00 = 29.00, and the breakdown said 25.00 because the delivery charge was left out.
The comparison is exact, so a figure a penny out fails just as surely as one that forgets a whole charge.
What the rule checks
For each cac:TaxCategory with cbc:ID of Z under the VAT scheme in the root cac:TaxTotal, the rule adds the cbc:LineExtensionAmount of the lines whose item category is Z, adds the cbc:Amount of root-level charges in Z, and subtracts that of root-level allowances in Z.
There is no tolerance either way. When tried, 29.01 and 28.99 against a calculated 29.00 each failed, while 29 passed as the same number as 29.00.
The sign of an allowance matters. When tried, the volume discount invoice with its 2.50 added instead of subtracted, a taxable amount of 27.50 against 22.50, reported this rule.
Zero rated content is not grouped by rate. An allowance or charge in category Z counts even when its rate is wrong, which is why a discount at 20 in category Z reports BR-Z-06 but leaves this rule satisfied.
| Term | Meaning | UBL element |
|---|---|---|
| BT-116 | VAT category taxable amount | cac:TaxTotal/cac:TaxSubtotal/cbc:TaxableAmount |
| BT-118 | VAT category code | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID |
| BT-131 | Invoice line net amount | cac:InvoiceLine/cbc:LineExtensionAmount (cac:CreditNoteLine/cbc:LineExtensionAmount in a credit note) |
| BT-99 | Document level charge amount | cac:AllowanceCharge[cbc:ChargeIndicator = true]/cbc:Amount |
| BT-92 | Document level allowance amount | cac:AllowanceCharge[cbc:ChargeIndicator = false]/cbc:Amount |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- The taxable amount is copied from the sum of the line net amounts, and a Zero rated delivery charge added at document level never reaches it.
- A document-level discount is applied to the monetary totals but not to the Zero rated breakdown, or is added where it should be subtracted.
- Document-level charges are assigned to the Standard rated breakdown by default, even when their own category is
Z. - The breakdown is recomputed from quantities and prices, and rounding moves it a penny away from the line net amounts written in the document.
How to fix it
- Sum
cbc:LineExtensionAmountof every line withcac:Item/cac:ClassifiedTaxCategory/cbc:IDofZ, keeping negative lines negative. - Add the
cbc:Amountof each root-levelcac:AllowanceChargein categoryZwithcbc:ChargeIndicatoroftrue, and subtract those withfalse. Leave line-level allowances and charges out: they are already inside the line amounts. - Write the result, to two decimals, as the
cbc:TaxableAmountof the one Zero ratedcac:TaxSubtotal. Itscbc:TaxAmountstays0.00. - Check
cbc:TaxExclusiveAmountseparately. It covers every category and is tested byBR-CO-13, not by this rule.
The recorded example has one Zero rated line and one Zero rated delivery charge.
Zero rated line: 25.00 Zero rated document-level charge: + 4.00 Zero rated document-level allowances: none Taxable amount for Z: 25.00 + 4.00 = 29.00 Sent: 25.00, which is 4.00 short, and any difference fails
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: the Zero rated breakdown counts the 25.00 line but not the 4.00 delivery charge
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<!-- reason code and reason omitted from this fragment -->
<cbc:Amount currencyID="GBP">4.00</cbc:Amount>
<!-- tax category Z at 0 omitted from this fragment -->
</cac:AllowanceCharge>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">25.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>
<!-- Zero rated line: LineExtensionAmount 25.00 -->Fragment of the corrected invoice: 25.00 + 4.00 = 29.00
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">29.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>Only the Zero rated cbc:TaxableAmount differs: 25.00 in the failing invoice, 29.00 in the corrected one. The failing document reports only BR-Z-08. Its monetary totals include the delivery charge and agree with each other, and the breakdown tax amount is 0.00 in both, so no totals rule reacts to the wrong taxable amount.
What the validator reported
- The failing invoice reports BR-Z-08. 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 sums itscac:CreditNoteLineelements instead. The credit note version of the recorded example reported this rule when tried. - Reported by the EN 16931 layer as a fatal finding at the Zero rated breakdown's
cac:TaxCategory. - Unlike
BR-S-08, which allows a difference under 1.00 and works per rate, this rule has no tolerance and a single Zero rated figure.BR-Z-01makes sure there is only one Zero rated breakdown to compare.
Related rules
- BR-Z-09 requires the tax amount of the same breakdown to be zero
- BR-S-08 is the Standard rated taxable amount rule, with a tolerance and a figure per rate
- BR-Z-01 requires exactly one Zero rated breakdown
- BR-CO-13 checks the total without VAT, which the same lines, allowances and charges feed
- 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-08 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.

