Skip to Content
Migration 8 min read

Migrating Odoo 16, 17 or 18 to Odoo 19: a practical guide

Odoo 16 and 17 no longer get standard support, and Odoo 20 was released in September 2026. If your database is on 16, 17 or 18, this guide explains which upgrade path applies to you, what changes in custom code between versions, and how to run the upgrade without surprises.

In short: on Enterprise, use Odoo's upgrade service: it is included in the subscription and can go from 16 straight to 19, but your custom modules must be ported first. On Community, the open-source route is OCA OpenUpgrade, one version at a time. Either way: test upgrade, port the code, rehearse, then upgrade production.

Why upgrade now: support status

Each Odoo major version gets three years of standard support, the only phase with security updates. After that comes extended support: a paid option available only on Odoo.sh and on-premise. Status according to Odoo's support policy in November 2026:

VersionReleasedStandard support untilStatus now
16.0October 2022September 2025Extended support only (paid, Odoo.sh / on-premise)
17.0November 2023September 2026Extended support only (paid, Odoo.sh / on-premise)
18.0October 2024September 2027 (planned)Standard support
19.0September 2025September 2028 (planned)Standard support
20.0September 2026September 2029 (planned)Standard support

Two more reasons apply to Enterprise customers. On Odoo Online a major upgrade is mandatory every two years (upgrade documentation). And the Enterprise subscription agreement defines covered versions as the three most recently released majors; customers on an older version can be charged an extra fee of 25% of the annualized subscription price. Community on your own server can stay on any version indefinitely, but without security fixes.

Odoo 19 or straight to Odoo 20?

Odoo lets you upgrade to any major version still under standard support. At the time of writing (November 2026), two things point to 19 as the practical target for databases with custom modules:

  • The upload form on upgrade.odoo.com lists 19.0 as the newest target version, and the OCA OpenUpgrade 20.0 branch does not contain migration scripts yet.
  • Odoo 20 changes more of the technical foundation: access rights and record rules are merged into one model, the web client moves to OWL 3 without jQuery, and account groups are replaced by parent accounts. Every custom module needs more porting work.

A sensible plan is to move to 19 now and treat 20 as a separate, later step. Odoo 18 is also a valid target, but it has the shortest support left (until September 2027).

Enterprise: the Odoo upgrade service

From the upgrade documentation:

  • Included with Enterprise, together with support to fix discrepancies in the upgraded database.
  • Versions can be skipped: 16.0 → 19.0 is one upgrade request (Odoo's own example is 16.0 → 18.0).
  • All hosting types: Odoo Online (database manager), Odoo.sh (Upgrade tab and a staging branch) and on-premise with python <(curl -s https://upgrade.odoo.com/upgrade) test -d <db> -t 19.0, then production instead of test.
  • Test first: the test database is neutralized (scheduled actions off, outgoing mail replaced by a fake server, payment providers in test mode), comes without the filestore and includes an upgrade report. You can request as many as you need.
  • Custom code is your job: a database with custom modules "cannot be upgraded until a version of your custom modules is available for the target version". In-house and third-party modules without a maintenance contract, data clean-up and training are not covered.

Community: OCA OpenUpgrade

Odoo's upgrade scripts are not open source. For Community, the open-source route is OpenUpgrade by the Odoo Community Association (OCA):

  • One version at a time: "Skipping versions is not supported". From 16 to 19 that means three runs: the 17.0, 18.0 and 19.0 branches.
  • 19.0 is active: core apps such as accounting, sales, purchase, inventory, manufacturing, CRM, project, employees, website, eCommerce and point of sale are marked done in its coverage list, but hundreds of modules have no status yet (the Ukrainian l10n_ua among them). Check every module you use.
  • 20.0 is not ready: the branch exists but has no migration scripts yet (November 2026).
  • You run it yourself, on a copy of the database, and cover gaps with your own migration scripts.

For a small database or one with messy history, a fresh Odoo 19 database with master data and open balances migrated can cost less than three chained OpenUpgrade runs. Decide after a trial run, not before. Moving data into a clean database is what our ERP migration service does.

What breaks in custom modules

Odoo's porting guide lists the typical install errors: invalid dependencies, syntax changes (assets, OWL, attrs), renamed or removed fields, models and views, XPaths whose targets moved, and renamed methods. The main changes, checked in the Odoo source code and the ORM changelog:

StepWhat changes for custom code
16 → 17attrs and states removed from views (use invisible / readonly / required expressions); name_get() deprecated in favour of display_name; new _read_group() signature; Python 3.10+.
17 → 18<tree> views become <list> (view_mode "list,form"); name_get() removed; group_operator renamed aggregator; check_access_rights() / check_access_rule() replaced by check_access() / has_access(); account.account gets company_ids instead of company_id.
18 → 19<group expand> no longer valid in search views; _sql_constraints replaced by models.Constraint; read_group(), odoo.osv, record._cr / _uid / _context and type="json" routes deprecated; employee contracts merged into Employees.
19 → 20Access rights and record rules merged into ir.access (ir.access.csv); account groups replaced by parent accounts; odoo.osv, the group_operator alias and the old access-check methods removed; OWL 3 and no jQuery; Python 3.12+ and PostgreSQL 16.

Deprecated APIs usually keep working, with warnings, for a version or two and are then removed. Fix them while you port, or the next upgrade starts with a backlog.

A step-by-step upgrade plan

Adapted from Odoo's guide to upgrading a customized database:

  1. Freeze and challenge customizations. Stop new development, compare every custom feature with what standard Odoo 19 now does, and drop code that is no longer needed.
  2. Run a test upgrade (upgrade service or OpenUpgrade on a copy) to confirm the standard part converts cleanly.
  3. Port custom modules on an empty Odoo 19 database: install them one by one, fix tracebacks and warnings, check views, reports, email templates, server and automated actions.
  4. Make them work on the upgraded database: write pre- and post-migration scripts (Odoo's upgrade-util library renames fields, models and XML IDs) and re-enable views the upgrade disabled; the upgrade report lists them.
  5. Test and rehearse: request fresh test databases as you go and do a full rehearsal just before go-live.
  6. Upgrade production at a quiet time. The database is unavailable while it runs and changes made after the dump are not carried over. Merge the returned filestore with the production one.

Test checklist

Odoo's upgrade documentation recommends testing at least:

  • Views, especially the ones deactivated in the test database.
  • Reports and printed documents, website pages and mail templates.
  • Creating and editing records, translations, saved filters and exports.
  • Integrations (EDI, APIs), automated and server actions.
  • At least one end-to-end flow: purchase → receipt → sale → delivery → invoice → credit note → accounting reports → eCommerce order.

What drives the effort

There is no universal price for an upgrade. The main drivers are:

  • The number and size of custom modules, and how much of them standard Odoo 19 can now replace.
  • Whether every third-party module you use (OCA, Odoo Apps) is available for Odoo 19.
  • How many versions you cross: one request on Enterprise, one OpenUpgrade run per version on Community.
  • Integrations with other systems, data volume and data quality.

A trial upgrade plus an inventory of modules gives a reliable estimate. Version upgrades are part of our Odoo support service, and porting custom modules is custom development work. If you are also weighing editions, read Community vs Enterprise; for what Odoo 20 adds, see Odoo 20 AI features.

Sources

Planning an Odoo project?

45 minutes with a senior consultant. We'll map your current stack, the gaps, and a rough budget. Zero pressure, zero generic decks.

  • You'll leave the call with a one-pager: scope, timeline and price band.
  • If we're not the right fit, we'll point you to someone who is.
  • NDA on request, before the call, no questions.
// or reach us directly
info@erpconsulting.pro

Tell us about your project

All fields optional except email. We respond within one business day.

Thanks — we'll be in touch.

A senior consultant will reach you within 1 business day to schedule the call.