Search
Getting Started Invoice sending Invoice sending Consumer Invoicing Printing Email invoicing Invoice receiving Invoice receiving Scanning Detect Fraud reporting Integration tools Webhooks Reference implementations Maventa Connector Embeddable User Interface Peppol Peppol Network Document Exchange Invoice Response Self-billing support Invoicing formats Invoicing formats Validation Peppol BIS 3.0 Finvoice 3.0 Document types and type codes Preview Maventa JSON (table) Preview Maventa JSON (json schema) Account management Companies and Settings Department Company Users Billing Accounts receivable Accounts receivable Ropo Reminder & Collection Amili Kassavirta Amili Perintä

Peppol BIS 3.0

Peppol BIS Billing 3.0 is the recommended format for invoice exchange through Maventa. It implements the European standard EN16931-1:2017 using UBL 2.1 XML syntax, and is mandatory for cross-border invoicing over the Peppol network. Some countries also accept national formats for domestic Peppol traffic.

This page covers the XML format itself. For Peppol network registration and participant lookup, see the Peppol network page. For sending and receiving documents via the API, see the document exchange page.

The Peppol BIS 3.0 specification is updated regularly. Required and conditional fields may change between releases. Always check the latest implementation guidelines for current rules.

Document identifiers

Every Peppol BIS 3.0 invoice must include CustomizationID and ProfileID elements that identify the document specification and business process.

<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>

These values are the same for both invoices and credit notes. The document type is determined by the root element (Invoice or CreditNote) and the InvoiceTypeCode / CreditNoteTypeCode element.

For the full document identifier strings used in Peppol registration, see the document types section on the invoicing formats page.

Invoice structure overview

A Peppol BIS 3.0 invoice uses the UBL 2.1 Invoice root element. The following table lists the required and commonly used top-level elements.

Element Required Description
cbc:CustomizationID Yes Specification identifier (see above)
cbc:ProfileID Yes Business process identifier (see above)
cbc:ID Yes Invoice number
cbc:IssueDate Yes Invoice date (YYYY-MM-DD)
cbc:DueDate Conditional Payment due date. Either DueDate or PaymentTerms must be provided.
cbc:InvoiceTypeCode Yes 380 for commercial invoice, 384 for corrected invoice, 389 for self-billing invoice, 751 for invoice information for accounting purposes
cbc:DocumentCurrencyCode Yes ISO 4217 currency code (e.g., EUR)
cbc:BuyerReference Yes Buyer’s reference or order number. Required by Peppol even if the buyer has not provided one — use N/A as fallback.
cac:AccountingSupplierParty Yes Seller details
cac:AccountingCustomerParty Yes Buyer details
cac:TaxTotal Yes Tax breakdown
cac:LegalMonetaryTotal Yes Invoice totals
cac:InvoiceLine Yes At least one invoice line

Minimal invoice skeleton

The following shows the high-level structure of a Peppol BIS 3.0 invoice. Each section is covered in detail below.

<?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-2024-001</cbc:ID>
  <cbc:IssueDate>2024-01-15</cbc:IssueDate>
  <cbc:DueDate>2024-02-15</cbc:DueDate>
  <cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
  <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
  <cbc:BuyerReference>PO-12345</cbc:BuyerReference>

  <cac:AccountingSupplierParty><!-- ... --></cac:AccountingSupplierParty>
  <cac:AccountingCustomerParty><!-- ... --></cac:AccountingCustomerParty>
  <cac:TaxTotal><!-- ... --></cac:TaxTotal>
  <cac:LegalMonetaryTotal><!-- ... --></cac:LegalMonetaryTotal>
  <cac:InvoiceLine><!-- ... --></cac:InvoiceLine>

</Invoice>

Parties (supplier and buyer)

Both AccountingSupplierParty and AccountingCustomerParty follow the same structure. The key required elements are:

Element Required Description
cbc:EndpointID Yes Electronic address with schemeID attribute (e.g., 0216 for Finnish OVT code)
cac:PartyIdentification/cbc:ID No Additional party identifier
cac:PartyName/cbc:Name No Trading name
cac:PostalAddress Yes Street, city, postal code, country
cac:PartyTaxScheme No VAT number (cbc:CompanyID) with tax scheme VAT. Not all companies have a VAT identifier.
cac:PartyLegalEntity/cbc:RegistrationName Yes Legal registration name
cac:PartyLegalEntity/cbc:CompanyID No Company registration number
<cac:AccountingSupplierParty>
  <cac:Party>
    <cbc:EndpointID schemeID="0216">003712345678</cbc:EndpointID>
    <cac:PartyName>
      <cbc:Name>Supplier Oy</cbc:Name>
    </cac:PartyName>
    <cac:PostalAddress>
      <cbc:StreetName>Esimerkkikatu 1</cbc:StreetName>
      <cbc:CityName>Helsinki</cbc:CityName>
      <cbc:PostalZone>00100</cbc:PostalZone>
      <cac:Country>
        <cbc:IdentificationCode>FI</cbc:IdentificationCode>
      </cac:Country>
    </cac:PostalAddress>
    <cac:PartyTaxScheme>
      <cbc:CompanyID>FI12345678</cbc:CompanyID>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:PartyTaxScheme>
    <cac:PartyLegalEntity>
      <cbc:RegistrationName>Supplier Oy</cbc:RegistrationName>
      <cbc:CompanyID>1234567-8</cbc:CompanyID>
    </cac:PartyLegalEntity>
  </cac:Party>
</cac:AccountingSupplierParty>

The EndpointID schemeID value identifies the type of electronic address. Common scheme IDs and endpoint ID formats include:

Scheme ID Country Endpoint ID format
0216 Finland OVT code (e.g., 003712345678)
0007 Sweden Organization number (e.g., 5567891234)
0088 International GLN (Global Location Number)
0184 Denmark CVR number (e.g., 12345678)
0192 Norway Organization number (e.g., 987654321)
0106 Netherlands KvK number (e.g., 12345678)

For a full list, see the EAS code list in the Peppol documentation. For endpoint ID formats and details for each country Maventa supports, see the Services & Reach country pages.

Tax and totals

TaxTotal

The TaxTotal element provides a total tax amount and a breakdown by tax category. Each TaxSubtotal groups all line amounts with the same tax rate and category.

<cac:TaxTotal>
  <cbc:TaxAmount currencyID="EUR">240.00</cbc:TaxAmount>
  <cac:TaxSubtotal>
    <cbc:TaxableAmount currencyID="EUR">1000.00</cbc:TaxableAmount>
    <cbc:TaxAmount currencyID="EUR">240.00</cbc:TaxAmount>
    <cac:TaxCategory>
      <cbc:ID>S</cbc:ID>
      <cbc:Percent>24.00</cbc:Percent>
      <cac:TaxScheme>
        <cbc:ID>VAT</cbc:ID>
      </cac:TaxScheme>
    </cac:TaxCategory>
  </cac:TaxSubtotal>
</cac:TaxTotal>

Common tax category codes:

Code Description
S Standard rate
Z Zero rated
E Exempt from tax
AE Reverse charge (VAT paid by buyer)
K Intra-community supply
O Not subject to VAT

Tax categories with a zero percent rate (E, AE, K, O) require a TaxExemptionReasonCode or TaxExemptionReason (free text) inside the TaxCategory element to explain why VAT is not charged.

<cac:TaxCategory>
  <cbc:ID>E</cbc:ID>
  <cbc:Percent>0.00</cbc:Percent>
  <cbc:TaxExemptionReasonCode>vatex-eu-132</cbc:TaxExemptionReasonCode>
  <cbc:TaxExemptionReason>Exempt based on article 132 of Council Directive 2006/112/EC</cbc:TaxExemptionReason>
  <cac:TaxScheme>
    <cbc:ID>VAT</cbc:ID>
  </cac:TaxScheme>
</cac:TaxCategory>

LegalMonetaryTotal

The LegalMonetaryTotal element summarizes the invoice amounts. All amounts must use 2 decimal places.

<cac:LegalMonetaryTotal>
  <cbc:LineExtensionAmount currencyID="EUR">1000.00</cbc:LineExtensionAmount>
  <cbc:TaxExclusiveAmount currencyID="EUR">1000.00</cbc:TaxExclusiveAmount>
  <cbc:TaxInclusiveAmount currencyID="EUR">1240.00</cbc:TaxInclusiveAmount>
  <cbc:PayableAmount currencyID="EUR">1240.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
Element Required Description
LineExtensionAmount Yes Sum of all invoice line net amounts
TaxExclusiveAmount Yes Total amount without VAT (line extension + document-level charges - document-level allowances)
TaxInclusiveAmount Yes Total amount with VAT
AllowanceTotalAmount No Sum of document-level allowances
ChargeTotalAmount No Sum of document-level charges
PayableRoundingAmount No Rounding amount to reach PayableAmount
PayableAmount Yes Amount to be paid

Invoice lines

Each InvoiceLine represents a line item on the invoice.

<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="EA">10</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="EUR">1000.00</cbc:LineExtensionAmount>
  <cac:Item>
    <cbc:Name>Product name</cbc:Name>
    <cac:ClassifiedTaxCategory>
      <cbc:ID>S</cbc:ID>
      <cbc:Percent>24.00</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>
Element Required Description
cbc:ID Yes Line identifier (unique within the invoice)
cbc:InvoicedQuantity Yes Quantity with unitCode attribute (UN/ECE Rec 20 codes, e.g., EA for each, HUR for hour, KGM for kilogram)
cbc:LineExtensionAmount Yes Net amount for the line (quantity x price, adjusted for line-level allowances/charges)
cac:Item/cbc:Name Yes Item name or description
cac:Item/cac:ClassifiedTaxCategory Yes Tax category and rate for the line
cac:Price/cbc:PriceAmount Yes Unit price excluding VAT

For item identification, you can optionally include:

For unit codes, see the UN/ECE Recommendation 20 and 21 reference.

Line-level allowances and charges

Line-level allowances and charges appear inside InvoiceLine and affect the LineExtensionAmount of that line. They do not include a TaxCategory (the line’s tax category applies).

Provide either AllowanceChargeReasonCode (from the UNCL7161 code list) or AllowanceChargeReason (free text), or both.

<cac:InvoiceLine>
  <cbc:ID>1</cbc:ID>
  <cbc:InvoicedQuantity unitCode="EA">10</cbc:InvoicedQuantity>
  <cbc:LineExtensionAmount currencyID="EUR">900.00</cbc:LineExtensionAmount>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
    <cbc:AllowanceChargeReason>Discount</cbc:AllowanceChargeReason>
    <cbc:Amount currencyID="EUR">100.00</cbc:Amount>
  </cac:AllowanceCharge>
  <cac:Item>
    <cbc:Name>Product name</cbc:Name>
    <!-- ... -->
  </cac:Item>
  <cac:Price>
    <cbc:PriceAmount currencyID="EUR">100.00</cbc:PriceAmount>
  </cac:Price>
</cac:InvoiceLine>

In this example, 10 units at 100.00 EUR = 1000.00, minus a 100.00 EUR discount, gives a LineExtensionAmount of 900.00 EUR.

Allowances and charges

Allowances (discounts) and charges can also be applied at the document level. Both use the same AllowanceCharge structure, distinguished by the ChargeIndicator element. Provide either AllowanceChargeReasonCode (from the UNCL7161 code list) or AllowanceChargeReason (free text), or both.

Document-level allowances and charges

Document-level allowances and charges appear directly under the Invoice root element and affect the invoice totals.

<!-- Document-level allowance (discount) -->
<cac:AllowanceCharge>
  <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Discount</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="EUR">50.00</cbc:Amount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <cbc:Percent>24.00</cbc:Percent>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:AllowanceCharge>

<!-- Document-level charge (e.g., shipping) -->
<cac:AllowanceCharge>
  <cbc:ChargeIndicator>true</cbc:ChargeIndicator>
  <cbc:AllowanceChargeReasonCode>FC</cbc:AllowanceChargeReasonCode>
  <cbc:AllowanceChargeReason>Freight charge</cbc:AllowanceChargeReason>
  <cbc:Amount currencyID="EUR">15.00</cbc:Amount>
  <cac:TaxCategory>
    <cbc:ID>S</cbc:ID>
    <cbc:Percent>24.00</cbc:Percent>
    <cac:TaxScheme>
      <cbc:ID>VAT</cbc:ID>
    </cac:TaxScheme>
  </cac:TaxCategory>
</cac:AllowanceCharge>

Credit notes

Credit notes use a separate root element CreditNote instead of Invoice. The XML namespaces and structure are otherwise the same, with a few key differences:

Aspect Invoice Credit note
Root element Invoice CreditNote
Type code element InvoiceTypeCode CreditNoteTypeCode
Type code value 380 (standard) 381 (credit note)
Quantity element InvoicedQuantity CreditedQuantity
Line element InvoiceLine CreditNoteLine

Amounts in a credit note are positive — the credit note document type itself indicates that the amounts are to be subtracted.

Referencing the original invoice

Use BillingReference to link the credit note to the original invoice:

<CreditNote xmlns="urn:oasis:names:specification:ubl:schema:xsd:CreditNote-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>CN-2024-001</cbc:ID>
  <cbc:IssueDate>2024-02-01</cbc:IssueDate>
  <cbc:CreditNoteTypeCode>381</cbc:CreditNoteTypeCode>
  <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
  <cbc:BuyerReference>PO-12345</cbc:BuyerReference>

  <cac:BillingReference>
    <cac:InvoiceDocumentReference>
      <cbc:ID>INV-2024-001</cbc:ID>
      <cbc:IssueDate>2024-01-15</cbc:IssueDate>
    </cac:InvoiceDocumentReference>
  </cac:BillingReference>

  <!-- Remaining structure follows the same pattern as Invoice -->
</CreditNote>

Attachments

Peppol BIS 3.0 supports embedding attachments in the invoice XML using the AdditionalDocumentReference element.

Supported MIME types

MIME type Description
application/pdf PDF document
image/png PNG image
image/jpeg JPEG image
text/csv CSV file
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet Excel spreadsheet (.xlsx)
application/vnd.oasis.opendocument.spreadsheet OpenDocument spreadsheet (.ods)

Embedding an attachment

<cac:AdditionalDocumentReference>
  <cbc:ID>ATT-001</cbc:ID>
  <cbc:DocumentDescription>Timesheet for January 2024</cbc:DocumentDescription>
  <cac:Attachment>
    <cbc:EmbeddedDocumentBinaryObject mimeCode="application/pdf"
                                       filename="timesheet-2024-01.pdf">
      <!-- Base64 encoded content -->
      JVBERi0xLjQKMSAwIG9iago8PAovVHlwZSAvQ2F0YWxvZw...
    </cbc:EmbeddedDocumentBinaryObject>
  </cac:Attachment>
</cac:AdditionalDocumentReference>

You can also reference an external document by URL instead of embedding:

<cac:AdditionalDocumentReference>
  <cbc:ID>ATT-002</cbc:ID>
  <cac:Attachment>
    <cac:ExternalReference>
      <cbc:URI>https://example.com/documents/timesheet.pdf</cbc:URI>
    </cac:ExternalReference>
  </cac:Attachment>
</cac:AdditionalDocumentReference>

Validation

Peppol BIS 3.0 invoices are validated at three levels:

  1. UBL 2.1 XSD schema validation — Checks that the XML structure conforms to the UBL 2.1 schema (correct elements, data types, and structure).
  2. EN16931 schematron rules — European standard business rules that check calculation correctness, required fields, and cross-field consistency.
  3. Peppol business rules — Additional rules specific to the Peppol network (e.g., EndpointID must be present, CustomizationID must match the Peppol BIS 3.0 identifier).

Maventa automatically validates outgoing Peppol invoices against all three rule sets. If validation fails, the invoice is rejected with an error describing which rule was violated.

For more details on validation and how to pre-validate your invoices, see the /integration-guide/invoicing-formats/validation/ page and the Validator API.

Key code lists

Code list Usage Reference
EAS EndpointID scheme IDs Peppol EAS list
ICD (ISO 6523) PartyIdentification/ID and PartyLegalEntity/CompanyID scheme IDs Peppol ICD list
ISO 4217 Currency codes (DocumentCurrencyCode, amounts) Peppol currency list
UNCL5305 (subset) Tax category codes (S, Z, E, AE, etc.) Peppol tax category list
UNCL7161 Allowance/charge reason codes Peppol UNCL7161 list
UNCL1001 (subset) Invoice type codes (380, 381, 384, etc.) Peppol invoice type list
UN/ECE Rec 20 + 21 Unit of measure codes (EA, HUR, KGM, etc.) Peppol unit codes
MIME types Attachment content types Peppol MIME list

External resources

Back to top

AI Chat Support 24/7

  • Get help via AI chat available 24/7 whenever it suits you
  • Chat extensively uses Maventa support pages, websites, and blogs in its answers
  • If you need assistance that the AI cannot provide, you can also ask a customer service agent to join the conversation
  • Support requests processed Monday to Friday
Cancel Open chat

Got feedback?

Did you not find what you were looking for? Or was something explained unclearly? Or just want to share your thoughts? We are happy to hear your feedback!

Note: This form is not a way to get support, this is only for feedback for the documentation website. If you need support, please contact Maventa support.

Integration Guide Services & Reach API Specification Changelogs Integration guide Getting Started Invoice sending Consumer Invoicing Printing Email invoicing Invoice receiving Scanning Detect Fraud reporting Webhooks Reference implementations Maventa Connector Embeddable User Interface Peppol Network Document Exchange Invoice Response Self-billing support Invoicing formats Validation Peppol BIS 3.0 Finvoice 3.0 Document types and type codes Maventa JSON (table) Maventa JSON (json schema) Companies and Settings Department Company Users Billing Accounts receivable Ropo Reminder & Collection Amili Kassavirta Amili Perintä Services and reach Maventa services and reach e-invoicing in Finland Mass Printing Service e-invoicing in Sweden e-invoicing in Norway e-invoicing in Denmark e-invoicing in the Netherlands e-invoicing in Belgium e-invoicing in Germany e-invoicing in Estonia e-invoicing in Latvia e-invoicing in Poland e-invoicing in Italy e-invoicing in France e-invoicing in Spain Api specification API overview Getting Started Common & authentication API Invoices API Documents API Companies & settings API Lookups API Detect API Validator API Receivables API Billing API Scanning API B2CFI API B2CNO API B2CSE API Partner API Getting Started API Methods Overview Account Configuration API Methods Invoice Sending API Methods Invoice Receiving API Methods B2C Norway API Methods B2C Finland API Methods Other API Methods Changelogs Product changelog Developer Changelog
Clear Send

Enter your credentials to Maventa testing environment, to authenticate and try things out with the Swagger UI. This will fetch a Bearer token using OAuth2 with the endpoint POST https://ax-stage.maventa.com/oauth2/token. The token is stored in your browser's session storage (cleared when you close the tab) and used in Swagger calls done from this documentation website. The token is valid for 1 hour.

Never use your production credentials here. This is only for testing the Maventa test environment in the Swagger UI.
Reset All None
eui global company lookup document:receive document:send invoice:receive invoice:send company:read company:write validate receivables:assignments analysis billing:reports partner:invoice_delivery_actions partner:lookups partner:takeovers partner:lyanthe_scan_service fi_bank_message:send fi_bank_message:receive
Cancel Sign In