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

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

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

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

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

```xml
<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](https://ironfang.uk/docs/finance/rules/BR-S-08.md). The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.uk/finance/rule-examples/BR-32-invalid.xml)
  - [Download the corrected XML](https://ironfang.uk/finance/rule-examples/invoice-rich.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 `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.

## Related rules

- [BR-S-08 subtracts Standard rated document allowances from the taxable amount, and fails when this one has no category](https://ironfang.uk/docs/finance/rules/BR-S-08.md)
- [BR-CL-17 checks that the category code, once supplied, is on the UNTDID 5305 list](https://ironfang.uk/docs/finance/rules/BR-CL-17.md)
- [BR-CO-21 requires a reason on the same document-level allowance](https://ironfang.uk/docs/finance/rules/BR-CO-21.md)
- [BR-CO-11 sums the document-level allowances into the allowance total](https://ironfang.uk/docs/finance/rules/BR-CO-11.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-32](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/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.

## Links

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