Odoo + n8n — Self-Hosted Workflow Automation
n8n is an open-source workflow automation platform — like Zapier or Make, but you host it yourself. It has a native Odoo node, 400+ other integrations, and no per-execution pricing. This guide covers everything: running Odoo and n8n together in Docker, connecting them, building real workflows, and going beyond what Odoo's built-in automations can do.
Why n8n for Odoo?
Odoo has built-in automation features — server actions, automated actions, scheduled actions. They work for simple triggers (“when a sale order is confirmed, send an email”). But they hit a wall fast:
- •No external integrations — Odoo's built-in automations live inside Odoo. If you want to post to Slack, update a Google Sheet, send a WhatsApp message, or call an external API, you are writing custom Python server actions and managing dependencies.
- •No visual workflow builder — automated actions are configured through form fields, not a workflow diagram. Complex multi-step logic is hard to build and harder to debug.
- •No error handling — if an automated action fails, it logs an error and moves on. There is no retry logic, no dead letter queue, no notification that something broke.
- •No cross-system orchestration — if your workflow involves Odoo + Slack + Stripe + a custom API, Odoo's built-in tools cannot handle that.
n8n solves all of this. It is a dedicated workflow engine that sits alongside Odoo and handles the orchestration layer. It connects to Odoo via XML-RPC (the same API that Odoo's own mobile app uses), and it connects to everything else via its 400+ built-in integration nodes.
The key advantage: self-hosted. n8n runs on your own server — same server as Odoo if you want. Your data never leaves your infrastructure. There are no per-task fees. There is no vendor deciding to 5x their pricing next quarter.
Projects like OD8N.com have already proven there is a real market for Odoo + n8n. The combination works — and it works especially well for Odoo Community Edition users who do not have access to Enterprise's more advanced automation features.
n8n vs Zapier vs Make for Odoo
If you are evaluating automation platforms, here is how they compare:
| n8n (self-hosted) | Zapier | Make (Integromat) | |
|---|---|---|---|
| Pricing model | Free (self-hosted) or from $20/mo (cloud) | From $19.99/mo (750 tasks/mo) | From $9/mo (1,000 ops/mo) |
| Self-hosted option | Yes — full feature parity | No | No |
| Odoo integration | Native node (XML-RPC) | Via HTTP/Webhooks (no native module) | Native module |
| Number of integrations | 400+ | 6,000+ | 1,500+ |
| Execution limits | Unlimited (self-hosted) | 750–2M tasks/mo depending on plan | 1,000–800K ops/mo depending on plan |
| Complex logic | Full — loops, conditionals, sub-workflows, code nodes | Limited branching, multi-step paths on paid plans | Visual router, iterators, good logic tools |
| AI nodes | OpenAI, Claude, Ollama, LangChain | OpenAI (limited) | OpenAI |
| Error handling | Error trigger node, retry, dead letter workflows | Basic retry, email alerts | Error handlers, retry, break modules |
| Data privacy | Full control — data on your server | Data transits Zapier’s cloud | Data transits Make’s cloud |
| Open source | Yes (fair-code license) | No | No |
| Webhook support | Yes — custom webhook nodes | Yes — webhook triggers | Yes — webhook triggers |
| Community | Active, growing fast | Very large | Large |
When n8n wins: You want self-hosting, unlimited executions, full data control, and advanced workflow logic. Your team is technical enough to run a Docker container.
When Zapier wins: You need the largest catalog of integrations and your workflows are simple (trigger → action). Your team is non-technical and values ease-of-use over control.
When Make wins: You need good visual workflow design with moderate complexity and decent pricing. Your workflows are multi-step but do not need self-hosting.
For Odoo deployments, n8n is the clear winner if you are already self-hosting Odoo (which you are, if you are reading this). Adding one more Docker container to your stack costs nothing and gives you unlimited automation.
Docker Compose: Odoo + n8n Together
Here is a complete docker-compose.yml that runs Odoo, n8n, and PostgreSQL on the same server. Both services share a Docker network so n8n can reach Odoo's XML-RPC endpoint directly.
version: "3.8"
services:
# -- PostgreSQL (shared database server) ----------------------
postgres:
image: postgres:16
container_name: odoo-postgres
restart: unless-stopped
environment:
POSTGRES_USER: odoo
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-odoo_secret_change_me}
POSTGRES_DB: postgres
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U odoo"]
interval: 10s
timeout: 5s
retries: 5
networks:
- odoo-network
# -- Odoo -----------------------------------------------------
odoo:
image: odoo:18.0
container_name: odoo
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
environment:
HOST: postgres
PORT: 5432
USER: odoo
PASSWORD: ${POSTGRES_PASSWORD:-odoo_secret_change_me}
ports:
- "8069:8069"
- "8072:8072" # longpolling / websocket
volumes:
- odoo_data:/var/lib/odoo
- odoo_addons:/mnt/extra-addons
- ./odoo.conf:/etc/odoo/odoo.conf:ro
networks:
- odoo-network
# -- n8n ------------------------------------------------------
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
environment:
# n8n uses its own PostgreSQL database
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: odoo
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD:-odoo_secret_change_me}
# n8n configuration
N8N_HOST: ${N8N_HOST:-localhost}
N8N_PORT: 5678
N8N_PROTOCOL: https
WEBHOOK_URL: ${WEBHOOK_URL:-https://n8n.yourdomain.com/}
# Timezone -- match your Odoo timezone
GENERIC_TIMEZONE: ${TIMEZONE:-UTC}
TZ: ${TIMEZONE:-UTC}
# Optional: enable community nodes
N8N_COMMUNITY_PACKAGES_ENABLED: "true"
ports:
- "5678:5678"
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
networks:
- odoo-network
volumes:
postgres_data:
odoo_data:
odoo_addons:
n8n_data:
networks:
odoo-network:
driver: bridgeCreate a .env file alongside the compose file:
POSTGRES_PASSWORD=your_secure_password_here
N8N_HOST=n8n.yourdomain.com
WEBHOOK_URL=https://n8n.yourdomain.com/
TIMEZONE=Europe/BerlinImportant notes
- •n8n and Odoo share the same PostgreSQL server but use separate databases. n8n creates its own
n8ndatabase automatically on first start. - •Because both containers are on the
odoo-network, n8n can reach Odoo athttp://odoo:8069(using the container name as hostname). No need to expose Odoo's port publicly for n8n to connect. - •The
WEBHOOK_URLmust be the public URL where n8n receives webhook callbacks. This is critical for WhatsApp integration, Odoo webhook triggers, and any external service that needs to call into n8n. - •You still need a reverse proxy (Nginx, Caddy, Traefik) in front of both services for SSL termination. Our Docker Compose Generator can generate a full config including the reverse proxy.
Start the stack:
# Create the n8n database (PostgreSQL must be running first)
docker compose up -d postgres
sleep 5
docker compose exec postgres createdb -U odoo n8n
# Start everything
docker compose up -dOdoo is now available at http://localhost:8069 and n8n at http://localhost:5678.
Connecting n8n to Odoo
With both services running on the same Docker network, connecting them takes about two minutes.
Step 1: Create an API key in Odoo
For production, use an API key instead of a password. In Odoo:
- Go to Settings → Users & Companies → Users
- Select the user n8n will connect as (create a dedicated “n8n Integration” user if you prefer)
- Go to the Account Security tab
- Under API Keys, click “New API Key”
- Name it “n8n” and copy the generated key — you will not see it again
Step 2: Configure the Odoo credential in n8n
- Open n8n at
http://localhost:5678 - Go to Credentials → Add Credential → Odoo
- Fill in:
- Site URL:
http://odoo:8069(internal Docker network URL) - Username: the Odoo user's login (e.g.,
adminorn8n@yourcompany.com) - Password or API Key: paste the API key from step 1
- Database Name: your Odoo database name (e.g.,
odoo)
- Site URL:
- Click Test Connection — you should see a green checkmark
Step 3: Verify available operations
Create a new workflow, add an Odoo node, and select the credential you just created. The Odoo node supports these operations on any Odoo model:
- •Create — insert a new record
- •Read — fetch a record by ID
- •Update — modify fields on an existing record
- •Delete — remove a record
- •Get All — search and return multiple records with domain filters
- •Generic Resource — access any Odoo model by technical name (e.g.,
sale.order,res.partner,helpdesk.ticket)
This means n8n can interact with every single model in your Odoo database — including custom modules.
10 Ready-to-Use Automation Workflows
Here are ten practical workflows. Each one describes the trigger, the logic, and the action. All of them can be built in n8n's visual editor without writing code.
1. New sale order confirmed → Slack notification
Trigger: Odoo webhook (sale.order state changes to sale)
Flow: Fetch order details → Format message → Post to Slack channel
Use case: Sales team gets instant visibility in their team channel.
2. New customer created in CRM → Add to Mailchimp
Trigger: Odoo webhook (res.partner created with customer_rank > 0)
Flow: Extract email, name, tags → Add/update Mailchimp subscriber → Tag based on Odoo category
Use case: New CRM contacts automatically enter your email nurture sequence.
3. Invoice overdue → Automatic email reminder
Trigger: Cron (daily at 9 AM)
Flow: Query Odoo for invoices where payment_state = 'not_paid' AND invoice_date_due < today → For each, send email via SMTP or SendGrid → Log activity on the invoice in Odoo
Use case: Accounts receivable on autopilot. Add escalation logic: first reminder at 1 day overdue, second at 7 days, third at 30 days.
4. Website form submission → Create CRM lead
Trigger: n8n Webhook (receives POST from website contact form)
Flow: Validate input → Search Odoo for existing partner by email → Create or update partner → Create CRM lead linked to partner → Send confirmation email to submitter
Use case: Contact form submissions go directly into Odoo CRM without building a custom Odoo website integration.
5. New purchase order → WhatsApp notification to supplier
Trigger: Odoo webhook (purchase.order confirmed)
Flow: Fetch supplier phone from partner record → Format WhatsApp template with PO details → Send via WhatsApp Business API → Log message on PO chatter
Use case: Suppliers get instant purchase order notifications on WhatsApp. See our WhatsApp integration guide for Meta API setup.
6. Inventory below threshold → Reorder notification
Trigger: Cron (every 4 hours)
Flow: Query Odoo for products where qty_available < reorder_minimum → Group by supplier → Send Slack/email notification per supplier group with product list and quantities
Use case: Never run out of stock because someone forgot to check inventory levels.
7. Helpdesk ticket created → AI classification and assignment
Trigger: Odoo webhook (helpdesk.ticket created)
Flow: Extract ticket subject and description → Send to OpenAI/Claude for classification (billing, technical, feature request, bug) → Set ticket category and priority in Odoo → Assign to the right team based on classification
Use case: Incoming tickets are triaged automatically. See our AI for Odoo Community guide for more AI workflow patterns.
8. Monthly sales report → PDF → Email to stakeholders
Trigger: Cron (1st of each month at 8 AM)
Flow: Query Odoo for last month's sale orders → Aggregate by product, salesperson, region → Generate HTML report → Convert to PDF (using n8n's HTML-to-PDF node or a service like PDFShift) → Email to distribution list
Use case: Stakeholders get an automated monthly summary without anyone manually pulling reports.
9. Employee leave request → Manager approval via Slack
Trigger: Odoo webhook (hr.leave created in confirm state)
Flow: Fetch employee and manager details → Post Slack message to manager with leave dates and type → Include “Approve” / “Refuse” buttons (Slack interactive message) → Manager clicks button → n8n receives callback → Update leave request status in Odoo → Notify employee
Use case: Leave approvals happen in Slack without managers logging into Odoo.
10. Payment received → Update invoice + Send receipt via WhatsApp
Trigger: Odoo webhook (account.payment posted)
Flow: Fetch linked invoice → Verify payment matches invoice amount → Send WhatsApp receipt template to customer → Update custom field on invoice with receipt confirmation timestamp
Use case: Customers get instant payment confirmation on WhatsApp.
Building Your First Workflow: Sale Order → Slack Notification
Let us build workflow #1 step by step. By the end, every confirmed sale order will trigger a Slack message.
Step 1: Create the webhook trigger in n8n
- In n8n, create a new workflow and name it “Sale Order → Slack”
- Add a Webhook node as the trigger
- Set HTTP Method to
POST - Set Path to
odoo-sale-order(the full webhook URL will behttps://your-n8n/webhook/odoo-sale-order) - Under Authentication, select Header Auth and set a secret token — we will use this to verify requests from Odoo
- Save the node — n8n generates the webhook URL
Step 2: Configure Odoo to call the webhook
In Odoo, create a server action that fires on sale order confirmation:
- Go to Settings → Technical → Server Actions (enable Developer Mode first)
- Create a new server action:
- Name: n8n - Sale Order Confirmed
- Model: Sale Order (sale.order)
- Action Type: Execute Python Code
- Enter this code:
import json
import requests
for record in records:
payload = {
"event": "sale_order_confirmed",
"order_id": record.id,
"order_name": record.name,
"partner_name": record.partner_id.name,
"amount_total": record.amount_total,
"currency": record.currency_id.name,
"salesperson": record.user_id.name or "Unassigned",
"date_order": str(record.date_order),
"order_line_count": len(record.order_line),
}
try:
requests.post(
"https://your-n8n-domain.com/webhook/odoo-sale-order",
json=payload,
headers={
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Content-Type": "application/json",
},
timeout=10,
)
except Exception:
pass # Log errors in production -- do not block the sale orderNow create an Automated Action to trigger this server action:
- •Go to Settings → Technical → Automated Actions
- •Model: Sale Order
- •Trigger: On Update
- •Before Update Filter:
[("state", "!=", "sale")] - •Apply on:
[("state", "=", "sale")] - •Action: the server action you just created
Step 3: Add the Slack node in n8n
- Back in n8n, add a Slack node after the Webhook node
- Connect your Slack credential (Slack App with
chat:writepermission) - Configure:
- Channel:
#sales(or your preferred channel) - Message:
- Channel:
*New Sale Order Confirmed*
*Order:* {{ $json.order_name }}
*Customer:* {{ $json.partner_name }}
*Amount:* {{ $json.currency }} {{ $json.amount_total }}
*Salesperson:* {{ $json.salesperson }}
*Items:* {{ $json.order_line_count }} line(s)
*Date:* {{ $json.date_order }}Step 4: Test and activate
- In n8n, click “Listen for test event” on the Webhook node
- In Odoo, confirm a test sale order
- Verify the webhook fires and the Slack message appears
- Activate the workflow
Exported workflow JSON
Here is the complete n8n workflow JSON — import this directly into n8n via Workflows → Import from File:
{
"name": "Sale Order -> Slack Notification",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "odoo-sale-order",
"authentication": "headerAuth",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [250, 300],
"id": "webhook-1",
"name": "Odoo Sale Webhook"
},
{
"parameters": {
"channel": "#sales",
"text": "=*New Sale Order Confirmed*\n\n*Order:* {{ $json.order_name }}\n*Customer:* {{ $json.partner_name }}\n*Amount:* {{ $json.currency }} {{ $json.amount_total }}\n*Salesperson:* {{ $json.salesperson }}\n*Items:* {{ $json.order_line_count }} line(s)\n*Date:* {{ $json.date_order }}",
"otherOptions": {}
},
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [500, 300],
"id": "slack-1",
"name": "Post to Slack"
}
],
"connections": {
"Odoo Sale Webhook": {
"main": [
[
{
"node": "Post to Slack",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
}
}Advanced: AI-Powered Workflows
n8n has native nodes for OpenAI, Anthropic Claude, and Ollama (local LLMs). This opens up workflows that were impossible with Odoo alone.
Classify incoming emails → Route to the right department
Email Trigger (IMAP or Gmail node)
-> Extract subject + body
-> OpenAI node: "Classify this email into: billing, technical_support,
sales_inquiry, partnership, spam. Return only the category."
-> Switch node: route based on classification
-> Odoo node: create lead (sales), helpdesk ticket (support),
or discard (spam)Summarize customer interactions before a meeting
Manual Trigger (or Cron before daily standup)
-> Odoo node: fetch all activities/messages for partner in last 30 days
-> Claude/OpenAI node: "Summarize this customer's recent interactions
in 3 bullet points. Note any open issues or pending quotes."
-> Slack node: post summary to #sales-prep channelAuto-generate product descriptions
Odoo Trigger: new product created with empty description
-> Fetch product name, category, attributes
-> OpenAI node: "Write a concise product description (2-3 sentences)
for an e-commerce store. Product: {{name}}, Category: {{category}},
Attributes: {{attributes}}"
-> Odoo node: update product description fieldFor more AI + Odoo patterns, including how to bring AI features to Community Edition, see our AI for Odoo Community guide.
Webhook Integration: Odoo → n8n
The sale order example above showed one webhook pattern. Here is a reusable server action template you can adapt for any Odoo model.
Generic webhook server action
Create this as a reusable server action and call it from any automated action:
import json
import requests
# Configuration -- change these per use case
WEBHOOK_URL = "https://n8n.yourdomain.com/webhook/odoo-events"
AUTH_TOKEN = "your_secret_token"
for record in records:
payload = {
"event": env.context.get("n8n_event", "record_updated"),
"model": record._name,
"record_id": record.id,
"record_name": record.display_name,
"timestamp": str(fields.Datetime.now()),
# Add model-specific fields as needed
"data": {
"state": getattr(record, "state", None),
"partner_id": record.partner_id.id if hasattr(record, "partner_id") else None,
"partner_name": record.partner_id.name if hasattr(record, "partner_id") else None,
"amount_total": getattr(record, "amount_total", None),
"user_id": record.user_id.id if hasattr(record, "user_id") else None,
},
}
try:
requests.post(
WEBHOOK_URL,
json=payload,
headers={
"Authorization": f"Bearer {AUTH_TOKEN}",
"Content-Type": "application/json",
},
timeout=10,
)
except Exception as e:
# In production, log this properly
record.message_post(
body=f"n8n webhook failed: {str(e)}",
message_type="notification",
)Setting up the automated action
For each event you want to send to n8n:
- Settings → Technical → Automated Actions
- Pick the model (Sale Order, Invoice, Helpdesk Ticket, etc.)
- Set the trigger condition (On Creation, On Update with filter, etc.)
- Link to the server action above
Tip: Use a single n8n webhook URL and differentiate events using the event field in the payload. In n8n, use a Switch node right after the webhook to route different event types to different workflow branches. This keeps your Odoo configuration simple — one server action, multiple automated actions — and consolidates your workflow logic in n8n.
Scheduling & Batch Processing
Not everything should be event-driven. Some workflows run on a schedule.
n8n Cron triggers
n8n's Schedule Trigger node supports:
- •Every N minutes/hours — for polling-style workflows
- •Cron expression — for precise scheduling (e.g.,
0 9 * * 1-5for weekdays at 9 AM) - •Specific times — daily at 8 AM, weekly on Monday, monthly on the 1st
Common scheduled workflows
Nightly data sync: Odoo → external system
Schedule: 2 AM daily
-> Odoo node: Get All records modified today
(filter: write_date >= today 00:00)
-> Transform data to target format
-> HTTP Request: POST to external API
-> Log sync resultsWeekly sales digest
Schedule: Monday 8 AM
-> Odoo: Get all sale orders from last 7 days
-> Aggregate: total revenue, order count, top products, top salespeople
-> Format HTML email
-> Send via SMTP/SendGridMonthly cleanup: archive stale leads
Schedule: 1st of month, 3 AM
-> Odoo: Get All CRM leads where stage = 'New'
AND create_date < 90 days ago AND no activity in 60 days
-> Odoo: Update each lead -- set active = false
-> Slack: post summary "Archived X stale leads"Batch processing tips
When processing large datasets from Odoo, keep these in mind:
- •Use pagination — the Odoo node's “Get All” operation supports
limitandoffset. Process in batches of 100–500 records. - •Add delays between batches — a Wait node with 1–2 second delay prevents overwhelming Odoo's XML-RPC endpoint.
- •Use the SplitInBatches node — n8n has a built-in node for processing items in configurable batch sizes with automatic looping.
- •Set a reasonable timeout — n8n workflow executions have a default timeout. For large batch jobs, increase it in the workflow settings.
Monitoring & Error Handling
Production workflows need to be reliable. n8n has built-in tools for this.
Execution logs
Every workflow execution is logged in n8n with:
- •Start time, end time, duration
- •Status (success, error, waiting)
- •Input and output data for every node
- •The exact error message and stack trace if something failed
Access logs at Executions in the n8n sidebar. Filter by workflow, status, and date range.
Error workflows
n8n has a dedicated Error Trigger node. Create a separate “Error Handler” workflow:
{
"name": "Error Handler -> Slack Alert",
"nodes": [
{
"parameters": {},
"type": "n8n-nodes-base.errorTrigger",
"typeVersion": 1,
"position": [250, 300],
"id": "error-1",
"name": "On Workflow Error"
},
{
"parameters": {
"channel": "#ops-alerts",
"text": "=Workflow failed: {{ $json.workflow.name }}\nNode: {{ $json.execution.lastNodeExecuted }}\nError: {{ $json.execution.error.message }}\nExecution: {{ $json.execution.url }}"
},
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [500, 300],
"id": "slack-alert-1",
"name": "Alert Slack"
}
],
"connections": {
"On Workflow Error": {
"main": [
[
{
"node": "Alert Slack",
"type": "main",
"index": 0
}
]
]
}
}
}Then in each production workflow's settings, set the Error Workflow to your error handler. Now any failure in any workflow posts an alert to Slack with the workflow name, failing node, and error message.
Retry logic
For nodes that call external APIs (including Odoo), enable retry on error:
- •In the node settings, set Retry on Fail to
true - •Set Max Retries to 3
- •Set Wait Between Retries to 1000ms (or more for rate-limited APIs)
For more sophisticated retry patterns — exponential backoff, different retry strategies per error type — use a combination of the IF node (check error type) and Wait node (variable delay) in a retry loop.
Self-Hosted vs Cloud n8n
n8n offers both options. Here is how they compare for Odoo users:
| Self-Hosted | n8n Cloud | |
|---|---|---|
| Cost | Free (Community Edition) | From EUR 20/mo (Starter) |
| Hosting | You manage (same server as Odoo) | n8n manages |
| Latency to Odoo | Sub-millisecond (same Docker network) | Network latency (internet round-trip) |
| Data location | Your server, your jurisdiction | n8n’s EU cloud (Germany) |
| Updates | Manual (pull new Docker image) | Automatic |
| Backups | You manage | Included |
| Support | Community forum | Email support on paid plans |
| Scaling | Add resources to your server | Plan-based limits |
| Custom nodes | Full access | Limited on some plans |
Recommendation for Odoo users: Self-host. You are already running Docker for Odoo. Adding n8n is one more service in your docker-compose.yml. The latency advantage alone (n8n talks to Odoo on the same Docker network, sub-millisecond) is worth it. Plus, workflow data and credentials never leave your server.
The only case for n8n Cloud is if you have no DevOps capacity and cannot manage another container. In that case, n8n Cloud works fine — just note that n8n will reach Odoo over the public internet, so your Odoo instance needs to be accessible (with proper authentication) from n8n's IP ranges.
Server resources
n8n is lightweight. For a typical Odoo deployment's automation needs:
- •CPU: 0.5 cores (n8n is mostly I/O-bound, waiting on API calls)
- •RAM: 256–512 MB (more if you process large datasets in workflows)
- •Disk: 1–2 GB (for n8n application + execution logs)
If you are running Odoo on a 4 GB / 2 vCPU server, adding n8n barely registers. On a 2 GB / 1 vCPU server, you might notice it during batch processing — in that case, run n8n on a separate small server or bump your server specs. Use our Server Requirements Calculator to size appropriately.
Deploy Odoo + n8n on OEC.sh
Running Odoo and n8n together means managing two services, their database connections, SSL certificates, reverse proxy configuration, backups, and updates. OEC.sh handles all of that on the cloud provider of your choice.
What you get:
- Odoo + n8n on the same server with internal networking already configured
- Any cloud provider — AWS, Hetzner, DigitalOcean, or your own infrastructure. No vendor lock-in.
- SSL certificates provisioned and renewed automatically — required for n8n webhooks
- Automated backups of both Odoo and n8n data
- One-click updates for both services
Start with our Docker Compose Generator to preview the configuration, or see pricing for fully managed deployment.
Ready to automate Odoo with n8n?
OEC.sh deploys Odoo and n8n together on any cloud provider — with SSL, backups, and internal networking already configured. No per-task fees. Unlimited workflows.
- Free tier available
- No credit card required
- n8n + Odoo pre-configured
Frequently Asked Questions
Can n8n replace Odoo's built-in automations?
For internal triggers within Odoo (field change → update another field, record created → set default values), Odoo’s built-in automated actions are simpler and faster — they run inside Odoo without an external round-trip. Use n8n for anything that involves external systems, complex multi-step logic, scheduling, or error handling. In practice, most teams use both: Odoo automated actions for simple internal logic, n8n for everything that touches the outside world.
How many workflows can n8n handle?
Self-hosted n8n has no artificial limits on workflow count or executions. The practical limit is your server’s resources. A 2-core / 2 GB server can comfortably handle 50+ active workflows with thousands of daily executions. The bottleneck is usually the external APIs you are calling (rate limits, response times), not n8n itself.
Does n8n work with Odoo Community AND Enterprise?
Yes. n8n connects to Odoo via XML-RPC, which is available in both Community and Enterprise editions. Every model, every field, every operation works the same way. The only difference is that Enterprise has additional models (e.g., helpdesk.ticket) that are not present in Community — but n8n does not care about the edition, it just talks to whatever models exist in your database.
Can I migrate from Zapier to n8n?
There is no automatic migration tool, but the process is straightforward. For each Zapier zap: create the equivalent n8n workflow using the visual editor, configure the same trigger and action nodes, map the same fields, and test. Most people report that migration takes 15–30 minutes per workflow. n8n also has a growing collection of workflow templates that cover common Zapier use cases.
How much server resources does n8n need alongside Odoo?
For typical automation workloads (10–50 active workflows, a few thousand executions per day), n8n adds roughly 256–512 MB RAM and negligible CPU. It is one of the lightest automation platforms available. If you are running Odoo on a 4 GB server, you will not notice n8n. On a 2 GB server, consider bumping to 3–4 GB if you plan to run heavy batch workflows.
Is n8n really free?
The self-hosted Community Edition is free under the Sustainable Use License (a “fair-code” model). You can use it for any purpose, including commercial, with no execution limits. The source code is available on GitHub. The license has one restriction: you cannot offer n8n as a managed service to third parties (i.e., you cannot build a “hosted n8n” business). For running your own automations alongside Odoo, it is fully free with no catches.
Automate Odoo with n8n Today
Self-hosted, unlimited workflows, no per-task fees. n8n + Odoo is the open-source automation stack that replaces Zapier and Make — and OEC.sh makes deployment effortless on any cloud provider.
Related Resources
Docker Compose Generator
Generate production-ready Docker Compose files for Odoo deployments.
Odoo Docker Guide
Complete guide to running Odoo in Docker containers.
AI for Odoo Community
Bridge the AI gap between Community and Enterprise editions.
Odoo WhatsApp Integration
Set up WhatsApp Business API with Odoo for customer messaging.
AI Chatbot for Odoo
Build a self-hosted AI customer support chatbot with n8n and OpenAI.
Vibe Coding for Odoo
Build Odoo modules with AI coding agents like Claude Code and Cursor.
Server Calculator
Calculate the right server size for your Odoo + n8n workload.
Deploy Odoo Guide
Step-by-step guide to deploy Odoo on any cloud provider.