βš™οΈ Odoo Migration Console

idle

1Setup β€” source, destination and your custom code

πŸ“¦ Source database

Pick the version of the backup you are migrating. The upgrade steps are prepared from here up to the target. After restore the console double-checks the backup really is this version.
no backups found β€” drop a file into Upload_backup/

🎯 Destination

The database created and migrated by this run (letters, digits, underscores). Created fresh in the Restore DB + neutralize step β€” an existing DB with this name is dropped and rebuilt from the backup.
Output folder migrated_db/
Every finished database is exported here as a timestamped .dump β€” nothing is ever overwritten, all test runs are kept.

🧩 Custom repositories

Module lists (upload Excel or edit below)

Unused modules β€” not used by any client, uninstalled before the migration starts
Report modules to uninstall β€” reporting-only modules rebuilt on the new version (history not migrated)
Module renames β€” two columns: old name β†’ new name (module was renamed in the new version)
Review / edit the uninstall list
One module per line. The job stops before doing any damage if other installed modules depend on a listed one.
Review / edit the module renames
old,new per line β€” same target twice = merge, old,new+extra = split (extra gets installed).

Optional steps

2Progress

Overall0%
Status: idle Mode: – Database at: – Time taken: – Est. remaining: –

3Finish & verify β€” in this order

1 Installs your real custom code on the migrated database (applies renames + data transforms). Unlocks when the hop chain has finished. If it fails, add a solution below and press it again β€” known fixes are re-applied first, then it continues.
πŸ›  Solutions applied automatically
These SQL fixes live in scripts/fixes/ and are replayed first on every run and every retry (each is idempotent). When a new failure is diagnosed, its fix is added here so the same issue never blocks a future migration again.
2 Compares record counts and accounting totals with the untouched source copy. Unlocks after the final update.
3 Removes migration debris and shrinks the database. Unlocks only after Postcheck has PASSED.
4 Boots the migrated Odoo so you can log in and verify. Unlocks after the final update.

Live log

πŸ“– How to migrate β€” read this before your first run

Prerequisites

The steps

  1. Prepare β€” fill in the Setup card: pick the backup, choose the target version, set the custom-repos path, and upload/review the three module lists (unused modules, report modules to uninstall, renames). Press Save settings.
  2. Start β€” choose Test or Production and press β–Ά Start migration. The console restores a copy, disables e-mail and scheduled jobs (a test can never send customer mail), keeps an untouched reference copy for validation, audits every module, uninstalls the listed ones, then upgrades one Odoo version at a time. Each step below shows its own progress bar, time taken and time remaining.
  3. Final update β€” the chain stops on purpose when the database reaches the target version. Press β–Ά Run final update: module renames are applied, your real custom code is installed, and the changed-model data transforms run automatically.
  4. Validate β€” press Postcheck: record counts and accounting totals are compared against the untouched source copy. Debit/credit must match to the cent.
  5. Cleanup β€” press Cleanup (dry-run) to preview, then Cleanup to remove migration debris and shrink the database.
  6. Check in the browser β€” press Start Odoo, open the URL, and log in (customer admin credentials, or press Reset admin password and use admin/admin).
  7. Deliver β€” the finished dump is in migrated_db/ (every run is kept, timestamped). Restore it on the production server together with the migrated filestore.

If something fails

Where it failedWhat to do
Unpack / Restore Check the file is a pg_dump -Fc dump (or a zip containing one). Production mode needs filestore/ inside the zip. Fix the file and press Start migration again.
Preflight Open the log β€” usually a module list problem. Review custom_modules.txt (the suggested list is a starting point, not the truth), then Resume.
Uninstall unused modules The log lists modules that DEPEND on something you want to uninstall. Either add those dependents to the uninstall list too (ask the client!) or remove the blocking entry. Then Resume β€” nothing was changed on failure.
An OpenUpgrade hop (e.g. β†’ 16.0) Read the error in the log (also in logs/hop-<version>.log). Typical causes: a module missing from custom_modules.txt, or a data problem needing a fix in scripts/fixes/. After fixing, press Resume β€” the failed hop is rolled back to its snapshot and retried automatically.
Final update Read logs/custom-update.log. Usually an error in a ported module β€” fix the module code in your repos and press β–Ά Run final update again (it is safe to repeat).
Postcheck shows MISMATCH Any difference in journal items or debit/credit totals is a release blocker β€” investigate before going further. Small attachment-count differences are normal.
Odoo does not open Wait 30–60 s after Start Odoo. Still nothing? Press Stop Odoo, then Start Odoo again and watch the live log.
The server/laptop restarted mid-run Open this page again β€” the job state is remembered. Press Resume to continue from the interrupted step.
Rule of thumb: nothing here is destructive to the customer β€” every run works on a copy, every hop has a rollback snapshot, and mail/crons stay disabled until go-live.