On this page
The short answer
BR-S-04 fails when a cac:AllowanceCharge flagged as a charge has a cac:TaxCategory of S under the VAT scheme, and the document gives neither a seller tax identifier, under any scheme, nor a tax representative VAT identifier. Add the seller's VAT number in a cac:PartyTaxScheme of the seller party or, when the seller is represented for VAT, the representative's number in cac:TaxRepresentativeParty.
Charging Standard rated VAT on freight or packing presupposes a VAT registered seller. The validator only asks that the registration be stated where it can see it.
What the rule checks
Any charge with cbc:ChargeIndicator of true and a Standard rated category under the VAT scheme brings the rule into play. The seller condition is met by any cbc:CompanyID in a seller cac:PartyTaxScheme, or by a tax representative cbc:CompanyID whose tax scheme is VAT.
The tax representative route works on its own. When tried, the freight invoice without a seller cac:PartyTaxScheme but with a cac:TaxRepresentativeParty holding GB987654321 under VAT passed every layer.
The representative's scheme is checked. Changed to GST, the same invoice reported this rule and BR-S-02 again, plus BR-56 because the representative then had no VAT identifier.
The finding is per document, not per charge. When tried, adding a second Standard rated charge, for packing, to the failing invoice still produced a single BR-S-04, reported at the root element.
| Term | Meaning | UBL element |
|---|---|---|
| BT-102 | Document level charge VAT category code | cac:AllowanceCharge[cbc:ChargeIndicator = true]/cac:TaxCategory/cbc:ID |
| BT-31 | Seller VAT identifier | cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID (tax scheme VAT) |
| BT-32 | Seller tax registration identifier | cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme/cbc:CompanyID (a tax scheme other than VAT) |
| BT-63 | Seller tax representative VAT identifier | cac:TaxRepresentativeParty/cac:PartyTaxScheme/cbc:CompanyID |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- Freight is added by a shipping or carrier module that applies the Standard rated tax code automatically, while the seller party comes from a record without a VAT number.
- The export includes
cac:PartyTaxSchemein the seller party only for some document types, and this document was produced along a different route. - The seller's VAT number is stored per branch or per country, and the branch that raised the document has none.
- A tax representative is used, and its VAT number is sent under a local tax scheme name instead of
VAT.
How to fix it
- Establish whether the seller is VAT registered for the supply. If so, take the number, with its country prefix, from the seller record:
GB123456789in the recorded example. - Write it into the seller party as
cac:PartyTaxScheme/cbc:CompanyIDwithcac:TaxScheme/cbc:IDofVAT, betweencac:PostalAddressandcac:PartyLegalEntity. - Where a tax representative accounts for the VAT, give
cac:TaxRepresentativePartyacac:PartyTaxSchemewith the representative's number under theVATscheme. - If there is no registration to state, the Standard rated category on the charge and on the lines is what needs reviewing, with whoever owns the tax setup, before anything in the XML changes.
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 freight charge, and a seller party with no PartyTaxScheme
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0088">7300010000001</cbc:EndpointID>
<!-- postal address omitted from this fragment -->
<cac:PartyLegalEntity>
<cbc:RegistrationName>Example Supplier Ltd</cbc:RegistrationName>
<cbc:CompanyID>12345678</cbc:CompanyID>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>FC</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Freight</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="GBP">7.50</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>Fragment of the corrected invoice: the seller PartyTaxScheme with its VAT number
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0088">7300010000001</cbc:EndpointID>
<!-- postal address omitted from this fragment -->
<cac:PartyTaxScheme>
<cbc:CompanyID>GB123456789</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Example Supplier Ltd</cbc:RegistrationName>
<cbc:CompanyID>12345678</cbc:CompanyID>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>The corrected invoice has a seller cac:PartyTaxScheme with GB123456789 under the VAT scheme, which is missing from the failing invoice; nothing else differs. BR-S-02 is reported as well, because the invoice line is Standard rated at 20 and needs the same identifier. The freight charge of 7.50 and the breakdown of 32.50 taxable and 6.50 VAT are unchanged between the two.
What the validator reported
- The failing invoice reports BR-S-02 and BR-S-04. 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 credit note version of the recorded example reportedBR-S-02andBR-S-04when tried. - Reported by the EN 16931 layer as a fatal finding at the root of the document.
- Allowances have their own version,
BR-S-03, and Zero rated charges theirs,BR-Z-04. One seller VAT identifier satisfies every one of these rules. - The number itself is not validated here;
BR-CO-09checks its country prefix.
Related rules
- BR-S-03 asks the same of a Standard rated document-level allowance
- BR-S-07 requires a Standard rated charge to carry a rate above zero
- BR-56 requires a tax representative to carry a VAT identifier of its own
- BR-Z-04 is the Zero rated version of this charge rule
- 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-28.1: source checked 2026-09-28, explanation last updated 2026-09-28.
The official definition of BR-S-04 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.

