
Odoo 20 Migration Guide for Businesses Planning a Major Upgrade



Odoo 20 was introduced at Odoo Experience in Brussels on September 24, 2026, and Odoo now reports 28 million users worldwide. However, for thousands of businesses, the launch also started a countdown. Odoo provides a strict three-year support lifecycle for each major release, and the arrival of version 20 signals the end of standard support for Odoo 17 this year. Meanwhile, Odoo 18 enters its final year of support, heading toward a September 2027 deadline. For organizations running either release, the time to plan a major upgrade is now.
An ERP upgrade succeeds or fails long before anyone runs the production migration. Most ERP projects exceed their budgets for a single reason: late-stage technical surprises and system misfits. An Odoo version upgrade repeats this exact pattern on a smaller scale through forgotten integrations, unported custom modules, and third-party apps lacking an Odoo 20 equivalent.
This guide focuses on the critical prep work that decides the outcome, from compatibility checks to post-migration validation. You will see what changed in Odoo 20, discover the optimal upgrade path for your current version, and get a clear framework for estimating costs and downtime.
Content
It’s the migration process of your database, filestore, custom code, and connected systems from a previous version of Odoo to version 20. It’s more than a version switch; three layers move simultaneously, each with its own rules.
This description also applies to migration to Odoo 20 from QuickBooks, NetSuite, SAP Business One, or spreadsheets, but each of them calls for dedicated data mapping.
Upgrading to Odoo 20 can make for a priority for this year for 3 main reasons. First, expiring support for legacy versions; second, a built-in AI layer to transform your daily tasks; and third, major functional updates across key apps. Treat the upgrade as a strategic business change, an opportunity to elevate the way your teams work.
Odoo 20 is now backed by three years of standard support through September 2029. Under Odoo’s rolling lifecycle policy, previous releases remain supported on a staggering schedule: Odoo 19 is covered until September 2028, and Odoo 18 until September 2027. After the end of standard support, there is an extended support service for some versions deployed on Odoo.sh or on your own servers, but it is a paid service.
One upgrade rule is often misread by teams. Odoo’s support policy lets you upgrade from any version, but only to targets that are still supported or left support less than six months ago. That window applies to Odoo 17 as a target until about March 2027, not to Odoo 17 as your starting point.
Odoo 20 transforms AI from a simple Q&A assistant into an active worker within your database. Powered by dedicated AI agents, the system can now create records and update records automatically, even extracting structured data directly from an uploaded PDF. These agents can also be integrated into automated and scheduled actions, taking over repetitive background tasks. Beyond native capabilities, Odoo supports the model context protocol, allowing external intelligence tools to securely connect to your database. Keep in mind that as these AI features take on real operational workloads, they consume credits purchased through In-App Purchase, so usage should be factored into your project budget.
Odoo 20 reshapes several daily workflows, and your team will feel the difference as soon as they log in. The biggest shift involves the retirement of the standalone Field Service app. As Field Service moves under the Planning module umbrella, dispatching becomes significantly more intuitive: schedulers can now monitor technicians on a live map, toggle to a spatial map view of assigned shifts, automatically calculate travel fees, and manage scheduling right within the familiar Gantt view.
Beyond field operations, here are the other critical app changes to communicate to your department leads:
Preparation turns an unpredictable project into a scheduled one. Before you request anything from Odoo, you need a full picture of what runs in your database and what Odoo 20 already covers. The three tasks below give your team that picture and a safe place to work.
An upgrade audit records every element that could break or delay the move. Start with a module inventory that lists each installed app, its source, its owner, and the process it supports. Then add the facts below to the same project file.
Odoo’s upgrade documentation tells you to stop development and challenge every customization before you port anything. Compare each module with the Odoo 20 release notes and mark it keep, replace, or remove. Picture a custom module that toggles tax-inclusive pricing on quotes. Odoo 20 now offers a tax-inclusive switch on sales orders, purchase orders, and invoices, so that code can retire.
For the code you keep, our guide to Odoo customization best practices explains how to build it so future upgrades cost less.
Pick a migration window, announce a code freeze, and stop new development on the source system. Next, restore a production copy into an isolated staging environment that cannot send emails or call live APIs. This copy becomes the rehearsal space for every round that follows, and it is the right moment to start planning user training.
Your requirements depend on edition, hosting, and the version you run now. Enterprise subscribers use Odoo’s upgrade platform, while Community users rely on tooling from the Odoo Community Association. Servers you host yourself also need a newer technical stack before Odoo 20 can start.
| Hosting | How you request the upgrade | How custom code is handled |
| Odoo Online | Database manager or the Upgrade section of your subscription, with a test run first | You cannot create or install custom Python modules on this platform |
| Odoo.sh | Upgrade tab on a staging branch, then on the production branch | The platform updates custom modules after it restores the upgraded database |
| Your own servers | Command line or upload form on upgrade.odoo.com | Your team updates each module with the -u option |
As of mid-October 2026, Odoo’s upgrade request form still lists 17.0, 18.0, and 19.0 as targets. In the initial weeks after a major launch, Odoo’s upgrade team homes in on stabilizing migration paths for mature releases before opening 20.0 as an official target. Use that gap to port code and consider waiting for the first stable patches before you move production.
If you run Odoo on-premises, the Odoo 20 source install guide raises the minimums to Python 3.12 and PostgreSQL 16. Teams with heavy reporting can also send read-only transactions to a replica through the –db_replica_host option, so include that setup in staging.
The number of versions you skip changes the work more than the jump itself. Odoo’s platform can move a database across several versions in one request. Custom code, however, must absorb the breaking changes of every major release in between. Find your path in the table below.
| Starting point | Database path | Code work |
| Odoo 19 Enterprise | One upgrade request to 20.0 | Changes from one release only |
| Odoo 17 or 18 Enterprise | One request across several versions | Changes from every skipped release, so a direct jump is never one version of work |
| Odoo 16 or older | Possible across many versions | Compare the porting effort against a fresh implementation |
| Community edition | OpenUpgrade from the OCA, run version by version | Same porting work, on a community release schedule that trails Odoo’s service |
| Community to Enterprise | Edition switch plus a version upgrade | Review your apps against their Enterprise equivalents |
Before touching your production environment, Odoo strongly recommends testing a full copy of your database. The exact execution will vary depending on the hosting environment, but the following eight-step guide provides a clear blueprint for Odoo Online, Odoo.sh, and self-hosted deployments. Use this framework as your upgrade guide to plan, execute, and adapt each step to your team’s workflow.
After each test run, read the upgrade report Odoo sends because it lists custom views the process disabled. On self-hosted servers, the test command is “python <(curl -s https://upgrade.odoo.com/upgrade) test -d <your_db> -t 20.0” once 20.0 opens as a target. If you use the upload form, Odoo asks you to run production within three days of a successful test.
For a customized database, going live is never a single click. Write down the manual steps of your cutover so nobody improvises on go-live night.
Your downtime window covers the final backup, the production upgrade, module updates, and a smoke test by key users. On Odoo Online, you can trigger the upgrade directly when Odoo’s silent test upgrade finishes in under 20 minutes. Customized databases on Odoo.sh or your own servers add module updates and checks, so time each step during the rehearsal. Pick a weekend or quiet period that avoids payroll runs and month-end close.
Use this go-live checklist on the day:
An Odoo version upgrade is an in-place transformation driven by automated platform scripts. You should never attempt to manually export and re-import data between major versions, as by doing so, you can break relational links and risk massive data loss. Because the system modifies your database structure directly, rigorous backups and post-migration validation are your primary safety nets: protect your source data first, then audit your figures to ensure complete financial and operational integrity.
Before executing any test or production migration, create a full system snapshot. Start by taking a PostgreSQL database dump using pg_dump -F c, the standard format recommended by Odoo’s upgrade platform. A database dump alone will not preserve file attachments, so you must also back up your filestore, custom configuration files, and the exact Git commit of your custom addons. This backup routine is your first line of defense against data loss. Take this opportunity to archive old logs and combine duplicate records so you can get clean data into Odoo 20.
Then agree with finance and operations on which closed transactions, logs, and attachments stay live and which move to an archive. A leaner database is faster to upgrade, restore, and validate in every test round.
Validation comes down to comparing your upgraded test database against your live source using the key figures your leadership trusts most. Run matching reports on both databases using the same cutoff date and then cross-reference accounting entries, transaction totals, and core record counts. You must analyze and resolve each discrepancy before continuing to the next migration phase.
Moving from QuickBooks, NetSuite, or another ERP needs field mapping, cleansing, and opening balances, which our guide to Odoo data migration best practices covers in detail.
Glorium Technologies applied this process when a US contract manufacturer moved off JobBOSS to Odoo 17. The team tested migration scripts on Odoo.sh and kept JobBOSS running in parallel during the first two phases, so production never stopped. After a phased 14- to 18-week rollout, job turnaround became 31% faster and month-end close dropped from 8 to 10 days to under three.
Odoo’s standard upgrade only handles core data and out-of-the-box modules. Your custom modules, third-party apps, and external integrations call for manual porting. Odoo 20 introduces structural changes to the framework these customizations rely on. Knowing those changes upfront, you can keep your estimate honest and your schedule realistic.
The changes below come from the Odoo 20 release notes and the 20.0 developer documentation. Each one can break a module that worked well on Odoo 18 or 19. Review them with your developers before you size the project:
Odoo’s documentation sets a fixed order for porting work. First, uninstall every module your business no longer needs. Then make each remaining module install on an empty Odoo 20 database before you run it against your upgraded data. The odoo-bin upgrade_code command, available since Odoo 18, rewrites some deprecated patterns automatically. Business logic, view inheritance, and security still need a developer. Renamed fields or models need pre-, post-, or end-migration scripts, and Odoo’s upgrade-util library supplies helper functions for them.
In practice, a port touches four layers of every module: Python models and ORM calls, XML views and reports, JavaScript and Owl components, and security files with access rights.
You cannot go live until every app you depend on has a 20.0 version. Check the Odoo Apps Store and the OCA 20.0 branches for each item in your module inventory and ask vendors for release dates. For integrations, plan the move to JSON-2, which authenticates with API keys sent as bearer tokens. Odoo’s documentation also limits external API access to Custom pricing plans, so confirm your subscription before you rebuild connectors.
If you run an accounting connector like the one in our Odoo QuickBooks integration blueprint, map each of its calls to a JSON-2 endpoint before the first test round.
Testing is where problems stay cheap to fix. Odoo lets you request multiple test databases, so plan for at least two or three rounds on a customized system. Every test round should involve the business users who run each process, alongside the developers who changed the code.
| Team | What to check in Odoo 20 |
| Finance | Bill lines suggested from bill history, batch payments, reconciliation, and tax reports |
| Sales | Quotes, discounts, commissions, and pricelist rules set by period or weekday |
| Purchasing and inventory | Reordering suggestions, receipts, transfers, and stock valuation |
| Manufacturing | Work orders, continuous production settings, component use, and costing |
| Field teams | Planning shifts, routes, travel fees, and offline work on mobile devices |
| Administration | Scheduled actions, mail servers, user roles, and printed reports |
Add three technical checks to every round:
You should close each round with a written sign-off from every department owner and treat the final round as formal user acceptance testing (UAT). Each department runs its real daily workflows end to end on the upgraded copy, and nothing moves to production until every owner approves.
Most troubled upgrades repeat the same handful of mistakes. The biggest difference between a calm go-live and a stressful one is how early your team spots them. The table pairs each common problem with a practical fix you can add to your plan today.
| Challenge | Practical fix |
| Starting close to a support deadline | Begin the audit while your current version still receives standard support |
| Skipping the test migration | Run at least two full test rounds on a production copy |
| Ignoring third-party apps | Confirm 20.0 releases before you book a go-live date |
| Porting features Odoo 20 now covers | Score every module against the release notes first |
| Forgotten XML-RPC integrations | Search code and connector settings for /xmlrpc and /jsonrpc calls |
| Untrained users | Train teams on moved apps, new icons, and changed menus before cutover |
| No rollback plan | Define the point of no return and keep the old system ready until then |
Your rollback window closes the moment users start posting transactions in the new system. Before that point, you can switch back to the source database with little effort. After that, every new entry must be reentered or migrated by hand, so set the point of no return in writing.
Enterprise subscribers request the database upgrade through Odoo’s platform with their subscription code. That means the actual cost of the project sits in code porting, testing, and partner time. The drivers below explain why two companies using the same version can receive very different quotes.
Odoo’s documentation states that, with Odoo Enterprise, upgrading a database to the most recent version is free. That service covers standard apps and Odoo Studio customizations, plus custom code under a paid Maintenance of Customizations subscription. It excludes custom modules built in-house or by partners, code added to standard modules by hand, and automated actions written in Python code.
Cost grows with complexity, and complexity hides in a few predictable places. Count each item below during your audit because each one adds hours to porting, testing, or both. The list also shows where trimming scope saves the most money.
Timelines follow the same drivers as cost. A version upgrade reuses your existing configuration, so its length depends mostly on code and data scope. Use these tiers as a starting point for your own plan.
Here is our estimate for your Odoo 20 upgrade. Since Odoo’s built-in service covers your standard database migration, our hours focus on everything custom: your modules, integrations, thorough testing, and full go-live support.
| Scope | Light | Moderate | Complex |
| Starting point | Odoo 19, few customizations, no XML-RPC integrations | Odoo 17 or 18, several custom and third-party modules, a few integrations | Odoo 16 or older, many modules, multi-company setup, complex integrations |
| Total effort | 40–60 hours | 80–120 hours | 200–400 hours |
| Timeline | About 2 weeks | About 3–4 weeks | About 6–8 weeks |
| Scope of work | Audit of custom modules and Studio customizations; test upgrade via Odoo’s service and upgrade report review; porting custom modules to Odoo 20 (new access rights model (ir.access), Owl 3 frontend, ORM changes); functional testing and UAT support; production upgrade, smoke test, and post-go-live support | Everything in Light, plus: code changes accumulated across versions 18, 19, and 20; third-party modules checked for 20.0 availability, then ported or replaced; XML-RPC integrations moved to the JSON-2 API and database-service calls replaced, with regression tests; custom data migration scripts with accounting and stock reconciliation; UAT by department and key-user training | Everything in Moderate, plus: port-or-rewrite decision per module and legacy view syntax (attrs/states); multi-company access rules and intercompany flows; integration redesign on JSON-2 with load testing; several test upgrades and a full rehearsal on production-size data; UAT per company, weekend cutover, and extended hypercare |
| Developer | 20–30 h | 44–68 h | 110–220 h |
| QA | 8–12 h | 14–22 h | 36–76 h |
| Business analyst | 6–8 h | 12–16 h | 30–60 h |
| PM/client communication | 6–10 h | 10–14 h | 24–44 h |
Our total cost is calculated as estimated hours multiplied by our hourly rate (HoursRate). We will confirm final, fixed numbers after a brief audit of your database, modules, integrations, and hosting environment.
Odoo has not yet enabled version 20.0 as a target on its upgrade platform. Production migration will begin as soon as Odoo opens platform access.
Please note that Odoo platform/subscription fees, AI credits, hosting costs, third-party module licensing, and internal testing time required from your team are not included in the scope.
Go-live opens the hypercare period, when your team watches the system closely and fixes small issues fast. Assign named owners and hold a short daily check-in during the first weeks. You can use this checklist to confirm the upgraded system behaves the way your teams expect.
While an internal team with solid Odoo experience and spare capacity can handle a straightforward upgrade, complex projects are a different story. When an upgrade involves heavy custom code, intricate integrations, or significant operational risk, bringing in an experienced partner quickly pays for itself.
Here are the key signals that mean you should pull in a partner before running your first test upgrade:
As a certified Odoo partner, Glorium Technologies helps companies plan and execute ERP version upgrades. Our Odoo migration services cover every stage of the journey, from auditing your existing modules to porting custom code for full version compatibility to running thorough regression tests before cutover. After go-live, our support team will be there for you and provide clear documentation to make sure your internal team fully owns the solution.
If you’re still deciding, check out our side-by-side Odoo 19 vs. Odoo 20 breakdown to learn the differences and how to plan your upgrade.
Once you’re ready, schedule a call with our Odoo team and get an upgrade roadmap customized to your modules and timelines.
Odoo has not published a fixed date for moving Odoo Online databases to Odoo 20. Its upgrade documentation says a major version on Odoo Online must be upgraded every two years. You receive a notice in your database a few weeks before an automatic upgrade, and Odoo triggers it if you take no action by the due date. Request a test database as soon as the invitation arrives so your team controls the timing.
A move from QuickBooks, SAP Business One, Microsoft Dynamics, NetSuite, or spreadsheets starts with data mapping, cleansing, and agreed opening balances. Odoo’s import tool accepts an External ID column that has record IDs from your previous software. Those IDs allow you to link related records and run test loads without adding duplicates. Larger histories usually need ETL scripts that clean, transform, and load data through the JSON-2 API.
Integration work is a core part of the Odoo practice at Glorium Technologies, ranging from accounting tools to e-commerce platforms. Our team maps each XML-RPC call to its JSON-2 equivalent, sets up API keys, and tests every connector against an upgraded copy of your database. We schedule this work early, because integrations often decide the go-live date. After launch, our support team monitors those connections during hypercare.
The answer depends on your support status and your appetite for two projects. Odoo 19 is a valid target today and stays in standard support until September 2028. If you run Odoo 17 and need a supported version quickly, Odoo 19 removes that pressure but adds a second upgrade later. Teams on Odoo 18 can port code to Odoo 20 now and upgrade once 20.0 opens as a target.
Glorium Technologies starts with an upgrade audit that scores every custom module against Odoo 20 standard features. Our developers port your existing modules, write custom data migration scripts, and run exhaustive regression tests against every test database. We guide your team through the cutover process step-by-step and record every change so you have clear ownership of your source code and a clean, detailed history to refer to when upgrading in the future.