How to Set Up E-Invoicing in Odoo 17 — A Complete Guide (2026)
If you run Odoo 17 and operate across Europe, e-invoicing compliance is no longer optional. For a full overview of timelines and country scope, see EU B2B e-invoicing mandates in 2026. Belgium's Peppol mandate went live in January 2026. Poland's KSeF system is now enforced for large taxpayers. Italy's FatturaPA clearance has been mandatory since 2019. France goes live in September 2026. Germany follows in 2027. Spain's VeriFactu regime is active now.
Odoo 17 ships with meaningful e-invoicing improvements over Odoo 16, including native Factur-X generation and better UBL support. But format generation is only half the story. Submitting invoices to tax authority systems — SDI in Italy, KSeF in Poland, AEAT in Spain, DGFiP in France — requires a live connection, certificate management, real-time status tracking, and rejection handling that Odoo's built-in modules do not provide. This guide covers exactly what Odoo gives you, what it doesn't, and how to close the gap cleanly.
What Odoo 17 Includes Out of the Box
Odoo 17's accounting module has a genuinely useful foundation for e-invoicing. The improvements over prior versions are real:
- Factur-X / ZUGFeRD generation — Odoo 17 can embed a machine-readable XML payload into a PDF invoice, producing a hybrid Factur-X document. This satisfies the format requirement for France and Germany (where XRechnung or Factur-X EN16931 is the expected output).
- UBL 2.1 export — Odoo can generate Universal Business Language XML, the format used by Peppol and required for Belgium's mandate. The
l10n_account_edi_ubl_ciimodule handles this. - EDI framework — A plugin architecture for attaching EDI documents to invoices and tracking their format-level state.
- PEPPOL module (beta) — Odoo 17.0 includes an early integration with a Peppol access point for some regions. Coverage and reliability vary.
What this means in practice: Odoo can produce the correct XML or hybrid PDF format for many European countries. If your buyer simply wants to receive a Factur-X PDF by email, Odoo handles that well.
What it does not mean: Odoo will automatically submit that invoice to a government clearance system, receive an official clearance number, track rejection reasons, or retry failed submissions. Those steps are where most compliance gaps live.
What You Still Need
The countries with active e-invoicing mandates don't just require a structured XML format — they require real-time or near-real-time submission to a government platform, with a legally binding response before the invoice is considered issued. Here is what Odoo's built-in modules don't cover:
- Authority submission — Posting the invoice to SDI (Italy), KSeF (Poland), AEAT's VERI*FACTU (Spain), DGFiP's Portail Public de Facturation (France), or a Peppol access point (Belgium) requires active API calls with country-specific authentication.
- Certificate management — Italy's SDI, Spain's AEAT, and Poland's KSeF all require digital certificates or token-based authentication that must be provisioned, stored securely, and rotated. Odoo has no built-in certificate vault for this purpose.
- Real-time status tracking — Authorities return asynchronous responses. An invoice submitted to KSeF may be accepted, rejected with an error code, or held for processing. Odoo's EDI state machine does not map to these authority-specific states.
- Rejection handling — When SDI rejects an invoice for a structural issue, or KSeF returns an FA3 validation error, you need a workflow to notify the finance team, correct the invoice, and resubmit. This does not exist natively.
- Hash chain management (Spain) — VeriFactu requires a persistent cryptographic chain linking each invoice to the previous one. This state must be maintained server-side and is entirely outside Odoo's scope.
These are not minor gaps. For Italy, an invoice that hasn't cleared SDI is not legally issued — you cannot collect payment on it. For Poland, the KSeF number must be returned to the buyer and referenced in payments. For Spain, the Huella and QR code must appear on every invoice output. Getting these wrong creates real legal exposure.
Installing the Clearvo Module
The Clearvo Odoo module bridges the gap between Odoo's format generation and the authority submission layer. It installs as a standard Odoo add-on and connects to the Clearvo API for all government-facing calls. Your invoice data stays in Odoo; Clearvo handles certificates, submission protocols, and status polling for each country.
Setup takes three steps:
Step 1 — Install the module. Download the Clearvo module from the Odoo App Store or from the Clearvo Odoo integration page and place it in your Odoo addons path. Then activate it from Settings → Apps:
# If self-hosting, add to your addons path in odoo.conf:
addons_path = /path/to/odoo/addons,/path/to/clearvo-odoo
# Then update the module list and install:
./odoo-bin -c odoo.conf -u clearvo_einvoicing
On Odoo.sh or Odoo Online, upload the module zip via the Apps menu and install it from the interface.
Step 2 — Add your API key. Go to Settings → Technical → Clearvo E-Invoicing. Enter your Clearvo API key and select whether to use the sandbox or production environment. The sandbox environment makes no real authority calls — it validates your invoice structure and returns mock clearance responses so you can test your full Odoo workflow before going live.
CLEARVO_API_KEY=sk_live_...
CLEARVO_ENV=production # or: sandbox
Step 3 — Configure per-company country settings. For each Odoo company entity, navigate to Accounting → Configuration → E-Invoicing Settings and enable the relevant country modules (Italy SDI, Poland KSeF, Spain VeriFactu, France DGFiP, Belgium Peppol). The module will prompt for any country-specific identifiers — your Italian codice destinatario, your Polish NIP, your Spanish NIF — and validate them against the authority systems before you process your first invoice.
Once configured, the module intercepts Odoo's standard invoice confirmation flow. When you confirm an invoice, Clearvo submits it to the relevant authority, returns the clearance number or status, and attaches both to the Odoo invoice record. Rejections surface as chatter messages with the authority's error description and a suggested correction.
Country-by-Country: What Changes in Odoo
Each country's mandate has a different technical shape. Here is what the Clearvo module adds for each:
| Country | Format | Authority | Mandate status | Key addition over vanilla Odoo |
|---|---|---|---|---|
| France | Factur-X (EN16931) | DGFiP Portail Public de Facturation | Mandatory Sep 2026 (large), 2027 (mid), 2027 (small) — see France e-invoicing September 2026 | PPF submission, Flux 1 clearance, e-reporting Flux 2/3 for B2C and payment events |
| Germany | XRechnung / Factur-X | Peppol network / PONTON | Mandatory Jan 2027 (B2B receive), 2028 (send) | XRechnung profile routing, Peppol delivery to German receivers, ELSTER alignment |
| Italy | FatturaPA XML | SDI (Sistema di Interscambio) | Mandatory now (since Jan 2019) | SDI submission, codice destinatario routing, async notification polling, RC/TD code handling |
| Poland | FA(2) (KSeF XML) | KSeF (Krajowy System e-Faktur) | Mandatory now (large taxpayers) | KSeF session token auth, FA(2) schema generation, KSeF number returned to invoice, NIP validation |
| Spain | FacturaE / VeriFactu XML | AEAT VERI*FACTU | Live now (software certification required) | SHA-256 hash chain per NIF/series, QR code + CSV generation on invoice PDF, AEAT SOAP submission |
| Belgium | UBL 2.1 (BIS Billing 3.0) | Peppol network | Mandatory Jan 2026 | Peppol SMP lookup for receiver endpoint, AS4 delivery, Peppol ID registration for your entity |
A note on Germany: the 2027 mandate requires businesses to be capable of receiving XRechnung invoices, not necessarily sending them. The sending obligation for domestic B2B invoices phases in from 2028. However, configuring your Odoo instance to receive and parse incoming XRechnung documents now — and route them into your accounts payable workflow — is work worth doing early.
Testing Before Go-Live
Every country's authority provides a test environment, but accessing them varies considerably in difficulty. Italy's SDI test environment requires a separate registration and test codice destinatario. Poland's KSeF test system requires test NIP credentials issued by the Ministry of Finance. France's PPF sandbox is currently restricted to accredited PDP operators. Spain's AEAT test environment is the most accessible — it accepts test NIFs and returns mock acceptance responses.
The Clearvo sandbox handles this complexity for you. When you set CLEARVO_ENV=sandbox, all authority calls are intercepted and validated against the same schema and business rule checks that Clearvo runs in production — but no invoice reaches a real government system. The sandbox returns realistic responses including rejection codes, so you can verify your rejection-handling workflows before your finance team sees a live failure.
To run a complete end-to-end test in Odoo:
- Set your Clearvo API key to your sandbox key (prefix:
sk_test_) - Create a test customer with a valid format VAT number for the target country (e.g.,
FR12345678901for France) - Issue a test invoice and confirm it — the module will submit to the Clearvo sandbox and return a mock clearance number
- Test a rejection scenario by submitting an invoice with a known invalid field (e.g., a missing buyer VAT number for Italy) and confirm the chatter shows the correct SDI error code
- Switch to
sk_live_only once you have validated the happy path and at least one rejection path in sandbox
The sandbox key is available immediately on sign-up — no onboarding call required. For production keys, Clearvo verifies your company's identity and the authority credentials for each country you activate.
Getting Started
Odoo 17 is a strong foundation for European invoicing. The format generation is solid, the EDI framework is extensible, and the accounting module handles multi-company and multi-currency invoicing well. What it doesn't handle is the live government submission layer — and that layer is where mandate compliance actually lives.
The Clearvo module adds that layer without replacing any of Odoo's own invoicing logic. Your Odoo workflow stays the same; what changes is that confirmed invoices now clear through the relevant tax authority automatically, with the clearance number, rejection handling, and country-specific artefacts (KSeF numbers, VeriFactu QR codes, SDI receipt files) all attached to the Odoo invoice record.
If you run Odoo across France, Germany, Italy, Poland, Spain, or Belgium — or plan to expand into any of them — the time to configure this is before the mandate deadline, not after your finance team gets an authority rejection on a real customer invoice.
Connect Odoo 17 to every e-invoicing authority in minutes
Install the free Clearvo module, add your API key, and your Odoo invoices clear automatically. Sandbox included — no onboarding call required.
Get started free →