All articles
Odoo & ERP2 August 2026 · 10 min read

Odoo Migration Checklist: What 213 Modules and Zero Errors Actually Takes

Most ERP migration write-ups are written by people selling the migration. This one is written from the other side: I led a full Odoo v14 → v18 migration covering 213 modules, finishing with zero errors and a 100% data match.

This is what that actually required — useful whether you are scoping a migration yourself or evaluating someone who says they can do it for you.

The number that matters is not “modules migrated”

213 modules sounds impressive. It is also the least interesting number in the project.

The number that decides whether a migration succeeds is how many records you verify individually after the move. In this case:

Record type Verified
Partners 3,766
Invoices 4,230
Sales orders 812
Purchase orders 479
Helpdesk tickets 82
User credentials 39

Moving data is straightforward. Proving every invoice carries the same value before and after — that is the work. A migration without a verification plan is not a migration; it is a hopeful copy.

What breaks, in order of likelihood

1. Custom modules written against old APIs

Anything custom is where migrations stall. Core Odoo modules have upgrade paths; your bespoke approval workflow does not. In this project three custom modules had to be ported by hand.

Scope it separately. Custom code is a rewrite estimate, not a migration estimate.

2. Data that was already wrong

Migration exposes every inconsistency the old system tolerated: duplicate partners, invoices without a valid journal, products referencing deleted categories.

You have two options, and only two: clean it before the move, or carry it forward. There is no third option where it fixes itself.

3. Attachments and the filestore

Database rows migrate cleanly. Files sitting in the filestore do not always follow. On one project I had to recover message attachments from an older filestore after the fact — recoverable, but only because the old volume still existed.

Verify file counts, not just row counts.

4. Authentication

Users cannot log in on day one and everyone assumes the migration failed. Plan credential syncing explicitly and test with real accounts before cutover.

A migration checklist that reflects reality

Before you touch anything

  • Take a full backup and restore it somewhere else to prove it works
  • Inventory every custom module and mark which are still in use
  • Run a data-quality audit: duplicates, orphans, broken references
  • Record baseline counts and totals for every business-critical table
  • Agree what “done” means with the client, in numbers

During

  • Migrate to a staging environment first, never straight to production
  • Port custom modules one at a time, testing each in isolation
  • Re-run the baseline counts and compare against the originals
  • Have a named person test each business process end to end

Cutover

  • Freeze writes on the old system
  • Run a final delta migration for records created during the work
  • Sync credentials and verify logins with real accounts
  • Switch DNS/domain last, once the system is confirmed working
  • Keep the old system readable — not writable — for at least a month

Database cleanup is part of the job

On a separate engagement I migrated two production Odoo instances from DigitalOcean to AWS. One database went from 21GB to 1.45GB — a 93% reduction.

That reduction was not compression. It was removing accumulated debris: orphaned attachments, log tables that had never been pruned, and snapshot data from an audit that had run in a loop.

The system was materially faster afterwards. In the same project, standardising bot protection cut response time from 58 seconds to 0.8 seconds — a 98% improvement that had nothing to do with hardware.

The lesson generalises: most “we need a bigger server” problems are actually “nobody has looked at this data in three years” problems.

Estimating honestly

Rough scoping ranges, based on work delivered rather than a price list:

Scope Timeline Main risk
Version upgrade, no customisation 2–4 weeks Third-party module compatibility
Upgrade with 3–5 custom modules 6–10 weeks Custom code rewrites
Cross-platform migration + upgrade 10–16 weeks Data quality, infrastructure changes
Multi-instance consolidation 3–6 months Reconciling conflicting master data

If a proposal promises a full migration with custom modules in two weeks, ask specifically which verification steps are being skipped. There is always an answer.

What to ask a migration partner

  1. How will you verify data integrity? Look for record-level counts and totals, not “we will check it works”.
  2. What happens to our custom modules? Vague answers here mean the estimate is wrong.
  3. What is the rollback plan? If there isn’t one, the cutover is a gamble.
  4. Who tests the business processes? Someone who knows your operations must sign off, not just the developer.
  5. How long do we keep the old system? “We deleted it” is the wrong answer.

FAQ

How long does an Odoo migration take? A straightforward version upgrade takes 2–4 weeks. Add custom modules and it becomes 6–10 weeks. Cross-platform moves with infrastructure changes run 10–16 weeks. The variable is almost always custom code and data quality, not module count.

Can we migrate without downtime? Near-zero downtime is achievable with a staged approach: migrate to staging, verify, then run a final delta sync during a short freeze window. True zero downtime needs dual-write architecture, which is rarely worth the cost at SME scale.

Should we upgrade to the newest version? Not always the very newest. Running one version behind the latest release often means better third-party module support. What matters more is staying within the window that still receives security patches.

What does a failed migration look like? Rarely a dramatic crash. Usually it is discovering three months later that historical invoices have the wrong tax treatment, or that a report silently excludes a subset of records. This is exactly why verification counts matter more than a successful import.


If you are scoping a migration and want a second opinion on the estimate or the verification plan, I am happy to look it over.