Odoo 20.0 FINAL ya está publicado y en el App Store. Si migras una instalación que solo usa módulos oficiales de Odoo, el riesgo es bajo. Si tiene conectores personalizados, propios o de terceros, hay cambios de Odoo 20 que rompen módulos enteros — y al menos uno que no avisa con ningún error. Este es el orden en el que lo comprobamos nosotros, con lo que se puede automatizar y lo que hay que mirar a mano.
1. Inventaría qué módulos no oficiales corren en tu Odoo
Desde Ajustes > Aplicaciones, filtra por «no en catálogo de Odoo» o revisa ir.module.module con author != 'Odoo S.A.'. Cada uno de esos módulos hay que revisarlo antes de migrar; los oficiales los porta Odoo.
2. Busca dependencias de módulos que han desaparecido
grep -rn "base_vat\|base_iban\|stock_picking_batch\|website_sale_wishlist\|website_sale_comparison" */__manifest__.py. Si aparecen en depends, el módulo queda installable=False en Odoo 20: no es un aviso, no se instala. La validación de NIF/IBAN se mudó al núcleo; el resto no tiene sustituto directo.
3. Busca odoo.osv en el código Python
grep -rn 'from odoo.osv import' .. El paquete odoo.osv ya no existe en Odoo 20: da ModuleNotFoundError y el módulo no carga. Cambia cada expression.AND/OR/TRUE_DOMAIN/FALSE_DOMAIN por su equivalente en odoo.fields.Domain.
4. Convierte los permisos al formato nuevo
ir.model.access e ir.rule se funden en un solo modelo, ir.access. Odoo trae un guion oficial: odoo-bin upgrade_code --script 19.4-00-ir-access --addons-path <carpeta>, que convierte los CSV, actualiza el manifiesto y borra el fichero viejo. Ojo con los ficheros ._* de macOS: hacen que el guion falle con UnicodeDecodeError; bórralos antes con find . -name '._*' -delete.
5. Revisa cómo se escriben y leen los adjuntos
Es el cambio más peligroso porque no avisa: ir.attachment.create({'datas': ...}) crea el adjunto con tamaño 0 y sin ningún error. Cambia 'datas': base64.b64encode(x) por 'raw': x — funciona igual en Odoo 17, 18, 19 y 20, así que se puede arreglar hoy sin esperar al porte. Leer con .datas da AttributeError: en Odoo 20 se lee con .raw o, tras leer el campo, con .content/.to_base64() sobre el valor devuelto.
6. Sube la versión del manifiesto a 20.0
Si el version del __manifest__.py no empieza por 20.0, el log dice The module X has an incompatible version, setting installable=False y el módulo queda uninstallable. No es un aviso ignorable: sin este paso, nada de lo anterior importa.
7. Instala en un Odoo 20 real, no solo compiles
Que el código compile o que un escaneo estático no marque nada no demuestra que el módulo instale, y mucho menos que funcione. La única prueba que vale es instalar de verdad en un Odoo 20.0 FINAL con Enterprise y ejecutar toda la batería de tests del módulo, no solo el arranque.
8. No migres de golpe todo el catálogo de conectores
Ordénalos por lo que más dinero mueve o más arriesgado es dejar roto, no por el más fácil de portar. Un conector de facturación o de firma electrónica que falle en silencio — como el de los adjuntos — es mucho más caro de descubrir tarde que uno de catálogo.
El detalle de cada rotura, con el fichero y la línea donde la comprobamos: Odoo 20 ya está aquí: qué cambia para tus integraciones y conectores.
Preguntas frecuentes
¿Puedo migrar a Odoo 20 si tengo conectores personalizados?
Sí, pero cada conector no oficial hay que revisarlo antes: dependencias de módulos que han desaparecido (base_vat, base_iban...), uso de odoo.osv, el formato de permisos y cómo escribe y lee adjuntos. Instalar sin errores no basta; hace falta pasar la batería de tests completa en un Odoo 20 real.
¿Qué es lo primero que se puede arreglar sin esperar a migrar?
Cambiar cómo se escriben los adjuntos: 'datas': base64.b64encode(x) por 'raw': x. Funciona igual en Odoo 17, 18, 19 y 20, así que se puede hacer hoy en el código actual sin esperar a la rama 20.
Enlaces útiles dentro de FlexigoTech
¿Quieres que revisemos tus conectores antes de migrar?
Te decimos, contra el código real de Odoo 20, cuáles de tus módulos personalizados se rompen y por qué punto de esta lista. Escribe a comercial@flexigobe.com o llama al +34 616 809 504.

