The short answer
BR-S-01 fails when the document uses VAT category S on a line, a document-level allowance or a document-level charge, but cac:TaxTotal has no cac:TaxSubtotal whose cac:TaxCategory/cbc:ID is S. Add a Standard rated breakdown, one per Standard rate in use, with the taxable amount and tax amount for that rate.
The rule also fails the other way round: a Standard rated breakdown in a document where nothing is Standard rated.
What the rule checks
The rule counts category S in two places. One is every cac:ClassifiedTaxCategory and every cac:AllowanceCharge/cac:TaxCategory anywhere in the document. The other is cac:TaxCategory inside cac:TaxTotal/cac:TaxSubtotal under the document root. Either both counts are above zero or both are zero; anything else fails.
It is a presence check only. It asks for at least one Standard rated breakdown, so several breakdowns at different Standard rates satisfy it, and it does not look at rates or amounts. Those are covered by BR-S-08 and BR-S-09.
In the reverse case, an invoice whose only line is Zero rated but whose breakdown says S reports BR-S-01 together with BR-S-08 and BR-Z-01.
| Term | Meaning | UBL element |
|---|---|---|
| BG-23 | VAT breakdown | cac:TaxTotal/cac:TaxSubtotal |
| BT-118 | VAT category code | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID |
| BT-151 | Invoiced item VAT category code | cac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory/cbc:ID |
| BT-95 | Document level allowance VAT category code | cac:AllowanceCharge[cbc:ChargeIndicator = false]/cac:TaxCategory/cbc:ID |
| BT-102 | Document level charge VAT category code | cac:AllowanceCharge[cbc:ChargeIndicator = true]/cac:TaxCategory/cbc:ID |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- The breakdown is built from the lines only, and the one Standard rated item in the document is a document-level charge such as freight.
- Breakdowns with a zero tax amount or zero taxable amount are filtered out before the XML is written.
- The breakdown is copied from a tax summary that uses internal tax codes, and the mapping to
Sis missing for one of them. - A line is labelled
Sby default in the item mapping while the tax summary correctly treats it as another category, so the two disagree. - A Standard rated breakdown is left over from a template when the document has no Standard rated content.
How to fix it
- Find every Standard rated item: lines through
cac:Item/cac:ClassifiedTaxCategory/cbc:ID, and root-levelcac:AllowanceChargeelements throughcac:TaxCategory/cbc:ID. - Decide which side is wrong. If the items really are Standard rated, the breakdown is missing. If they are not, correct the category where it is assigned in the source data; do not relabel items just to match the breakdown that happens to be there.
- For each Standard rate, add a
cac:TaxSubtotalwithcbc:TaxableAmountequal to the lines plus charges minus allowances at that rate,cbc:TaxAmountequal to taxable amount x rate / 100 rounded to two decimals, and acac:TaxCategorywithcbc:IDofS, thecbc:Percent, and theVATtax scheme. - Check that
cac:TaxTotal/cbc:TaxAmountequals the sum of all breakdown tax amounts, including the one just added.
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: a Standard rated line, but the only VAT breakdown is Zero rated
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">11.70</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">10.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>Z</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<!-- note, quantity and other line details omitted from this fragment -->
<cbc:LineExtensionAmount currencyID="GBP">58.00</cbc:LineExtensionAmount>
<cac:Item>
<!-- description, name and item identifiers omitted from this fragment -->
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>20</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<!-- price omitted from this fragment -->
</cac:InvoiceLine>Fragment of the corrected invoice: the Standard rated breakdown is present beside the Zero rated one
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">11.70</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">58.50</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">11.70</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>20</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">10.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>Z</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>The corrected invoice has the whole Standard rated cac:TaxSubtotal (58.50 taxable, 11.70 tax, S at 20) that the failing one lacks; nothing else differs. The failing document also reports BR-CO-14, because its VAT total is still 11.70 while the one remaining breakdown adds up to 0.00. Restoring the breakdown clears both. Besides line 1 shown here, the invoice has a second Standard rated line, a Standard rated document allowance and a Standard rated document charge.
What the validator reported
- The failing invoice reports BR-CO-14 and BR-S-01. 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 UBL
InvoiceandCreditNote; the rule is evaluated at the document root of either. A credit note with its Standard rated breakdown removed reports the same two rules. BR-CO-14is a side effect of the recorded example, not part of this rule. With the VAT total and monetary totals reduced to match the missing breakdown, the document reportsBR-S-01alone.- The other VAT categories have their own rules of this kind.
BR-Z-01is the Zero rated one and is stricter, asking for exactly one breakdown.
Related rules
- BR-S-08 checks the taxable amount of the Standard rated breakdown once it exists
- BR-S-09 checks the tax amount of the Standard rated breakdown
- BR-CO-14 compares the VAT total with the sum of the breakdown tax amounts
- BR-Z-01 is the matching requirement for Zero rated content
- Browse every rule in the reference
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-S-01 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.
