Odoo module upgrades, done for you
Your custom JS widgets broke — Owl web client migration
Legacy odoo.define widgets and old Owl components are the hardest part of many upgrades. A few hundred lines of JavaScript can outweigh thousands of lines of Python — and it's what blocks install on 16, 17, or 18.
What the port involves
Legacy AMD-style modules:
odoo.define('my_module.CustomWidget', function (require) {
"use strict";
var Widget = require('web.Widget');
// ...
});
become ES modules built on Owl components:
/** @odoo-module **/
import { Component } from "@odoo/owl";
import { registry } from "@web/core/registry";
export class CustomWidget extends Component { /* ... */ }
It's rarely a mechanical rename: widget lifecycles, RPC calls, field-widget registration, and template rendering all changed between the legacy client and Owl 2. This is exactly why JS-heavy modules are our $250 tier — and why we test the UI in a browser, not just the install.
Send us the module. We port the JS/Owl layer to the target web client, install, and test until the UI actually works. Try it live, then $50 to download.
Try the working result before you pay a cent. No signup to get started.
Common questions
Why is JavaScript the hardest part of Odoo upgrades?
The web client rewrote around Owl across 15→18. Old widget patterns, RPC calls, and component lifecycles all changed. Static analysis flags JS-heavy modules as complex for a reason.