Before you upgrade production to Odoo 20, restore your backup, upgrade a copy of your own database, and test custom code, money and stock flows, access rights and integrations with the people who use them. Go live only when no critical defect is open.
Before you upgrade production to Odoo 20, restore your backup, upgrade a copy of your own database, and test custom code, money and stock flows, access rights and integrations with the people who use them. Go live only when no critical defect is open. This Odoo 20 upgrade checklist is for business owners, IT managers and ERP administrators who have custom modules or connected tools and need to decide whether, and when, to commit. If you would rather have specialists review those first, Odiware's Odoo migration services cover version upgrades, custom module migration and integration migration.
Odoo 20 was released in September 2026, and Odoo's supported versions page lists planned standard support until September 2029. This guide covers testing and the go-live decision. For the wider migration process from Odoo 19, see Odiware's Odoo 19 to 20 migration guide.
Quick checklist: eight readiness gates
- [ ] A backup of the database and filestore has been restored on a separate machine.
- [ ] Self-hosted servers run Python 3.12 or later and PostgreSQL 16 or later.
- [ ] Every custom module and third-party app has an owner and an Odoo 20 version.
- [ ] Custom modules install on an empty Odoo 20 database and on the upgraded copy.
- [ ] The core sales, purchase, inventory and accounting cases match saved baselines.
- [ ] Every user role has been tested for access.
- [ ] Integrations and scripts work in sandboxes, and none relies on the removed RPC
dbservice. - [ ] Each department has signed off in writing, no S1 defect is open, and every S2 defect has a tested workaround.
The sections below show how to prove each gate, rate what you find and make the final call.
How to test an Odoo upgrade before production: what a test copy can and cannot prove
Odoo's upgrade documentation sets out the sequence: request an upgraded test database, test it, report problems, and only then upgrade production. Test databases are neutralized so they cannot affect production. According to the documentation:
- Scheduled actions are disabled.
- Outgoing mail servers are archived and replaced with a fake one.
- Payment providers and delivery carriers are reset to their test environment.
- Bank synchronization is disabled. To test it, ask your synchronization provider for sandbox credentials.
A clean test copy therefore proves that your data, views, documents and business logic survive the upgrade. It does not prove that live mail, scheduled jobs, payment gateways, carriers or bank feeds work. Those need their own check right after go-live, covered below.
Two further points from the documentation. First, read the upgrade report: it is attached to the completion email and available in the Discuss app to users in the Administration / Settings group, and Odoo's guide for customized databases notes that views which cause problems are disabled during the upgrade and listed there. Second, request fresh test databases as work continues, because upgrade scripts and your own data keep changing. Never test in production, and never point a test copy at real customers or live accounts.
Odoo 20 upgrade checklist: before you request a test database
Each item names the evidence that proves it is done.
Environment and recovery
- [ ] Version, edition and hosting type recorded. Evidence: one-page environment sheet.
- [ ] Self-hosted only: servers meet the Odoo 20 minimums of Python 3.12 and PostgreSQL 16, per Odoo's source install guide. Evidence: version output from each server.
- [ ] Full backup of the database and filestore, copied off the server and restored on a separate machine. Evidence: a recent transaction and an opened attachment on the restored copy.
Custom module compatibility and third-party apps
- [ ] Every custom module and third-party app listed with its owner, source repository and Odoo 20 status. Evidence: vendor reply or release page for each app.
- [ ] Custom development frozen, apart from bug fixes. Odoo's guide for upgrading a customized database recommends this because every change after the upgrade starts must be upgraded and retested.
- [ ] Each custom module installs cleanly on an empty Odoo 20 database before you work on the upgraded copy, as that guide recommends.
- [ ] Studio customizations listed. They are not custom modules, but they touch standard views and models.
Integrations and baselines
- [ ] Every integration listed with its owner, credential location and sandbox.
- [ ] Scripts that create, duplicate, list or drop databases over RPC identified (see the Odoo 20 changes below).
- [ ] Baseline reports saved from the current system: trial balance, aged receivables and payables, tax report and stock valuation for a fixed date.
- [ ] Test owners named per department, and the severity rules agreed in writing.
What breaks in an Odoo upgrade, and how to find it
Most failures cluster where your setup departs from standard Odoo. The table lists general upgrade risks, not confirmed Odoo 20 breaking changes.
| Area | How it fails | How to detect it | Severity if it fails |
|---|---|---|---|
| Custom modules | Install errors, changed overrides, broken inherited views or JavaScript | Install on an empty Odoo 20 database, then on the upgraded copy; read the upgrade report and server logs | S1 if a core process depends on it |
| Third-party apps | No Odoo 20 version, or data that would be lost if the app were removed | Vendor status check before testing | S1–S2 |
| Sales, purchase, inventory | Changed pricing, approval, reservation or routing behavior | End-to-end orders compared with the current version | S1–S2 |
| Accounting and tax | Balances, tax lines or reconciliations differ | Closed-period reports compared with saved baselines | S1 |
| Integrations | Authentication, payload or webhook failures; silent data loss | Sandbox transactions and integration logs | S1–S2 |
| Permissions | Users see too much or too little | Log in as each role | S1 if data is exposed |
| Scheduled actions and email | Jobs not running, duplicates, wrong recipients | Job logs and the mail queue, after go-live | S2–S3 |
| Reports and documents | Layout shifts, missing fields, wrong totals | Side-by-side PDF comparison | S1 if totals are wrong, S4 if cosmetic |
Odoo 20 changes that Odoo documents
These are specific to Odoo 20, with their sources, and each one turns into a test.
- Server software. Odoo 20 requires Python 3.12 or later, up from 3.10, and PostgreSQL 16 or later, up from 13 (source install guide). Custom code written for older Python versions needs its own check.
- RPC database service. The
dbservice of the XML-RPC and JSON-RPC APIs was removed in Odoo 20. Thecommonandobjectservices are deprecated and scheduled for removal in Odoo 22 (fall 2028), with the JSON-2 API as the replacement (external RPC API page). Backup, provisioning or test-environment scripts that calldbare the ones to find. - ORM changes for custom code. The ORM changelog for 20.0 lists a changed RPC format for binary fields and the removal of
Model._table_query. Integrations that move files and custom reporting models that use that method should be tested. - Access rules. The same changelog lists a new
ir.accessmodel that merges access control lists and record rules, introduced in Odoo Online 19.4, the release before Odoo 20.0. If your custom modules define their own security rules, review them and test every role.
Who is responsible for what
Decide ownership before testing, because it decides who fixes what. Odoo's documentation is direct on three points. A database with custom modules cannot be upgraded until a version of those modules exists for the target version of Odoo. Differences in standard views, features, fields and models cannot be reverted case by case. And if a new version breaks a customization, making it compatible is the responsibility of the maintainer of that custom module.
For Odoo Enterprise databases, the documentation describes upgrade services that cover standard applications, Studio customizations and customizations under a maintenance subscription. It lists data cleaning, in-house or third-party modules without a maintenance contract, and training as not included, and notes that the Enterprise Subscription Agreement governs. Modules that nobody maintains are the usual point where businesses look for outside help, for example from an Odoo customization team that can update them for Odoo 20.
Rate every defect: a four-level severity framework
Rate every finding the same way. Without a rule, teams argue case by case under deadline pressure.
| Level | Definition | Examples (illustrative) | Go-live rule |
|---|---|---|---|
| S1 Critical | Blocks a core process, corrupts or loses financial or stock data, or exposes data to the wrong users | Invoice totals differ from the current version; a warehouse user can open payroll records | Any open S1 means no-go |
| S2 High | A core process works only through a workaround, or an integration drops or duplicates data | Carrier labels fail, so staff create them manually | Go only with a tested workaround and written business-owner approval |
| S3 Medium | A non-core feature or report is wrong | A digest email arrives late | Go; fix scheduled with an owner and date |
| S4 Low | Cosmetic or minor usability issue | A slightly shifted label on a delivery slip | Go; logged |
Re-rate a defect when the facts change: a "cosmetic" layout problem on a legal tax invoice may be S1. Problems in standard apps found in the test copy can be reported to Odoo through its support page, as the documentation describes.
Odoo upgrade test cases with pass/fail criteria
These 15 cases are an example set built from common business scenarios, not results from any client project. Replace the generic scenarios with your own products, taxes, roles and connectors, and run each one on the current version first to get a baseline.
| # | Test area | Steps | Expected result | Pass/fail criterion |
|---|---|---|---|---|
| 1 | Sales | Create a quotation for a stocked product with a discount and tax; confirm, deliver, invoice | Totals, tax lines and stock move match the current version | Pass: identical figures. Fail: any variance |
| 2 | Sales | Quote using your custom pricelist rule and any custom field | Price follows the rule; custom data carries to order and invoice | Pass: price matches rule, field populated |
| 3 | Purchase | RFQ in a foreign currency, approve, receive, create and post the vendor bill | Approval fires; bill matches receipt; exchange rate behaves as before | Pass: bill posts with no manual fix |
| 4 | Inventory | Deliver part of an order of a lot-tracked product; process the backorder | Remaining quantity sits on a backorder; lot traceable end to end | Pass: quantities reconcile and lot trace is complete |
| 5 | Inventory valuation | Run the stock valuation report for the baseline date | Quantity and value equal the saved baseline | Pass: zero unexplained difference |
| 6 | Accounting | Run trial balance, aged receivables and payables, and tax report for a closed period | Figures equal saved baselines | Pass: zero unexplained variance |
| 7 | Accounting | Issue a credit note against a posted invoice | Receivable, revenue and tax reverse correctly | Pass: entries equal expected postings |
| 8 | Banking | Import a statement file and reconcile open items (feeds are disabled in test copies) | Open items match; reconciliation behaves as before | Pass: balances agree and items reconcile |
| 9 | Permissions | Log in as a sales rep, warehouse user, accountant and portal user; open menus and records | Each role sees only expected menus and records, including under custom security rules | Pass: nothing extra or missing. Any exposure is S1 |
| 10 | Integration | Place a web-store sandbox order, pay with test credentials, create the delivery and carrier label | One order created; payment recorded; label and tracking written back | Pass: single order, correct statuses |
| 11 | Integration | Send and fetch a file or image (attachment, product image) through each API connector | Same file name and content on both sides | Pass: file opens identically. Fail: missing, renamed or corrupted file |
| 12 | Scripts | Run backup, provisioning and test-environment scripts against the Odoo 20 copy | No script depends on the removed RPC db service |
Pass: all scripts run or are replaced. Fail: any call to db |
| 13 | Automation | Run scheduled, automated and server actions by hand (scheduled actions are disabled in test copies), with mail routed to a safe address | Each runs once, to the right recipients | Pass: clean logs, no duplicates |
| 14 | Everyday use | Check saved search filters, data exports, mail templates, saved translations and website pages | Same behavior as the current version | Pass: reviewer signs off each |
| 15 | Custom code | Run each custom module's written acceptance script; check the upgrade report for disabled views | Every documented step passes; no needed view stays disabled | Pass: all steps pass |
Three end-to-end scenarios (examples)
These examples string tests into realistic flows. They are illustrations, not client case studies.
Scenario 1: Quote-to-cash with a partial delivery and a credit note
- Create a quotation for a stocked product with a customer discount and tax, then confirm it.
- Deliver part of the order, leaving a backorder. Invoice the delivered quantity.
- Register a payment. Issue a credit note for one returned unit and process the return.
- Run the receivables report and the stock valuation for that customer and product.
It proves that sales, stock and accounting stay linked. Fail signals: a wrong backorder quantity, a credit note whose tax differs from the invoice's, or valuation that does not move with the return. Wrong money or stock is S1.
Scenario 2: Procure-to-pay in a foreign currency
- Raise a purchase order in a foreign currency above your approval threshold.
- Approve it as the manager role, then receive part of it.
- Create the vendor bill from the receipt, post it, pay it and reconcile.
- Compare the booked amounts and exchange differences with a similar transaction on the current version.
It proves approval rules, currency handling and payables. Fail signals: a skipped or misdirected approval, a bill that cannot be matched to the receipt, or exchange differences posted to a different account. Treat a ledger difference as S1 and a missed approval as S2 or higher.
Scenario 3: Web order to shipped parcel, with a partial refund
- Place an order in your web store's sandbox and pay with the gateway's test credentials.
- Confirm that exactly one order and one payment arrive in the Odoo test database.
- Create the delivery, generate a label with the carrier sandbox and check that tracking returns to Odoo.
- Refund part of the order and confirm the credit note and the gateway status.
It proves the integration chain, not only each connection. Fail signals: duplicate orders, a paid order left unpaid, missing tracking, or a refund that updates only one side. Silent data loss is S2 at minimum and S1 if it affects revenue.
Data integrity and reconciliation
Reconcile instead of eyeballing. Compare record counts for partners, products, users and open documents with the source. Reconcile balances and stock values at a fixed date, and spot-check sample records field by field, in the way Odoo's own end-to-end example does: pick a product and a customer and compare their data in the test and production databases. Open attachments to confirm files came across. On-premise, the upgraded test database is delivered without your production filestore, so merge the filestores before judging attachments. The target is zero unexplained differences. Record any difference you explain, who explained it and who approved it. Finance should own this sign-off, not IT.
User acceptance testing
Have the people who do the work run their own tasks on the test database, using scripts you write with them.
- Pick testers by role, including at least one person who handles exceptions such as returns and corrections.
- Give each a short script covering daily and month-end tasks, with the expected result written down.
- Capture evidence: screenshots or exported documents, not "looks fine."
- Log each defect with a severity from the framework above.
- Collect written sign-off per department, listing any accepted S2 items and their workarounds.
If your team lacks capacity for this, Odiware's Odoo testing services list functional, regression and user acceptance testing.
Go/no-go decision and go-live checklist
Go live only when every gate is met.
- [ ] Exit criteria: no open S1; each open S2 has a tested workaround and written business-owner approval; S3 and S4 are logged with owners.
- [ ] Rehearsal: the upgrade has been rehearsed in full the day before, which Odoo's documentation recommends, and a fresh test upgrade passed the same cases.
- [ ] Backup: a new database and filestore backup taken immediately before cutover, location recorded.
- [ ] Recovery plan: restore steps written and rehearsed, with a named person and a point at which you stop and recover.
- [ ] Approvals: business owner, finance and IT sign off in writing.
- [ ] Communication: staff and affected customers or vendors know the window and who to contact. Production is unavailable while its upgrade runs, so Odoo advises choosing a time of minimal use.
Recovery depends on hosting. According to Odoo's documentation, on Odoo Online it is impossible to revert to the previous version once the upgrade completes. On Odoo.sh the platform automatically reverts the upgrade if anything goes wrong, and creates a backup of the pre-upgrade database when it succeeds. On-premise, changes made to production after the database is uploaded are not present in the upgraded copy, so stop using the system during the upgrade.
Post-upgrade verification, before reopening to everyone. These are the checks a neutralized test copy could not make:
- [ ] Log in as several roles and confirm access.
- [ ] Process a test order and post a test invoice.
- [ ] Confirm outgoing and incoming mail work and that scheduled actions are running.
- [ ] Confirm payment providers and carriers are in live mode, and that bank synchronization works.
- [ ] Rerun the baseline reports and compare.
- [ ] Read the server and scheduled-action logs.
Keep the pre-upgrade backup at least until the first accounting period closes cleanly, and watch logs and support requests closely for the first days.
Frequently asked questions
Do we have to upgrade to Odoo 20 right now?
It depends on your hosting. Odoo's documentation says a database on Odoo Online that sits on a major version must be upgraded every two years, Odoo.sh databases get two further years after the initial three years of support, and on-premise databases can stay on the same version indefinitely, though that is not recommended. A smaller version gap generally makes the upgrade easier.
What if a custom module or third-party app has no Odoo 20 version yet?
The database cannot be upgraded with that module installed until a version exists for Odoo 20. Your options are to wait for the maintainer, commission the update, replace the feature with standard Odoo functionality, or retire it. Check what data the module holds before choosing, and test the outcome on a copy.
Do we need to test if we only use standard Odoo?
Yes, though the effort is lighter. Odoo recommends testing as many of your business flows as possible, because views, behavior and error messages can change even without custom code.
Can the changes to standard behavior be reversed if we do not like them?
No. Odoo's documentation says differences in standard views, features, fields and models cannot be reverted case by case. You can adapt your processes or, where a customization breaks, have its maintainer update it.
Conclusion: decide on evidence
If any gate in the quick checklist is not met, move the date, not the testing.
If your database has custom modules or integrations you are unsure about, Odiware offers a free migration assessment: share your current version and setup, and the team will outline risk and next steps.
Get a free 30-minute review with an Odiware Odoo consultant — bring your current setup and we'll map the fastest route to a working configuration.