An upgrade is not a button. It is three jobs: data, standard modules, custom modules. The third one sets the price.
Order of work
- Copy production to a test server. Never upgrade production first.
- List every custom and third-party module. Mark which ones still exist in the target version.
- Run the upgrade on the copy and read the log for errors.
- Fix custom modules: renamed fields, removed methods, changed views.
- Test the main flows by hand: sell, buy, stock move, invoice, payment.
- Choose a cut-over time, freeze production, repeat the upgrade, switch.
What usually breaks
- Views that inherit from a changed parent (xpath no longer matches)
- Fields or methods renamed in core
- Reports in QWeb that used removed variables
- Third-party apps that have no version for the target
Time rule
Test run first, estimate second. A module-count guess is wrong more often than a measured run.
Skip one version?
Odoo upgrades go version by version in the background. Skipping saves your effort but not the work, so test each result.