Skip to content

BR-S-01Add the Standard rated VAT breakdown that the lines, allowances or charges require

If any line, document allowance or document charge is Standard rated, the VAT breakdown needs a Standard rated entry too, and the reverse also holds.

EN 16931Fatal: the document is invalidVAT

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.

TermMeaningUBL element
BG-23VAT breakdowncac:TaxTotal/cac:TaxSubtotal
BT-118VAT category codecac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID
BT-151Invoiced item VAT category codecac:InvoiceLine/cac:Item/cac:ClassifiedTaxCategory/cbc:ID
BT-95Document level allowance VAT category codecac:AllowanceCharge[cbc:ChargeIndicator = false]/cac:TaxCategory/cbc:ID
BT-102Document level charge VAT category codecac: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 S is missing for one of them.
  • A line is labelled S by 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

  1. Find every Standard rated item: lines through cac:Item/cac:ClassifiedTaxCategory/cbc:ID, and root-level cac:AllowanceCharge elements through cac:TaxCategory/cbc:ID.
  2. 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.
  3. For each Standard rate, add a cac:TaxSubtotal with cbc:TaxableAmount equal to the lines plus charges minus allowances at that rate, cbc:TaxAmount equal to taxable amount x rate / 100 rounded to two decimals, and a cac:TaxCategory with cbc:ID of S, the cbc:Percent, and the VAT tax scheme.
  4. Check that cac:TaxTotal/cbc:TaxAmount equals 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

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 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-14 is 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 reports BR-S-01 alone.
  • The other VAT categories have their own rules of this kind. BR-Z-01 is the Zero rated one and is stricter, asking for exactly one breakdown.

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.