# BR-Z-07: Give a Zero rated document charge a VAT rate of 0

A document-level charge in VAT category `Z` must state a rate of 0 in `cbc:Percent`. Leaving the rate out fails, as does any other value.

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

## The short answer

`BR-Z-07` fails on each charge whose `cac:TaxCategory` has `cbc:ID` of `Z` under the `VAT` scheme and a `cbc:Percent` that is absent or not 0. Write `<cbc:Percent>0</cbc:Percent>` after the category code; in the recorded example the delivery charge had no rate element at all.

The zero rate has to be stated, not implied. A category of `Z` with no rate is incomplete, not zero.

## What the rule checks

The rule checks every Zero rated `cac:TaxCategory` under the `VAT` scheme in a charge, including a charge inside an invoice line. When tried, a line charge in category `Z` at 20 reported this rule at the line's `cac:AllowanceCharge`, beside the warning `UBL-CR-558`.

The rate must equal zero as a number. When tried, the delivery charge at 5 and at 20 each reported this rule, while `-0.0` passed.

An absent rate is not read as zero, which is the failure in the recorded example.

Nothing else reacts to the missing rate. The Zero rated taxable amount rule counts the charge by its category alone, so the failing invoice reports this rule only.

| Term | Meaning | UBL element |
|---|---|---|
| BT-102 | Document level charge VAT category code | `cac:AllowanceCharge[cbc:ChargeIndicator = true]/cac:TaxCategory/cbc:ID` |
| BT-103 | Document level charge VAT rate | `cac:AllowanceCharge[cbc:ChargeIndicator = true]/cac:TaxCategory/cbc:Percent` |

## How an integration ends up here

Possible causes, from the shape of the rule rather than from measured usage:

- The delivery charge is created with a category flag and no rate, and the export writes only the fields that are filled.
- The serialiser drops elements whose value is zero, and so omits `cbc:Percent` whenever the rate is 0.
- Charges take their rate from a default tax code, the Standard rate, while their category is copied from the goods.
- The charge was reclassified from Standard rated to Zero rated and its rate was not updated.

## How to fix it

1. Locate the charge from the finding: in the recorded example it is `cac:AllowanceCharge[1]`, the first `cac:AllowanceCharge` under the root.
2. Confirm from the tax code of the charge that it is Zero rated.
3. Write `cbc:Percent` with `0` straight after `cbc:ID` in its `cac:TaxCategory`, before `cac:TaxScheme`.
4. Make the export write the rate for every category, a rate of 0 included, instead of skipping zero values.
5. If the charge is actually taxed, move it to the right category and rate, and rebuild both breakdowns.

## 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 delivery charge is in category Z but has no rate

```xml
<cac:AllowanceCharge>
  <cbc:ChargeIndicator>true</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>DL</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Delivery</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="GBP">4.00</cbc:Amount>
  <cac:TaxCategory>
    <cbc:ID>Z</cbc:ID>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:AllowanceCharge>
```

Fragment of the corrected invoice: the delivery charge states its rate of 0

```xml
<cac:AllowanceCharge>
  <cbc:ChargeIndicator>true</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>DL</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Delivery</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="GBP">4.00</cbc:Amount>
  <cac:TaxCategory>
    <cbc:ID>Z</cbc:ID>
    <cbc:Percent>0</cbc:Percent>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:AllowanceCharge>
```

The failing invoice lacks `cbc:Percent` in the delivery charge's `cac:TaxCategory`, and the corrected one has `0` there; nothing else differs. The failing document reports only `BR-Z-07`. The Zero rated breakdown of 29.00 still matches, since the charge counts towards it through its category `Z`.

### What the validator reported

- The failing invoice reports **BR-Z-07**. The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.com/finance/rule-examples/BR-Z-07-invalid.xml)
  - [Download the corrected XML](https://ironfang.com/finance/rule-examples/zero-rated-charge-valid.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`. A credit note built from the recorded example reported this rule alone when tried.
- Reported by the EN 16931 layer as a fatal finding at the charge's `cac:TaxCategory`.
- Allowances have the same rule in `BR-Z-06`. Standard rated charges need a rate above zero under `BR-S-07`, and a charge with no category at all fails `BR-37`.

## Related rules

- [BR-Z-06 asks the same of Zero rated document-level allowances](https://ironfang.com/docs/finance/rules/BR-Z-06.md)
- [BR-S-07 requires a Standard rated charge to have a rate above zero](https://ironfang.com/docs/finance/rules/BR-S-07.md)
- [BR-Z-04 requires a seller VAT identifier once a charge is Zero rated](https://ironfang.com/docs/finance/rules/BR-Z-04.md)
- [BR-37 requires each document-level charge to carry a VAT category](https://ironfang.com/docs/finance/rules/BR-37.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-28.1: source checked 2026-09-28, explanation last updated 2026-09-28.

[The official definition of BR-Z-07](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-Z-07/) 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.com/docs/finance/rules/BR-Z-07)
- [Free Peppol invoice validator](https://ironfang.com/tools/peppol-validator)
- [Rule index](https://ironfang.com/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.com/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.com/mcp
