Skip to content
العربيةLet’s talk

Practical guide

Odoo data migration: a spreadsheet preparation and test-import checklist

Prepare Odoo migration files with stable IDs, clear field mappings, test imports, reconciliation and an agreed production recovery procedure.

Lava Solutions · · 4 minute read

A close view of Python code displayed on a computer screen.
Illustrative stock photo. Photo: Chris Ried / Unsplash.

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 itemDecision to recordAcceptance evidence
Record selectionWhich active records belong in this batch?Approved source count and exclusion list
IdentifiersWhich stable key identifies each record?No missing or duplicated keys
RelationshipsWhich company, category or parent should each row reference?All references resolve to the intended record
Dates and amountsWhat do the values and units mean?Sample values and relevant totals agree
Blank cellsIs the value unknown, intentionally empty or outside the import scope?Expected result checked in the test database
Business ownershipWho 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.

Sources & further reading

A useful next step

Bring one real workflow.

Share the process you want to improve, the systems involved and the decision you need to make.

Talk to Lava ↗