/
Free Consultation
All articles
Guides6 min read

Upgrading to Odoo 20: A Checklist for Management

The costly upgrade problems are the ones that throw no error. Lessons from a real Odoo 19 to 20 migration, and a checklist for the people who sign off.

By Tim Keyklik

This is part 7, the final part, of our Odoo 20 series. The earlier parts covered what Odoo 20 adds. This one covers what it takes to get there safely. It is written for the people who approve the budget and sign off the go-live, not for the people who write the code.

The main lesson fits in one sentence: the expensive upgrade problems are not the ones that crash. They are the ones that keep running and quietly do the wrong thing.

Lessons from a real migration

We ported the custom modules of an Indonesian restaurant group from Odoo 19 to Odoo 20: a POS import from a third-party system, inter-company stock transfers, central-kitchen bill-of-materials distribution, tiered purchase-order approval, and a module for attachments and receipt tolerances.

The changes that caused an error on first use were easy to find and fix. The ones worth worrying about produced no error at all:

  1. Costs that would have flipped sign. Odoo 20 records the value of outgoing stock differently. A customisation that carried unit cost from one company to another would have booked every receipt at a negative cost. Nothing would have crashed. The numbers would simply have been wrong.
  2. An approval lock that stopped locking. After a purchase order was submitted, certain fields were meant to be locked, including the unit of measure. Odoo 20 renamed that field, so the lock kept looking for a name that no longer existed, and the field became editable again without anyone being told.
  3. Buttons that went invisible. Odoo 20 changed its icon set. Custom buttons using the old icons still worked, but showed up blank.
  4. Access rules that could lock everyone out. Odoo 20 merged its two permission systems into one. A word-for-word translation of the old rules would have blocked every user from part of the system.
  5. POS customisations that simply stopped running. The rewritten POS session closing (see part 2) left nothing for the old customisations to attach to. They didn't fail. They were just never called.

All of these were caught during the port, before go-live, by checking every custom module against the new version rather than waiting for something to break. Searching for removed features is not enough. The cost hides in things that changed meaning while keeping their name.

One more finding is good news: a sixth module was retired instead of ported. It only existed to allow longer journal codes, and Odoo 20 removed that limit itself. Porting it word for word would have reintroduced a limitation. Every upgrade should include the question: which of our customisations does the new version make unnecessary?

To double-check our work, we compared results against the live Odoo 19 database in read-only mode (session entries, payment dates, configuration) through ODXProxy, the gateway we build at Keyklik. That gave us a way to verify without any risk of changing production data.

Integrations: four things that can break without a warning

If other systems talk to your Odoo, such as a webstore, a delivery platform, a mobile app, a BI dashboard or a backup script, check these:

  1. Integration keys are now tied to one purpose. In Odoo 20, an access key only works for the kind of connection it was issued for. Older all-purpose keys may stop working. Plan to reissue integration keys after the upgrade, and test them before cut-over.
  2. Files and images come back in a different format. Systems that download invoice PDFs, product photos or attachments from Odoo need adjusting.
  3. Some records were renamed or merged. Examples are unit-of-measure fields, scrap records, leave types and account groups (see parts 3 to 5). An integration that reads them will fail, or worse, silently get nothing.
  4. Database backups through the old remote method no longer work. If an automated script backs up or lists your databases that way, it will stop. Check that your backups still run after the upgrade. This is the one nobody notices until they need a backup.

The two-version clock

The classic connection methods many integrations use still work in Odoo 20, but Odoo has announced they are scheduled for removal in Odoo 22. That leaves about two major versions to move integrations to Odoo's newer interface. It is not urgent today, but it belongs in your IT budget for the next couple of years, not in a surprise later.

Running two versions side by side

During an upgrade, most organisations run Odoo 19 and Odoo 20 in parallel for a while: production on one, testing on the other. It helps if your apps connect through one gateway rather than each holding its own Odoo keys and connection details. Switching an app from the old instance to the new one, or reissuing keys, then happens in one place. That is the role a proxy layer such as ODXProxy plays. It doesn't change what Odoo 20 sends back, so apps still need the adjustments above, but it keeps the switch-over controlled.

The server underneath

Odoo 20 needs newer versions of its technical foundation (Python 3.12 and PostgreSQL 16 or later).

  • If Odoo hosts your system, this is mostly their responsibility. Confirm the timeline with them.
  • If you host it yourself or with a cloud provider, the upgrade may include an operating-system and database upgrade. Budget time for it, because it is a project in its own right.

Odoo 20 also introduces its own engine for producing PDF documents, alongside the old one. Print and compare your key documents (invoices, tax invoices, delivery notes, payslips, purchase orders) on the test system before go-live. Layout differences are easy to miss and awkward to explain to customers.

The sign-off checklist

Before approving go-live, ask your team or partner to confirm each item:

  1. Every custom module has been checked against Odoo 20, not just installed. Ask which ones were retired because core now covers them.
  2. Financial numbers match. Trial balance, stock valuation and receivables reconcile between the old and new systems on a test copy.
  3. Integrations have been tested end to end, with newly issued keys.
  4. Backups run, and a restore has actually been tested.
  5. Key documents print correctly.
  6. Users have rehearsed the changed routines: POS closing, scrap, leave requests, production warnings.
  7. There is a rollback plan with a named decision-maker and a deadline.

Planning your move to Odoo 20? See our services or contact the Keyklik team.

The Odoo 20 series

  1. What's New for Your Business
  2. Point of Sale for Restaurants and Retail
  3. Inventory and Manufacturing
  4. Accounting and Purchasing
  5. HR and Attendance
  6. AI Agents and MCP
  7. Planning the Upgrade (this article)

Note (DYOR — Do Your Own Research): This article is based on our own comparison of the Odoo 19 and Odoo 20 source code and on a migration project that, at the time of writing, has not yet gone live. It is not Odoo's official upgrade documentation. Every system is different. Verify against the official Odoo upgrade documentation and release notes, test on a copy of your own database, and consult your implementation partner, accountant and IT advisors before upgrading a production system.

#odoo#odoo-20#upgrade#migration#integration#odxproxy

Ready to start your digital transformation?

Talk to our team about your Odoo, ERP, or business integration needs.