This guide shows where Odoo keeps an invoice's unique identifiers and how to read one for an invoice that has already been sent, for example when a customer asks for the invoice UUID. The short answer: standard Odoo has no general UUID on invoices and no button to generate one, but an invoice sent through Peppol carries a Peppol message ID that you can export from the invoice list. Without Peppol, the invoice number is the unique reference Odoo holds.
It is written for accountants and finance staff.
Before you start
- Version and edition: verified on Odoo 19. The Peppol connection is part of Odoo Community, so the steps apply to Community and Enterprise. In Enterprise the app is called Accounting; in Community it is called Invoicing, with the same Customers menu.
- Apps: the Accounting (or Invoicing) app. To have a Peppol message ID at all, Peppol must be enabled in Accounting > Configuration > Settings, under the Electronic Invoicing section, where the Enable PEPPOL option and then the Activate Peppol button register your company.
- Access rights: access to the Accounting or Invoicing app, and the right to export data. Administrators have the export right by default; other users need an administrator to grant it.
- Terms: Peppol is a European network that delivers invoices as structured electronic files between companies' accounting systems. A Peppol message ID is the code Odoo stores on an invoice when the Peppol access point, the connector into the network, accepts it. A UUID (universally unique identifier) is a long code software uses to tell documents apart.
Where Odoo keeps unique invoice identifiers
The core invoice record in Odoo does not carry a UUID. It carries the invoice number, such as INV/2026/00042, and Odoo will not let two posted entries in the same journal share a number. The invoice number is also what Odoo writes into the identifier element of the UBL file, the structured XML version of the invoice used for Peppol. That XML file contains no separate UUID.
Identifiers that look like a UUID appear only when an invoice passes through an e-invoicing network or a national e-invoicing system:
- Peppol message ID. When Odoo hands an invoice to the Peppol access point, the access point returns a message ID and Odoo stores it on the invoice. This applies to any company that sends through Odoo's Peppol connection, including Belgian companies.
- Country e-invoicing UUIDs. Several country modules store a UUID tied to the local system: Mexico (shown as Fiscal Folio), Egypt (Document UUID), Saudi Arabia, Jordan, Serbia, Turkey and Uruguay. The Mexican and Uruguayan modules are part of Odoo Enterprise. Denmark's Nemhandel connection stores a similar message ID.
Country UUIDs exist only for companies using that country's module. Fiscal Folio, for example, is filled in by the Mexican tax authority when it stamps the invoice, so it will not appear on an invoice from a Belgian company.
Export the Peppol message ID
Odoo saves the Peppol message ID when the invoice is sent, but the invoice form does not display it. The simplest way to read it is an export from the invoice list:
- Open the Accounting app, then go to Customers > Invoices. The list of customer invoices appears.
- Tick the checkbox next to the invoice. You can select several invoices at once. An Actions menu (the gear icon) appears above the list.
- Open the Actions menu and choose Export. The Export Data window opens.
- Type "Peppol" in the search box under Available fields. The PEPPOL message ID field appears in the list.
- Add PEPPOL message ID to the Fields to export list.
- Click Export. Odoo downloads a spreadsheet file.
The file shows one row per invoice with the message ID in its own column. You can save the field list as a template in the same window for next time.
If Export is missing from the Actions menu, your user lacks the export right and an administrator needs to grant it.
Check that it worked
- In the Invoices list, enable the optional PEPPOL status column, or group the list by Peppol status from the search options.
- Pick one invoice whose status is Done and export it as described above.
- Open the file. Success looks like a filled PEPPOL message ID cell that does not start with "demo_".
To cross-check a single invoice on screen, turn on developer mode, a setting that shows extra technical options: open the Settings app, scroll to Developer Tools and click Activate the developer mode. The invoice's Other Info tab then shows a Peppol info section. It shows the Peppol status, and it appears only when the invoice has a message ID.
What the Peppol statuses mean
A message ID exists only if the invoice actually reached the Peppol access point:
- Ready to send or Queued: the invoice has not been handed to Peppol yet, so there is no message ID.
- Error: sending failed and no message ID was stored.
- Pending Reception or Done: the access point accepted the invoice and the message ID is on the record.
An empty cell means the invoice was never sent through Peppol. A message ID that starts with "demo_" was created while the Peppol connection was in demo mode, a test mode that sends no real data, so it does not correspond to a real Peppol message and should not be given to the customer.
When the invoice was not sent through Peppol
If the invoice went out by email or post, Odoo holds no UUID for it, and there is no standard way to generate one afterwards. Ask the customer which reference their system expects:
- The customer receives invoices through Peppol. Sending this invoice through Peppol gives it a message ID. Your company must be registered on Peppol, and the customer's contact must show Partner is on Peppol. The invoice's status then becomes Ready to send, and you can send it from its Send button with the by Peppol option.
- The customer only needs a unique reference. Give them the invoice number. It is unique within the journal, and it is the identifier Odoo puts in the invoice's structured data.
Storing a randomly generated UUID on invoices that never went through an e-invoicing network is not available in standard Odoo and would need a customization.
Differences between Odoo 17, 19 and 20
In Odoo 17 the field has the same label, PEPPOL message ID, and the export steps are the same. The Odoo 17 invoice form shows the Peppol status but not the message ID.
In Odoo 19 the invoice form shows the Peppol status only in developer mode, on the Other Info tab. For vendor bills received through Peppol, Odoo 19 also writes the line "Peppol document UUID" with the ID into the bill's chatter, the message log at the side or bottom of the record.
In Odoo 20 the label changes to Peppol message ID, and the status list gains Received, Approved and Rejected for invoices where the customer has sent back a business response. The message ID is still not on the invoice form, so the export still applies.
Steps verified on Odoo 19. Menus and labels can differ on other versions.
Common questions
Does Odoo generate a UUID for every invoice?
No. Standard Odoo stores no general UUID on invoices and has no button to generate one. A UUID-style identifier exists only when the invoice goes through Peppol or a country e-invoicing integration that stores one.
Where is the Peppol message ID on an Odoo invoice?
Odoo stores it on the invoice when the Peppol access point accepts the document, but the invoice form does not display it. In the Accounting app, open Customers > Invoices, select the invoice, choose Export from the Actions menu and add the PEPPOL message ID field.
Is the Fiscal Folio the invoice UUID?
Only for Mexican companies. Fiscal Folio is the UUID the Mexican tax authority returns when it stamps an electronic invoice, and the field comes from the Mexican e-invoicing module, so it does not exist on a Belgian invoice.
Why does my Peppol message ID start with demo_?
The invoice was sent while the Peppol connection was in demo mode, a test mode that sends no real data and creates placeholder IDs. That ID does not match a real Peppol message, so it should not be given to the customer.
What can I send a customer if the invoice was not sent through Peppol?
The invoice number, which Odoo keeps unique within the journal for posted invoices and writes into the invoice's UBL file as its identifier. If the customer receives invoices through Peppol, sending the invoice that way gives it a message ID.
Talk to the team.
If you are setting this up, or Odoo is not behaving the way this guide describes, book a 30-minute call. We will look at your configuration and tell you what it needs. Calgary studio, in-house team, no offshore handoffs.
Book the call →