Peppol Attachments EU
Embed PDF, CSV and supplementary documents as Base64 binary attachments inside Peppol BIS 3.0 UBL invoices
Want Peppol Attachments EU installed and configured for you? Onboarding Pack: $350 one-off
Support plans from $425 a monthPeppol Attachments EU
Embed PDF, CSV, images and spreadsheets as Base64 binary attachments inside Peppol BIS Billing 3.0 UBL invoices
What it does
Peppol BIS Billing 3.0 lets a UBL invoice or credit note carry
supporting documents — a PDF rendering of the
invoice, a CSV timesheet, an XLSX or ODS usage report, a PNG or
JPEG proof of delivery — embedded directly in the XML as a
Base64-encoded binary object. This toolkit stages those files on
the invoice and writes them into the UBL as standards-correct
cac:AdditionalDocumentReference elements, each
carrying a
cbc:EmbeddedDocumentBinaryObject with the mandatory
mimeCode and filename attributes.
It is a format-generation tool: it produces the UBL
fragment and splices it into your document at the correct
position. It does not run its own Access Point or hold
transport credentials — it plugs into Odoo's own
account_edi_ubl_cii "Send & Print" pipeline
(a required, free Community dependency of this module), so
every staged supporting document is embedded into the exact
UBL XML that gets attached to the invoice and handed to
whatever Access Point / Peppol proxy you already send
through — automatically, the moment you send the
invoice, not as a separate manual step.
Key features
Standards-correct embedding
Builds cac:AdditionalDocumentReference / cac:Attachment /
cbc:EmbeddedDocumentBinaryObject exactly as the
OpenPEPPOL specification requires, with the mandatory
mimeCode and filename attributes and
the optional cbc:DocumentDescription.
Allowed mime subset enforced
Only the six Peppol-permitted attachment types are accepted: PDF, PNG, JPEG, CSV, XLSX and ODS. Files of any other type are rejected before they can break validation downstream.
Automatic mime detection
The mime code is resolved from the file content (magic-byte sniffing distinguishes ODS from XLSX inside the ZIP container) and the filename extension, so you rarely set it by hand.
Schema-safe splicing
References are inserted at the correct UBL 2.1 ordinal position — after the document header and any existing references — into your already-generated UBL, or into a minimal BIS 3.0 carrier when no host document exists yet.
External-URI references
Reference a document hosted elsewhere by URI instead of embedding it. Per Peppol, an attachment carries either an embedded binary object or an external URI, never both — the toolkit enforces this.
One-click invoice PDF
Attach the rendered invoice PDF as a supporting document with a single button, or have it embedded automatically on every generation via a company setting.
Configurable size ceiling
Set a per-company maximum size (megabytes) for a single embedded document. Many Access Points reject oversized UBL envelopes; the toolkit blocks an over-limit attachment at staging time with a clear error instead of letting an oversized envelope reach — and get rejected by — your transport.
Wired into Send & Print
Staged documents are embedded automatically into the UBL
Odoo's own account_edi_ubl_cii module attaches to
the invoice when you send it — no manual export/upload
step required for the documents to reach the transmitted file.
Allowed attachment types
| Document | Mime code | Typical use |
|---|---|---|
| application/pdf | Invoice rendering, contract | |
| PNG | image/png | Proof of delivery, signature |
| JPEG | image/jpeg | Photo, scanned document |
| CSV | text/csv | Timesheet, usage report |
| XLSX | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | Spreadsheet report |
| ODS | application/vnd.oasis.opendocument.spreadsheet | OpenDocument spreadsheet |
These six mime codes are the OpenPEPPOL subset of the IANA list permitted for invoice and credit-note attachments.
How this compares to Odoo's built-in Peppol attachments
Odoo Community's own account_edi_ubl_cii module
(free, part of core) already embeds the invoice PDF, and any
file you manually pick in the "Send & Print" attachments
widget, into the BIS 3.0 UBL as
cac:AdditionalDocumentReference /
cbc:EmbeddedDocumentBinaryObject — using the
exact same six-mimetype subset this toolkit enforces. We say
this plainly because the listing should not read as if that
capability did not exist. What this toolkit adds on top:
- Persistent, reusable staging. Supporting documents
live on the invoice as
peppol.attachment.linerecords with their own reference id, description and mime code — validated once, embedded on every subsequent send — instead of a one-off file picked in the send wizard's attachments widget each time. - Peppol-rule validation with a clear error, not a silent drop. An unsupported file type raises a specific "not in the Peppol BIS 3.0 allowed subset" error when you stage it; the core flow simply excludes a non-matching mimetype from the embed with no dedicated feedback.
- Magic-byte content sniffing. The mime code is resolved from the file's actual bytes (distinguishing an ODS from an XLSX inside their shared ZIP container), not only from the mimetype Odoo happened to record on upload.
- External-URI references.
cac:ExternalReference/cbc:URIfor a document hosted elsewhere — the core flow only knows how to embed a binary object, not reference one by URI. - A configurable, enforced size ceiling (see "Key features" above) — the core flow embeds whatever you hand it with no size check.
How it works
- Open a customer invoice or credit note and go to the Peppol Attachments tab.
- Add one or more supporting documents (drag a file, or use the Add Document wizard / Attach Invoice PDF button).
- Click Validate Attachments to check every file against the Peppol mime subset and size ceiling.
- Send the invoice as usual (Send & Print /
account_edi_ubl_ciiUBL formats). The staged documents are embedded automatically into the UBL Odoo attaches to the invoice and hands to your transport — no extra step. - Alternatively, click Embed Peppol Attachments to generate and download a standalone copy of the enriched UBL on demand, without sending the invoice.
Scope & boundary
This module performs format generation and embedding. It
produces the Peppol UBL attachment fragment and splices it into
the UBL account_edi_ubl_cii builds for the
invoice; it is not an Access Point and does not hold transport
credentials or contact any external service itself. The
enriched UBL is handed to whatever Peppol transport you already
operate through Odoo's own Send & Print / EDI pipeline.
Screenshots
Supporting Documents
Update date: 2026-10-09
User guides (PDF)
Related modules
XRechnung Viewer EU
Offline EN16931 e-invoice visualization (XSLT normalize + HTML render) for XRechnung (UBL 2.1 / UN/CEFACT CII) and ZUGFeRD / Factur-X
Advanced Financial Analytics
Cash-flow forecast records computed from posted invoices
US BAI2 Statement Split
Split multi-account US BAI2 cash-management statements and route each account to its matching Odoo bank journal