Odoo 20 is out, in Community and Enterprise. Before we offered it to anyone, we installed it on clean servers, both editions, natively and in Docker, carried data from Odoo 19 into it, ported custom modules and printed real documents. This is not a feature tour. It is what actually changes for a company that deploys Odoo 20 or moves to it, what is not ready yet, and a checklist for before you switch.

The server comes first

Odoo 20 runs on Ubuntu 24.04. It needs Python 3.12 or newer, and without it Odoo simply does not start. It expects PostgreSQL 16; below that Odoo only prints a warning, but that is not a setup to run a business on. On Ubuntu 22.04 the official package does not even install: the Python is too old, the database server is 14, and required packages are missing. So a 22.04 server that runs Odoo 19 today does not get 20 by adding a package. Plan a new 24.04 server and move to it.

One quiet change helps security: by default Odoo 20 listens only on the local address of its own machine, so it has to sit behind a web server like nginx, which is how it should run anyway. A setup that talked to Odoo directly on its port, or ran it in a container, has to set the listening address on purpose.

API keys now have a scope and an expiry

This is the change most likely to break something silently. In Odoo 20 an API key used by an integration must carry the RPC scope. Keys created in Odoo 19 have no scope, and we confirmed that Odoo 20 rejects such a key. A new key expires after 30 days by default (the choices are a day, a month or a year; "never" is for administrators only). An integration that works fine on launch day can stop a month later, with nobody remembering why.

Two more points for whoever looks after integrations. The classic XML-RPC interface still works in 20, but every call now logs a deprecation warning, and Odoo has announced its removal for Odoo 22. And the Enterprise edition adds a second kind of key for its own MCP server, which does not work for RPC. Keep them apart.

Custom modules need a real port

Odoo 20 replaces the two old access models, access rights and record rules, with a single access model. A custom module that still ships the old access files will not install on 20 at all. Odoo ships converters that rewrite most of this, and on the modules we ported both installed on 20 with their record rules intact, but every custom module still needs to be ported and installed on a test 20 database before the move.

Check your app list too. VAT and IBAN validation merged into the base module, batch transfers into Inventory, the org chart into Employees. The eCommerce wishlist and product comparison are gone without a successor. Field Service was rebuilt on Planning, with a different data model, so a company that uses it should treat that part as its own project.

Some data rules changed in ways an import will feel. A contact now counts as a company only when it has a tax ID, so companies imported without one arrive as individuals. Bank account fields were renamed, and the unit of measure on purchase lines and stock moves moved to a new field.

PDFs: same engine, do not switch yet

Invoices and delivery slips are still printed by wkhtmltopdf, now as its own module. It needs the build with patched Qt: the plain version from the Linux distribution printed our invoice without the company header and footer, with no error. Odoo also needs at least two workers to print at all.

Odoo 20 adds an optional new PDF engine. We printed ten real documents with both engines. With the new one the general ledger came out as two pages instead of six, silently dropping most of its rows; totals overlapped text on the invoice; files were several times larger. Its authors call it an early alpha, and a document that quietly loses accounting lines is worse than no document. Keep wkhtmltopdf for now.

No official Docker image yet

At the time of writing there is no official Odoo 20 image on Docker Hub. If you run Odoo in containers, you build the image yourself from Odoo's official package (for Enterprise, from the package you download with your own subscription), set the listening address, and use PostgreSQL 16. The Enterprise AI features also need the vector extension in the database.

Enterprise ships its own MCP server

Odoo 20 Enterprise includes a built-in MCP server. It installs together with the AI features when the database has the vector extension, and it gives an AI agent five read-only tools: look up models and fields, search records and read grouped figures, always within the rights of the user whose key it uses. It signs in with a key of its own scope or through OAuth. It is a way for an agent to read your data. Installing, backing up, moving and upgrading the Odoo it runs on is a different job.

Upgrading a 19 database in place: not yet

For Community, the community upgrade scripts have no Odoo 20 version published yet. For Enterprise, Odoo's own upgrade service returned errors on the days we tested, and we have not yet seen it carry a 19 database to 20 end to end. We would rather say "not yet" than guess, so an in-place upgrade from 19 to 20 is not something we offer today.

What works today is a new Odoo 20 database. Configure it first: country, chart of accounts, taxes and languages, because data loaded before the chart of accounts ends up with empty accounts. Then carry the business data over, compare both databases side by side, counts and content, every language included, and explain every gap before you switch. The Odoo 19 system stays untouched as the way back. The general rules from Odoo upgrades without the panic still hold: rehearse first, and make the live switch the boring part.

We did it on our own ERP first

We moved our own ERP this way: a new Odoo 20 database on a new server, the data carried over and compared, the old system kept as the way back. Two lessons did not fit in any checklist we had before.

First, a comparison proves that the copy is faithful, not that the original was right. Mistakes that sat unnoticed in the 19 data came across exactly as they were: a form with a mandatory question that could not be answered, a booking page whose only assigned person was an inactive user. The fix is simple and manual: after the move, walk through your public pages and forms like a customer would, on a phone and on a desktop.

Second, not every setting means the same thing in 20. Outgoing mail is the clearest case. Odoo 20 needs an alias domain set on the company; without it, emails that have no sender address of their own (portal messages, website forms, anonymous orders) fail instead of going out. And we turned scheduled actions back on one at a time, after checking the outgoing mail queue, rather than all at once.

Checklist before you switch to Odoo 20

  • A server with Ubuntu 24.04, Python 3.12 and PostgreSQL 16. A new server, not an operating system upgrade on the live one.
  • Enterprise: a subscription that covers 20, and the package downloaded with it.
  • Your app list checked against the modules merged or removed in 20. Field Service planned separately.
  • Every custom module ported to the new access model and installed on a test 20 database.
  • Every integration listed, with a new RPC-scoped key and its expiry date written down. A plan to leave XML-RPC before Odoo 22.
  • Country, chart of accounts, taxes and languages configured before any data is loaded.
  • Contacts without a tax ID reviewed: in 20 they are individuals, not companies.
  • The alias domain for outgoing mail set on the company.
  • Printing checked with the patched wkhtmltopdf, at least two workers, and a real invoice printed.
  • Both databases compared and every gap explained. Public pages and forms walked through on a phone and a desktop.
  • Backups running and a restore actually tested, not just scheduled. The old server kept as the way back.
  • Scheduled actions switched on one at a time.

FAQ

Can I upgrade my Odoo 19 database to Odoo 20 today?

Not in place yet. The community upgrade scripts for 20 are not published, and Odoo's own upgrade service has not yet been shown to carry a 19 database to 20 end to end. Today you move to 20 by starting a new Odoo 20 database, carrying your data into it and comparing both before you switch.

Does Odoo 20 run on Ubuntu 22.04?

No. The official package does not install there: Odoo 20 needs Python 3.12 and packages that 22.04 does not have, and it expects PostgreSQL 16. Use Ubuntu 24.04.

Should I move to Odoo 20 now or stay on 19?

Odoo gives each major version three years of standard support; for 19 that runs until September 2028. A new project on a new server can start on 20. An existing 19 system has time: move when your custom modules and integrations are ported and tested, not because a new number came out.

If you want an AI agent to walk this path with you, on your own server, showing every step before it runs, that is what Zoxron MCP does. It is free, and you can connect your agent at zoxron.com/connect.