Skip to content

BR-32: Add a VAT category to each document-level allowance

A document-level allowance needs a cac:TaxCategory with a cbc:ID under the VAT scheme, so the discount is taken off the right VAT breakdown.

EN 16931Fatal: the document is invalidAllowances and chargesVAT

The short answer

BR-32 fails when a root-level cac:AllowanceCharge with cbc:ChargeIndicator of false has no VAT category code, meaning no cac:TaxCategory with a cbc:ID whose cac:TaxScheme/cbc:ID is VAT. Add the category and rate of the supplies the discount reduces, as the corrected invoice does with S at 20.

An allowance without a category is not deducted in any VAT breakdown, so the taxable amount checks lose it; in the recorded example BR-S-08 fails alongside.

What the rule checks

Each cac:AllowanceCharge directly under the Invoice or CreditNote root that reads as an allowance must contain a cac:TaxCategory that has a cbc:ID child and belongs to the VAT tax scheme.

The scheme is compared after trimming and upper-casing, so vat passes. A category under another scheme does not count: when tried with GST in place of VAT, BR-32 was reported.

The category code has to be present as an element. When tried, a cac:TaxCategory with a rate but no cbc:ID reported this rule; one with an empty cbc:ID got past it and was rejected by BR-CL-17 and PEPPOL-EN16931-R008 instead.

The rate is policed by other rules. With S and no cbc:Percent, the document reported BR-S-06 and BR-S-08 rather than this rule.

Document-level charges have the matching rule BR-37. Allowances on a line carry no category of their own, because they are part of the line net amount and take the line category.

TermMeaningUBL element
BG-20Document level allowancescac:AllowanceCharge[cbc:ChargeIndicator = false]
BT-95Document level allowance VAT category codecac:AllowanceCharge/cac:TaxCategory/cbc:ID
BT-96Document level allowance VAT ratecac:AllowanceCharge/cac:TaxCategory/cbc:Percent

How an integration ends up here

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

  • The discount is modelled as a header amount with no tax attributes, because the source system applies it after VAT has been worked out.
  • The mapping copies the tax category onto lines and charges but was never written for allowances.
  • The document spans several VAT categories or rates, and the export cannot decide which one the discount belongs to, so it leaves the category out.
  • The cac:TaxScheme carries a local tax name, or is missing, instead of VAT.

How to fix it

  1. Work out which supplies the allowance reduces. Its VAT category and rate are those of the supplies it applies to.
  2. Add cac:TaxCategory after cbc:Amount (and after cbc:BaseAmount when present), with cbc:ID for the category, cbc:Percent for the rate, and cac:TaxScheme/cbc:ID of VAT.
  3. If one discount covers supplies in different categories or at different rates, split it into one allowance per category and rate, each with its share of the amount. The allowance total stays the same.
  4. Check the VAT breakdown: the allowance must be subtracted from the taxable amount of its category and rate, and the tax amount recalculated from there. BR-S-08 and the matching rules for other categories check that sum.

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 document allowance has a reason and an amount, but no tax category

<cac:AllowanceCharge>
  <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Example document discount</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="GBP">1.00</cbc:Amount>
</cac:AllowanceCharge>

Fragment of the corrected invoice: the allowance is Standard rated at 20 under the VAT scheme

<cac:AllowanceCharge>
  <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Example document discount</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="GBP">1.00</cbc:Amount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <cbc:Percent>20</cbc:Percent>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:AllowanceCharge>

The corrected invoice has a cac:TaxCategory of S at 20 under the VAT scheme on its document allowance, and the failing invoice has none. The failing document also reports BR-S-08: without a category the 1.00 allowance drops out of the Standard rated sum, which becomes 56.00 of lines plus the 3.50 charge, or 59.50, a full 1.00 away from the taxable amount of 58.50. Restoring the category brings that sum back to 58.50 and clears both findings.

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 Invoice and CreditNote; the credit note version of the recorded example reported BR-32 and BR-S-08 in the same places when tried.
  • Which taxable amount rule comes with it depends on the breakdown the allowance should have reduced. Here it is the Standard rated breakdown, so BR-S-08.
  • Adding the category is not the end of it for category S: the allowance also needs a rate above zero, which BR-S-06 checks.

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