02
ERP systems
Odoo shaped around your flows: standard where that is enough, custom where your way of working is an advantage
An ERP is not judged by how many features it has, but by how many people stop keeping a parallel spreadsheet. While that spreadsheet stays open, the project is not finished.
- Flow analysisWhat the current system does, and what the spreadsheets kept beside it do
- Standard configurationStart from what Odoo already does, without writing code
- Custom modulesOnly where your way of working is an advantage, kept in separate modules
- Data migrationRehearsed several times, with the numbers having to add up
- Go-live by flowStart with the flow that matters most; the rest follows once it really runs
- First weeksFixes and side-by-side support: they decide whether the system gets used
Standard while it holds, custom where it counts
Odoo covers a great deal, and every custom module is code to maintain at each upgrade. The rule is simple: customise where the process is the company's competitive advantage, stay on the standard everywhere else.
When customisation is needed it lives in separate, versioned modules rather than edits to the core: that is what keeps the door open to future upgrades.
The numbers you actually decide on
Analytical accounting is the part that pays off most: once costs attach themselves to the job, the site or the product line, margin stops being a year-end estimate and becomes something you watch while the work is still running.
For that to work the data has to be born already assigned — from the phone of the person on site, from the document coming in, from the shift recorded — not reconstructed afterwards from memory.
Go-live without stopping the work
Separate environments for testing and production, database templates to start from a proven configuration, data migration rehearsed several times before the real day, and a way back if something doesn't add up.
On go-live day nobody has to learn everything: you start from the flow that matters most and add the rest once the first one really runs.
What "configuring" Odoo actually means
Between installing the product and having it useful lie dozens of decisions no manual takes for you: what your categories are called, which states an order passes through, who may approve what, which fields are mandatory and — above all — which are not.
This is where the project is won or lost. A well-configured system feels bespoke while being standard; a badly configured one forces people into workarounds that, six months later, have become the real process.
Our rule: every mandatory field must have someone downstream who uses it. If nobody reads that data, the field is simply slowing thirty people down every day.
When a custom module is warranted
A module is written when your way of working is a competitive advantage and the standard would force you to give it up. Not when a screen is disliked: that is solved by configuration, at a hundredth of the cost.
The module lives separately from the core, with its own lifecycle and its own automated checks. It is the difference between an upgrade done in an afternoon and one postponed for two years until the system becomes an archaeological artefact.
And it carries a maintenance cost that should be stated upfront: every new Odoo version requires checking the modules. A few hours if they are written well, weeks if someone has been inside the core.
Go-live day, and the week after
Go-live is not the finish line: it is the most fragile moment of the project. The first two weeks need someone sitting beside the people working, not a support number — because the real problems are not software errors, they are cases the analysis never saw.
During the same period a short friction list is kept and two items a week are fixed. That is the signal deciding whether the system is used or worked around: people accept an imperfect system that improves, not a perfect one that doesn't listen.
What we work with on Odoo
Odoo is a vast product: what matters is how it is implemented and what gets added without compromising upgrades.
Platform
- Odoo
- Python
- PostgreSQL
- separate modules
The standard covers most of the common work. Everything we add lives in its own versioned modules with their own tests: the core stays untouched, so upgrading stays possible.
Accounting and jobs
- analytical accounting
- cost centres
- reporting
- period closing
The part that pays off most: when every hour and every material is born already assigned to a job, margin is watched while the work runs instead of after the fact.
Migration
- extraction from legacy systems
- cleaning and deduplication
- repeated dry runs
- balance reconciliation
Old data is always worse than the memory of it. Every rehearsal is verified against the numbers — balances, open items, counts — because migration is judged by reconciliation, not by the absence of errors.
Environments
- Docker
- Kubernetes
- separate test and production instances
- per-instance backups
A test environment identical to production, so what works in test genuinely works. Every instance has its own backups and a rehearsed restore path, not a declared one.
Portfolio
What we did on this, project by project.
CocoonServer
Management platform for multi-customer Odoo instances
- A console governing the environment lifecycle: create, start, upgrade, clone and decommission, with explicit, traced semantics.
- Per-instance backup and restore with verification and operation history.
- Custom module and bundle management: upload, package validation and controlled installation on selected instances.
- Database templates and environment export, so a new customer starts from a proven configuration instead of from scratch.
- Odoo
- PostgreSQL
- Kubernetes
- Helm
- Next.js
- Prisma
ASC Buildings
Construction site wired into analytical accounting
- Access and attendance captured on site flow into Odoo and become cost on the right job, with no manual re-entry.
- The data is born already assigned: who entered, where and when, instead of being reconstructed in the back office at month end.
- Odoo
- analytical accounting
- Odoo API
- Flutter
ERP Next-Gen
Selective port of Odoo onto a TypeScript stack
Internal research: architecture completed, not in production.
- Portability study of the base module towards NestJS and Prisma: a modular monolith with explicit boundaries and room for future extraction.
- Multi-company foundation with database-level isolation, cross-module side effects through events, and GDPR requirements taken as a design constraint.
- NestJS
- Prisma
- PostgreSQL
- RabbitMQ
- MinIO
Need this?
Tell us the problem and we'll tell you how we would tackle it — and if it isn't worth doing, we'll tell you that too.
Let's talk