Connecting N8N and Odoo
The question to ask first
Before connecting anything: does Odoo already do this?
Odoo has automated actions, scheduled jobs, email templates, follow-up levels, reordering rules and approval thresholds built in. A large share of “we need n8n for this” requests turn out to be settings somebody had not found.
A setting beats a workflow every time, because there is nothing extra to maintain.
Where n8n earns its place is connecting Odoo to something outside it. That is the honest scope.
How n8n talks to Odoo
Odoo exposes an API, and n8n calls it — commonly over JSON-RPC.
What that allows:
Search. Find records matching a condition.
Read. Fetch customers, orders, products, invoices, stock.
Create. Add a partner, a product, an order, a custom-module record.
Update. Change a field, move a stage.
Any model, including custom ones. If your business has a custom module, its records are reachable the same way as standard ones.
Setting up access
Four things, and getting them right prevents a class of problems.
A dedicated user. Never a real person’s login. When they leave or change their password, the integration should not break.
An API key rather than a password. Keys can be revoked individually and they keep working when two-factor authentication is enabled.
Minimum permissions. A workflow that only reads orders should not be able to delete them. Give it access to the models it actually touches and nothing else.
Written down. Which workflow uses which account, and who owns it.
FIGURE 1: ACCESS, DONE PROPERLY
A dedicated user
- It should not break when a person leaves.
An API key, not a password
- Revocable individually, and it survives 2FA.
Minimum permissions
- Only the models the workflow actually needs.
Documented
- Which workflow uses which account, and who owns it.
The pattern that appears in every import
Check whether the record exists before creating it.
Any workflow that brings data into Odoo — orders, customers, products, licences, anything — needs this branch:
Search for the record.
If found, use it.
If not, create it.
Without it, every run creates duplicates. And duplicate customers are far harder to clean up than to prevent — they split one relationship across several records, and every report built on top is wrong.
Match on something stable. An external ID, a reference number, an order number, a registration number.
Never match on a name. Names get edited. The day somebody corrects a spelling, the match fails and a duplicate appears — silently.
FIGURE 2: THE CHECK EVERY IMPORT NEEDS
Search Odoo
- By a stable identifier
Found?
- Use the existing record
Not found?
- Create it
Then create the child record
- Linked to the right parent
Where the combination is genuinely useful
Four patterns.
Bringing external data in
An e-commerce order. A file from a third party. A form on a site Odoo does not host.
n8n receives it, validates it, checks for duplicates, and creates the records.
This is the most common use and usually the highest value.
Sending Odoo events out
An order is confirmed, and something outside Odoo needs to know. A messaging channel, a partner system, a project tool.
Two ways to trigger it: Odoo’s automated actions can call an n8n webhook, or n8n can poll Odoo on a schedule.
Webhook is immediate. Polling is simpler. Ask what a delay costs before choosing.
Chains across several systems
Where the real value is. Something happens in Odoo, n8n fetches more from a third system, transforms it, and updates a fourth.
Odoo’s own automation cannot reach outside itself. This is exactly the gap.
Scheduled updates
Reference data fetched on a schedule and applied to Odoo, with business rules on top.
The rules are the interesting part. Not just writing a value — applying it according to conditions the business decided.
Design decisions before building
Four questions. Getting these wrong is what makes integrations fail.
Which system owns each field? If both hold a customer address, one must be authoritative. Write it down field by field.
How are records matched? A stable identifier. Never a name.
What happens on failure? Odoo will be down during an upgrade. A good workflow queues, retries and alerts. A bad one drops the record quietly.
Who is notified? A named person, not a shared inbox.
Odoo upgrades
Worth planning for.
Odoo’s data model changes between versions. Fields get renamed, models get restructured.
An integration built against version 17 may need work at version 19.
Two practices:
Keep a list of which workflows touch Odoo and which models they use.
Test them in staging as part of your upgrade, before production. Integrations fail silently after upgrades — nobody notices for weeks, and that is the expensive way to find out.
FIGURE 3: WHAT BELONGS WHERE
Odoo handles it
- Stages, approvals, reminders
- Reordering rules and follow-up levels
- Email templates and scheduled jobs
- Nothing extra to maintain
n8n helps
- Bringing outside data in
- Sending Odoo events outward
- Chains across three or four systems
- Reconciling against another system
What to avoid
Duplicating Odoo’s own automation. If Odoo can send the reminder, let Odoo send it.
Writing to accounting without review. Anywhere money moves, keep a person on the commit.
Matching on names. The most common silent failure.
Building without deciding field ownership. Two systems overwriting each other, discovered weeks later.
No owner. The workflow everyone depends on and nobody understands.
A sensible first project
- Check whether Odoo already does it.
- Pick one direction — data in, or data out. Not both.
- Create a dedicated user with an API key and minimum access.
- Build for one record type, with a stable identifier.
- Add the check-before-create branch.
- Test with awkward records — missing fields, unusual characters, one that already exists.
- Add retries and failure alerts before going live.
Two-way sync is the hardest thing to get right. Start one-way. Add the other direction later, with explicit conflict rules.
The short version
Check what Odoo already does first. It is more than most people expect.
n8n earns its place connecting Odoo to things outside it — bringing data in, sending events out, chaining across systems.
Use a dedicated user with an API key and minimum permissions. Match on stable identifiers, never names. Always check before you create.
And test your integrations at every Odoo upgrade — they fail quietly.
Odoo needing to talk to something outside it?
Get in touch. We build n8n workflows into Odoo — including custom modules — and we check whether a setting already covers it first.