Odoo 14 to 19 Migration
A guide to the breaking changes that affect custom modules across Odoo 14, 15, 16, 17, 18, and 19, covering XML views, JavaScript/OWL, the Python API, and field changes.
The problem
A module written for Odoo 14 crosses five major releases on the way to Odoo 19. Each release removes or changes APIs, view attributes, and frontend patterns, so the module must be reworked rather than copied forward.
Why it matters
Changes such as the OWL framework requirement and the deprecation of attrs and states mean views and widgets that worked on 14 will not render on 19 without edits. Field removals can also break stored data references.
Common symptoms
- Install errors referencing unknown view attributes
- OWL template parse failures and missing widgets
- Tracebacks for removed Python methods or fields
- Chatter and mail.thread features no longer wired up
Version-by-version summary
| Version | Key breaking changes |
|---|---|
| Odoo 15 | OWL framework introduced alongside legacy widgets. New odoo.define module system begins its transition. |
| Odoo 16 | attrs and states attributes deprecated on view fields. Backend asset bundling reworked. Several Python API helpers renamed. |
| Odoo 17 | OWL becomes the required frontend framework. Many legacy web.Widget components removed. View modifier syntax tightened. |
| Odoo 18 | Further view and action cleanups. mail.thread inheritance and chatter integration adjustments. Field and method removals. |
| Odoo 19 | Continued removal of deprecated APIs and fields carried over from earlier releases. Stricter manifest and security validation. |
Example risk
A legacy widget defined for Odoo 14 must become an OWL component for Odoo 17 and later:
odoo.define('my_module.Counter', function (require) {
var Widget = require('web.Widget');
return Widget.extend({ /* legacy widget */ });
});On Odoo 17+ this is rewritten as an OWL component using @odoo-module and a template.
How to audit it
- Run a Migration Audit with source 14 and target 19.
- Scan XML for
attrs=andstates=. - Search JavaScript for
odoo.defineandweb.Widget. - Verify field references against the Odoo 19 source.
How Odoo Doctor helps
The Migration Audit scans your module ZIP and reports version-specific risks with remediation guidance, grouping findings so you can address frontend, view, and field changes in order.
Manual testing needed
Install on a clean Odoo 19 database. Exercise every view, OWL component, computed field, server action, and mail.thread feature, and confirm record rules still apply as expected.
Map the gap from 14 to 19
Scan your module and review version-specific migration risks.
Run Migration AuditFrequently asked questions
Can I skip directly from Odoo 14 to Odoo 19?
Technically you rewrite the module for 19, but breaking changes accumulate across five releases. Reviewing each version's removals to fields, view attributes, and JavaScript reduces surprises during the rewrite.
What is the single biggest change between Odoo 14 and 19?
Frontend JavaScript. OWL arrived in 15 and became required from 17, so odoo.define and web.Widget components must be rewritten as OWL components and templates.
Do attrs and states still work in Odoo 19?
They were deprecated in Odoo 16 and should be replaced with direct invisible, readonly, and required attributes bound to field expressions. Relying on them is not safe for a 19 target.
Does the audit cover Python API deprecations?
The Migration Audit performs static analysis on Python, XML, JavaScript, and data files and flags known deprecated patterns with file and line references for manual review.