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

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

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

| Term | Meaning | UBL element |
|---|---|---|
| BT-117 | VAT category tax amount | `cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount` |
| BT-118 | VAT category code | `cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID` |
| BT-110 | Invoice total VAT amount | `cac: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.

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

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

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

- The failing invoice reports [BR-CO-17](https://ironfang.uk/docs/finance/rules/BR-CO-17.md) and **BR-E-09**. The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.uk/finance/rule-examples/BR-E-09-invalid.xml)
  - [Download the corrected XML](https://ironfang.uk/finance/rule-examples/exempt-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`. 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`.

## Related rules

- [BR-CO-17 is reported beside this rule when the exempt tax amount does not round to zero](https://ironfang.uk/docs/finance/rules/BR-CO-17.md)
- [BR-AE-09 requires a tax amount of zero in a reverse-charge breakdown in the same way](https://ironfang.uk/docs/finance/rules/BR-AE-09.md)
- [BR-CO-14 fires as well if the breakdown tax amount and the VAT total are not changed together](https://ironfang.uk/docs/finance/rules/BR-CO-14.md)
- [BR-E-10 requires the exemption reason in the same exempt breakdown](https://ironfang.uk/docs/finance/rules/BR-E-10.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-24.

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

## Links

- [This rule as a web page](https://ironfang.uk/docs/finance/rules/BR-E-09)
- [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
