Skip to content

Ironfang Finance - Rule reference

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.

EN 16931Fatal: the document is invalidVATAllowances and charges

On this page

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.

TermMeaningUBL element
BT-102Document level charge VAT category codecac:AllowanceCharge[cbc:ChargeIndicator = true]/cac:TaxCategory/cbc:ID
BT-103Document level charge VAT ratecac: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.

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

<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

<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

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.

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