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.
| Term | Meaning | UBL element |
|---|---|---|
| BG-20 | Document level allowances | cac:AllowanceCharge[cbc:ChargeIndicator = false] |
| BT-95 | Document level allowance VAT category code | cac:AllowanceCharge/cac:TaxCategory/cbc:ID |
| BT-96 | Document level allowance VAT rate | cac: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:TaxSchemecarries a local tax name, or is missing, instead ofVAT.
How to fix it
- Work out which supplies the allowance reduces. Its VAT category and rate are those of the supplies it applies to.
- Add
cac:TaxCategoryaftercbc:Amount(and aftercbc:BaseAmountwhen present), withcbc:IDfor the category,cbc:Percentfor the rate, andcac:TaxScheme/cbc:IDofVAT. - 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.
- 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-08and 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
- The failing invoice reports BR-32 and BR-S-08. The corrected document passes every layer with no findings.Download the failing XMLDownload the corrected 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
InvoiceandCreditNote; the credit note version of the recorded example reportedBR-32andBR-S-08in 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, whichBR-S-06checks.
Related rules
- BR-S-08 subtracts Standard rated document allowances from the taxable amount, and fails when this one has no category
- BR-CL-17 checks that the category code, once supplied, is on the UNTDID 5305 list
- BR-CO-21 requires a reason on the same document-level allowance
- BR-CO-11 sums the document-level allowances into the allowance total
- Browse every rule in the reference
- Background: Understanding EN 16931 validation errors
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.
