Skip to content

Ironfang Finance - Rule reference

BR-Z-09: Set the tax amount of the Zero rated VAT breakdown to 0.00

Zero rated supplies are taxed at 0, so the tax amount in a VAT breakdown with category Z must be exactly zero. Even 0.01 fails.

EN 16931Fatal: the document is invalidVATTotals

On this page

The short answer

BR-Z-09 fails when the cbc:TaxAmount beside a cac:TaxCategory of Z in the VAT breakdown is not zero. Set it to 0.00, and take the same amount off the VAT total, the total with VAT and the amount due; in the recorded example that removes 4.50 from each.

The 4.50 is 20 per cent of the 22.50 Zero rated taxable amount, the mark of a tax calculation that applied the Standard rate to every breakdown. If VAT really is due, the supplies are not Zero rated and the category must change at source.

What the rule checks

The rule runs on every Zero rated cac:TaxCategory under the VAT scheme in the root cac:TaxTotal and reads the cbc:TaxAmount of its cac:TaxSubtotal. That amount must equal zero as a number, so -0.00 passed when tried.

No rounding is allowed. When tried, 0.01 in the Zero rated breakdown, with the totals raised to match, failed this rule alone.

BR-CO-17 is looser at a rate of 0 and only fails once the amount rounds to a whole number other than 0. At 0.50 it joined this rule when tried, and at the recorded 4.50 it fires too.

The VAT total is outside this rule. With 4.50 in the Zero rated breakdown but the VAT total left at 0.00, the invoice reported BR-CO-14 alongside this rule and BR-CO-17.

TermMeaningUBL element
BT-117VAT category tax amountcac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount
BT-118VAT category codecac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID
BT-110Invoice total VAT amountcac:TaxTotal/cbc:TaxAmount

How an integration ends up here

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

  • Every breakdown is taxed with the document's default rate instead of its own cbc:Percent.
  • The item was Standard rated when the order was taken and Zero rated at invoicing, and the stored VAT amount survived the change.
  • The invoice VAT is calculated once and apportioned across the breakdowns by taxable amount.
  • Penny rounding differences from the Standard rated breakdowns are posted to the last breakdown written, which happens to be the Zero rated one.

How to fix it

  1. Check the tax code of the Zero rated lines, allowances and charges. If they are Zero rated, their breakdown tax amount is 0.00.
  2. Set cbc:TaxAmount in the Zero rated cac:TaxSubtotal to 0.00.
  3. Re-sum cac:TaxTotal/cbc:TaxAmount from the breakdowns, then recalculate cbc:TaxInclusiveAmount and cbc:PayableAmount: 27.00 becomes 22.50 in the recorded example.
  4. If VAT is truly due on those supplies, move them to the category and rate that apply, such as S at 20, and build that breakdown instead of taxing a Zero rated one.

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: 4.50 of VAT in the Zero rated breakdown, carried into the totals

<cac:TaxTotal>
  <cbc:TaxAmount currencyID="GBP">4.50</cbc:TaxAmount>
  <cac:TaxSubtotal>
    <cbc:TaxableAmount currencyID="GBP">22.50</cbc:TaxableAmount>
    <cbc:TaxAmount currencyID="GBP">4.50</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>
<cac:LegalMonetaryTotal>
  <!-- line and tax exclusive amounts omitted from this fragment -->
  <cbc:TaxInclusiveAmount currencyID="GBP">27.00</cbc:TaxInclusiveAmount>
  <!-- allowance, charge, prepaid and rounding amounts omitted from this fragment -->
  <cbc:PayableAmount currencyID="GBP">27.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

Fragment of the corrected invoice: no VAT in the Zero rated breakdown, and totals without it

<cac:TaxTotal>
  <cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
  <cac:TaxSubtotal>
    <cbc:TaxableAmount currencyID="GBP">22.50</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>
<cac:LegalMonetaryTotal>
  <!-- line and tax exclusive amounts omitted from this fragment -->
  <cbc:TaxInclusiveAmount currencyID="GBP">22.50</cbc:TaxInclusiveAmount>
  <!-- allowance, charge, prepaid and rounding amounts omitted from this fragment -->
  <cbc:PayableAmount currencyID="GBP">22.50</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

The Zero rated cbc:TaxAmount and the VAT total are 4.50 in the failing invoice and 0.00 in the corrected one, and the total with VAT and the amount due are 27.00 against 22.50; nothing else differs. The failing document also reports BR-CO-17, which accepts a tax amount at a rate of 0 only when it rounds to zero, and 4.50 does not. The totals agree with one another, so BR-CO-14 and BR-CO-15 stay quiet.

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 made from the recorded example reported BR-CO-17 and BR-Z-09 when tried.
  • Reported by the EN 16931 layer as a fatal finding at the Zero rated breakdown's cac:TaxCategory.
  • Exempt and reverse-charge breakdowns have the same requirement of zero, under BR-E-09 and BR-AE-09.

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