Migrating your Excel data into Odoo: what actually goes wrong
Every company moving to Odoo arrives with a history: Excel files, sometimes legacy software, often both. The question "can our data be recovered?" always gets the same answer: yes.
The real question lies elsewhere. It is not can it, but what should be brought over, in what state, and who settles it when the files contradict each other. That is where migrations go wrong — never on the import itself.
What comes over, and what stays behind
Everything is technically importable. That does not mean everything should be.
Always bring over
- Customers and suppliers — contact details, tax identifiers, payment terms
- Products or services — references, descriptions, prices, units
- Current stock — real quantities, not theoretical ones
- Open items — unpaid invoices, live orders, ongoing projects
Leave behind, unless there is a specific reason
- Invoice history settled years ago
- Dead contacts, discontinued products
- Intermediate working files
Bringing over ten years of paid invoices costs a lot and is almost never used. The practice that works: keep the old system read-only, or an archive of its exports, for rare lookups.
The five problems that always come up
Duplicates
The same customer entered three times, spelled three ways. The most frequent case and the longest to handle, because someone has to decide which record is right — and sometimes the answer is "none of the three".
No tool does this reliably for you. Someone who knows the customers has to go through the list.
Inconsistent units
A product sold by the metre in one file, by the piece in another, by the box at the supplier. Without explicit conversion, stock goes wrong at the first delivery.
Balances nobody wants to settle
The customer file says one client owes 12,000, accounting says 9,500. This is not an import problem: it is a real discrepancy the migration exposes. Someone has to decide the opening figure, and that someone is usually the accountant.
Fields that do not exist in Odoo
An in-house Excel column with no equivalent. Three options: map it to a nearby Odoo field, create a custom field, or drop it because it no longer serves. The third is more common than people admit.
Living files
Activity continues during migration. Files change. Without a freeze date agreed in advance, you import an already-outdated state.
The method that avoids nasty surprises
1. A sample before anything else. Fifty rows from each file, imported into a test environment. Format and unit problems show up immediately, at a volume you can read by eye.
2. Clean in Excel, not in Odoo. Fixing duplicates and units in the source file is faster and, crucially, reversible. Once imported, corrections become Odoo operations.
3. An announced freeze date. From this date, no more entry in the old files. The most unpopular constraint, and the most useful.
4. A full dry-run import. All data into a test environment, checked by the people who know the figures: stock totals, customer balances, number of references.
5. The real import, then a cross-check. The same people re-verify the same totals in production.
This sequence takes longer than a direct import. It avoids discovering three weeks later that stock has been wrong from the start.
Who does what
The split that works, across our deployments:
| Task | Who |
|---|---|
| Extract data from the old system | you, or us if access allows |
| Decide what comes over | you |
| Settle duplicates and balances | you, with your accountant |
| Format and import | us |
| Verify totals | you |
The point to keep: the decisions are yours, the technical work is ours. A migration where the integrator alone decides which customer is right produces a database that is clean and wrong.
Frequently asked questions
How long does a data migration take? From a few days to several weeks, depending on volume and above all on how clean the source files are. Cleaning almost always takes longer than importing.
Do we need to bring over the full invoice history? Rarely. Open items and recent invoices are enough in most cases. Keeping the old system readable, or an archive of its exports, covers exceptional lookups at far lower cost.
What if our files are badly kept? That is the normal situation, not the exception. Cleaning is part of the project. What it requires is time on your side to settle the ambiguous cases — nobody else can know which of two same-named customers is the right one.
Can we migrate without stopping operations? Yes, with a freeze date on the old files and a switch over a quiet day. Operations do not stop, but double entry has to stop dead, or the two systems diverge.
Is migration billed separately? No, it is part of the project and appears in the initial quote. We provide a detailed, free quote within 24 hours after reviewing your files.
For the details of our offer, see our Odoo service. On choosing the edition, read Community or Enterprise. For sector projects, Odoo for construction.

