Odoo 20 was unveiled in September 2026 at Odoo Experience in Brussels, and many Odoo 19 users are now asking the same question: how do we upgrade without breaking our business? This guide explains the Odoo 19 to Odoo 20 upgrade process in plain steps โ separately for Odoo.sh, on-premise (your own server) and Odoo Online, and for Community and Enterprise editions.
Upgrade vs Migration: What Is the Difference?
People use these words loosely, so it helps to separate them:
- Upgrade โ moving your existing database and data from Odoo 19 to Odoo 20 using Odoo's upgrade tools. Your records, history and settings come with you.
- Migration โ a wider project: upgrade the data and port custom modules, replace third-party apps, update integrations, retest reports and retrain users.
The automated database step is usually the smaller part. The real work is in custom code, integrations and testing.
What Changes in Odoo 20 That Affects Your Upgrade
These are the points most likely to affect planning, based on public Odoo 20 release information. Treat them as a checklist of things to verify, not a complete list.
| Area | What to know | What to do |
|---|---|---|
| Server requirements | Odoo 20 is reported to need Python 3.12+ and PostgreSQL 16+ (Odoo 19 allowed older versions). | Check your OS, Python and PostgreSQL versions now. Plan a server upgrade if needed. |
| Stored tracking values | Chatter tracking values are no longer stored; messages are generated on the fly. | Review custom reports and audit processes that read old tracking history. |
| Access rights | Record rules are reported to be replaced by domains set at the access-right level. | Re-test user permissions, especially if you use custom record rules or multi-company. |
| Accounting | Parent accounts replace account groups; account codes become optional; some payment status labels changed. | Have your accountant review the chart of accounts and reports after a test upgrade. |
| AI features | New AI agents and connections to AI assistants; AI features use credits. | Decide whether you will use them and budget credits. |
| External API | The legacy RPC db service is reported to be removed; other legacy RPC services are deprecated. JSON-2 is the replacement. | List every integration that calls Odoo (website, apps, scripts) and check which API it uses. |
Who Should Upgrade Now โ and Who Can Wait
- Starting a new implementation: start on Odoo 20 directly.
- Standard Odoo 19, few custom modules: a good candidate to test-upgrade soon.
- Heavy customisation or many third-party apps: run a test upgrade first and wait until every app has an Odoo 20 version. You can stay on 19 while you prepare.
- Self-hosted on an older server: your server (Python, PostgreSQL, OS) may need upgrading first โ start that early.
Pre-Upgrade Checklist (Do This First)
- Know your setup. Edition (Community or Enterprise), hosting (Online, Odoo.sh or on-premise), exact version, list of installed apps and database size.
- List custom modules. Every module in your custom addons path, who wrote it, and whether you still need it. Retire what you no longer use.
- Check third-party apps. Look for an Odoo 20 (
20.0) version of each one, or plan a replacement. - List integrations. Payment gateways, banks, shipping, WhatsApp, website, BI tools, scripts โ anything that talks to Odoo.
- List custom reports and layouts. PDF reports, invoice layouts and exports need retesting.
- Check server requirements. Python, PostgreSQL, wkhtmltopdf and OS compatibility for Odoo 20 (on-premise).
- Take verified backups. A full database backup with filestore, stored safely, and a test that you can restore it.
Odoo 19 to 20 Upgrade Process: Step by Step
These steps are the same for every setup. What changes is how you request the test upgrade (next sections).
- Audit your Odoo 19 system. Version, apps, data size, scheduled actions, outgoing mail, integrations.
- Review custom modules and third-party apps. Decide what to port, replace or retire.
- Build an isolated test environment. A copy of production with outgoing email and live integrations switched off, so tests never email real customers or hit real gateways.
- Request a test upgrade to 20.0. Method depends on hosting (see below). The result includes an upgraded database and a report of problems.
- Port custom modules. Update them for Odoo 20, add migration scripts where data must change, and install them on the upgraded test database.
- Fix issues from the upgrade report. Prioritise by business impact: invoicing, stock, payroll and payments first.
- Functional testing. Run complete business flows: quotation โ order โ delivery โ invoice โ payment; purchase โ receipt โ vendor bill; month-end.
- Integration testing. Test each integration against sandbox accounts, not live ones.
- User acceptance testing. The people who do the work every day test it. This finds more real issues than any script.
- Plan the production cutover. Choose a quiet window, freeze data entry, take a final backup and write a rollback plan.
- Run the production upgrade. Use the same method that worked in testing.
- Validate and monitor. Check key reports, balances and stock; watch logs and user feedback for the first days.
- Keep the old backup. Do not delete the pre-upgrade backup until at least one accounting period has closed cleanly.
Odoo.sh: How to Upgrade from 19 to 20
With Odoo.sh, Odoo runs the platform and your custom code lives in your Git repository. The safe approach is to test on a staging branch before touching production.
- Check your repository. Make sure custom modules are in the repo and note which are used in production.
- Open the Upgrade tab. In your Odoo.sh project, use the Upgrade tab on a staging branch to request a test upgrade to Odoo 20. The test runs on the latest daily production backup, so you do not need to make a manual backup for it.
- Create a 20.0 branch for your code. Port custom modules to Odoo 20 in a development branch, then merge to staging so they are applied on top of the upgraded database.
- Test on staging. Staging has emails and crons disabled by default, which keeps testing safe. Run functional, integration and acceptance tests.
- Repeat test upgrades if needed. Run another test upgrade closer to go-live so the data is fresh and the process is rehearsed.
- Schedule the production upgrade. Pick a window, freeze data entry, then run the production upgrade from the Upgrade tab and merge your 20.0 code.
- Validate production. Confirm accounting, stock and integrations, then re-enable external connections.
On-Premise: How to Upgrade from 19 to 20
On your own server (physical, VPS or private cloud) you own the operating system, Python, PostgreSQL, backups and deployment. The upgrade has two parts: upgrading the database and upgrading the server and code.
On-premise Enterprise (official upgrade platform)
- Prepare the new environment. Set up a test server with Python 3.12+, PostgreSQL 16+ and Odoo 20 code (see our Odoo 20 installation guide).
- Create a database dump. Back up your Odoo 19 database including the filestore (the Odoo database manager "zip with filestore" backup works well).
- Request a test upgrade. Submit the dump to Odoo's upgrade platform (upgrade.odoo.com) with target version 20.0. You can also use Odoo's upgrade command-line script โ see the platform for the current command.
- Receive the upgraded database and report. Restore it on your Odoo 20 test server and read the report for warnings.
- Install ported custom modules. Update custom addons, install them, and run module updates on the test copy.
- Test thoroughly. Same functional, integration and user tests as above.
- Production upgrade. Freeze data entry, take a final dump, submit a production upgrade request, restore the returned database on the production Odoo 20 server, and validate.
# Example: update all modules on a TEST copy (never on production first)
./odoo-bin -c /etc/odoo20.conf -d mydb_test -u all --stop-after-init
# Update only your custom module while developing
./odoo-bin -c /etc/odoo20.conf -d mydb_test -u my_custom_module --stop-after-init
On-premise Community
Odoo does not provide an official upgrade service for Community. You have three realistic options:
- OCA OpenUpgrade: a community project that provides migration scripts between versions. Check whether a 20.0 version is available and mature before you commit โ new versions can lag behind the Odoo release.
- Fresh Odoo 20 database + data import: set up a clean Odoo 20 and import master data (customers, products, opening stock and balances). Often cleaner for smaller databases.
- Move to Enterprise: if you want the official upgrade platform and support.
Community upgrades are fully possible, but the technical and verification workload is heavier, so budget more testing time.
Odoo Online: What Is Different
With Odoo Online, Odoo upgrades the database for you using their process. Because custom Python modules are not supported on Odoo Online, the risk is mainly with Studio customisations, reports and automations โ test them on a copy. If you need custom modules, you would first move to Odoo.sh or your own server.
Community vs Enterprise: Upgrade Comparison
| Community | Enterprise | |
|---|---|---|
| Official upgrade platform | No | Yes (upgrade platform and support, with a valid subscription) |
| Typical method | OCA OpenUpgrade scripts or fresh database + import | Upgrade platform: test upgrade, then production upgrade |
| Support if something fails | Community forums or your partner | Odoo support plus your partner |
| Effort for you / your partner | Higher โ more manual verification | Lower for the database step; custom code still needs porting |
Migrating Custom Modules to Odoo 20
Custom modules are where most upgrade time goes. A safe approach:
- Create a branch for
20.0and update each module'sversionin__manifest__.py. - Install the module on a clean Odoo 20 database and fix errors and deprecation warnings.
- If your module stores data that must be transformed, add
pre-migrationandpost-migrationscripts in the module'smigrations/folder. - Re-test custom reports, server actions, automated actions and scheduled jobs.
- Prefer standard Odoo features over custom code where possible โ less custom code means easier future upgrades.
# Example layout of a migration script for a custom module
my_custom_module/
โโโ __manifest__.py # version: 20.0.1.0.0
โโโ migrations/
โโโ 20.0.1.0.0/
โโโ pre-migration.py # runs before the module is updated
โโโ post-migration.py # runs after the module is updated
What Can Break After an Upgrade
| Risk | Why it happens | How to reduce it |
|---|---|---|
| Custom modules fail to install | APIs and data models change between versions | Port and test on a copy; keep modules small and standard |
| Third-party apps missing | No Odoo 20 version yet | Check vendors early; plan replacement or delay |
| Reports and layouts look wrong | Template and model changes | Compare PDFs before and after |
| Integrations stop working | Changed or removed APIs | Test each one against a sandbox; plan JSON-2 where needed |
| Permissions behave differently | Access-rights changes | Test each user role |
| Accounting totals differ | Changes in accounts and payment statuses | Accountant reviews trial balance and reports before go-live |
How Long Does It Take and What Does It Cost?
There is no honest one-size price or timeline. What drives them:
- Number and complexity of custom modules
- Number of third-party apps and integrations
- Database size and data quality
- How many versions you are jumping
- Whether you need server changes (Python, PostgreSQL, OS)
- How much user testing and training your team needs
A near-standard database can be quick, while a heavily customised system takes longer. A good partner gives you an itemised quotation after a test upgrade, so you pay for real scope. See also our Odoo pricing guide.
Common Upgrade Mistakes
- Testing on production or with live emails switched on.
- Skipping the "restore test" โ having a backup that was never restored.
- Waiting for the last week to check third-party apps.
- Letting only the IT team test; users find the real problems.
- Upgrading the server, PostgreSQL and Odoo all at once with no rollback.
- Deleting the old backup right after go-live.
Post-Upgrade Checklist
- Trial balance, aged receivables/payables and stock valuation match your pre-upgrade numbers.
- Invoices, delivery slips and key PDF reports print correctly.
- Scheduled actions, outgoing mail and integrations are re-enabled and working.
- User roles and access rights checked.
- Team briefed on what changed; questions collected for the first week.
- Backups and monitoring set up on the new version.
How Bharat Intelligent Can Help
We run upgrades as a project: audit, test upgrade, custom module porting, user testing, a rehearsed cutover and support afterwards โ on Odoo.sh or on your own server, for Community and Enterprise. If you are installing a fresh Odoo 20 instead, see our Odoo 20 installation guide for Linux and Windows, or visit our Odoo ERP page.
Frequently Asked Questions
Can I upgrade directly from Odoo 19 to Odoo 20?
Yes. Odoo 19 to 20 is a single, consecutive-version upgrade. If you are on an older version (for example 17 or 18), the database is upgraded through each version in order, so plan more testing time for longer jumps.
How long does an Odoo 19 to 20 upgrade take?
It depends on how many custom modules, third-party apps and integrations you have. A near-standard database can be upgraded and tested in days to a few weeks; heavily customised systems take longer. Most of the time goes into testing, not the automated upgrade itself.
What is the difference between upgrading on Odoo.sh and on-premise?
On Odoo.sh you request test upgrades from the Upgrade tab on a staging branch and your custom code lives in your Git repository. On-premise you send a database dump to Odoo's upgrade platform (Enterprise), receive the upgraded database, and deploy it on your own server running Odoo 20 code with the required Python and PostgreSQL versions.
Can I upgrade Odoo Community to Odoo 20?
Yes, but there is no official upgrade service for Community. Teams usually use community tools such as OCA OpenUpgrade (check that a 20.0 version exists before you plan), or migrate data into a fresh Odoo 20 database. It is workable but needs more technical effort and verification.
Do I need a newer Python or PostgreSQL for Odoo 20?
Yes. Public guides for Odoo 20 list Python 3.12 or later and PostgreSQL 16 or later. Always confirm the exact minimums in Odoo's official 20.0 documentation before you prepare your server.
Will my custom modules and third-party apps still work?
Not automatically. Every major version changes APIs and data models, so custom modules must be ported and tested, and each third-party app needs an Odoo 20 version from its vendor or must be replaced.
How much downtime should I expect?
Test upgrades have no effect on your live system. For the final production upgrade, plan a maintenance window: freeze data entry, take a final backup, run the upgrade, validate, then reopen. Your partner can estimate the window after a test upgrade.
Should I upgrade to Odoo 20 right now or wait?
If you are starting fresh, start on Odoo 20. If you run a stable Odoo 19 and depend on custom or third-party apps that are not ready, it is reasonable to wait and prepare while you test. Plan the move before your current version loses support.
Does Odoo 20 need AI credits?
Odoo 20 introduces AI features that are reported to use credits (in-app purchase). Your standard ERP workflows do not depend on them, but if you plan to use AI agents, include credit usage in your budget.