Skip to Content
Senedoo Get in touch

Technology and AI

Real-time interfaces with Odoo.

Odoo is excellent at capturing and keeping data

It is less good at showing it the way a managing director, a Senegalese accountant or a shop manager needs it. Rather than developing inside Odoo — which costs at every upgrade — we built a technology that works alongside Odoo, live, without copying your data.

It opens inside Odoo

Our OHADA balances, your dashboard, the stock location view, the Excel exports appear in Odoo's menus, with your access rights, without a second login.

It reads Odoo the moment you look

No data warehouse refreshed overnight: the balance you open at 10:04 contains the entry posted at 10:03. The 3D planogram fills at receipt and empties at sale.

It listens to Odoo

A validated invoice, a closed till session, a confirmed order: Odoo notifies our server, which updates the dashboard, flags the forgotten session, or triggers a supplier order.

It talks to machines

Tremol fiscal devices in Kenya, receipt printers, M-Pesa terminals: our gateways run next to the till and keep a queue, so an internet outage never blocks a sale.

It sees several databases at once

Five stations, five Odoo databases, one dashboard; one configuration compared with another; a central purchasing company that splits its orders across its stations' databases.

And it stays reversible

every write is logged and can be undone, access to your databases is encrypted and specific to each client, and you receive the rebuild sheet of your configuration.

The living store — the shop in 3D, read live from Odoo
The living store — the shop in 3D, read live from Odoo
Network architecture: SaaS clusters, orchestrator, central purchasing
Network architecture: SaaS clusters, orchestrator, central purchasing
The Odoo till in the living store
The Odoo till in the living store
AI, MCP server, ToolBox

Your Odoo databases, operated by AI — under control.

We developed our own MCP server

Model Context Protocol, the open standard created in late 2024 and adopted by Claude, ChatGPT, Gemini and Copilot, which lets an AI use tools. Ours has three hundred and thirty-seven, all connected to your Odoo databases: diagnostics, Sage import, payroll, reports, tills, backups, dashboards, configuration. No dependency on a single AI vendor.

What took a consultant a day takes ten minutes of conversation

"Check the balance after the import", "install the Commerce agreement on this database and compute a test payroll", "which till is stuck at Westlands?" — and the answer comes back, with the numbers.

Control stays human

Every write is simulated first, executed only on confirmation, and logged so it can be undone. The AI proposes; the consultant decides.

Schema mcp
The ToolBox MCP server: controlled tools between users — human and AI — and the databases
› Check the balance of sunu-finance after the Sage ledger import
sage_import_verify_balance(client_id="sunu-finance", rapproche=true)
✓ 1,842 accounts reconciled · variance 0 XOF · 0 lines on deprecated accounts
› Install the Commerce 2023 agreement on dakar-boutiques and compute August's test payroll
payroll_install_full(client_id="dakar-boutiques", convention="COMMERCE 2023", confirm=false)
→ simulation: 1 structure, 42 rules, 6 categories. Confirm?
› Which till is stuck at Westlands?
pos_diag(client_id="nairobi-stations")
✓ 3 open sessions · 0 receipts awaiting signature · eTIMS bridge OK
Networks and groups

The SaaS cluster technology

For a shop network or a group of companies, we don't put everything in one database. We spread sites across clusters of about twenty Odoo SaaS databases, linked by our orchestrator: each cluster stays light, an outage never stops the whole network, and you grow by adding a cluster, not by rebuilding.

Resilience

A maintenance window or an incident affects only one cluster of twenty shops: the rest of the network and the hub keep selling and ordering.

Controlled volumes

One till ticket creates twelve records. Over five years a twenty-shop cluster weighs 131 million rows — Odoo's comfort zone. A single 150-shop database would weigh a billion.

Parallelism

POS load is distributed; the orchestrator processes each cluster's flows in parallel. Latency stays stable at peak hours.

Roll-out in waves

One cluster = one wave. Our tooling provisions a complete database — companies, warehouses, tills, catalogue — in an automated, repeatable way.

Master data propagated

A product added at the hub propagates to every cluster and to e-commerce; a permanent consistency check flags any discrepancy — price, code, unit, tax.

One federated view

The dashboard and the MCP tools read clusters one by one or in a cached federated view: to the user, the network reads like a single database.

Hosting

SaaS, Odoo.sh or on-premise? Why do we prefer Odoo SaaS?

Odoo deploys three ways: Odoo SaaS (odoo.com, hosted and operated by the publisher), Odoo.sh (the publisher's cloud platform with your own Python modules), or on-premise (your servers). We recommend SaaS to almost all our clients, and we prefer to say so with its limits.

Criterion✔ Odoo SaaS (our recommendation)Odoo.shOn-premise
Hosting and operations
Included
Included in the Enterprise subscription: ISO 27001 infrastructure, replicated backups, monitoring, Odoo S.A.'s availability guarantee. Zero servers to buy or administer.
To plan
Hosting billed on top (workers, storage, staging environments). Operations shared between publisher and integrator.
On you
Servers, redundancy, backups, security and an operations team at your expense. In Senegal or Kenya, power and connectivity add to the risk.
Version upgrades
Included
Automatic and continuous, year after year: your databases stay on the latest version with no migration project.
To plan
A migration to plan every two or three years, adapting your modules: a project each time.
On you
Migration at your expense, often postponed: on-premise databases age, technical debt piles up.
Customisation
Included
Studio (fields, views, reports, automations) and our technology alongside Odoo (ToolBox, orchestrator, installable add-ons). Honest limit: no way to touch Odoo's source code. Our answer: customisations run on a VPS kept in sync with your database through webhooks and crons, without touching the SaaS database — it stays standard, hence always up to date.
To plan
Custom Python modules possible — that is its point, and its trap. A module touches Odoo's source code: at every version it must be reviewed, adapted and retested; until then the upgrade is blocked. A bug in the module stops the whole database, not just the feature. And the code ties you to its author: without them, nobody maintains it.
On you
Everything is possible, everything is yours to maintain. Same drawbacks as Odoo.sh Python modules — modified source code, postponed migrations, dependence on the developer — without the platform's automated staging and deployment. This is how databases end up stuck on version 12 or 14.
Resilience and scale
Included
One database per cluster of about twenty sites; an incident stays local; you grow by adding clusters.
To plan
A single database: single point of failure, volumes growing without limit.
On you
Same, plus the fragility of your own infrastructure.
Total cost
Included
The lowest: licences only, no server, no migration, no operations team.
To plan
Licences + hosting + periodic migrations.
On you
Licences + hardware + team + migrations. The visible cost is low, the real cost is the highest.
Data location
Included
Odoo data centres (Europe by default). To be examined if a regulation imposes national localisation.
To plan
Same (publisher's cloud).
On you
At your premises — the one decisive argument for on-premise, when the law requires it.
When to choose it
Included
SMEs, multi-company groups, shop or station networks, any client who wants an up-to-date system without a technical team.
To plan
When a custom business module is genuinely indispensable and you accept paying for its maintenance.
On you
Legal data-localisation obligation, or a site without reliable internet with an on-site IT team.

Our position. What a client asks for "bespoke" is almost always solved by Studio, by an installable Senedoo add-on, or by our technology working alongside Odoo in real time — without ever leaving SaaS. When it isn't, we say so, and we support you on Odoo.sh. We have never yet had to recommend on-premise.

Three fronts, one codebase

The Senedoo ToolBox

Your client portal

senedoo-toolbox.com: single sign-on to all your databases, financial reports, Excel exports, dashboards, project tracking, video tutorials.

Add-ons inside Odoo

Twenty-nine installable tools — OHADA reports, returns, payroll, shelf tags, mobile money — updated centrally, with no intervention on your side.

The MCP server

Connector for Claude and ChatGPT, reserved for our consultants and, on request, your trained teams. Dry-run by default, undo log.

Webhooks

Odoo tells us, our servers act.

A webhook is an automatic call from one system to another, triggered by an event

Odoo does it both ways, without a line of code, from its automation rules.

Odoo telling

The "Send Webhook Notification" action sends a POST request, carrying the fields you choose, to the address you choose. A validated invoice, a closed till session, a confirmed order, a new hire: our orchestrator receives the event and does the work that follows — refresh the dashboard, flag a till session left open before opening time, chase a purchase order.

Odoo listening

The "External" trigger does the opposite: Odoo generates an address, an outside system calls it, and an automation fires on the target record. That is how a payment terminal, a fiscal gateway or a form hosted elsewhere write into Odoo at the moment the event happens, with no overnight synchronisation.

From signal to data

A webhook carries the event, not the file: Odoo announces that "till session 1842 is closed", it does not send its three hundred sales lines. That is deliberate — the payload stays small, and nothing confidential crosses the network unless it was asked for. So our orchestrator takes the second step: it checks the signature, then calls Odoo back through the API to pull exactly what it needs. The webhook says what; the API says how much.

What it replaces

Evening exports, files dropped on a server, scripts polling Odoo every five minutes to find out whether anything changed. A webhook costs one call, exactly when the event occurs.

The safety rails

Odoo says it in its own documentation: a badly configured webhook can disrupt a database, and reverting takes time. With us a webhook never comes alone: signed address, a log of every call received, a queue when the other side does not answer, and replay. A lost event is a wrong figure the next morning.

# 1. Odoo calls this address when the till session closes
@app.post("/odoo/session-closed")
def session_closed():
    signed = hmac.new(SECRET, request.data, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(request.headers.get("X-Senedoo-Sig", ""), signed):
        abort(403)    # missing or wrong signature: dropped
    session = request.get_json()["session_id"]
 
    # 2. The webhook says WHAT. The API says HOW MUCH: we call Odoo back.
    uid = common.authenticate(DB, LOGIN, KEY, {})
    lines = models.execute_kw(DB, uid, KEY, "pos.order", "search_read",
        [[["session_id", "=", session]]],
        {"fields": ["amount_total", "payment_ids"], "limit": 1000})
 
    # 3. We act — here, the cash difference, before the next day opens
    taken = sum(l["amount_total"] for l in lines)
    if abs(taken - counted_by_the_cashier(session)) > 5000:
        alert(f"Session {session}: difference of {taken:,.0f} F")
    return "", 204    # Odoo expects nothing but an acknowledgement

Thirty lines, and no code inside the Odoo database. The same shape serves a validated invoice, a confirmed order or a new hire: only the query in step 2 changes.

API

Odoo's API: your data, readable and writable from outside.

Anything a user can do in Odoo, a program can do through the API — with the same rights, no more and no less. That is how our reports, dashboards and gateways work.

JSON-2, the current road

Since version 19: post a JSON object to /json/2/model/method, authenticated by a dedicated API key. Every database publishes the list of its models, fields and methods on its own documentation page.

XML-RPC, the legacy

The old interface still works, but Odoo has deprecated it: the database-management service disappeared in version 20, and the rest is scheduled for removal. Our connectors still run on it and will move before the deadline.

The MCP server

The same idea, for artificial intelligence: declared tools rather than direct access. Odoo 20 ships one; ours holds more than three hundred. Read the comparison

What we do with it

Our OHADA trial balances, your SYSCOHADA income statement, your dashboards, the shelf labels, the Sage import reconciled to the franc, the monitoring of your tills: all of it reads and writes in your database through the API, at the moment you look, with no copy of your data on our side.

One condition to know before building on it

On Odoo Online, access to the external API is not open to every subscription: it is reserved for Custom plans, and excluded from One App Free and Standard plans. It is not a matter of edition but of plan — we check it with you before integrating anything, and we tell you whether your need justifies it.

What about security ?

An API key is worth a password: it carries its owner's rights. We create a dedicated user with strictly necessary rights, one key per use, and we log every write so it can be undone.