Skip to main content

Introduction

Peppol (Pan-European Public Procurement On-Line) is a global network for electronic document exchange, widely adopted for e-invoicing across multiple countries. It provides a standardized protocol for companies to exchange business documents like invoices, credit notes, and purchase orders. The Peppol network is particularly popular in:
  • Nordic countries (Norway, Finland)
  • Asia-Pacific region (Japan, Singapore, Malaysia, Australia, New Zealand)
  • Several EU countries for business-to-government invoicing (Germany, Italy, Croatia)
Invopop allows you to send and receive documents through the Peppol network using a single integration while continuing to work with our GOBL format. This guide walks you through the steps to register a company in Invopop and then issue and receive invoices on its behalf.

Setup

Letโ€™s prepare your workspace to work with Peppol. Weโ€™ll configure the Peppol app and create three workflows:
  • Invoice issuance workflow: Send invoices through the Peppol network
  • Invoice reception workflow: Receive invoices from the Peppol network
  • Party registration workflow: Programmatically onboard companies (Parties) with Invopop
If you only want to send invoices through Peppol, you can skip steps 3 and 4 of the setup. Alternatively, if you only want to receive invoices through Peppol, you can skip step 2. The Peppol app is designed to only send and receive the document, generating and importing the appropriate file is delegated to format specific apps such as OASIS UBL or UN/CEFACT CII. This is done to keep the Peppol app simple and focused on the Peppol protocol, while allowing you to use the format that best suits your needs.
1

Connect the Peppol app

  1. Within the Console, navigate to Configuration โ†’ Apps
  2. Find the Peppol app in the list
  3. Click Connect to activate it. The Peppol app should now appear in the list of Enabled apps
Connect Peppol app
2

Configure a workflow to issue invoices

Now weโ€™ll create the workflow that converts invoices to a valid Peppol format and sends them through the Peppol network. In this example, weโ€™ll generate a Peppol BIS Billing UBL 3.0 document.Skip this step if you only want to receive invoices via Peppol.

Peppol issue invoice workflow

This workflow converts a GOBL document into the Peppol format and sends it to the network
3

Configure a workflow to receive invoices

Peppol receive document workflow

This workflow receives incoming documents from the Peppol network and converts them to the GOBL format.
4

Configure the Peppol app

Within the Console, navigate to Configuration โ†’ Apps, find the Peppol App and click Configure. Youโ€™ll need to set the following field:
  • Incoming Workflow: Select the Receive Invoice Workflow created in Step 3. This is where the app will send incoming invoices (expenses) received from the Peppol network.
5

Configure a Party registration workflow

This workflow onboards companies (Peppol participants) to Invopop before they can issue or receive invoices. If youโ€™re managing your own invoices only, you may use this workflow just once. However, if youโ€™re offering Peppol to your customers through Invopop (white-label use case), youโ€™ll run this workflow for each merchant you onboard.

Peppol supplier registration workflow

Onboards Peppol participants by sending a registration link
Congratulations! Your workspace is now configured to send and receive Peppol documents and programmatically onboard Peppol participants with Invopop.

Running

After setup, you can perform three key operations with Peppol in Invopop: onboarding entities (parties) so they can use Peppol, sending invoices through Peppol, and receiving Peppol invoices.

Registering parties

Business entities are represented in Invopop as GOBL org.party objects, which we call Parties. Peppol requires Invopop to collect proof of ownership for regulatory compliance. As outlined in Section 3.3 End user Identification of the Internal Regulations II document, key details such as VAT number, address, contact information, and company name must be provided and validated during registration. To register a party:
  1. Upload it to the Silo with required company information
  2. Send it to the party registration workflow

Upload a party document

You can upload parties via the Create an Entry API endpoint or manually through the Console. For this guide, weโ€™ll demonstrate the manual process:
  1. Find the Parties section in the sidebar and click Suppliers
  2. Click + New Supplier to open the editor
  3. Use one of the following examples and adapt to your needs
Belgium supplier example
The mandatory fields for Peppol registration are:
  • Company name (fiscal name)
  • VAT number (tax ID)
  • Complete company address
  • Contact information
  • Peppol Participant ID*
*If not provided, Invopop will assign a Participant ID during registration based on the VAT number and the country. After registration the supplier entry will be updated with their Peppol inbox:
If the company has already been registered before or you need to set a specific participant ID, include this information so that it is not auto-generated. All fields are required for identity validation and proof of ownership verification. Click Build to validate the document, then Save.

Send to the registration workflow

Once the document is saved:
  1. Click the Select Workflow button
  2. Select the Register Supplier workflow created during setup
  3. Click Run Workflow
The execution should succeed, and the silo entryโ€™s state will change to Processing The first step creates a registration link that you can extract from the Meta tab or via the API:
Sending party to the registration workflow
This link leads to a web form where you can upload proof of ownership documents and confirm your company details:
Peppol registration wizard
After submitting the web form, Invopop will be notified and will validate your information within 72 hours. The approval status will be shown in the Meta tab of the entry.

Programmatic registration (white-label)

For programmatic integration, upload the proof of ownership document using the API. This is particularly useful for white-label implementations when you want to integrate the registration process into your own application. After using this API endpoint the verification process will begin automatically.

Completion

After Invopop approves your registration, your party will be registered in the Peppol network. Youโ€™ll see the Peppol Participant ID in the Meta tab of the entry, and the GOBL document will contain an inboxes array.
Peppol inboxes

Peppol participant inboxes

Participant IDs are represented as inboxes within a Party record because they function as network addressesโ€”the location where invoices are sent to and received from. The party can now send and/or receive invoices in Peppol via Invopop.

Unregistering a participant

If you need to unregister an entity (because the supplier is no longer your client, for example), use the following workflow template:
Example Peppol unregister party workflow

Sending invoices

To send an invoice:
  1. Store it as a Silo Entry with the Peppol inboxes previously obtained.
  2. Send it to the Sending Invoice Workflow created during setup
You can perform these steps manually via the Console or programmatically via the API using the Create an Entry and Create a Job endpoints. For API usage, refer to our quickstart guide. When creating your invoice, ensure you add the eu-en16931-v2017 addon to enable validations and extensions needed for Peppol
A standard B2B invoice sent over the Peppol network. The eu-en16931-v2017 addon applies the European norm rules; the peppol inboxes on both parties identify the sending and receiving participants.Notice:
  • both parties carry a peppol inbox with the participant scheme and code used for routing,
  • the line tax states the VAT percent explicitly along with the untdid-tax-category extension, and,
  • totals are calculated automatically when the document is built.
A Belgian B2B invoice with VAT-inclusive prices and two different VAT rates.Notice:
  • tax.prices_include is set to VAT, so line prices are treated as tax-inclusive and the base amounts are derived automatically,
  • the supplierโ€™s inbox uses the combined scheme:code form (0208:0735585741), while the customer states scheme and code separately โ€” both are equivalent, and,
  • the two lines apply the general (21%) and reduced (6%) Belgian VAT rates.
A credit note reversing part of a previously sent invoice.Notice:
  • the type is set to credit-note, which the eu-en16931-v2017 addon maps to UNTDID document type 381,
  • the preceding array references the original invoice by series, code, and issue_date, with a reason for the correction, and,
  • the lines state the credited amounts as positive values โ€” the document type is what reverses them.
The payment: { "terms": {"detail": "..."}} field is required for EN16931 (EU) invoices and should be filled in with due dates or payment terms.

Receiving invoices

Invopop automatically processes invoices received from the Peppol network using your configured Incoming Workflow. The workflow converts Peppol documents to GOBL format and creates Silo Entries for each invoice. Configure your workflow with webhooks or Google Drive integration to deliver these invoices to your systems.

FAQ

Please contact the Invopop support team if you have any questions that are not listed here.
The visibility of your Peppol Party determines what documents you can send and receive.
  • smp: Only SMP, should be used for testing
  • smp+sml: SMP and SML, useful when you want to send documents but not receive them
  • smp+sml+peppol: SMP, SML, and Peppol Directory, recommended for both sending and receiving documents as you will be visible in the Peppol Directory
In general, you should use the highest visibility available.
Yes, you can remove either format based on your needs. Our template includes both UBL and CII imports for comprehensiveness, but if youโ€™re certain youโ€™ll only receive invoices in one format, you can safely remove the unused format. This simplifies your workflow and reduces the number of apps you need to activate.
Participant IDs are unique identifiers for entities in the Peppol network. They consist of two parts:
  • Scheme: Identifies the type of identifier being used (e.g., 9920 for Spanish VAT numbers, 0208 for Belgian KBO/BCE numbers)
  • Code: The actual identification number
In most cases, Participant IDs are based on VAT numbers or local business identifiers. Since most countries have a default scheme, we can typically derive the Participant ID automatically from a Tax ID.Note that some countries support multiple schemes. For example, Belgium uses 0208 (KBO/BCE number) as the preferred default, but some entities are registered under 9925 (VAT number). When sending invoices, if you get a โ€œreceiver not foundโ€ error, the recipient may be registered under an alternative scheme. See the Belgium FAQ for details.
This is because a supplier with the stated participant ID has already been registered in your workspace.
By default, the regime is automatically determined from each supplierโ€™s settings, which is recommended in Peppol.
You must register them through different silo entries, even though they represent the same party. The supplier must upload their proof of ownership documentation for each inbox assigned.
In countries where Peppol is the standard but not mandatory, you must often provide an e-invoice even if the recipient isnโ€™t registered in the Peppol network. Both parties can agree on an alternative transfer method (not Peppol), but the invoice must still be EN16931 compliant.Recommended approach:
  • Set up a separate workflow that generates the XML without sending it via Peppol
  • Alternatively, use your current workflow without the customer Peppol ID (the send Peppol document step will automatically skip)
  • Fetch the generated XML
  • Deliver it through an agreed-upon method, typically email
B2C (business-to-consumer) invoices typically donโ€™t include the structured customer information required for Peppol delivery, and most consumers donโ€™t have Peppol inboxes to receive invoices through the network. While itโ€™s technically possible to send B2C invoices via Peppol if you have the customerโ€™s Peppol endpoint details, this is rarely the case in practice.The recommended approach is to implement a conditional workflow:
  1. Check for Peppol capability โ€“ Using the If/Else workflow step, detect the presence of the customerโ€™s inbox via the following expr: count(customer.inboxes, true) > 0
  2. Set up an alternative flow - Adding a workflow condition, select โ€œOKโ€ and code false. Then set-up your alternative flow (Generate PDF and send by email, for example). Make sure to stop the flow within the workflow condition at the end.
This will ensure B2C invoices are handled by a separate flow. This hybrid approach ensures you can leverage Peppolโ€™s benefits for B2B transactions while maintaining a smooth invoicing process for your consumer customers.

Participate in our community

Ask and answer questions about Peppol โ†’