# BR-Z-01: Add exactly one Zero rated VAT breakdown when the document has Zero rated content

A document with a Zero rated line, document allowance or document charge needs exactly one Zero rated VAT breakdown: not none, and not two.

- Layer: EN 16931
- Severity: fatal (the document is invalid)
- Topics: VAT
- Official definition: https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-Z-01/
- Explanation last updated: 2026-09-20

## 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 `Z` through 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

1. Confirm from the source data that the items marked `Z` are genuinely zero-rated supplies. The category describes the transaction and is not something to alter to silence the rule.
2. Sum the Zero rated content into one figure. In the recorded invoice that is the single Zero rated line of 10.00.
3. Emit one `cac:TaxSubtotal` with that `cbc:TaxableAmount`, a `cbc:TaxAmount` of `0.00`, and a `cac:TaxCategory` with `cbc:ID` of `Z`, `cbc:Percent` of `0` and the `VAT` tax scheme.
4. If the generator emitted several Zero rated breakdowns, merge them into that one rather than adding another.

## 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

```xml
<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

```xml
<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 XML](https://ironfang.uk/finance/rule-examples/BR-Z-01-invalid.xml)
  - [Download the corrected XML](https://ironfang.uk/finance/rule-examples/invoice-rich.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 `Invoice` and `CreditNote`, evaluated at the document root. A credit note with its Zero rated breakdown removed reports the same single rule.
- Only category `Z` under the `VAT` tax 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](https://ironfang.uk/docs/finance/rules/BR-S-01.md)
- [BR-CO-17 checks the tax amount of every breakdown, including one at a rate of 0](https://ironfang.uk/docs/finance/rules/BR-CO-17.md)
- [BR-CO-18 requires at least one VAT breakdown in every document](https://ironfang.uk/docs/finance/rules/BR-CO-18.md)

## 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-20.

[The official definition of BR-Z-01](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/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.

## Links

- [This rule as a web page](https://ironfang.uk/docs/finance/rules/BR-Z-01)
- [Free Peppol invoice validator](https://ironfang.uk/tools/peppol-validator)
- [Rule index](https://ironfang.uk/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.uk/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.uk/mcp
