Odoo 19 vs Odoo 20: Technical Differences and Migration Guide
Technical Comparison for Odoo Community Developers
For developers building custom addons for Odoo Community, comparing Odoo 19 and Odoo 20 involves much more than changes to the module folder structure.
There are 10 key technical areas that developers should carefully evaluate:
- Core Framework & ORM — Changes to Python APIs, models, fields, and methods.
- Database & PostgreSQL — Changes to database schemas, relationships, and system requirements.
- Security & Access Rights — Changes to ACLs, Record Rules, Groups, and permissions.
- XML Views & XPath — Changes to view structures and inheritance mechanisms.
- JavaScript & OWL — Changes to the frontend framework, components, and assets.
- API & Integration — Changes to external APIs, controllers, authentication, and integrations.
- Module Structure & Manifest — Changes to addon structures, dependencies, and module declarations.
- Background Jobs & Automation — Changes to cron jobs, scheduled actions, and background processing.
- Deployment & Dependencies — Compatibility requirements for Python, PostgreSQL, Linux, and external libraries.
- Migration & Compatibility — Impacts on custom addons and the overall upgrade process.
Important Note: As of November 2, 2026, technical differences should be verified against official Odoo 20 documentation and source code. Confirmed changes must be clearly distinguished from predictions, community discussions, or unverified technical claims.
1. Overview of Key Technical Differences
Available technical analyses indicate that Odoo 20 was released in September 2026, introducing significant framework-level changes compared to Odoo 19.
These changes extend beyond simply renaming security CSV files.
| Technical Area | Odoo 19 | Odoo 20 | Impact |
| Minimum Python Version | Python 3.10 | Python 3.12 | High |
| Minimum PostgreSQL Version | PostgreSQL 13 | PostgreSQL 16 | High |
| Access Rights | ir.model.access | ir.access | Critical |
| Record Rules | Separate ir.rule model | Consolidated into ir.access | Critical |
| Security CSV | ir.model.access.csv | ir.access.csv | Critical |
| Frontend Framework | Owl 2.8 | Owl 3 with compatibility layer | High |
| Icon Framework | Font Awesome / Odoo Icons | Material Symbols | Medium |
| Binary Fields | Base64-based representation | BinaryValue | High |
| Attachment API | datas | raw | High |
| Configuration Parameters | get_param() / set_param() | Typed getters and setters | High |
| ORM Grouping | read_group() | Replacement grouping API | High |
| Timezone Handling | pytz | zoneinfo | Medium |
| Web Server | Werkzeug-based | Changes to HTTP server implementation | Medium |
| Module Migration | Manual adjustments and scripts | Additional upgrade scripts | Medium |
Reference: Technical comparisons of Odoo 19.0 and 20.0 branches, including an Odoo Digest analysis published on October 24, 2026.
Verification Note: The table summarizes the technical changes reported in the supplied material. Individual changes should be confirmed against the relevant Odoo source-code branches before being treated as mandatory migration requirements.
2. Security Framework Changes — Critical Impact
One of the most significant reported changes in Odoo 20 concerns its security architecture.
Odoo 19 Security Architecture
Odoo 19 uses two primary models to manage security:
self.env['ir.model.access'] self.env['ir.rule']
These models serve different purposes:
- ir.model.access manages model-level access permissions, including Create, Read, Update, and Delete (CRUD).
- ir.rule manages record-level access restrictions using domain-based rules.
Odoo 20 Security Architecture
According to the reported changes, Odoo 20 consolidates these mechanisms into:
self.env['ir.access']
This means that the changes potentially extend beyond CSV file naming conventions to the underlying security management architecture.
Impact on Custom Addons
Developers should carefully review the following areas:
- References to legacy security models must be identified and migrated where necessary.
- Security file structures and declarations may require adjustments.
- Custom code that creates or modifies ir.rule records must be reviewed.
- Access-control testing must cover user groups, CRUD permissions, domain restrictions, and multi-company scenarios.
- Security migration should follow official upgrade procedures and include comprehensive regression testing.
3. ORM and Python API Changes
Several legacy APIs are reported to have been removed, replaced, or refactored in Odoo 20.
These changes may directly affect custom business logic and backend integrations.
| API / Component | Reported Odoo 20 Change | Recommended Developer Action |
| read_group() | Removed | Migrate to the supported grouping API |
| odoo.osv.expression | Removed | Refactor domain expressions |
| @ormcache_context | Removed | Review caching strategies |
| check_access_rights() | Removed | Migrate access validation logic |
| check_access_rule() | Removed | Adapt to the updated security API |
| _check_recursion() | Removed | Review recursive validation logic |
| group_operator | Removed | Update aggregation declarations |
| toggle_active() | Removed | Refactor active/archive operations |
| ir.attachment.datas | Removed | Use the appropriate raw API |
Potential Technical Impacts
These changes may introduce several compatibility issues:
1. Module Installation Failures
Custom addons may fail during installation if they reference removed or incompatible APIs.
2. Runtime Exceptions
Existing methods may trigger errors when called by business processes.
3. Data Processing Issues
Changes to ORM grouping, aggregation, or binary data handling may affect reports, dashboards, and integrations.
4. Security Validation Failures
Changes to access-checking methods may affect custom authorization logic.
5. Business Logic Incompatibility
Custom Python methods may require refactoring to align with the updated ORM framework. Even when the addon folder structure and manifest remain unchanged, compatibility is not guaranteed.
Recommendation: Conduct a source-code audit to identify deprecated APIs, removed methods, and incompatible ORM operations before upgrading.
4. JavaScript and OWL Framework Changes
Odoo 20 reportedly introduces a transition from Owl 2.8 to Owl 3, bringing changes to frontend components, directives, and rendering mechanisms.
Frontend Framework Comparison
| Odoo 19 | Odoo 20 |
| t-portal | t-custom-portal |
| t-model | t-custom-model |
| useEffect | useLayoutEffect |
| Owl 2 components | Owl 3 components with a compatibility layer |
| Font Awesome icons | Material Symbols |
Compatibility Considerations
Odoo 20 reportedly includes a compatibility layer to support certain existing Owl 2 components. However, compatibility does not necessarily extend to every custom implementation.
Developers should specifically evaluate addons that:
- Patch native Odoo web client components.
- Extend Owl components and templates.
- Register custom services or frontend components.
- Modify JavaScript registries.
- Implement custom widgets and interactive dashboards.
- Use custom JavaScript assets or frontend libraries.
- Override standard Odoo website behavior.
5. Database and Deployment Changes
Changes to minimum Python and PostgreSQL requirements may significantly affect development, staging, and production environments.
Infrastructure Migration Requirements
| Component | Recommended Migration Action |
| Python | Upgrade to a supported runtime version |
| PostgreSQL | Plan database migration to PostgreSQL 16 or another officially supported version |
| Python Packages | Verify compatibility of all packages in requirements.txt |
| Timezone Handling | Refactor pytz implementations where required |
| HTTP Server | Review reverse proxy and deployment configurations |
| Docker | Rebuild container images using compatible Odoo 20 dependencies |
| Database Migration | Follow an official database upgrade procedure rather than simply replacing the source code |
Additional Technical Considerations
Operating System Compatibility
Verify that the Linux distribution supports the required Python, PostgreSQL, and system libraries.
Reverse Proxy Configuration
Review Nginx or other reverse proxy settings, including request routing, timeouts, and WebSocket-related configurations.
External Libraries
Validate compatibility with third-party Python packages used by custom addons.
Database Backup and Recovery
Establish a tested backup and rollback strategy before performing production migration.
Environment Isolation
Deploy Odoo 20 in a separate development or staging environment before migrating production workloads.
Recommended Deployment Approach
For Linux-based deployments using Nginx, PostgreSQL, and multiple custom addons, a controlled migration process is strongly recommended.The production environment should remain unchanged until functional, integration, security, and performance testing have been completed successfully.
7. Odoo 19 to Odoo 20 Migration Tools
Odoo 20 reportedly provides the upgrade_code command to assist developers in adapting custom addon source code.
Step 1 — Perform a Dry Run
Run the migration utility in simulation mode before applying changes:
./odoo-bin upgrade_code \ --addons-path=/opt/odoo/custom_addons \ --from 19.0 \ --dry-run
The purpose of a dry run is to identify potential source-code modifications without directly changing addon files, where supported by the installed tool.
Step 2 — Execute the Code Upgrade
After creating a backup and a dedicated Git migration branch:
./odoo-bin upgrade_code \ --addons-path=/opt/odoo/custom_addons \ --from 19.0
Step 3 — Perform Owl 3 Migration
For frontend-related changes, the reported migration command is:
./odoo-bin upgrade_code \ --addons-path=/opt/odoo/custom_addons \ --script owl3-migration
Important: These commands are reproduced from the supplied technical material. Their availability, syntax, and supported options must be verified against the actual Odoo 20 command-line interface before execution.
Migration Tool Limitations
Automated migration utilities may assist with source-code transformation, but they cannot guarantee complete compatibility.
Manual validation remains necessary for:
- Custom business logic
- Security permissions
- Record Rules
- JavaScript and Owl components
- Database migrations
- External API integrations
- Custom reports and dashboards
- Third-party dependencies
A successful automated migration does not necessarily mean that an addon is production-ready.
8. Technical References
The following official resources should be used for further technical verification and compatibility assessment:
- Odoo 20 Developer Documentation
- Odoo 20 ORM API Reference
- Odoo 20 Security Framework
- Odoo 20 Source Code — GitHub
These resources should be consulted to confirm changes to framework APIs, security models, dependencies, and migration procedures.
9. Conclusion and Recommendations
Migrating from Odoo 19 to Odoo 20 involves much more than updating the module manifest version or renaming security configuration files.
The migration process may require substantial adjustments to backend architecture, frontend components, security mechanisms, database infrastructure, and external integrations.
The three highest-priority areas for technical assessment are:
- Security Framework Migration — Reviewing ACLs, Record Rules, user groups, and authorization mechanisms.
- Python and ORM API Refactoring — Identifying removed, deprecated, or modified APIs and updating custom business logic.
- Owl 3 Compatibility Testing — Validating custom frontend components, JavaScript extensions, and interactive interfaces.