Upgrading to Odoo 20: What Changes for Your Customizations
The Odoo 20 changes that break custom modules, reports and imports, and what to do about each one.
Updated October 2026
Most guides to Odoo 20 list new features. This one lists the changes that break custom work, because those decide how long an upgrade takes and what it costs. We checked each item against the Odoo 19 and Odoo 20 source code, not only the release notes.
Changes that affect custom modules
| Area | Odoo 19 | Odoo 20 | What to do |
|---|---|---|---|
| Access rights and record rules | ir.model.access grants operations, and ir.rule limits records. | One model, ir.access. A record with a group grants an operation, and grants add up. A record with no group restricts everyone, the administrator included. | Rewrite your security files for ir.access (ir.model.access.csv becomes ir.access.csv), then test every role logged in as a real user in that group. |
| Companies and people | A company_type choice, and is_company you can set. | company_type is gone. is_company is computed: a top-level contact with a tax ID counts as a company. | Update imports, views, filters and reports that set or read either field, and load tax IDs for company contacts. |
| Field change history | Tracking values are stored for every tracked change. | Tracking messages are built on the fly. Stored values move to a separate module, mail_tracking, that is not installed by default. | Code or reports that read tracking values need that module, or a rewrite. |
| Icons | Font Awesome. | Material Symbols. | Review custom views, templates and scripts that use Font Awesome classes. |
| PDF reports | One built-in engine, wkhtmltopdf. | Engines are separate modules: wkhtmltopdf, installed by default, and a new optional engine, Paper Muncher. | Test every custom report layout after the upgrade, and again if you switch engines. |
| Modules merged into core | stock_picking_batch, base_vat, hr_org_chart, and the eCommerce wishlist were separate modules. | Their features live in Inventory, the base module, Employees and eCommerce. Remote Work is merged into Employees. | Fix the dependencies in your custom modules' manifests. |
| Accounting structure | Account groups and asset models. | Parent accounts and depreciation models. | Review custom reports and code that use account groups or asset models. |
| Field Service (Enterprise) | Its own app. | Merged into Planning. | Port Field Service customizations to Planning. |
| Push notifications | Firebase. | Odoo's own service. | Check any custom mobile notification integrations. |
How we run an Odoo 20 upgrade
- Audit. We list your custom modules, third-party apps, reports and data quality issues, and check each against the table above.
- Port. We rewrite custom modules for Odoo 20, starting with security and anything that touches contacts.
- Test on a copy. We upgrade a copy of your database, then your team tests their own work on it while we fix what turns up.
- Go live. A planned cutover with a way back, then support while your team settles in.
We already build and run four of our own products on Odoo 20, so we work from the source code, not from guesses. Our Odoo services.
Want a second pair of eyes on your upgrade?
Book a free call. Bring your list of custom modules, and we will tell you which of these changes hit you.