Odoo 20.0 FINAL is already out and live on the App Store. If you are migrating a setup that only uses official Odoo modules, the risk is low. If it runs custom, in-house or third-party connectors, several Odoo 20 changes break entire modules — and at least one of them raises no error at all. This is the order we check things in, what can be automated and what has to be checked by hand.
1. List which non-official modules run on your Odoo
From Settings > Apps, filter by «not in Odoo's catalog», or query ir.module.module with author != 'Odoo S.A.'. Each of those modules needs checking before migration; the official ones are Odoo's own job to port.
2. Look for dependencies on modules that no longer exist
grep -rn "base_vat\|base_iban\|stock_picking_batch\|website_sale_wishlist\|website_sale_comparison" */__manifest__.py. If any show up in depends, the module ends up installable=False on Odoo 20: not a warning, it simply does not install. NIF/IBAN validation moved into core; the rest has no direct replacement.
3. Look for odoo.osv in the Python code
grep -rn 'from odoo.osv import' .. The odoo.osv package no longer exists on Odoo 20: it raises ModuleNotFoundError and the module fails to load. Replace each expression.AND/OR/TRUE_DOMAIN/FALSE_DOMAIN with its odoo.fields.Domain equivalent.
4. Convert permissions to the new format
ir.model.access and ir.rule merge into a single model, ir.access. Odoo ships an official script: odoo-bin upgrade_code --script 19.4-00-ir-access --addons-path <folder>, which converts the CSVs, updates the manifest and removes the old file. Watch out for macOS ._* files: they make the script fail with UnicodeDecodeError; delete them first with find . -name '._*' -delete.
5. Check how attachments are written and read
This is the most dangerous change because it gives no warning: ir.attachment.create({'datas': ...}) creates the attachment at size 0, with no error at all. Change 'datas': base64.b64encode(x) to 'raw': x — it works the same on Odoo 17, 18, 19 and 20, so it can be fixed today without waiting for the port. Reading via .datas raises AttributeError: on Odoo 20 it is read via .raw, or, after reading the field, via .content/.to_base64() on the returned value.
6. Bump the manifest version to 20.0
If version in __manifest__.py does not start with 20.0, the log says The module X has an incompatible version, setting installable=False and the module is left uninstallable. It is not a warning you can ignore: without this step, none of the previous points matter.
7. Install on a real Odoo 20, don't just compile
Code compiling, or a static scan finding nothing, does not prove the module installs, let alone that it works. The only test that counts is a real install on Odoo 20.0 FINAL with Enterprise, running the module's full test suite, not just checking it boots.
8. Don't migrate the entire connector catalog at once
Sort them by what moves the most money or is riskiest to leave broken, not by what is easiest to port. A billing or e-signature connector failing silently — like the attachment issue — is far more expensive to discover late than a catalog connector.
The detail of each breaking change, with the file and line we checked it against: Odoo 20 is here: what changes for your integrations and connectors.
Frequently asked questions
Can I migrate to Odoo 20 if I have custom connectors?
Yes, but every non-official connector needs checking first: dependencies on modules that no longer exist (base_vat, base_iban...), use of odoo.osv, the permission file format, and how it writes and reads attachments. A clean install is not enough; it needs to clear the full test suite on a real Odoo 20.
What's the first thing that can be fixed without waiting to migrate?
Changing how attachments are written: 'datas': base64.b64encode(x) to 'raw': x. It behaves the same on Odoo 17, 18, 19 and 20, so it can be done today in the current code without waiting for the 20 branch.
Useful links inside FlexigoTech
Want us to review your connectors before you migrate?
We'll tell you, against the real Odoo 20 source, which of your custom modules break and at which point on this list. Email comercial@flexigobe.com or call +34 616 809 504.

