Below is a complete, valid UK e-invoice in Peppol BIS Billing 3.0 (UBL 2.1) format. It is a GBP invoice from one UK VAT-registered company to another, with a 20% line, a zero-rated line and a delivery charge. We validated it against the UBL 2.1 schema, the EN 16931 UBL rules (version 1.3.17 from the European Commission's GitHub) and the Peppol BIS Billing 3.0 rules, with no errors and no warnings. Copy it, then read the walkthrough to see what each part does.
All names, numbers and identifiers are fictitious. HMRC has not yet published a UK e-invoice specification, so this shows Peppol BIS Billing 3.0 with UK data, not a confirmed UK mandate format.
The scenario
| Seller | Example Supplies Ltd, Leeds, VAT GB123456789 |
| Buyer | Sample Buyer Ltd, Bristol, VAT GB987654321 |
| Line 1 | 10 hours consultancy at £85.00, standard rated 20% = £850.00 |
| Line 2 | 5 printed books at £12.00, zero-rated = £60.00 |
| Charge | Delivery £15.00, standard rated 20% |
| VAT | 20% on £865.00 = £173.00; 0% on £60.00 |
| Total | £925.00 net + £173.00 VAT = £1,098.00 |
The full invoice
<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
<cbc:ID>INV-2026-0142</cbc:ID>
<cbc:IssueDate>2026-10-20</cbc:IssueDate>
<cbc:DueDate>2026-11-19</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>GBP</cbc:DocumentCurrencyCode>
<cbc:BuyerReference>FIN-OPS-77</cbc:BuyerReference>
<cac:InvoicePeriod>
<cbc:StartDate>2026-09-01</cbc:StartDate>
<cbc:EndDate>2026-09-30</cbc:EndDate>
</cac:InvoicePeriod>
<cac:OrderReference>
<cbc:ID>PO-48213</cbc:ID>
</cac:OrderReference>
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0088">5099999000011</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Example Supplies</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>1 High Street</cbc:StreetName>
<cbc:CityName>Leeds</cbc:CityName>
<cbc:PostalZone>LS1 1AA</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>GB</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>GB123456789</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Example Supplies Ltd</cbc:RegistrationName>
<cbc:CompanyID>01234567</cbc:CompanyID>
</cac:PartyLegalEntity>
<cac:Contact>
<cbc:Name>Accounts team</cbc:Name>
<cbc:ElectronicMail>accounts@example.co.uk</cbc:ElectronicMail>
</cac:Contact>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0088">5099999000028</cbc:EndpointID>
<cac:PostalAddress>
<cbc:StreetName>20 Market Square</cbc:StreetName>
<cbc:CityName>Bristol</cbc:CityName>
<cbc:PostalZone>BS1 2BB</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>GB</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>GB987654321</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Sample Buyer Ltd</cbc:RegistrationName>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:Delivery>
<cbc:ActualDeliveryDate>2026-09-30</cbc:ActualDeliveryDate>
</cac:Delivery>
<cac:PaymentMeans>
<cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
<cbc:PaymentID>INV-2026-0142</cbc:PaymentID>
<cac:PayeeFinancialAccount>
<cbc:ID>GB29NWBK60161331926819</cbc:ID>
<cbc:Name>Example Supplies Ltd</cbc:Name>
</cac:PayeeFinancialAccount>
</cac:PaymentMeans>
<cac:PaymentTerms>
<cbc:Note>Payment within 30 days of invoice date</cbc:Note>
</cac:PaymentTerms>
<cac:AllowanceCharge>
<cbc:ChargeIndicator>true</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>DL</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Delivery</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="GBP">15.00</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>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="GBP">173.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="GBP">865.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="GBP">173.00</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">60.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:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="GBP">910.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="GBP">925.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="GBP">1098.00</cbc:TaxInclusiveAmount>
<cbc:ChargeTotalAmount currencyID="GBP">15.00</cbc:ChargeTotalAmount>
<cbc:PayableAmount currencyID="GBP">1098.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="HUR">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="GBP">850.00</cbc:LineExtensionAmount>
<cac:OrderLineReference>
<cbc:LineID>1</cbc:LineID>
</cac:OrderLineReference>
<cac:Item>
<cbc:Name>Consultancy services, September 2026</cbc:Name>
<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>
<cac:Price>
<cbc:PriceAmount currencyID="GBP">85.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
<cac:InvoiceLine>
<cbc:ID>2</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">5</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="GBP">60.00</cbc:LineExtensionAmount>
<cac:OrderLineReference>
<cbc:LineID>2</cbc:LineID>
</cac:OrderLineReference>
<cac:Item>
<cbc:Name>Printed books</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>Z</cbc:ID>
<cbc:Percent>0</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="GBP">12.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
</Invoice>
Walkthrough
Header: identifiers and dates
cbc:CustomizationIDandcbc:ProfileIDare fixed Peppol values for BIS Billing 3.0. A wrong CustomizationID triggers PEPPOL-EN16931-R004.cbc:IDis the invoice number (BT-1). HMRC requires "a sequential number based on one or more series which uniquely identifies the document".cbc:IssueDate(BT-2) andcbc:DueDate(BT-9) must beYYYY-MM-DD.cbc:InvoiceTypeCode380 is a commercial invoice. Credit notes use a separateCreditNotedocument. See credit notes in Peppol.cbc:DocumentCurrencyCodeGBP. For other currencies, see multi-currency e-invoices.
References
cbc:BuyerReference (BT-10) and cac:OrderReference/cbc:ID (BT-13). Peppol needs at least one (rule R003). See buyer reference and PO number. cac:InvoicePeriod shows the service period. cac:Delivery/cbc:ActualDeliveryDate is one way to show the time of supply. You could use cbc:TaxPointDate (BT-7) instead.
Parties
cbc:EndpointIDis the Peppol electronic address, with aschemeIDfrom the EAS list. We used0088(GS1 GLN) with fictitious numbers that pass the GLN check-digit rule. UK businesses may also use9932(UK VAT number). See Peppol EAS codes for the UK.cac:PartyName/cbc:Nameis the trading name (BT-28).cac:PartyLegalEntity/cbc:RegistrationNameis the legal name (BT-27). HMRC requires the name under which you are registered for VAT.cac:PartyTaxScheme/cbc:CompanyIDis the VAT number with theGBprefix (BR-CO-09).cac:PartyLegalEntity/cbc:CompanyIDhere holds a Companies House-style number without a scheme ID. That is optional.- Postal addresses need a country code (BR-09, BR-11).
Payment
cbc:PaymentMeansCode 30 is credit transfer. Rule BR-61 then requires an account identifier (cac:PayeeFinancialAccount/cbc:ID). We used the standard example IBAN format. cbc:PaymentID is the remittance reference you want quoted.
Document-level charge
cac:AllowanceCharge with cbc:ChargeIndicator true is a charge. false would be a discount. Reason code DL is "Delivery" in the UNCL 7161 list. Each charge needs its own VAT category and rate.
VAT breakdown
One cac:TaxTotal with one cac:TaxSubtotal per VAT category and rate:
Sat 20%: taxable £850.00 + £15.00 = £865.00, VAT £173.00Zat 0%: taxable £60.00, VAT £0.00 (no exemption reason allowed)
Category codes are explained in UK VAT category codes.
Totals
| Element | Value | Rule |
|---|---|---|
| LineExtensionAmount | 910.00 = 850.00 + 60.00 | BR-CO-10 |
| ChargeTotalAmount | 15.00 | BR-CO-12 |
| TaxExclusiveAmount | 925.00 = 910.00 + 15.00 | BR-CO-13 |
| TaxTotal/TaxAmount | 173.00 = 173.00 + 0.00 | BR-CO-14 |
| TaxInclusiveAmount | 1098.00 = 925.00 + 173.00 | BR-CO-15 |
| PayableAmount | 1098.00 | BR-CO-16 |
Element order inside cac:LegalMonetaryTotal is fixed by the UBL schema: LineExtensionAmount, TaxExclusiveAmount, TaxInclusiveAmount, then AllowanceTotalAmount, ChargeTotalAmount, PrepaidAmount, PayableRoundingAmount, PayableAmount.
Lines
Each cac:InvoiceLine has an ID, quantity with a UN/ECE unit code (HUR hour, C62 one), a net amount equal to quantity × price (PEPPOL-EN16931-R120), an item name, a VAT category, and a price. cac:OrderLineReference links each line to the PO line.
How to validate it yourself
- Schema: validate against
UBL-Invoice-2.1.xsdfrom the OASIS UBL 2.1 package. - EN 16931 rules: run the UBL XSLT from ConnectingEurope/eInvoicing-EN16931 with an XSLT 2.0 processor such as Saxon.
- Peppol rules: compile
PEPPOL-EN16931-UBL.schfrom OpenPEPPOL/peppol-bis-invoice-3 and run it the same way.
Look for svrl:failed-assert in the output. None means pass. Most Access Points run the same checks when you submit.
Variations
- Reverse charge construction invoice: AE code example
- PDF timesheet attached: attachments
- Errors and fixes: common Peppol validation errors
What may change
This example follows Peppol BIS Billing 3.0 as published in May 2026. Peppol is confirmed as the UK's network. The UK data standard is due to be set out after the roadmap at Budget 2026 and may add UK-specific requirements. Nothing UK-specific is confirmed yet. Check the timeline.
Frequently asked questions
Is there an official UK e-invoice XML example?
Not yet. HMRC has not published a UK e-invoice specification or examples. Peppol publishes generic examples on GitHub. The example on this page follows Peppol BIS Billing 3.0 with UK data.
Which XML format do UK Peppol invoices use?
Peppol BIS Billing 3.0 uses UBL 2.1. The Invoice root element is in the namespace urn:oasis:names:specification:ubl:schema:xsd:Invoice-2.
What is the minimum a Peppol invoice needs?
Among other things: the CustomizationID and ProfileID, invoice number, issue date, type code, currency, a buyer reference or PO number, seller and buyer with electronic addresses and postal addresses, a VAT breakdown, totals, and at least one line.
How was this example validated?
Against the UBL 2.1 Invoice schema, the EN 16931 UBL Schematron (version 1.3.17) and the Peppol BIS Billing 3.0 Schematron. All passed with no errors or warnings.
Spotted a mistake? Report an error. einvoices.uk is an independent publication and is not affiliated with HMRC. Details of the mandate may change; check the sources and official GOV.UK guidance before acting.