Skip to content

Migrate Odoo 15 to 16: Complete Step-by-Step Guide

DeployMonkey Team · March 23, 2026 10 min read

Overview

Odoo 15 to 16 was a significant upgrade. Odoo 16 introduced major frontend changes (OWL 2 components), new view features, updated Python API patterns, and deprecation of several legacy interfaces. This guide covers the complete migration process — database, code, views, and data.

Before You Start

  • Create a complete backup of your database and filestore
  • Document all custom modules and third-party add-ons
  • Test the migration on a staging server first — never migrate production directly
  • Verify your third-party modules have v16 compatible versions
  • Budget 2-6 weeks for a typical migration (depends on customization)

Database Migration

Odoo does not provide an official migration tool for Community Edition. Your options are:

OpenUpgrade (Community)

OpenUpgrade is the standard open-source migration tool. It provides migration scripts that transform the database schema and data from one version to the next. Run OpenUpgrade against your v15 database to produce a v16-compatible database.

git clone https://github.com/OCA/OpenUpgrade.git
git checkout 16.0
python odoo-bin -d your_db --update all --stop-after-init

Odoo Enterprise Migration

Enterprise customers can use Odoo's official migration service. Upload your database at upgrade.odoo.com and receive a migrated database. This is the safest option for Enterprise but does not handle custom module code.

Key Python API Changes (v15 to v16)

Web Controllers

The website parameter in route decorators changed. Controllers using website=True need review as the website module was restructured. Check all custom controller routes for compatibility.

Fields and Models

  • The track_visibility attribute was fully replaced by tracking=True (deprecated in v14, removed in v16)
  • _sql_constraints syntax remained stable but new validation was added
  • Selection fields gained group_expand support for Kanban grouping

Security

Record rules using global attribute changed behavior. Review all ir.rule definitions in your custom modules. The global attribute now means the rule applies to all users, including superuser in some contexts.

View Changes

Odoo 16 introduced several view syntax updates:

  • New column_invisible attribute for tree/list view columns replaced context-based column hiding
  • Form view button styling classes updated
  • Kanban view QWeb templates got new helper attributes
  • Search view filter grouping syntax was refined

Review all custom XML view definitions. Most view changes are backward-compatible, but deprecated patterns may cause warnings or unexpected behavior.

Frontend / JavaScript Changes

Odoo 16 continued the migration from legacy widgets to OWL 2 components. If your custom modules include JavaScript widgets:

  • Legacy widget registry still works but is deprecated
  • New OWL components should extend Component from @odoo/owl
  • Service injection replaced the old require() pattern
  • Asset bundling changed — verify your module's __manifest__.py asset declarations

Data Migration Checklist

  1. Run OpenUpgrade or Odoo upgrade service on a copy of your database
  2. Verify all standard module data migrated correctly (partners, products, invoices)
  3. Check custom field data — fields added by custom modules need manual migration scripts
  4. Verify accounting data integrity — run trial balance before and after migration
  5. Test all automated actions and scheduled jobs
  6. Verify email templates render correctly
  7. Check report generation (QWeb PDF reports)

Custom Module Migration Steps

  1. Update __manifest__.py version to 16.0.x.x.x
  2. Replace deprecated API calls (track_visibility, etc.)
  3. Update view XML for new syntax requirements
  4. Migrate JavaScript from legacy to OWL 2 where needed
  5. Update security files (ir.model.access.csv, record rules)
  6. Run Python tests and fix failures
  7. Test all UI workflows manually

Common Migration Issues

  • Assets not loading: Asset bundle names changed. Update __manifest__.py asset references.
  • Website pages broken: Website module restructuring affects custom pages. Re-check templates.
  • Kanban views empty: Column grouping behavior changed. Add group_expand if needed.
  • Access errors: Record rule changes may affect permissions. Test all user roles.

Rollback Strategy

Always maintain your v15 backup and infrastructure until v16 is verified in production. A rollback plan should include: database restore procedure, filestore restore, v15 code deployment, and DNS switchback if applicable. Test the rollback procedure before going live.

DeployMonkey

DeployMonkey can deploy both Odoo 15 and 16 instances for side-by-side testing during migration. Use the AI agent to identify compatibility issues in your custom modules before committing to the migration.