Now booking Q3 — custom modules from $999, typical first ship in 14 days Start a project →
Custom Odoo modules

The module Odoo should have shipped.

OCA-grade modules built around how you actually work. From a 200-line workflow tweak to a full vertical add-on. Delivered in fixed scope. Your source code, in your repo, with tests — not a tangle of server actions someone has to untangle later.

Brief a module → See what we build
What we build

Six categories that cover most of what people ask for.

If your idea isn’t in here, ask anyway — this list is descriptive, not exhaustive.

Workflow modules

Approval flows, gated stages, multi-step state machines. Replace the spreadsheet your team uses next to Odoo.

Vertical add-ons

Industry-specific bundles — clinics, manufacturing, F&B, automotive. Built on what we’ve seen in production.

Reports & dashboards

QWeb PDFs, Bokeh charts, custom dashboards. Things finance and ops actually want to read.

Bridge modules

Two-way syncs with another internal system you can’t replace yet. Retries, queues, audit trails.

Mobile-friendly PWAs

Sales / driver / shop-floor mobile apps that hit Odoo natively. No third-party PWA layer.

AI-enhanced modules

LLM agents inside Odoo — reconciliation, replies, parsing. See AI Solutions →

How we build them

Built like a real product. Not a script.

Most custom Odoo work is a heap of server actions, automated rules and Studio fields glued together. It works on Tuesday and breaks on Thursday when someone upgrades.

Ours look the way Odoo’s own modules look — proper folder structure, manifest, security, views, tests. The next developer (including you) can read it.

  • Standard Odoo module layout — models/, views/, tests/
  • Security groups & record rules, not sudo() everywhere
  • --test-enable against a fresh DB before delivery
  • Manifest pinned to versions we’ve actually tested against
  • Source code in your repo, OPL-1 by default (LGPL on request)
your_module/
├── __init__.py
├── __manifest__.py
├── models/
│   ├── __init__.py
│   └── sop_run.py
├── views/
│   ├── sop_run_views.xml
│   └── sop_action.xml
├── security/
│   ├── ir.model.access.csv
│   └── security_groups.xml
├── tests/
│   └── test_sop_run.py
├── static/description/
│   ├── icon.png
│   └── index.html
└── README.md
Delivery

14 days, on average. Maybe less.

1

Brief call

What problem, what flow, what gets touched. 30 minutes.

2

Fixed quote

One-page spec. Outcome, price, timeline, what’s not included.

3

Staging drop

Built in your staging clone. Daily access for you to break it.

4

Ship + handover

Production install, README, source-code repo, 30 days included support.

Custom work, done two ways

The shortcut. The right way.

Studio + server actions

  • Fields drift from form to form, hard to track
  • Server actions opaque to the next developer
  • Breaks on upgrade with no clear error trail
  • No tests, so refactoring is risky
  • Can’t be published to apps.odoo.com
  • Locks you to the consultant who built it

A proper module

  • Models & fields declared in code, version-controlled
  • Anyone fluent in Odoo can pick it up
  • Migration script ships with the module, upgrades are routine
  • Tests run on every change — refactor without fear
  • Publishable on apps.odoo.com if you want to monetise it
  • Your source — we’re replaceable, by design
~14 daysmedian delivery for a single module
$999+starts at, fixed scope
v17 → v20versions actively supported
100%source code handed over

Brief us on a module — get a fixed quote in 48 hours.

One paragraph is enough. We’ll come back with a spec, price, and timeline. If we can’t do it fixed-scope, we say so on the call.