ediverse Explore the platform

Spotlight PEPPOL BIS Billing 3.0 The EU e-invoicing mandate is here — France Sept 2026, Belgium Jan 2026, Germany 2025.

UBL — Universal Business Language

The universal XML library of business documents: invoice, order, despatch advice, catalogue… One royalty-free grammar underpinning PEPPOL, the European EN 16931 standard and the majority of national e-invoicing systems.

What is UBL?

UBL (Universal Business Language) is a library of XML business documents standardised by OASIS. Where EDIFACT and X12 describe segment-based messages, UBL describes XML documents with an explicit, readable vocabulary. Its original goal: to provide a royalty-free set of documents, reusable across sectors and countries, to replace the proprietary formats of early e-commerce.

UBL is not limited to the invoice. The library covers the entire procure-to-pay and order-to-cash process: catalogue, quotation, order, order response, despatch advice, receipt advice, invoice, credit note, statement, reminder… Each document is an independent XSD schema, but all share the same elementary building blocks.

The two namespaces: cbc and cac

UBL's coherence rests on two namespaces reused by every document:

  • cbc — Common Basic Components: the simple, atomic elements (an identifier, a date, an amount, a code). Example: cbc:IssueDate, cbc:PayableAmount.
  • cac — Common Aggregate Components: the composite elements that group other components (a party, an address, an invoice line). Example: cac:AccountingSupplierParty, cac:InvoiceLine.

This split makes UBL highly reusable: the cac:Party component (with its name, address and tax identifiers) is the same in an order, a despatch advice and an invoice. Learn the components once and you can read every document.

Anatomy of a UBL invoice

A UBL invoice is an XML file whose root is <Invoice>. The header declares the version (cbc:UBLVersionID) and the semantic profile (cbc:CustomizationID); then come the parties (cac:AccountingSupplierParty / AccountingCustomerParty), the tax and monetary totals, and finally the line items.

xml invoice-ubl-2.1.xml
<?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:UBLVersionID>2.1</cbc:UBLVersionID>
  <cbc:CustomizationID>urn:cen.eu:en16931:2017</cbc:CustomizationID>
  <cbc:ID>F-2026-00187</cbc:ID>
  <cbc:IssueDate>2026-06-23</cbc:IssueDate>
  <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
  <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>

  <cac:AccountingSupplierParty>
    <cac:Party>
      <cac:PartyName><cbc:Name>Atelier Marchand SARL</cbc:Name></cac:PartyName>
      <cac:PostalAddress>
        <cbc:CityName>Lyon</cbc:CityName>
        <cac:Country><cbc:IdentificationCode>FR</cbc:IdentificationCode></cac:Country>
      </cac:PostalAddress>
    </cac:Party>
  </cac:AccountingSupplierParty>

  <cac:AccountingCustomerParty>
    <cac:Party>
      <cac:PartyName><cbc:Name>Northern Textile Co-op</cbc:Name></cac:PartyName>
    </cac:Party>
  </cac:AccountingCustomerParty>

  <cac:TaxTotal>
    <cbc:TaxAmount currencyID="EUR">432.00</cbc:TaxAmount>
  </cac:TaxTotal>

  <cac:LegalMonetaryTotal>
    <cbc:LineExtensionAmount currencyID="EUR">2160.00</cbc:LineExtensionAmount>
    <cbc:PayableAmount currencyID="EUR">2592.00</cbc:PayableAmount>
  </cac:LegalMonetaryTotal>

  <cac:InvoiceLine>
    <cbc:ID>1</cbc:ID>
    <cbc:InvoicedQuantity unitCode="MTR">120</cbc:InvoicedQuantity>
    <cbc:LineExtensionAmount currencyID="EUR">2160.00</cbc:LineExtensionAmount>
    <cac:Item><cbc:Name>Unbleached canvas 220 g/m²</cbc:Name></cac:Item>
    <cac:Price><cbc:PriceAmount currencyID="EUR">18.00</cbc:PriceAmount></cac:Price>
  </cac:InvoiceLine>
</Invoice>

The two namespaces appear everywhere: cbc for simple values, cac for groupings. A currencyID attribute qualifies each amount, and each line (cac:InvoiceLine) carries its quantity, its item (cac:Item) and its unit price.

The document library

The most widely used UBL documents across the commercial chain:

UBL documentRoleEDIFACT equivalent
CatalogueProduct / price cataloguePRICAT
OrderPurchase orderORDERS
OrderResponseOrder response (acceptance / change)ORDRSP
DespatchAdviceDespatch adviceDESADV
ReceiptAdviceGoods receipt acknowledgementRECADV
InvoiceInvoiceINVOIC
CreditNoteCredit noteINVOIC (type 381)
StatementAccount statementSTATAC
ApplicationResponseBusiness status of a received documentAPERAK / CONTRL

CustomizationID, CIUS and extensions

UBL is deliberately permissive: most of its elements are optional. For an exchange to be genuinely interoperable, UBL is restricted via a CIUS (Core Invoice Usage Specification) or an extension, signalled by cbc:CustomizationID:

  • EN 16931 — the European semantic core: urn:cen.eu:en16931:2017. It mandates the required business terms (BT-*) and rules (BR-*).
  • PEPPOL BIS Billing 3.0 — a CIUS of EN 16931 adding the rules specific to the PEPPOL network.
  • National CIUS — Serbia (SEF), Albania, the Netherlands (SI-UBL / NLCIUS), Singapore (SG PEPPOL) and Denmark (OIOUBL) each define their own UBL restriction.

Versions

VersionYearAddition
UBL 1.02004First documents (order, invoice).
UBL 2.02006Library expanded to ~30 documents.
UBL 2.12013~65 documents, published as ISO/IEC 19845:2015. The reference version for European invoicing.
UBL 2.22018Procurement documents (tender, ESPD).
UBL 2.32021Additional logistics and transport documents.
UBL 2.42024Sector extensions; backward-compatible with 2.1.

In practice, the overwhelming majority of 2026 e-invoicing integrations target UBL 2.1, because that is the version EN 16931 and PEPPOL BIS are aligned to.

UBL in its ecosystem

UBL provides the syntax; other layers provide meaning and transport:

  • Semantics: EN 16931 defines the business terms and rules the UBL XML must satisfy.
  • Network: PEPPOL carries UBL documents over AS4 on its four-corner network.
  • CII alternative: Factur-X / ZUGFeRD uses the UN/CEFACT CII syntax rather than UBL for the same EN 16931 model.
  • Validation: the PEPPOL validator checks a UBL file against the EN 16931 / PEPPOL rules.

Further reading