Migrate Odoo 18 to 20
Last updated: October 2026
Migrating Odoo Community Edition from version 18 to 20 involves 315 models added or removed, 60 module merges, and 76 field renames. OCU automates this entire process — upload your database backup and download a production-ready database running Odoo 20.
New to Odoo upgrades? Start with our guide on how to upgrade Odoo Community Edition, which covers the options, the preparation and the steps that apply to every version.
What changes
Between Odoo 18 and 20, the following major changes occur: 17 model renames, 401 constraint changes, and 76 field renames, alongside the 315 models added or removed.
Counted from the Odoo source of each version and from the OCU migration mappings, step by step; Odoo’s internal test modules are left out because they never exist in a production database. Multi-step paths add up their steps.
- Two-step migration, one upload. OCU chains 18→19 and 19→20 into a single operation. Upload a v18 backup, download a v20 database. You never run Odoo 19 yourself.
- Two large restructurings in a row. Odoo 19 turns contracts into employee versions, drops unit of measure categories and renames groups_id. Odoo 20 then replaces ir.model.access and ir.rule with ir.access, removes res.bank and merges time off types into work entry types.
- 60 modules consolidated. Across both steps, 60 modules merge into their parent modules: HR contracts, website sale extras, POS payment terminals, base_iban and base_vat, and many localization sub-modules.
- PostgreSQL 16 for the result. Odoo 20 needs PostgreSQL 16 and Python 3.12. OCU runs the whole chain on PostgreSQL 16, so plan the Odoo 20 server before the production run.
What changes in detail
Here is a detailed breakdown of the structural changes between Odoo 18 and 20:
Step 1: Odoo 18 to 19
- 15 model renames. hr.contract becomes hr.version, procurement.group becomes stock.reference, stock.quant.package becomes stock.package, product.packaging becomes product.uom, stock.valuation.layer becomes product.value, and 10 others.
- groups_id becomes group_ids. On users, actions, views and menus. OCU rewrites the old name in record rules, saved filters and server action code.
- 207 constraint changes. 98 constraints added, 80 removed and 29 changed. Your data is checked against the new constraints before they apply.
Step 2: Odoo 19 to 20
- ir.access replaces ir.model.access and ir.rule. Standard access data is reloaded in the new format. Custom access rights and global record rules are converted; group record rules are kept and listed in the log for review.
- res.bank and hr.leave.type removed. Bank details are copied onto each bank account. Time off types become work entry types, and time off, allocations and accrual plans are re-pointed to them.
- 33 field renames, 35 module merges. product_uom becomes uom_id across inventory, purchase and manufacturing; acc_number becomes account_number. base_iban, base_vat, stock_picking_batch and the website sale wishlist and comparison modules merge into their parents.
- 194 constraint changes. 118 constraints added, 50 removed and 26 changed.
Cumulative impact
- 76 field renames across both steps. 43 in 18 to 19 (groups_id, tax_ids on order lines and others) and 33 in 19 to 20 (uom_id, account_number and others). Domain references, filters and server actions are updated at each step.
- HR changes twice. Contracts become versions in 19, then contract types become employee types and time off types become work entry types in 20. Employee data and time off history are carried through both steps.
Migration path
This is a 2-step migration handled automatically. You upload a version 18 backup and download a version 20 result — no intermediate steps required.
- Step 1: 18 → 19 — 129 models added or removed, 25 module merges, 207 constraint changes.
- Step 2: 19 → 20 — 186 models added or removed, 35 module merges, 194 constraint changes.
Before you migrate
- Back up your database. Create a fresh backup from Odoo’s database manager (Settings → Database Manager). The .zip format includes your filestore.
- Note your installed modules. Check Settings → Apps for any third-party or custom modules. These will need updated versions for Odoo 20 after migration.
- Run a test migration first. Test migrations are free and unlimited. Verify the result before committing a production credit.
- Plan your custom module updates. OCU handles standard Odoo modules. Custom or third-party modules need separate updates for Odoo 20 compatibility.
How it works
- Upload your .zip, .sql, or .dump backup. We auto-detect the source version.
- Migrate. We handle schema changes, module merges, field renames, and data migration across all 2 steps.
- Download your upgraded backup, ready for Odoo 20.
What OCU handles automatically
- Schema changes. Column types, table renames, new required fields — all structural database changes are applied automatically.
- Module merges. When Odoo consolidates modules between versions, OCU updates the module registry and migrates data to the new locations.
- Field renames. Fields that change names between versions are renamed in the database, including references in domains, filters, and server actions.
- Constraint validation. New CHECK and UNIQUE constraints are validated against your data, with automatic fixes for common violations.
- View updates. Inherited views are reset so Odoo 20 can reload them from the updated XML definitions.
- Filestore. Your attachments, images, and documents are preserved and included in the output.
Pricing
Test migrations are free and unlimited — run as many as you need to validate the upgrade. The output is neutralized (emails disabled, crons off) so it’s safe to explore but not for production use.
Production migrations cost one credit (99€), charged only when the migration completes successfully. If the migration fails, no credit is consumed. One credit covers the full path regardless of how many steps are involved (this 2-step migration costs the same as a single-step one).
Frequently asked questions
- Can I skip Odoo 19 and go from 18 to 20?
- You do not need to install Odoo 19. OCU runs 18→19 and 19→20 in one job: upload a v18 backup, download a v20 result.
- How much does an 18 to 20 migration cost?
- One credit (€99), the same as any migration regardless of the number of steps. Test migrations are free, and the credit is only charged when a production migration completes successfully.
- What do I need on the server for Odoo 20?
- Python 3.12 or newer and PostgreSQL 16 or newer. Odoo 18 did not enforce a minimum, so many Odoo 18 servers run an older PostgreSQL and need a database server upgrade before they can run 20.
- What about third-party and OCA modules?
- Their data tables are preserved and the modules stay installed, but their views are disabled during migration. After migrating, install Odoo 20 versions of them.
- Can I test the migration before paying?
- Yes. Test migrations are free. The test output has outgoing mail and scheduled actions switched off, so it is safe to explore without affecting your production system.
Other migration paths
- Odoo 18 to 19 — 129 models added or removed, 25 module merges.
- Odoo 19 to 20 — 186 models added or removed, 35 module merges.
- Odoo 17 to 20 — 470 models added or removed, 85 module merges.
- Odoo 16 to 20 — 604 models added or removed, 109 module merges.
- Odoo 15 to 20 — 751 models added or removed, 132 module merges.
Further reading
- How to Upgrade Odoo Community Edition — Step-by-step guide covering all migration approaches.
- Odoo Migration Checklist — Everything to prepare before, during, and after upgrading.
- Odoo upgrade errors — Fixes for the error messages that stop real upgrades.
- What's New in Odoo 19 — Key changes affecting the 18→19 migration step.
- What's New in Odoo 20 — Every verified breaking change in the 19→20 step.
- Pricing — Free test migrations, 99€ production credits.
Ready to migrate Odoo 18 to 20?
Free test migrations, unlimited runs. No credit card required.
Start your free test migration