Skip to content

BR-E-10Add the exemption reason to an exempt VAT breakdown

A VAT breakdown in the exempt category must say what the exemption is, through exemption reason text, an exemption reason code, or both.

EN 16931Fatal: the document is invalidVAT

The short answer

BR-E-10 fails when a VAT breakdown with category E has neither cbc:TaxExemptionReason nor cbc:TaxExemptionReasonCode in its cac:TaxCategory. Supply the reason the supply is exempt, as text, as a code from the VATEX list, or as both.

Exemption has many possible legal bases, so there is no single phrase to hard-code. The value has to come from whatever made your system treat the supply as exempt.

What the rule checks

The rule selects each cac:TaxCategory with cbc:ID of E under the VAT tax scheme, inside cac:TaxTotal/cac:TaxSubtotal beneath the document root, and passes when it has a cbc:TaxExemptionReason child or a cbc:TaxExemptionReasonCode child.

A code alone satisfies it. The valid exempt fixture with its text swapped for a cbc:TaxExemptionReasonCode of VATEX-EU-132 passes every layer.

The content of the text is not examined; any non-empty text passes. The validator cannot tell you that the stated exemption is the correct one.

Codes are checked elsewhere. A value outside the VATEX list is rejected by BR-CL-22, and the reverse-charge code VATEX-EU-AE on an exempt breakdown is rejected by the Peppol rule PEPPOL-EN16931-P0107, even with reason text beside it.

An empty cbc:TaxExemptionReason element is enough for this rule and is then rejected by PEPPOL-EN16931-R008.

TermMeaningUBL element
BT-118VAT category codecac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID
BT-120VAT exemption reason textcac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:TaxExemptionReason
BT-121VAT exemption reason codecac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:TaxExemptionReasonCode

How an integration ends up here

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

  • The exemption is recorded only as a tax code in the source system, with no description or legal reference the export could use.
  • The reason exists per item or per customer, and the export builds the VAT breakdown from category and rate alone.
  • The wording is printed on the PDF from a template and is never part of the structured data.
  • Blank values are dropped during serialisation and the reason was blank for this tax code.
  • A supply that is zero-rated or outside the scope of VAT was mapped to E by a catch-all, so no exemption reason exists for it. In that case the category assignment is the defect, and it is fixed where the category is decided.

How to fix it

  1. Find out why the supply is exempt: which provision or scheme your tax determination relied on. If it is genuinely exempt, the category stays E.
  2. Add cbc:TaxExemptionReason with wording that states that basis, or cbc:TaxExemptionReasonCode with the VATEX code that matches it, inside the cac:TaxCategory of the E breakdown. If no listed code fits, send text.
  3. Place the elements in UBL order: after cbc:Percent and before cac:TaxScheme, with the code before the text when both are sent. In the wrong order the document fails at the XSD layer and the later layers are skipped.
  4. Store the reason with the tax code or exemption record at source, so the export never has to invent 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: an exempt breakdown that gives no reason

<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>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:TaxSubtotal>

Fragment of the corrected invoice: reason text added to the tax category

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

The corrected invoice carries cbc:TaxExemptionReason in the E tax category and the failing one does not; that element is the whole difference. The failing document reports only BR-E-10. The fixture text, Exempt from VAT, is generic wording that satisfies the check; a real invoice should name the actual basis.

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 without a reason reports the same rule.
  • Only category E under the VAT tax scheme is in scope. Reverse charge has its own rule, BR-AE-10.
  • The rule reads the VAT breakdown only. The category on a line or on a document-level allowance or charge is not where the reason is looked for.
  • Tax in an exempt breakdown is a separate matter: a tax amount of 5.00 there brings BR-E-09 and BR-CO-17.

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-20.1: source checked 2026-09-20, explanation last updated 2026-09-20.

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