On this page
The short answer
BR-G-09 fails when the cbc:TaxAmount of a cac:TaxSubtotal in category G is anything but zero. The recorded export charges 5.80, 20% of the 29.00 of goods and freight; set the breakdown tax amount to 0.00 and remove the 5.80 from the VAT total, the total with VAT and the amount due.
An export in G is invoiced net: the amount due is the 29.00 of goods and freight, and any taxes at the destination are settled outside this invoice.
What the rule checks
For every G cac:TaxCategory under the VAT scheme in the root cac:TaxTotal, the neighbouring cbc:TaxAmount has to be zero as a number; the finding is placed on the category.
Changing the breakdown rate does not help. When tried, the same 5.80 with the breakdown rate also set to 20 reported this rule alone: BR-CO-17 then saw a consistent 20% of 29.00, and none of the export rules reads the breakdown rate.
Small amounts fail as well. When tried, 0.30 of tax in the export breakdown, with the totals following it, reported only this rule.
The VAT total is compared elsewhere. When tried, 5.80 in the export breakdown with cac:TaxTotal/cbc:TaxAmount left at 0.00 brought BR-CO-14 as well as this rule and BR-CO-17.
| Term | Meaning | UBL element |
|---|---|---|
| BT-117 | VAT category tax amount | cac:TaxTotal/cac:TaxSubtotal/cbc:TaxAmount |
| BT-118 | VAT category code | cac:TaxTotal/cac:TaxSubtotal/cac:TaxCategory/cbc:ID |
| BT-110 | Invoice total VAT amount | cac:TaxTotal/cbc:TaxAmount |
How an integration ends up here
Possible causes, from the shape of the rule rather than from measured usage:
- VAT is calculated for every breakdown at the seller's domestic rate, 20 in the recorded example, whatever the category.
- The delivery address was changed to New York after the order had been priced with VAT, and the stored tax amount was kept.
- Export status is decided after pricing, for example once proof of export arrives, and the invoice keeps the tax calculated before.
How to fix it
- Confirm that the goods leave the EU and that the supply is an export in
G. - Set
cbc:TaxAmountin theGcac:TaxSubtotalto0.00, and make sure itscbc:Percentis0. - Recalculate
cac:TaxTotal/cbc:TaxAmount,cbc:TaxInclusiveAmountandcbc:PayableAmount. In the recorded example they return to 0.00, 29.00 and 29.00. - If VAT is due because the goods do not in fact leave, the supply is not an export: use the category and rate that apply on the line, the freight charge and the breakdown.
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: 5.80 of VAT in the export breakdown, carried into the totals
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">5.80</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">29.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">5.80</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>G</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<!-- reason VATEX-EU-G, reason text and tax scheme omitted from this fragment -->
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="GBP">29.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="GBP">34.80</cbc:TaxInclusiveAmount>
<!-- allowance, charge of 4.00, prepaid and rounding amounts omitted from this fragment -->
<cbc:PayableAmount currencyID="GBP">34.80</cbc:PayableAmount>
</cac:LegalMonetaryTotal>Fragment of the corrected invoice: no tax in the export breakdown, and the totals without it
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">29.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">0.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>G</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<!-- reason VATEX-EU-G, reason text and tax scheme omitted from this fragment -->
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="GBP">25.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="GBP">29.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="GBP">29.00</cbc:TaxInclusiveAmount>
<!-- allowance, charge of 4.00, prepaid and rounding amounts omitted from this fragment -->
<cbc:PayableAmount currencyID="GBP">29.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>The failing invoice puts 5.80 of VAT in the export breakdown and carries it into a VAT total of 5.80 and a total with VAT and amount due of 34.80 each; the corrected invoice has 0.00, 29.00 and 29.00. The failing document also reports BR-CO-17: its export breakdown keeps a rate of 0, and 5.80 does not round to zero.
What the validator reported
- The failing invoice reports BR-CO-17 and BR-G-09. 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 reported this rule andBR-CO-17when tried. - Reported by the EN 16931 layer as a fatal finding at the export breakdown's
cac:TaxCategory. - The intra-community breakdown in category
Khas the same requirement underBR-IC-09, and the exempt one underBR-E-09.
Related rules
- BR-IC-09 is the same zero-tax requirement for an intra-community supply
- BR-CO-17 is reported beside this rule when the export breakdown keeps a rate of 0 and its tax amount does not round to zero
- BR-G-08 checks the taxable amount of the same export breakdown
- BR-CO-14 compares the VAT total with the breakdown tax amounts you change
- 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-09 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.

