Prepare an Odoo data migration as a repeatable process: define the records you need, clean a controlled copy, map identifiers, test a representative sample and reconcile the result. A spreadsheet that uploads successfully can still contain the wrong relationships or incomplete business information.
The product details here reference Odoo 20 documentation, checked on 10 November 2026. Confirm the fields and import interface in your installed version. The checklist concerns spreadsheet records, not moving an entire Odoo database between hosting providers.
Define what moves and who approves it
Make a migration register before editing files. For each dataset, name its source, business owner, selection rule, destination and acceptance check. Separate active customers and products from obsolete records, opening positions and historical transactions. Decide which history must remain searchable in the old system.
Keep the original export unchanged. Work on a dated preparation copy and maintain a short change log: merged duplicates, standardized labels, excluded records and unresolved questions. A sales administrator may approve contact names; finance should approve financial classifications. Do not let an ambiguous cell become an undocumented assumption.
Build the mapping before filling the file
Odoo 20 accepts XLSX and CSV imports. Use its template or a sample export to establish field names, review every mapping, and run the Test action before importing. A successful validation is an initial check; it does not establish that the business meaning is correct. See the official import guide.
| Preparation item | Decision to record | Acceptance evidence |
|---|---|---|
| Record selection | Which active records belong in this batch? | Approved source count and exclusion list |
| Identifiers | Which stable key identifies each record? | No missing or duplicated keys |
| Relationships | Which company, category or parent should each row reference? | All references resolve to the intended record |
| Dates and amounts | What do the values and units mean? | Sample values and relevant totals agree |
| Blank cells | Is the value unknown, intentionally empty or outside the import scope? | Expected result checked in the test database |
| Business ownership | Who can resolve exceptions and accept the result? | Named reviewer and recorded decision |
Preserve identities and relationships
External IDs support repeat updates and links between imported records. Keep them stable, unique and traceable to the source. Import referenced records first. Odoo warns that changing or removing IDs can create duplicates instead of updates. Reusing an existing ID for the wrong row can also target the wrong record. Review Odoo’s identifier guidance before preparing a repeat run.
Treat identifiers as controlled data, not spreadsheet row numbers that change when sorting. Keep a cross-reference of old and new keys. Have a reviewer inspect records with similar names, multiple delivery addresses or shared company names. Avoid relying on a display name alone where it could refer to more than one record.
Check formats with deliberately awkward examples
For CSV, check the detected date format and decimal separators. Odoo documents ISO-style dates such as 2026-11-10; Excel date cells are another supported approach. An included empty field behaves differently from an omitted field, so test blanks deliberately. The formatting guidance explains these cases.
Your sample should include an Arabic name, an apostrophe, a leading-zero reference, a negative amount where relevant, and a date whose day and month could be confused. Compare the actual imported values, not merely their appearance in the preparation workbook. Assign explicit currency and unit context to your checks so unlike quantities are never added together.
Run a rehearsal in the right environment
Use an approved non-production environment. Odoo’s neutralized database documentation explains that testing copies disable features such as outgoing email and payment providers. Check the actual environment and any custom integrations before importing; do not assume every external connection is covered.
On Odoo Online, the database manager documentation describes testing duplicates and backup downloads. The options for your hosting arrangement may differ. Agree access, retention and recovery with the administrator before the rehearsal.
Run the sample, inspect the records, then repeat it with a small intentional correction. Verify that the expected record changes and that record counts remain stable. Rehearse the dependency order and record every manual step. A repeatable run is easier to review than a series of undocumented fixes.
A fictional contact migration
Imagine a fictional supplier with two companies that both display as “North Trading.” Their source keys are different, and each has several contacts. The test file preserves separate company IDs and references those IDs from the contacts. A reviewer checks that each person belongs to the intended business.
The second rehearsal changes one contact’s telephone number while retaining its ID. The expected result is one corrected contact with no additional contact or company. This example is a test design, not a customer story or a claim about an executed migration.
Reconcile before approving production
Compare selected source records, imported records, exclusions and exceptions. For transaction datasets, reconcile meaningful amounts by currency and quantities by unit, then inspect relationships and representative documents. Record any permitted rounding difference explicitly; unexplained differences remain unresolved.
Odoo warns that imports are permanent and cannot be undone through an import undo action. Agree a backup and recovery procedure before the production run, including how later transactions would be preserved. Stop if identifiers or reconciliation checks fail.
For help defining the migration scope within an Odoo implementation, contact Lava with the source systems, record types and owners. Keep stock-process decisions separate using the inventory setup checklist.
