Build an EN 16931 / Peppol BIS Billing 3.0 e-Invoice (UBL)
Skill: Convert invoice data into the EU core-standard EN 16931 invoice via Peppol BIS Billing 3.0 (UBL)
Region: European Union (EU-wide standard)
Category: E-Invoicing — EU core invoice standard (Directive 2014/55/EU)
Does: Takes ordinary invoice data and produces an EN 16931-compliant UBL 2.1 Invoice in the Peppol BIS Billing 3.0 profile — the EU semantic standard for electronic invoicing and the technical foundation of the upcoming VAT in the Digital Age (ViDA) digital reporting requirements.
Standard: EN 16931 (semantic model) · OASIS UBL 2.1 (syntax) · Peppol BIS Billing 3.0 (CIUS) · Directive 2014/55/EU (B2G mandate)
EN 16931 is the semantic core invoice model mandated for B2G across the EU and used as the basis for national CTC reforms (FR, IT, DE, PL, etc.). This skill emits the UBL syntax binding in the Peppol BIS Billing 3.0 profile, routed over the Peppol 4-corner network. The CII syntax (used by ZUGFeRD/Factur-X) carries the same BT/BG semantics. Validate against the EN 16931 + Peppol BIS schematron before sending.
When this applies
- B2G invoicing to any EU contracting authority (mandatory receipt under Directive 2014/55/EU).
- B2B invoicing over Peppol, and as the cross-border interoperable format under ViDA's planned digital reporting (DRR).
- Whenever a counterparty publishes a Peppol Participant Identifier and the BIS Billing 3.0 profile.
Input data required
| Input | EN 16931 term |
|---|---|
| Invoice number, issue date, due date, type code (380/381) | BT-1, BT-2, BT-9, BT-3 |
| Document currency | BT-5 |
| Process & specification identifiers (CustomizationID / ProfileID) | BT-24, BT-23 |
| Seller name, address, VAT ID, legal/electronic IDs | BT-27, BG-5, BT-31, BT-30, Endpoint |
| Buyer name, address, VAT ID, electronic ID | BT-44, BG-8, BT-48, Endpoint |
| Lines: name, quantity, net unit price, VAT category/rate | BG-25, BT-153, BT-129, BT-146, BG-30 |
| VAT breakdown per category | BG-23 |
| Document totals | BG-22 |
Document structure (UBL Invoice)
Invoice
├── cbc:CustomizationID (urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0)
├── cbc:ProfileID (urn:fdc:peppol.eu:2017:poacc:billing:01:1.0)
├── cbc:ID / IssueDate / DueDate / InvoiceTypeCode / DocumentCurrencyCode
├── cac:AccountingSupplierParty (seller: EndpointID schemeID, PartyTaxScheme VAT, PartyLegalEntity)
├── cac:AccountingCustomerParty (buyer)
├── cac:TaxTotal (TaxSubtotal per VAT category — BG-23)
├── cac:LegalMonetaryTotal (LineExtension, TaxExclusive, TaxInclusive, Payable — BG-22)
└── cac:InvoiceLine ... (BG-25: quantity, LineExtensionAmount, Item, Price, ClassifiedTaxCategory)
VAT category codes (BT-151): S standard, Z zero, E exempt, AE reverse charge, K intra-EU, G export, O out of scope. Peppol endpoints use scheme IDs such as 0088 (GLN), 9930 (DE VAT), 0192 (NO org), etc. (Peppol EAS code list).
Calculation rules
- Line net = quantity × net unit price (price may carry a
BaseQuantity). - Group lines by VAT category + rate →
TaxSubtotalwithTaxableAmountandTaxAmount = TaxableAmount × rate. TaxInclusiveAmount = TaxExclusiveAmount + ΣTaxAmount;PayableAmount = TaxInclusiveAmount − PrepaidAmount + Rounding.- Reverse charge (
AE) / intra-EU (K): tax rate 0, aTaxExemptionReasonis required, and the buyer self-accounts.
Worked example (one line, standard-rated)
<?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-001</cbc:ID>
<cbc:IssueDate>2026-01-15</cbc:IssueDate>
<cbc:DueDate>2026-02-14</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
<cac:AccountingSupplierParty><cac:Party>
<cbc:EndpointID schemeID="9930">DE123456789</cbc:EndpointID>
<cac:PartyTaxScheme><cbc:CompanyID>DE123456789</cbc:CompanyID><cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme></cac:PartyTaxScheme>
<cac:PartyLegalEntity><cbc:RegistrationName>Muster GmbH</cbc:RegistrationName></cac:PartyLegalEntity>
</cac:Party></cac:AccountingSupplierParty>
<cac:AccountingCustomerParty><cac:Party>
<cbc:EndpointID schemeID="0192">991825827</cbc:EndpointID>
<cac:PartyLegalEntity><cbc:RegistrationName>Kunde AS</cbc:RegistrationName></cac:PartyLegalEntity>
</cac:Party></cac:AccountingCustomerParty>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">190.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="EUR">1000.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">190.00</cbc:TaxAmount>
<cac:TaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19</cbc:Percent><cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme></cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">1000.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">1000.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">1190.00</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">1190.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">1000.00</cbc:LineExtensionAmount>
<cac:Item><cbc:Name>Consulting</cbc:Name>
<cac:ClassifiedTaxCategory><cbc:ID>S</cbc:ID><cbc:Percent>19</cbc:Percent><cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme></cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price><cbc:PriceAmount currencyID="EUR">100.00</cbc:PriceAmount></cac:Price>
</cac:InvoiceLine>
</Invoice>
Validation checklist
-
CustomizationID/ProfileIDmatch Peppol BIS Billing 3.0 - Seller & buyer
EndpointIDwith a valid Peppol EASschemeID; VAT IDs present where required - Each line: quantity (
unitCode),LineExtensionAmount, item, price,ClassifiedTaxCategory -
TaxSubtotalper VAT category reconciles with line totals; reverse-charge/intra-EU carry a reason -
TaxInclusiveAmount=TaxExclusiveAmount+ VAT;PayableAmountcorrect - Passes EN 16931 + Peppol BIS schematron; recipient is reachable on the Peppol network
Last updated: 2026-06-04 — confirm the active Peppol BIS Billing version, EAS code list, and EN 16931 schematron (and any ViDA digital-reporting profile) against the current CEN / OpenPeppol / European Commission specifications before use.