Peppol E-Invoicing (BIS Billing 3.0)
The ECOSIRE Peppol E-Invoicing module (ecosire_einvoice_peppol) adds full Peppol BIS Billing 3.0 e-invoicing to Odoo. It generates standards-conformant UBL 2.1 invoice XML on the EN 16931 semantic model, runs a mandatory pre-flight validation against BIS 3.0 schematron rules, and hands the validated document to a certified Access Point for delivery over the 4-corner Peppol AS4 network. It ships as a standard pack on top of the ecosire_einvoice_core engine.
This module covers the supplier-side (Corner 1) workflow: build, validate, and submit. Corner 2 (Access Point transport) requires a certified AP that you configure separately — the module ships with a clear configuration interface and a manual mode for portal-upload workflows, but live AS4 transmission requires an AP account.
Compatibility: Odoo 17 / 18 / 19 (Community or Enterprise)
Price: $499 (one-time) — requires ecosire_einvoice_core ($499, sold separately)
License: LGPL-3 | Up to 3 domain activations
Standard: Peppol BIS Billing 3.0 v3.0.20-hotfix (mandatory enforcement 2026-02-23)
Legislative basis: EU Directive 2014/55/EU (B2G mandatory across the EU since April 2020)
What it does
- BIS Billing 3.0 document generation — builds UBL 2.1 XML with the correct
CustomizationID(BT-24) andProfileID(BT-23) per spec v3.0.20-hotfix, reusing Odoo's nativeaccount_edi_ubl_ciibuilder (account.edi.xml.ubl_bis3). Does not hand-roll UBL. - EN 16931 + BIS pre-flight validation — checks all mandatory BT fields (BT-1 through BT-126), validates the seller EAS scheme, and surfaces a B2G warning when the buyer reference field (BT-10) is missing on government partners.
- Peppol EAS management on partners — adds
Peppol EAS SchemeandPeppol Endpoint IDfields tores.partner; computes the fullscheme:valueparticipant identifier automatically. Covers the full BIS 3.0 EAS code list (0002, 0007, 0088, 0151, 0192, 0193, 0195, 0199, 0204, 0208, 0211, 0212, 0245, and more). - SML/SMP participant lookup — a wizard checks whether a buyer is registered on the Peppol network using the public, no-auth Peppol Directory and SMP infrastructure. No AP account required for the lookup.
- Pluggable Access Point adapter — a company-level AP configuration record selects the adapter kind:
Unconfigured,Manual (portal upload),Odoo IAP Access Point, orStorecove REST API. Each adapter is clearly scoped; nothing fabricates a vendor endpoint. - Per-document transmission log — one
peppol.transmissionrecord per send attempt, tracking the generated UBL payload, AP submission GUID, proof-of-delivery reference, and lifecycle state (Draft → Validated → Ready → Sent → Delivered / Error).
Prerequisites
| Requirement | Detail |
|---|---|
| Odoo | 17.0, 18.0, or 19.0 (Community or Enterprise) |
ecosire_einvoice_core | Core e-invoicing engine — must be installed first |
ecosire_license_client | ECOSIRE license enforcement module |
account_edi_ubl_cii | Odoo's UBL 2.1 builder — ships with Odoo Accounting (Enterprise or the relevant Community package) |
| Python | lxml (install via pip install lxml) |
| ECOSIRE license | An active license for ecosire_einvoice_peppol |
| Access Point (for live AS4) | A certified Peppol AP account — Odoo IAP (via account_peppol) or a third-party such as Storecove. See Access Point configuration. |
Installation
- Download the module ZIP for
ecosire_einvoice_coreandecosire_einvoice_peppolfrom your ECOSIRE Dashboard. - Extract both modules to your Odoo addons directory:
unzip ecosire-einvoice-core-*.zip -d /opt/odoo/addons/
unzip ecosire-einvoice-peppol-*.zip -d /opt/odoo/addons/ - Install the required Python package into the Odoo environment:
pip install lxml - Restart the Odoo service:
sudo systemctl restart odoo - Navigate to Apps, click Update Apps List.
- Search for "ECOSIRE E-Invoicing | Peppol" and click Install. Odoo will install
ecosire_einvoice_coreautomatically as a dependency. - Enter your ECOSIRE license key when prompted (or activate it under Settings > ECOSIRE License).
If account_edi_ubl_cii is not already installed in your database, install it first. It ships with Odoo Accounting on Enterprise and with the account_edi Community package. The module raises a clear UserError during document generation if the native UBL builder is absent.
Configuration
Step 1: Activate Your ECOSIRE License
- Go to Settings > ECOSIRE License.
- Enter the license key you received after purchase.
- Click Activate. The status banner must show Active before any generation or transmission action is available.
A license that is not yet active will block the Validate, Generate, and Send buttons with a clear notification.
Step 2: Configure Your Company's Peppol Participant
- Navigate to Accounting > Configuration > Companies (or Settings > Companies > Your Company).
- Open the Peppol tab (added by this module).
- Set the Peppol EAS Scheme for your company — for example,
0192for a Norwegian organisation number,0204for a German Leitweg-ID, or0211for an Italian IVA number. - Enter the Peppol Endpoint ID — the raw identifier value paired with the scheme (e.g. the organisation number without the scheme prefix).
- The Peppol Participant field (
scheme:value) is computed automatically and used as the sender identifier on all outgoing transmissions.
Step 3: Configure Your Access Point
Go to Peppol E-Invoicing > Configuration > Access Points and create an AP record:
| Field | Description |
|---|---|
| Name | A label for this AP configuration (e.g. "Storecove Production") |
| Company | The Odoo company this AP serves |
| Adapter | The kind of AP — see options below |
| Environment | Sandbox / Test or Production |
| API Base URL | Required for Storecove: https://api.storecove.com/api/v2/ |
| API Key / Token | Required for Storecove: your API key from app.storecove.com/api_keys |
| Sender Legal-Entity ID | Your registered sender ID on the AP side (one-time AP registration) |
Adapter options:
- Not configured (no transport) — default. Buttons that require AS4 delivery raise a clear
UserError. Use this while you are setting up. - Manual / out-of-band (portal upload) — the module generates and validates the BIS 3.0 UBL XML, saves it in the transmission record, and marks the document as
Ready to Send. You download the XML and upload it to your AP's web portal manually. No AP credentials required in Odoo. - Odoo IAP Access Point — delegates transmission to Odoo's own certified Peppol AP via the
account_peppolmodule (IAP credits). Requiresaccount_peppolto be installed and your Peppol registration completed under Accounting > Configuration > Settings > Electronic Invoicing (Peppol). - Storecove REST API — sends via the Storecove
/document_submissionsendpoint. Requires a Storecove account (app.storecove.com), your API key, and a registered sender legal entity. A free sandbox is available at Storecove for testing before going live.
The Peppol standard defines no universal ERP-facing transport API. Each certified Access Point exposes its own API. This module ships a clean adapter interface and the two above integrations; live document delivery to the Peppol network requires your AP account to be active and the adapter credentials to be entered. The Manual mode and the SML/SMP lookup work without any AP account.
Step 4: Set Peppol Participant IDs on Buyers
For each customer you will invoice via Peppol:
- Open the customer record in Contacts (or Accounting > Customers).
- Go to the Peppol tab.
- Set Peppol EAS Scheme — select the appropriate scheme for the buyer's country (e.g.
0192for Norway,0204for Germany,0151for Australia). - Enter Peppol Endpoint ID — the buyer's registered identifier value.
- The Peppol Participant field is computed as
scheme:value. - Optionally, click Check on Peppol Directory (the participant lookup wizard) to confirm the buyer is registered and can receive BIS Billing 3.0 documents before sending your first invoice.
The Send via Peppol flag on invoices is automatically set to True when the customer has a Peppol participant identifier and the invoice is of type customer invoice or credit note.
Usage
Core workflow: Generate, Validate, Transmit
- Create and post the customer invoice as normal in Odoo Accounting. The invoice must be in
Postedstate before Peppol actions are available. - Open the posted invoice. If the customer has a Peppol participant identifier, the Peppol section appears in the form.
- Click Validate BIS 3.0 to run the pre-flight check. The module verifies:
- All mandatory BT fields (BT-1 invoice number, BT-2 date, BT-3 type code, BT-5 currency, seller and buyer party information, tax totals, document totals, at least one invoice line).
- The seller EAS scheme is set on your company.
- If the buyer is a government entity, a warning is logged if BT-10 (buyer reference) is missing — many public bodies reject invoices without it.
- Errors raise a
UserErrorlisting every violation. Warnings are posted to the invoice chatter.
- Click Generate BIS 3.0 Document (license-gated). The module:
- Calls Odoo's native
account.edi.xml.ubl_bis3builder to produce the UBL 2.1 XML. - Creates a
peppol.transmissionrecord inValidatedstate, attaching the XML payload. - Opens the transmission record so you can review the document before sending.
- Calls Odoo's native
- On the transmission record, click Send via Access Point (license-gated). The outcome depends on the configured AP adapter:
- Manual: transmission moves to
Ready to Send; download the XML from the attachment and upload it to your AP's portal. - Odoo IAP / Storecove: the document is submitted to the AP; the AP submission GUID is recorded; the transmission moves to
SentorDeliveredwhen confirmed.
- Manual: transmission moves to
- Track all transmissions for an invoice via the Peppol Transmissions smart button on the invoice form.
Participant Lookup Wizard
Go to Peppol E-Invoicing > Operations > Check Participant (or from a partner record) to run an SML/SMP lookup. The wizard uses the public, no-auth Peppol Directory to confirm whether a participant ID is registered and which document types they can receive. This works without any AP account.
Troubleshooting / FAQ
| Issue | Cause | Fix |
|---|---|---|
| "No Access Point configured" on Send | Adapter is Not configured | Create an AP record and set it as the company default under Company > Peppol tab, or set it on the transmission record directly |
| "account_peppol module not installed" | Odoo IAP adapter selected but the module is absent | Install account_peppol from Odoo's App Store, then complete Peppol registration under Accounting > Settings |
| "Storecove selected, but live transmission requires…" | Storecove adapter chosen but no API key entered | Enter your Storecove API key and Sender Legal-Entity ID on the AP configuration record |
| "Post the invoice before generating" | Generate clicked on a draft invoice | Confirm and post the invoice first (Confirm button) |
| "BIS Billing 3.0 UBL generation reuses Odoo's native builder…" | account_edi_ubl_cii not installed | Install it (ships with Odoo Accounting Enterprise, or via account_edi Community package) and restart Odoo |
| Validation error: mandatory BT field missing | Required invoice field not populated | Check the error list in the UserError; fill in the highlighted fields (seller VAT, buyer address, invoice lines, currency) |
| "B2G buyer reference (BT-10) missing" warning | Government buyer partner does not have a buyer reference | Ask the buyer for their reference number and enter it on the invoice; many public bodies reject without it |
| "A Peppol Endpoint ID requires an EAS scheme" | Endpoint value saved without selecting a scheme first | Select the EAS scheme on the partner before entering the endpoint ID |
| License not active error on Validate/Generate/Send | ECOSIRE license not activated or expired | Go to Settings > ECOSIRE License, verify the key is entered, and click Activate |
| Transmission stuck in Error state | AP returned an error (network, auth, or validation) | Check the Last Error field on the transmission record; fix the root cause and click Send again to retry |
| "Peppol standard pack is not installed" | Internal check failed — module not fully loaded | Restart Odoo and re-try; if it persists, verify ecosire_einvoice_peppol is installed (not just ecosire_einvoice_core) |
Country-specific notes
The base BIS Billing 3.0 module covers the generic Peppol 4-corner profile used in most EU B2G contexts and by countries that have adopted base BIS 3.0 (Norway, Netherlands, Belgium, Austria, Australia/NZ, Singapore, Japan, Malaysia, etc.). The following are not served by this module:
- Italy — uses the SDI (Sistema di Interscambio) system, not native Peppol.
- France — uses the Chorus Pro / PDP Y-model, not a pure 4-corner Peppol flow.
- KSA ZATCA — covered by
ecosire_einvoice_ksa(separate module with ECDSA signing and ZATCA-specific fields). - UAE e-invoicing — covered by a separate UAE pack.
Germany XRechnung (a CIUS on BIS 3.0, EAS 0204 Leitweg-ID) and Belgium CIUS-BE are close to base BIS 3.0 and work with this module for document generation; verify country-specific schematron enforcement with your AP.