Business-ready modules, not customisations that break at the next upgrade.
Anyone can bolt a field onto a form. The skill is writing the thing so that it still works in Odoo 20, still makes sense to the next developer, and does not quietly corrupt your accounting at month-end.
We will try to talk you out of it first.
Every custom module is a cost you carry forever, through every upgrade, every new hire, every audit. So the first question is never “can we build it”. It is “should we”.
Configure it when…
- →Standard Odoo does 90% and the last 10% is habit, not requirement
- →An automation rule, server action or Studio field solves it
- →The process differs between teams because nobody agreed it, not because it must
- →A community module already does it and is maintained
Build it when…
- →The process is genuinely how you compete, not how you cope
- →A regulator, a customer contract or a tax authority requires it
- →The workaround costs more hours per month than the module costs once
- →Another system has to talk to Odoo and neither speaks the other's language
Modules we wrote, running in production.
These are not demos. Some run in our own live Odoo 19 system, used by our own team every week. Others run in client systems. Either way, you can ask to see them working.
AI CV screening
Every applicant is scored against the job position from their own CV, automatically, as they apply. The recruiter opens a shortlist instead of an inbox, and the reasoning is written into the record, so a rejection can be explained.
Voice assessment
Candidates record spoken answers from a private link in the browser. The model listens to the audio itself: fluency, clarity, pace, whether the answer addresses the question, rather than reading a transcript. Useful when the role is on the phone all day.
Unified sender identity
Odoo puts each author's own address in the From header, which exposes personal mailboxes and breaks on mail servers that only allow the authenticated account to send. This rewrites From to one company address while keeping the author's name, and leaves Reply-To alone so replies still thread back onto the record.
Sales order stage pipeline
Odoo gives quotations a status, not a pipeline. This adds real stages to sales orders so a long deal can be tracked through survey, approval, deposit and scheduling, on a kanban board the sales team actually looks at.
Bulk purchase demand and approvals
Restocking requests used to be informal, with no record of what had been asked for or approved. This adds a three-tier chain: staff raise a demand, a Head of Purchasing sets the recommended quantity, a Director approves and it locks. Every line pulls live on-hand stock, a configurable monthly threshold blocks approval once exceeded, and no purchase order can exceed what was approved, even across several separate orders.
Approvals that raise their own purchase orders
Approving a demand now raises the request-for-quote orders behind it the same day, grouped one per vendor, with vendors and pricing pulled from each product's own records. Products with no vendor on file are raised against a labelled placeholder rather than silently skipped, and cannot be confirmed until a real vendor is set.
We also build the unglamorous ones: skill taxonomies, website job templates, licence and expiry handling, report layouts, approval matrices.
Talk about yours →Making Odoo talk to everything else you run.
Most of the value in an ERP shows up when the data stops being retyped between systems. We build the connectors, handle the failure cases, and log enough that you can prove what happened.
Payments
Gateways, bank feeds and reconciliation.
WhatsApp & SMS
Order updates, reminders and two-way threads on the record.
Courier & logistics
Booking, labels and tracking pushed back to the order.
E-commerce
Shopify, WooCommerce or a marketplace kept in sync with stock.
IP PBX & call data
Click-to-dial, screen pop and call records attached to the customer.
Biometrics & attendance
Device punches feeding attendance, work entries and payroll.
AI services
Screening, drafting, extraction and classification inside Odoo.
Anything with an API
Odoo speaks XML-RPC and JSON-RPC; we write the rest.
Written so the next person can read it.
Including, eventually, someone who is not us. That is the point.
Proper modules, not core edits
We never patch Odoo's own source. Everything lives in a separate addon that can be switched off without taking your database with it.
Tests where it counts
Anything touching money, stock or payroll gets automated tests, so an upgrade tells us it broke before your accountant does.
Upgrade-aware by design
We follow Odoo's own patterns and inheritance rather than fighting them, which is what makes the annual version jump routine instead of a project.
Staging before production
Changes land on a copy of your live database first. You approve what you can see, not what you were told.
Documented in plain language
Every module ships with a description of what it does and why it exists, written for the person who inherits it in three years.
You own the source
Delivered as code you keep, in your own repository if you have one. No obfuscation, no licence key, no hostage-taking.
Have a process Odoo does not do?
Describe it in a call. We will tell you whether it is configuration, a module, or a habit worth dropping.