We Do Dev Work
We Do Dev Work
Software developmentWeb app
• 17 Oct 2026

Odoo and Peppol: e-invoicing in Belgium

Odoo and Peppol: e-invoicing in Belgium

Short answer: since 1 January 2026, Belgian VAT-registered businesses must send each other structured e-invoices, by default over the Peppol network in Peppol BIS format. Odoo 17, 18 and 19 include Odoo's own Peppol access point, which is free and also works in Odoo Community. If Odoo is your only invoicing system, you activate Peppol, check your customers' identifiers and you are mostly done. You need a connection when a second system is involved: invoicing runs in Billit, your accountant books in Silverfin, Exact Online, Octopus or Yuki, or you run several companies. Then the question is which system sends, which one receives, and how the documents get to the others. A custom one-way connection takes 6 to 10 days (about €3,000 to €5,500), a two-way one 12 to 20 days (about €6,000 to €11,000). This post zooms in on Peppol; for the full picture of connecting Odoo to accounting packages, read our Odoo accounting integration guide.

What changed for Belgian companies in 2026

The rules, as the federal e-invoicing portal einvoice.belgium.be describes them:

  • Who: every Belgian business with an active VAT number, for invoices to other Belgian VAT-registered businesses. This includes companies under the small business exemption (turnover up to €25,000) and, at least for receiving, the special agricultural scheme.
  • Exceptions: no obligation to send for bankrupt businesses, businesses that only perform transactions exempt under article 44 of the VAT Code, foreign businesses without a Belgian establishment, and flat-rate taxpayers (a regime that ends by 1 January 2028 at the latest). Invoices to consumers are out of scope, but a B2C-only business must still be able to receive structured invoices from its suppliers.
  • Format: structured, via Peppol, in Peppol BIS format, unless both parties agree on another format that respects the European standard EN 16931. A PDF by email no longer counts for B2B. Peppol BIS Billing 3.0 is that standard bound to UBL, for invoices and credit notes.
  • Credit notes: a document that corrects a structured invoice is itself a structured invoice, so credit notes go over Peppol too.
  • Tolerance: the general tolerance period covered January to March 2026 and has ended. For self-billing a targeted tolerance ran until 30 June 2026. After that, only exceptional technical problems are assessed case by case.
  • Penalties: not having the technical means to send and receive structured invoices costs €1,500 the first time, €3,000 the second and €5,000 after that. A second offence only counts if it is found at least three months after the previous one. The existing fines for missing or incorrect invoices still apply.
  • VAT deduction: as a buyer you need a regular invoice, which for in-scope transactions means a structured one, to deduct VAT. There is a "substance over form" exception, but you can still be fined for not being able to receive.
  • E-reporting: phase one sends no invoice data to the government. On 18 July 2026 the Council of Ministers approved a preliminary draft law for near-real-time e-reporting, envisaged from 1 January 2028, which would replace the annual client listing. It is not law yet.

One practical fallback: if your customer cannot technically receive a structured invoice, you may issue a paper or PDF invoice, and the customer must fix its setup without delay. Check your own situation on the official site; this post describes the rules, it is not tax advice.

What Odoo does out of the box

According to Odoo's documentation for versions 17, 18 and 19, Odoo is itself a Peppol access point and SMP. Odoo's Belgian page promises free, unlimited sending and receiving, and the docs state that registration is free and available in Community. Setup:

  1. Go to Accounting ‣ Configuration ‣ Settings, section Electronic Invoicing, and click Activate Peppol.
  2. Identify the company. For Belgium, Odoo's localization docs use EAS code 0208 with your enterprise (KBO) number as endpoint. Activation is usually done within a day.
  3. Choose the role: Sending & Receiving or Sending Only. Incoming documents become draft vendor bills in a purchase journal, or files in a Documents folder.
  4. Verify each customer: in developer mode, click Verify on the contact. Odoo marks the endpoint as Valid when the customer is on the network.
  5. Set the customer's invoice sending method to by Peppol. A sent invoice shows status Done once it reaches the customer's access point.

The limits matter more than the setup. Odoo's Peppol only knows about Odoo. It does not tell Billit or your accountant's software what it sent or received. "Done" means delivered to the other access point, not booked by your customer. Switching providers means deregistering first, because a company can only be registered with one access point at a time. And on Odoo 16 or older there is no standard module; you upgrade, buy a third-party Peppol module that connects to a commercial access point, or build a connection.

When you need a connection anyway

Your situationStandard Odoo enough?What to connect
All invoicing in Odoo, accountant works in OdooYesNothing. Activate Peppol, verify customers.
Invoicing in Odoo, accountant works in SilverfinYesOdoo's built-in Silverfin sync (set up with an Odoo API key).
Orders and stock in Odoo, invoices sent from BillitNoOdoo to Billit via the Billit API, send status back to Odoo.
Odoo sends, accountant books in Exact Online, Octopus or YukiPartlyPick one receiving access point; push invoices and payments to the accounting package (connector or custom).
Purchase invoices arrive in Billit or the accountant's tool, but Odoo needs them for purchase matchingNoPull incoming UBL invoices into Odoo as vendor bills.
Several companies, some in Odoo, some elsewherePartlyEach entity has its own enterprise number and Peppol ID; route per entity and avoid double registrations.
Odoo 16 or olderNoUpgrade, third-party module, or a connection to an access point such as Billit.

How an Odoo to Billit connection works

There is no Billit app in the Odoo store, so this is custom work on Billit's REST API, which supports OAuth or an API key and has a free sandbox. Billit's documentation describes the pieces you need:

  • Create and send: the invoice is created as an order (v1/orders) and sent with /v1/orders/commands/send and transport type Peppol.
  • No silent email fallback: since February 2026 Billit returns the error TheCustomerIsNotActiveOnPeppol instead of emailing a PDF. Your Odoo needs to show that error to someone.
  • Status back: webhooks push status changes to an HTTPS endpoint, signed with a secret.
  • No duplicates: an Idempotency-Key header means a retry can never send the same invoice twice; a reused key returns 409.
  • Identical totals: Billit recalculates VAT unless you pass VatGroups with Odoo's own totals per rate.
  • Receiving: an inbox API returns incoming invoices and their UBL files. sFTP is an alternative.

Billit also says you do not need to register on Peppol through Billit if you only send. That gives you a clean split: Billit sends, Odoo (or the accountant) receives. On the Odoo side the connection runs as a module on Odoo.sh or on-premise, or as a separate service using Odoo's API; our hub guide explains which Odoo plan that requires.

Where Peppol in Odoo goes wrong

  1. Wrong VAT or KBO number on the receiver. In Belgium every service provider must register companies at least on their enterprise number (scheme 0208). Odoo prefills the endpoint from the contact; a typo or an old VAT number means "not found". Billit's error for this can also point at your own data: if the VAT or company number in the invoice does not match your Billit account, it fails too.
  2. Receiver not on Peppol. Check with the official Peppol directory using 0208: plus the enterprise number. That lookup shows who can receive, not who can send.
  3. Duplicates via two access points. Odoo and Billit both send the same invoice, or a retry sends it again. Peppol does not detect duplicates; the official FAQ puts that responsibility on the accounting system. Decide per invoice type which system sends, and switch the other off.
  4. Credit notes. A credit note on a structured invoice must go via Peppol and refer to the original. A credit note in 2026 for a 2025 PDF invoice has no format requirement. In Billit's API credit note amounts stay positive; sending negative invoice lines instead is a classic mistake.
  5. UBL validation errors. Billit lists the usual ones: VAT category rule BR-S-08, line amounts that do not add up, a missing buyer reference or order number, empty elements. Since 2026, rounding on e-invoices applies to the total per VAT rate, not per line, so Odoo's rounding setting matters.
  6. Incoming invoices that never reach the accountant. Your company receives via one access point. If that is Odoo but your accountant works in Exact or Octopus, supplier invoices sit as drafts in Odoo. Without a structured invoice, VAT deduction becomes a discussion. Delivery normally takes minutes to a few hours; more than one business day means ask your provider.

Price and timeline

Activating Odoo's own Peppol and cleaning up customer identifiers is configuration, not development. Often a few hours, which fits our strip card. A custom connection is billed at €495 per senior day (excl. VAT):

  • One way, for example Odoo invoices and credit notes sent through Billit with status back in Odoo: 6 to 10 days, about €3,000 to €5,500.
  • Two way, adding incoming invoices into Odoo, payments, several companies or routing between Odoo and the accountant's package: 12 to 20 days, about €6,000 to €11,000.

Expect 3 to 6 weeks including a test month. More VAT scenarios (reverse charge, exempt lines with different reasons) and more entities push it up. See how we estimate and report in our projects.

How we build it

  • Routing on paper first: per company and per document type, who sends, who receives, where it gets booked. Your accountant signs off.
  • Sandbox before production: Billit's sandbox and test Peppol participants, with your real invoice types.
  • Validate before sending: UBL checked against Peppol rules, so errors show in Odoo, not at your customer.
  • Queue, idempotency, webhooks: every invoice gets a status in Odoo; retries never duplicate.
  • Alerts: failed sends, unregistered customers and expiring keys go to a person, not a log nobody reads.

When to call a specialist

Do it yourself if Odoo is your only invoicing system and your customers verify as Valid. Get help when invoices bounce for reasons you cannot read, customers receive invoices twice, supplier invoices do not reach your accountant, you run several entities across Odoo and Billit, or you are still on Odoo 16 or older. Since April 2026 those are not just annoyances; they can mean fines.

Want Odoo, Peppol and Billit or your accountant's software to work as one flow? See our Odoo integrations service, or send us your setup: Odoo version, number of companies, which tools send and receive, and invoices per month. We reply with what we would build and roughly how many days it takes.

Frequently asked questions

Is Peppol in Odoo free?

Yes, according to Odoo. Its documentation for versions 17 to 19 says Peppol registration is free and available in Community, and Odoo's Belgian page promises free, unlimited sending and receiving.

Is there an Odoo Billit connector?

We found no Billit app in the Odoo store. A connection is built on Billit's REST API: invoices are sent as orders over Peppol, status comes back by webhook, and incoming invoices are fetched from Billit's inbox.

Can Odoo and Billit both be registered on Peppol?

Not for receiving the same company's invoices: a company is registered with one access point at a time. Billit does not require registration if you only send through it, so a common split is Billit sending and Odoo receiving.

What are the penalties for not using e-invoicing in Belgium?

Not having the technical means to send and receive structured invoices costs €1,500, then €3,000, then €5,000 per offence. Existing fines for missing or incorrect invoices also still apply. Check einvoice.belgium.be for your situation.

Is e-reporting mandatory in Belgium from 2028?

Not yet. A preliminary draft law approved on 18 July 2026 envisages near-real-time e-reporting from 1 January 2028, but it still has to pass parliament.

Got a dev problem?

You don't need to know exactly what's wrong. That's kind of the point.

Send the signal