On this page
The short answer
BR-G-04 fails when a cac:AllowanceCharge with cbc:ChargeIndicator of true is in category G and there is no VAT identifier for the seller or its tax representative. The recorded seller does send GB123456789, but under the tax scheme TAX, which does not count; change the scheme to VAT.
The freight charge of 4.00 and the export line share one seller, so BR-G-02 reports the same shortfall for the line.
What the rule checks
A charge in G sets the rule off with no export line at all. When tried, a freight charge of 4.00 in G on an invoice whose only line was Standard rated at 20%, with the seller registered only under TAX, reported this rule alone. A charge inside a line counts as well: when tried, a charge of 0.00 in G placed in that Standard rated line, again with the seller only under TAX, reported this rule and the warning UBL-CR-558.
The seller identifier must sit in a cac:PartyTaxScheme whose cac:TaxScheme/cbc:ID is VAT. The scheme is the whole difference between the failing and corrected invoices: the same GB123456789 under TAX fails.
A tax representative is an alternative. When tried, the freight invoice with no seller VAT identifier but a cac:TaxRepresentativeParty holding GB987654321 under VAT passed every layer.
An empty identifier is not reported here. When tried, a seller cbc:CompanyID with no content under VAT got past this rule and BR-G-02, and failed only PEPPOL-EN16931-R008.
| 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 |
| 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:
- Tax registrations are exported with one generic scheme code,
TAX, whatever kind of registration they are. - The seller VAT section is suppressed for buyers outside the EU, on the reasoning that no VAT is charged.
- Freight is added as a separate charge by a logistics module that assigns
Gfrom the destination, while the seller party comes from a profile with no VAT registration.
How to fix it
- Find where the seller
cac:PartyTaxSchemeis written, and give it acac:TaxScheme/cbc:IDofVATwhen itscbc:CompanyIDis the VAT registration number. - If the seller also has a tax registration that is not for VAT, it can go in a second
cac:PartyTaxSchemeunder another scheme; theVATone must still be there. - Where a tax representative accounts for VAT on the seller's behalf, add
cac:TaxRepresentativePartywith its ownVATcac:PartyTaxSchemeinstead. - Leave the freight charge in
Gat a rate of0if it is part of the export supply.
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 freight charge in category G, and the seller registration under TAX
<cac:AccountingSupplierParty>
<cac:Party>
<!-- endpoint and postal address in London, GB, omitted from this fragment -->
<cac:PartyTaxScheme>
<cbc:CompanyID>GB123456789</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>TAX</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<!-- legal entity omitted from this fragment -->
</cac:Party>
</cac:AccountingSupplierParty>
<!-- buyer in New York, US, omitted from this fragment -->
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>FC</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Freight to New York</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="GBP">4.00</cbc:Amount>
<cac:TaxCategory>
<cbc:ID>G</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<!-- tax scheme VAT omitted from this fragment -->
</cac:TaxCategory>
</cac:AllowanceCharge>Fragment of the corrected invoice: the same registration under the VAT scheme
<cac:AccountingSupplierParty>
<cac:Party>
<!-- endpoint and postal address in London, GB, omitted from this fragment -->
<cac:PartyTaxScheme>
<cbc:CompanyID>GB123456789</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<!-- legal entity omitted from this fragment -->
</cac:Party>
</cac:AccountingSupplierParty>
<!-- buyer and the freight charge of 4.00 in G omitted from this fragment -->Only the seller tax scheme differs: TAX in the failing invoice, VAT in the corrected one, both around GB123456789. The freight charge of 4.00 in G is unchanged. The failing document also reports BR-G-02, since its export line needs the same seller VAT identifier.
What the validator reported
- The failing invoice reports BR-G-02 and BR-G-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 failing invoice as a credit note reportedBR-G-02and this rule when tried. - Allowances in
Gare checked the same way byBR-G-03. The charge's own rate must be 0 underBR-G-07, and its amount counts towards the export taxable amount checked byBR-G-08. BR-CO-09reads only identifiers under theVATscheme, so movingGB123456789toVATalso brings its country prefix under that check.
Related rules
- BR-G-03 is the same check for a document-level allowance in category G
- BR-G-07 requires the G charge to have a rate of 0
- BR-G-02 asks for the seller VAT identifier when an export line is present, and fires with this rule
- BR-S-02 accepts a seller registration under TAX for Standard rated lines, unlike this 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-G-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.

