Odoo Migration
The Odoo Migration Data Validation Checklist
This is the list, not the method. Every check here produces a number you can pull from both the old system and the new one and compare. Anything that does not reduce to a comparable number is an opinion, and opinions do not survive the meeting where somebody asks whether you are sure.
Part of our guide to Odoo Migration
How to use this
Run these against a migrated copy before go-live, and again immediately after the real cutover. Each one gives a number from the source and a number from Odoo. Record both, in writing, alongside who checked and when.
The order matters. Broad cheap checks first, because a record count that is short saves you a day of investigating individual records that were never there.
Record counts, by model
The first pass. For each area, count records in both systems and compare:
- Partners, split into customers and suppliers, since many systems keep them separately
- Products, and separately product variants, which are the usual source of a mismatch
- Sales orders, purchase orders and their line counts
- Customer invoices, vendor bills and credit notes
- Journal entries and journal items
- Stock moves and stock quants
- Users, and separately active users
Expect some differences and explain each one rather than accepting it. Draft records that were filtered out, archived partners, or a system that counted an order and its revision as two are all legitimate explanations. "It is only a few" is not.
Financial reconciliation
The checks that finance will ask for, so produce them before being asked:
- Trial balance at the cutover date, matching to the cent
- Accounts receivable total, and the aged breakdown by bucket
- Accounts payable total, and its aged breakdown
- Bank and cash balances per account, against the last reconciled statement
- Tax totals by tax code for the current period
- Unreconciled items count, since a total can match while the composition is wrong
That last one catches a specific failure: balances agreeing overall while individual invoices and payments have lost their reconciliation links. The number is right and the aging is meaningless.
Stock and manufacturing
- Quantity on hand by product and by location, not just in total
- Stock valuation, which must be checked separately from quantity because they can diverge
- Products with negative quantities, which should be a known list rather than a discovery
- Open transfers by state, being ready, waiting and done
- Open manufacturing orders and their component reservations
- Lot and serial numbers where they are tracked, since these are frequently lost in imports
Total quantity is the check people run. Quantity by location is the check that finds the problem, because a migration that collapses locations produces a correct total and an unusable warehouse.
Documents and attachments
The most commonly missed area, and the one that fails silently.
Count attachment records, then open a sample of at least twenty actual files across different years and types. The records live in the database and the files live in the filestore, so a restore can carry every row without the bytes behind them. Screens render, counts agree, and the PDFs are gone.
Also confirm generated documents still produce correctly: one invoice, one delivery note, one quotation, one purchase order. Read them as a customer would.
Sequences and numbering
Check the next number for each sequence in use: invoices, orders, pickings, journal entries.
A sequence that reset to one will start issuing duplicate document numbers on the first transaction after go-live, and in most jurisdictions duplicate invoice numbers are a compliance problem rather than a tidiness problem. This check takes two minutes and is skipped almost universally.
Access, automation and integrations
- User accounts, their groups, and specifically who has administrative rights
- Record rules and any multi-company restrictions, tested by logging in as a normal user rather than by reading the configuration
- Scheduled actions, both that they exist and that their next run times are sane
- Email configuration, both outgoing and incoming, tested with a real send
- Every integration completing one full cycle in both directions
Log in as an ordinary user for the access checks. An administrator sees everything by definition, so an administrator's screen tells you nothing about whether permissions survived.
Reports the business actually uses
Not every report. The five or six people run weekly, named in advance by the people who run them.
Produce each in both systems for the same period and compare the figures. Where they differ, understand why before go-live. This is the check that most often surfaces a genuine behavioural difference rather than a data loss, which is exactly why it belongs at the end, after the simpler explanations are eliminated.
Sign-off
Each area is signed off by its owner: finance for the balances, the warehouse for stock, sales for open orders, IT for access and integrations.
Written sign-off is not bureaucracy here. It is what converts "we think it is fine" into a defensible go-live decision, and it is what makes the rollback conversation a decision rather than an argument. The process that produces these numbers reliably, round after round, is the testing strategy that surrounds this list.
FAQ
Questions, answered.
What should we check first after an Odoo migration?
Record counts by model, because a count that is short tells you something did not arrive before you have spent a day investigating individual records. Then financial totals, then stock, then attachments. Cheapest and broadest checks first.
How do we know attachments survived a migration?
Count attachment records, then open a sample of the actual files. The records live in the database and the files live in the filestore, so a restore can carry the rows without the bytes. The counts match, the screens look right, and the PDFs are gone.
Who signs off that the data is correct?
The people who own each area, not the technical team. Finance signs off the balances, the warehouse signs off stock, sales signs off open orders. A developer can confirm records exist; only the person who closes the month can confirm the close is right.
Keep reading
More on Odoo Migration.
The full guide, plus the other articles in this cluster.
With CODEerts
Planning an upgrade?
We are certified Odoo partners. We migrate and upgrade Odoo databases, including the custom modules and integrations that decide how long it really takes.
See how we can helpBook a callReady to make Odoo work the way your business does?
Book a free callCODEerts is a team of certified Odoo partners and full-stack engineers. We implement, customise and support Odoo ERP, then build the software around it.