Rescue & Recovery
For numbers that are quietly wrong. We trace the symptom back to the parts of the system that disagree, fix the disagreement rather than the symptom, and leave tests behind.
Everything below is something we've shipped into a production Odoo system, and each practice links to the case studies that show it.
For numbers that are quietly wrong. We trace the symptom back to the parts of the system that disagree, fix the disagreement rather than the symptom, and leave tests behind.
Version upgrades across Odoo 16, 17, 18 and 19 — the custom modules, the data and the reports, not just the core. And Enterprise to Community migration: we replace the Enterprise-only features a business actually uses with Community and OCA modules or custom development, so the licence stops being a line item and the work carries on. Either way the migration is rehearsed on a copy of the live database first, the data is verified against the old system, and the cut-over happens only once that comparison is clean.
VAT return engines on both platforms, including multi-company GCC reporting; Saudi ZATCA e-invoicing on UBL 2.1; Saudi labour-law overtime; and leave balances that follow each employee's service year.
Modules that extend Odoo rather than editing its core: 55 built by the team on Odoo 17 and 24 on Odoo 18, running in production today.
Biometric attendance devices, WhatsApp through Meta's Graph API or Twilio, Central Bank of the UAE exchange rates, and vision and language models — with credentials in configuration, never in code.
Document intake and pipeline generation where someone can check the output. The model drafts; it never writes to the database on its own.
A no-code dashboard builder that respects access rights, letterheads an admin changes without a deployment, and Excel exports laid out like the official form.
A no-login attendance kiosk where employees identify with their Iqama and employee ID, check in or out and request corrections — and a portal to request, return or report a fault on company assets.
Module PIN locks, a guarded database manager, scheduled backups, and deployments that upgrade only the modules a change touched — in dependency order, rolling back if an upgrade fails.
The tools behind the case studies on this site.
16, 17, 18 and 19. Our deepest production experience is 17 and 18: MAFA and its sister companies run on Odoo 17 and the aviation and charter platform runs on Odoo 18, both live client platforms we maintain. We have extensive Odoo 16 experience as well, and we work on 19. The conventions differ between versions, and we keep them apart.
Yes. We go through the Enterprise-only features your business actually uses and replace each one — with a Community or OCA module where one does the job, and with custom development where none does. The point is that the business keeps working without the Enterprise licence, so the work is scoped from what you use rather than from the feature list.
That is the part of an upgrade we spend the most time on. Custom modules, their data and their reports are ported to the new version alongside the core upgrade. We rehearse the whole migration on a copy of the live database, check the migrated data against the old system, and only then cut over — the same way we approach anything running in production.
That's most of what we do. MAFA's four company databases have been maintained continuously since April 2025 — fixes, new modules and compliance changes shipped into a system the business runs on every day.
Yes, in two different shapes. MAFA — the root company — and its three sister companies, TechTrade24 KSA, TechTrade24 Germany and Eesint, each run the same Odoo 17 codebase in their own separate database. The aviation group takes the other shape: one Odoo 18 instance running three companies, where a new operating company gets its own document numbering without any setup.
Where a person can check the output. On the customer-onboarding pipeline a vision model fills a form and an admin approves it — the model never writes to the database directly. The CRM assistant runs only when a user asks, against any OpenAI-compatible provider.
In configuration, never in code. Recovery secrets for security features go a step further and live in the server config file, so database access alone can't reset them.
We're a remote team across Pakistan and Saudi Arabia, working on systems for companies in Saudi Arabia, Germany, Pakistan, the UAE and Bahrain.
Describe the symptom. We'll tell you which of these it is — and whether we've fixed a version of it before.