Skip to content

BR-E-09: Set the tax amount of the exempt VAT breakdown to zero

No VAT is charged in the exempt category, so the tax amount of a VAT breakdown with category E must be exactly 0.

EN 16931Fatal: the document is invalidVATTotals

The short answer

BR-E-09 fails when the cbc:TaxAmount of a cac:TaxSubtotal in category E is anything but zero. Set it to 0.00, then remove the same amount from cac:TaxTotal/cbc:TaxAmount, cbc:TaxInclusiveAmount and cbc:PayableAmount.

If VAT really is due on those supplies, they are not exempt, and the category on the lines and in the breakdown is what needs correcting.

What the rule checks

The rule reads the cbc:TaxAmount next to each cac:TaxCategory with cbc:ID of E under the VAT scheme in the root cac:TaxTotal, and requires it to equal zero as a number, so 0 and 0.00 both pass.

No rounding or tolerance applies. When tried, a tax amount of 0.40 in the exempt breakdown, with the totals following it, failed this rule and nothing else: BR-CO-17 let it through, because at a rate of 0 that rule only asks for an amount that rounds to zero as a whole number.

The document VAT total is not part of this test. When tried, 5.00 in the exempt breakdown with the VAT total left at 0.00 reported BR-CO-14 in addition to 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:

  • The breakdown tax amount is calculated with a default rate for every category, instead of from the category's own rate.
  • The item was taxed in the source system and reclassified as exempt later, but the stored tax amount was kept.
  • VAT for the whole invoice is calculated once and spread over the breakdowns in proportion to their taxable amounts.
  • A rounding difference from the other breakdowns is pushed into the last breakdown written, which is the exempt one.

How to fix it

  1. Confirm from your tax determination that the supplies in the exempt breakdown are exempt. If they are, their breakdown tax amount is 0.00.
  2. Set cbc:TaxAmount in the exempt cac:TaxSubtotal to 0.00.
  3. Recalculate cac:TaxTotal/cbc:TaxAmount as the sum of the breakdown tax amounts, then cbc:TaxInclusiveAmount and cbc:PayableAmount from it. In the recorded example each of the three falls by 5.00.
  4. If VAT is in fact due, give the lines the category that applies, such as S with its rate, and build that breakdown instead. That is a tax decision to take at source, not a change to make in the XML alone.

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: 5.00 of VAT in the exempt breakdown, carried into the totals

<cac:TaxTotal>
  <cbc:TaxAmount currencyID="GBP">5.00</cbc:TaxAmount>
  <cac:TaxSubtotal>
    <cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
    <cbc:TaxAmount currencyID="GBP">5.00</cbc:TaxAmount>
    <cac:TaxCategory>
      <cbc:ID>E</cbc:ID>
      <cbc:Percent>0</cbc:Percent>
      <cbc:TaxExemptionReason>Exempt from VAT</cbc:TaxExemptionReason>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:TaxCategory>
  </cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
  <cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount currencyID="GBP">25.00</cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount currencyID="GBP">30.00</cbc:TaxInclusiveAmount>
  <!-- allowance, charge, prepaid and rounding amounts omitted from this fragment -->
  <cbc:PayableAmount currencyID="GBP">30.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

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

<cac:TaxTotal>
  <cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
  <cac:TaxSubtotal>
    <cbc:TaxableAmount currencyID="GBP">25.00</cbc:TaxableAmount>
    <cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
    <cac:TaxCategory>
      <cbc:ID>E</cbc:ID>
      <cbc:Percent>0</cbc:Percent>
      <cbc:TaxExemptionReason>Exempt from VAT</cbc:TaxExemptionReason>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:TaxCategory>
  </cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
  <cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount currencyID="GBP">25.00</cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount currencyID="GBP">25.00</cbc:TaxInclusiveAmount>
  <!-- allowance, charge, prepaid and rounding amounts omitted from this fragment -->
  <cbc:PayableAmount currencyID="GBP">25.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>

The failing invoice charges 5.00 of VAT in the exempt breakdown and carries it through to a VAT total of 5.00, a total with VAT of 30.00 and an amount due of 30.00; the corrected invoice has 0.00, 25.00 and 25.00. The failing document also reports BR-CO-17: at a rate of 0 the breakdown tax amount has to round to zero, and 5.00 does not. The totals agree with one another, so BR-CO-14 and BR-CO-15 stay silent.

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. An exempt credit note with 5.00 of tax in its breakdown reported this rule and BR-CO-17 when tried.
  • Reported by the EN 16931 layer as a fatal finding at the exempt breakdown's cac:TaxCategory.
  • Reverse-charge breakdowns have the same requirement under BR-AE-09, and Zero rated breakdowns under BR-Z-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-24.1: source checked 2026-09-24, explanation last updated 2026-09-24.

The official definition of BR-E-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.