Odoo 15 to 18 Migration
Plan the move from Odoo 15 to 18 by understanding the breaking changes across 15, 16, 17, and 18 that affect views, JavaScript, fields, and the Python API in custom modules.
The problem
A module built for Odoo 15 must absorb three releases of change to reach 18. The frontend framework requirement, view attribute deprecations, and field removals all combine, so the module needs deliberate rework rather than a version bump in __manifest__.py.
Why it matters
Skipping these changes produces install failures and broken interfaces. Deprecated attrs blocks and legacy widgets are common causes of views that do not render on 18.
Common symptoms
- Manifest install warnings about asset declarations
- Views failing to render due to deprecated attributes
- OWL components throwing errors in the console
- Tracebacks for removed fields or renamed methods
Version-by-version summary
| Version | Key breaking changes |
|---|---|
| Odoo 15 | OWL components run alongside legacy web.Widget. odoo.define is still common but the new module system is available. |
| Odoo 16 | attrs and states attributes deprecated on view field tags. Asset bundle declarations move into __manifest__.py. Some ORM helpers renamed. |
| Odoo 17 | OWL becomes the required frontend framework. Many legacy widgets removed. View modifier expressions replace dictionary-style attrs. |
| Odoo 18 | Action and view cleanups, chatter and mail.thread adjustments, and removal of fields and methods deprecated in earlier releases. |
Example risk
A readonly modifier expressed with attrs on Odoo 15 must be rewritten as a direct expression for Odoo 16+:
<field name="user_id"
attrs="{'readonly': [('state', '=', 'done')]}"/><field name="user_id"
readonly="state == 'done'"/>How to audit it
- Run a Migration Audit with source 15 and target 18.
- Check
__manifest__.pyasset declarations and dependencies. - Scan XML views for
attrsandstates. - Review OWL components and field references against Odoo 18.
How Odoo Doctor helps
The Migration Audit scans your module ZIP and reports the specific view, JavaScript, and field risks between Odoo 15 and 18 with file-level references and remediation guidance.
Manual testing needed
Install on a clean Odoo 18 database and test every view, OWL component, computed field, server action, and access rule before promoting the module.
Prepare your 15 to 18 upgrade
Scan your module and review prioritized migration risks.
Run Migration AuditFrequently asked questions
How different is Odoo 15 from Odoo 18 for custom modules?
Significantly. The frontend moves fully to OWL by 17, attrs and states are deprecated in 16, and 18 removes APIs that were only deprecated earlier. Most non-trivial modules need view and JavaScript edits.
Will my OWL components from Odoo 15 still work in 18?
Early OWL components usually need adjustments because the component API, services, and registries evolved across 16, 17, and 18. Test each component in a clean target database.
What should I check in __manifest__.py first?
Confirm the assets bundle declarations use the 16+ format, update the version string, and verify every dependency module exists in the target edition before installing.
Does the audit guarantee the module will install on 18?
No. The Migration Audit is static analysis that flags known risks with file and line references. Runtime installation and testing in a clean Odoo 18 database is still required.