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:
| Version | Released | Standard support until | Status now |
|---|---|---|---|
| 16.0 | October 2022 | September 2025 | Extended support only (paid, Odoo.sh / on-premise) |
| 17.0 | November 2023 | September 2026 | Extended support only (paid, Odoo.sh / on-premise) |
| 18.0 | October 2024 | September 2027 (planned) | Standard support |
| 19.0 | September 2025 | September 2028 (planned) | Standard support |
| 20.0 | September 2026 | September 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, thenproductioninstead oftest. - 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_uaamong 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:
| Step | What changes for custom code |
|---|---|
| 16 → 17 | attrs 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 → 20 | Access 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:
- 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.
- Run a test upgrade (upgrade service or OpenUpgrade on a copy) to confirm the standard part converts cleanly.
- 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.
- Make them work on the upgraded database: write pre- and post-migration scripts (Odoo's
upgrade-utillibrary renames fields, models and XML IDs) and re-enable views the upgrade disabled; the upgrade report lists them. - Test and rehearse: request fresh test databases as you go and do a full rehearsal just before go-live.
- 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.