Service — Odoo ERP

Odoo ERP implementation, fitted to your business.

Odoo implementation end to end: scoping, configuration, custom modules, data migration, integrations and go-live. Nearshore from Tunis for Europe.

01Odoo 18 · 19 · current release02Community & Enterprise03Python · OWL · XML04PostgreSQL05Odoo.sh · self-hosted06XML-RPC · REST · n8n
01Approach
01

Implementation, end to end

Discovery, process mapping, configuration, migration, training and go-live, run as phases with a written scope for each one. The deliverable is a system your team works in, not a sandbox and a slide deck.

02

Custom module development

Odoo addons written as proper modules — own repository, own tests, core left untouched — so the next version upgrade is a review rather than a rebuild. Studio where Studio is enough, Python where it is not.

03

Data migration

Partners, products, stock, open invoices and accounting balances moved object by object into a staging database, cleaned, reconciled against your current system, and signed off before anyone goes live.

04

Integrations

Odoo connected to what you already run: payment gateways, carriers, e-commerce, bank statements and internal APIs, over XML-RPC, REST or n8n — with retries, logging and a visible failure path.

05

AI automation inside Odoo

Language models placed behind real Odoo actions: documents read into structured fields, supplier invoices pre-filled, first-line answers drafted — each one leaving a record a person approves.

06

Support and version upgrades

After go-live: a triaged backlog, monitored backups, and the annual Odoo upgrade planned and rehearsed as its own project instead of discovered when support ends.

02How an Odoo implementation runs.

How an Odoo implementation runs.

An Odoo ERP implementation runs in phases. Scope the processes, configure standard Odoo against them, write code only where the business genuinely differs, migrate the data, test on real records with the people who will use the system, then go live one group of modules at a time. Every phase ends with something you can open and sign off.

Discovery and scoping

We walk the processes that will live in Odoo — how a quote becomes an order, a delivery and an invoice, who approves what, which numbers have to close the month — and write them down as they actually run today rather than as the org chart describes them. What comes out is a module list, a gap list and a phase plan. The gap list separates what standard Odoo already does from what it does not, and it is the document that decides the budget, so it exists before anything is built.

  • The processes in scope, step by step, with the roles and approvals that touch them.
  • The standard apps that cover them: Sales, Purchase, Inventory, Manufacturing, Accounting, Project, HR, Website.
  • Gaps split three ways — solved by configuration, solved by code, or solved by changing the process.
  • The data that has to move, and every system Odoo has to exchange with.
  • A phased plan whose first go-live is small enough to actually happen.

Configuration

Most of an implementation is configuration, done in a dedicated database that mirrors what production will be: chart of accounts, taxes and journals, warehouses and stock routes, units of measure and product variants, pricelists, numbering sequences, document layouts, user groups and record-level access rules. Odoo's fiscal localisation package is installed and configured for the country you invoice from. None of this is code, and none of it breaks on the next version.

Development, only against the gap list

What configuration cannot reach becomes a custom module, written against the gaps agreed in discovery and reviewed before a line is typed. Anything that is not on that list is a change request with its own decision and its own estimate, not a quiet addition to the build.

Migration, testing and training

Data is loaded into a staging database, and then the people who will use the system test their own work on their own records — a real order, a real delivery, a real month-end. Problems found here are cheap. Training runs on that same database, so nobody is trained on a demo that looks nothing like their day.

Go-live and the weeks after

Cutover follows a written runbook with a rollback point and a named decision-maker. The weeks after go-live are the ones that decide whether an ERP is adopted or worked around, so they are part of the project: a short daily check, a triaged backlog, and the corrections that only surface once real volume hits the system.

03Configure first, customise second.

Configure first, customise second.

Every custom line in Odoo is a line somebody has to carry through the next upgrade. That is the whole argument for configuring first: the standard modules, configured properly, already cover most of what a company asks for, and what they cover costs nothing to maintain.

So the order is fixed. Configuration, then Odoo Studio for small automations, fields and views, then a real Python module when the requirement is genuinely yours — a pricing rule nobody else has, a document a regulator demands, a machine or a marketplace the standard connectors have never heard of.

What we push back on

  • Rebuilding a screen because it looks different from the old software, not because it works better.
  • A custom process that survives only because nobody has questioned it since the last system.
  • Reports recreated field for field when a standard report plus a filter answers the same question.
  • Customising a module before anyone has run a month of real work through the standard one.

How custom code is written

Custom work ships as proper Odoo addons: their own repository, their own manifest, a branch per Odoo version, and the core left untouched. Models are extended, never patched in place. Schema changes carry migration scripts inside the module, business rules are covered by tests, and the module is documented well enough that the next upgrade is a review rather than an archaeology exercise.

The kind of module this usually means

  • A pricing, discount or commission rule that standard pricelists cannot express.
  • An approval or validation step tied to your own thresholds, roles and documents.
  • A document — invoice, delivery note, certificate, label — in a layout a customer or a regulator dictates.
  • A connector to a system with no standard Odoo app: a marketplace, a carrier, a bank format, a machine.
  • A computed field or report the business steers by and that Odoo has no concept of.
  • An import or export in a format a partner insists on, run on a schedule with a visible error path.

Each one arrives with the same things attached: the models it touches, the tests that cover it, a note on what it will need at the next major version, and the repository it lives in — yours, so that changing supplier is a decision and not a rebuild.

04Data migration and go-live.

Data migration and go-live.

Migration is where ERP projects fail quietly. The rule is simple: every object moves deliberately, gets reconciled against a number your finance team already trusts, and is signed off before it counts.

What moves, and in what order

  • Master data first — partners and contacts, products and variants, units of measure, bills of materials, pricelists.
  • Balances next — open customer and supplier invoices, opening stock by location and lot, opening accounting entries.
  • History only where it earns its place: closed documents are often better left readable in the old system than half-imported into the new one.
  • Every load runs into staging first, and runs twice, because the second run is what proves the first was repeatable.

Reconciliation before sign-off

Loaded is not migrated. Stock valuation, receivables, payables and the trial balance are compared against the source system and explained until the difference is either zero or understood. Duplicate partners, missing tax codes and dead references surface here — which is exactly why the cleaning happens before the cutover weekend rather than during it.

Going live in stages

Where the business allows it, modules go live in groups instead of as a single overnight switch. Sales, purchase and inventory can run first while accounting still closes the old year in the old system; manufacturing follows once stock is trusted. A staged go-live gives each team a normal week to learn one thing, rather than an abnormal week learning everything.

Training and handover

Key users are trained on your configuration and your data, not on a demo database, and they train the rest. You get written procedures per role in the language your team actually works in — English, French or Arabic — and the technical handover with it: repositories, module documentation, database and backup access, and an open list of what still needs a decision. The measure of a good handover is that you can run the system without us.

05Odoo integrations.

Odoo integrations.

An Odoo integration connects the ERP to a system that owns data Odoo does not: a webshop, a payment provider, a carrier, a bank, a machine, a legacy application. Odoo exposes its models over XML-RPC and JSON-RPC, and a custom module can add REST endpoints, webhooks and scheduled jobs. So the question is rarely whether two systems can connect — it is who owns which record, and what happens when one side is down.

Common connections

  • E-commerce: Odoo's own website, or Shopify or WooCommerce as the storefront with Odoo holding stock and invoicing.
  • Payments and banking: gateways on the sales side, statement import and reconciliation on the accounting side.
  • Shipping and logistics: carrier labels, tracking written back onto the delivery order, barcode and warehouse devices.
  • Business tools: CRM, mail, spreadsheets, BI and internal APIs — orchestrated in n8n when the flow is a workflow rather than a product feature.
  • Industrial: PLCs, scales, label printers and machine data, where the plant network constrains the design as much as the software does.

What makes an integration survive

  • One system of record per field, written down, so nothing is edited on both sides.
  • Idempotent writes and stored external ids, so a retry never creates a second sales order.
  • Queued jobs with retries and dead-letter handling, instead of synchronous calls that freeze a user's screen.
  • A log a non-developer can read, and an alert when a flow stops — rather than a silence nobody notices for a week.
  • A staging environment wired to the third party's sandbox, so an integration is proven before it touches real money.
06AI automation inside Odoo.

AI automation inside Odoo.

Odoo already holds the record of most things a company does, which makes it the right place to put automation and the wrong place to put a chatbot. The work is narrow on purpose: a model reads something unstructured, an Odoo record is written from it, and a person approves it before it counts.

What it looks like in practice

  • Supplier invoices and delivery notes read into draft vendor bills, with lines matched to products and purchase orders and left in draft for accounting.
  • Inbound email and web enquiries classified, routed and attached to the right partner or lead instead of forwarded by hand.
  • First-line answers drafted against your own documents and past tickets, for a person to send, edit or discard.
  • Product descriptions and specification sheets drafted from structured data, reviewed before they are published.
  • Free text that never gets analysed — order comments, quality remarks, maintenance logs — turned into fields you can filter and report on.

How it is built

As an Odoo module, not a separate application bolted on the side. The model call sits behind a server action or a scheduled job, its output is written to real fields on real models, and Odoo's own access rules apply as they do everywhere else. Where a flow spans several systems it runs in n8n and writes back through the API.

  • Every run leaves a log: what went in, what came back, and which record it touched.
  • Nothing posts itself. Documents land in draft, and a person confirms them.
  • A cost ceiling per job, and a retry path, so a bad day at a provider is not a bad day for you.
  • Failure degrades to a human doing it, never to a wrong record written quietly.

What we push back on: automation that posts an accounting entry nobody reviewed, and anything that has to be right every single time with no way to notice when it is not.

07Manufacturing and inventory in Odoo.

Manufacturing and inventory in Odoo.

Odoo's manufacturing app covers bills of materials, work centres and routings, work orders and subcontracting, on top of the same inventory engine that runs receipts, deliveries and stock valuation. Quality checks and maintenance are separate apps, and Quality is Enterprise only. For a small or mid-sized manufacturer it is usually enough as it ships. What takes the time is describing the shop floor accurately — not writing code.

Where the work actually is

  • Bills of materials that match reality, including variants, phantom BoMs, scrap and by-products.
  • Routings and work centres with capacities and costs that mean something, because they drive both scheduling and margin.
  • Replenishment: reordering rules, lead times, make-to-order versus make-to-stock, and multi-step routes for receipt, quality and put-away.
  • Traceability: lots and serial numbers chosen deliberately, because they decide whether a recall takes an afternoon or a month.
  • Shop-floor reality: barcode scanning, tablet work orders, and steps operators will actually follow.
  • Costing: standard versus average cost, and analytic accounts that show margin per order instead of per year.

Where custom work is usually justified

Machine and scale integration, a scheduling rule specific to your plant, a customer-mandated label or EDI format, and quality documents a regulator wants in a particular shape. Those are genuine gaps. A work order screen that merely looks like the old one is not.

08Odoo Online, Odoo.sh or self-hosted.

Odoo Online, Odoo.sh or self-hosted.

Where Odoo runs decides what you can build, who carries the operational work, and how an upgrade will feel. It is worth deciding on purpose, early, because moving later is a project of its own.

Odoo Online

Odoo runs the platform and you configure it. Studio customisations are fine; custom Python modules are not, and there is no shell or database access. It is the right answer for a company that will stay inside standard Odoo — and the wrong one the moment the gap list contains code.

Odoo.sh

Odoo's own platform for hosted Odoo with your own code: git-backed, with development and staging branches, a build per push, backups, and a supported path through version upgrades. This is where most implementations that involve any development belong, because developers get a real workflow and you do not have to run servers.

Self-hosted

Your own infrastructure, or a European cloud you pick. It is the right answer when data residency, an on-premise integration or an existing platform team requires it. In exchange you own PostgreSQL tuning, backups and restore rehearsals, monitoring, filestore management and the upgrade machinery. That is a real operational job — staff it, or choose Odoo.sh.

Edition is a separate question from hosting. Community is enough for light, self-hosted use; Enterprise adds the modules, the mobile apps and Studio that most companies end up wanting. Either way the licence is a contract between you and Odoo: we implement, we do not resell it, and we have no commercial interest in which edition you land on.

09Odoo 18 and the upgrade cycle.

Odoo 18 and the upgrade cycle.

Odoo ships a major version every year and supports only a limited window of them, so an Odoo deployment is never finished — it is maintained. Whether you start on Odoo 18 or the current release, plan the first upgrade before go-live rather than when support runs out.

What an upgrade actually involves

  • Standard configuration and data are handled by Odoo's own upgrade path and usually move without drama.
  • Custom modules are the real work: deprecated APIs, renamed fields, changed view inheritance and moved models all have to be reviewed and adapted.
  • Third-party apps move at their author's pace, which is a reason to treat every installed app as a dependency before you install it.
  • Integrations are re-tested against the new version, because a renamed field breaks a connector silently.
  • The whole upgrade is rehearsed on a copy of production and validated by the same key users who signed off the go-live.

This is the honest cost of every customisation, and the reason the gap list matters more than the feature list. A deployment that stayed close to standard treats an upgrade as a review. One carrying years of unreviewed custom code turns it into a re-implementation — which is how companies end up stranded several versions behind.

10Questions

The questions that come before a contract.

How does an Odoo implementation actually run?
It starts with a walkthrough of how you work today — order to cash, purchase to pay, stock, and whatever else is going into the system — written up as a scope in which the gaps against standard Odoo are listed explicitly. Then configuration on a test database you can log into, loaded with your own data, so decisions get made against real screens instead of a slide. Development, where there is any, is scoped from what that walkthrough leaves unsolved. Training, a rehearsed go-live and a support period close the phase.
What do we have to decide before the project starts?
Which processes go into Odoo first and which stay where they are. Who inside your company owns each module and has the authority to approve how it works. Your chart of accounts and the tax rules you have to comply with, what data is coming across and how far back, and the hosting choice, because it constrains what custom code is possible at all. The most useful thing you can bring is one decision-maker per department; these projects stall on unanswered questions far more often than on missing features.
Do you configure Odoo or customise it?
Configuration first, always. Most requirements are met by the standard modules when they are configured well, and every custom module you add is code that has to survive the next upgrade. We push back on customisation that only exists because a process was never questioned, and we write custom code where the business genuinely differs from the standard.
What does developing a custom Odoo module involve?
Odoo is extended rather than edited: a module brings its own models, fields, views and business rules, and inherits the standard models instead of rewriting them in place. That discipline is what makes an upgrade possible later. We keep modules in your Git repository with their own tests, one module per coherent piece of the business, and document what each one overrides. A small piece of automation is often better handled by a standard automated action or a report than by a module, and we say so.
Can Odoo be integrated with the systems we already run?
Yes. Odoo exposes an external API over XML-RPC and JSON-RPC, so another system can read and write records, and a custom module can add its own endpoints or push data out when the standard interface is not enough. The usual connections are an online shop, a bank or payment provider, a carrier, a CRM you are keeping, and a legacy system that has to stay for a while. We insist that one system owns each piece of data and the other follows it — two-way sync with no clear owner is where these integrations fail.
Which edition do we need, and do you sell the licence?
The licence is a contract between you and Odoo — we implement, we do not resell. Community is enough for light setups you host yourself; Enterprise adds the modules and the mobile and Studio tooling most companies end up needing. We settle which apps you actually need before the user count, because that is what drives the bill.
Odoo Online, Odoo.sh or our own servers?
Odoo Online is the simplest but does not run custom modules. Odoo.sh runs your custom code with staging branches, and that is where most implementations involving development belong. Self-hosting makes sense when data residency or an on-premise integration requires it, and it puts backups, upgrades and monitoring on your side.
Can Odoo run our manufacturing?
The manufacturing app covers bills of materials, including multi-level ones, work centres, operations and manufacturing orders, with the stock moves and costing wired into the rest of the system. It fits discrete assembly and light process manufacturing well. It is not a substitute for machine-level control, and a shop floor with hard scheduling constraints or per-machine data capture usually needs either a custom module or an integration with the equipment. We test that against your real routings before promising anything.
How does our existing data get in, and how does go-live work?
Data is migrated object by object — partners, products, stock, open invoices, accounting history — cleaned, loaded into a staging database, then reconciled against your current system before anyone signs off. We prefer going live module by module over a single overnight switch, with a rehearsal on real data and a written rollback point.
What does a new Odoo version mean for our custom code?
Odoo publishes a major version each year and supports a limited number of them at a time. Standard configuration and standard data are handled by Odoo's own upgrade process; custom modules are not, and have to be reviewed, ported and retested on the new version by whoever maintains them. That is the real recurring cost of every customisation, and the reason we keep custom code small, documented and covered by tests. An upgrade is planned as its own project with its own test round, not slipped into a maintenance window.
How is an ERP project priced, and who trains the users?
Priced per phase against a written scope, because nobody can honestly estimate “the whole ERP” in a single number. Training and handover are part of the scope, not an extra: key users are trained on your own configuration and your own data, and you get written procedures in the language your team works in — English, French or Arabic.
Contact

Planning an ERP project?

Tell us which processes have to move into Odoo and where your current system stops. You get back a module list, a gap list and a phased plan.

Start a project