# BR-S-06: Give a Standard rated document allowance a VAT rate above zero

A document-level allowance in VAT category `S` must state the rate of the supplies it reduces in `cbc:Percent`, and that rate must be above zero.

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

## The short answer

`BR-S-06` fails on each allowance whose `cac:TaxCategory` has `cbc:ID` of `S` under the `VAT` scheme and a `cbc:Percent` that is missing, zero or negative. Give it the Standard rate of the supplies the allowance reduces: the loyalty rebate in the recorded example comes off a line at 20, so its rate is `20`.

A discount carries the VAT rate of what it discounts. Writing 0 because an allowance is not a sale in itself leaves category and rate contradicting each other, and takes the allowance out of the Standard rated taxable amount.

## What the rule checks

Every `cac:TaxCategory` of `S` under the `VAT` scheme inside a `cac:AllowanceCharge` with `cbc:ChargeIndicator` of `false` is checked, and a failure is reported at that category. An allowance inside an invoice line counts too: when tried, one with its own `S` category at 0 reported this rule at the line's `cac:AllowanceCharge`, with the warning `UBL-CR-558`.

The rate passes only as a number above zero. When tried on the rebate invoice, `-20` and an omitted `cbc:Percent` each reported this rule, both times together with `BR-S-08`.

Any positive figure passes, right or wrong. When tried, the rebate at 5 beside a line and breakdown at 20 got past this rule, and `BR-S-08` alone objected, because the rebate no longer counted towards the rate of 20.

Charges and lines are checked by their own rules: a Standard rated document charge at 0 is `BR-S-07`, and a Standard rated line at 0 is `BR-S-05`.

| Term | Meaning | UBL element |
|---|---|---|
| BT-95 | Document level allowance VAT category code | `cac:AllowanceCharge[cbc:ChargeIndicator = false]/cac:TaxCategory/cbc:ID` |
| BT-96 | Document level allowance VAT rate | `cac:AllowanceCharge[cbc:ChargeIndicator = false]/cac:TaxCategory/cbc:Percent` |

## How an integration ends up here

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

- The export treats allowances as having no VAT of their own and writes a rate of 0 for every discount, while keeping the category of the lines.
- The rate is read from a field that only products carry, so a header-level rebate has nothing to read and the serialiser writes `0` or skips `cbc:Percent`.
- A minus sign meant for the amount is applied to the rate as well, producing `-20`.
- The discount really applies to supplies in another category, but the allowance was left in category `S` with a rate of 0 instead of being moved.

## How to fix it

1. Identify the supplies the allowance reduces and the Standard rate they carry: in the recorded example, the single line at 20.
2. Write that rate to `cbc:Percent` in the allowance's `cac:TaxCategory`, keeping `cbc:ID` of `S` and the `VAT` tax scheme.
3. If the discount spans several rates, split it into one allowance per rate, each with its share of the amount.
4. If the discounted supplies are not Standard rated, give the allowance their category and rate, such as `Z` at 0, and move the amount to that breakdown.
5. Recalculate the Standard rated breakdown for the rate: the taxable amount must subtract the allowance, which `BR-S-08` checks, and the tax amount follows from it.

## 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 Standard rated rebate at 0, beside a breakdown at 20 that deducts it

```xml
<cac:AllowanceCharge>
  <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>100</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Loyalty rebate</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="GBP">5.00</cbc:Amount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <cbc:Percent>0</cbc:Percent>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:AllowanceCharge>

<cac:TaxSubtotal>
  <cbc:TaxableAmount currencyID="GBP">20.00</cbc:TaxableAmount>
  <cbc:TaxAmount currencyID="GBP">4.00</cbc:TaxAmount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <cbc:Percent>20</cbc:Percent>
    <!-- tax scheme omitted from this fragment -->
  </cac:TaxCategory>
</cac:TaxSubtotal>
```

Fragment of the corrected invoice: the rebate carries the rate of the line it reduces

```xml
<cac:AllowanceCharge>
  <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>100</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Loyalty rebate</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="GBP">5.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>
```

Only the `cbc:Percent` of the loyalty rebate differs: `0` in the failing invoice, `20` in the corrected one. The failing document also reports `BR-S-08` on the breakdown at 20: with the rebate at another rate, the Standard rated content at 20 is the 25.00 line alone, while the breakdown says 20.00, a gap of 5.00. Restoring the rate brings the rebate back into that sum and clears both findings.

### What the validator reported

- The failing invoice reports **BR-S-06** and [BR-S-08](https://ironfang.com/docs/finance/rules/BR-S-08.md). The corrected document passes every layer with no findings.
  - [Download the failing XML](https://ironfang.com/finance/rule-examples/BR-S-06-invalid.xml)
  - [Download the corrected XML](https://ironfang.com/finance/rule-examples/standard-rated-allowance-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`. The credit note form of the recorded example reported `BR-S-06` and `BR-S-08` when tried.
- Reported by the EN 16931 layer as a fatal finding at the allowance's `cac:TaxCategory`, once per offending allowance.
- An allowance with no `cac:TaxCategory` at all fails `BR-32` instead; this rule only sees allowances that already say `S`.
- Zero rated allowances need the opposite, a rate of exactly 0, under `BR-Z-06`.

## Related rules

- [BR-S-08 subtracts the allowance from the taxable amount of its rate, and failed alongside this rule in the recorded example](https://ironfang.com/docs/finance/rules/BR-S-08.md)
- [BR-S-07 makes the same demand of Standard rated document-level charges](https://ironfang.com/docs/finance/rules/BR-S-07.md)
- [BR-32 requires every document-level allowance to have a VAT category first](https://ironfang.com/docs/finance/rules/BR-32.md)
- [BR-Z-06 requires the rate of a Zero rated allowance to be exactly 0](https://ironfang.com/docs/finance/rules/BR-Z-06.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-28.1: source checked 2026-09-28, explanation last updated 2026-09-28.

[The official definition of BR-S-06](https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-tc434/BR-S-06/) 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.com/docs/finance/rules/BR-S-06)
- [Free Peppol invoice validator](https://ironfang.com/tools/peppol-validator)
- [Rule index](https://ironfang.com/docs/finance/rules.md)
- [Ironfang Finance API docs](https://ironfang.com/docs/finance)
- The same rule is available to MCP clients as the tool `finance.rule.get` on https://mcp.ironfang.com/mcp
