Skip to content
Odoo support plans from $425 a month · Installation and setup: Onboarding Pack, $350 one-offSee plans →Get a quote
PokutsoftPokutsoft
GlobalAccounting
Peppol Attachments EU icon

Peppol Attachments EU

Embed PDF, CSV and supplementary documents as Base64 binary attachments inside Peppol BIS 3.0 UBL invoices

Odoo 20.0Odoo 19.0Odoo 18.0

Want Peppol Attachments EU installed and configured for you? Onboarding Pack: $350 one-off

Support plans from $425 a month

Peppol 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
PDFapplication/pdfInvoice rendering, contract
PNGimage/pngProof of delivery, signature
JPEGimage/jpegPhoto, scanned document
CSVtext/csvTimesheet, usage report
XLSXapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetSpreadsheet report
ODSapplication/vnd.oasis.opendocument.spreadsheetOpenDocument 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.line records 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:URI for 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

  1. Open a customer invoice or credit note and go to the Peppol Attachments tab.
  2. Add one or more supporting documents (drag a file, or use the Add Document wizard / Attach Invoice PDF button).
  3. Click Validate Attachments to check every file against the Peppol mime subset and size ceiling.
  4. Send the invoice as usual (Send & Print / account_edi_ubl_cii UBL formats). The staged documents are embedded automatically into the UBL Odoo attaches to the invoice and hands to your transport — no extra step.
  5. 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

Supporting Documents

Update date: 2026-10-09

User guides (PDF)

Related modules