Skip to main content
Automation Guide

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.

18 min read
Updated February 2026
Odoo 17/18/19

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)ZapierMake (Integromat)
Pricing modelFree (self-hosted) or from $20/mo (cloud)From $19.99/mo (750 tasks/mo)From $9/mo (1,000 ops/mo)
Self-hosted optionYes — full feature parityNoNo
Odoo integrationNative node (XML-RPC)Via HTTP/Webhooks (no native module)Native module
Number of integrations400+6,000+1,500+
Execution limitsUnlimited (self-hosted)750–2M tasks/mo depending on plan1,000–800K ops/mo depending on plan
Complex logicFull — loops, conditionals, sub-workflows, code nodesLimited branching, multi-step paths on paid plansVisual router, iterators, good logic tools
AI nodesOpenAI, Claude, Ollama, LangChainOpenAI (limited)OpenAI
Error handlingError trigger node, retry, dead letter workflowsBasic retry, email alertsError handlers, retry, break modules
Data privacyFull control — data on your serverData transits Zapier’s cloudData transits Make’s cloud
Open sourceYes (fair-code license)NoNo
Webhook supportYes — custom webhook nodesYes — webhook triggersYes — webhook triggers
CommunityActive, growing fastVery largeLarge

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.

docker-compose.ymlyaml
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: bridge

Create a .env file alongside the compose file:

.envbash
POSTGRES_PASSWORD=your_secure_password_here
N8N_HOST=n8n.yourdomain.com
WEBHOOK_URL=https://n8n.yourdomain.com/
TIMEZONE=Europe/Berlin

Important notes

  • n8n and Odoo share the same PostgreSQL server but use separate databases. n8n creates its own n8n database automatically on first start.
  • Because both containers are on the odoo-network, n8n can reach Odoo at http://odoo:8069 (using the container name as hostname). No need to expose Odoo's port publicly for n8n to connect.
  • The WEBHOOK_URL must 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:

Terminalbash
# 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 -d

Odoo 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:

  1. Go to Settings → Users & Companies → Users
  2. Select the user n8n will connect as (create a dedicated “n8n Integration” user if you prefer)
  3. Go to the Account Security tab
  4. Under API Keys, click “New API Key”
  5. Name it “n8n” and copy the generated key — you will not see it again

Step 2: Configure the Odoo credential in n8n

  1. Open n8n at http://localhost:5678
  2. Go to Credentials → Add Credential → Odoo
  3. Fill in:
    • Site URL: http://odoo:8069 (internal Docker network URL)
    • Username: the Odoo user's login (e.g., admin or n8n@yourcompany.com)
    • Password or API Key: paste the API key from step 1
    • Database Name: your Odoo database name (e.g., odoo)
  4. 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

  1. In n8n, create a new workflow and name it “Sale Order → Slack”
  2. Add a Webhook node as the trigger
  3. Set HTTP Method to POST
  4. Set Path to odoo-sale-order (the full webhook URL will be https://your-n8n/webhook/odoo-sale-order)
  5. Under Authentication, select Header Auth and set a secret token — we will use this to verify requests from Odoo
  6. 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:

  1. Go to Settings → Technical → Server Actions (enable Developer Mode first)
  2. Create a new server action:
    • Name: n8n - Sale Order Confirmed
    • Model: Sale Order (sale.order)
    • Action Type: Execute Python Code
  3. Enter this code:
Server Action: n8n - Sale Order Confirmedpython
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 order

Now 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

  1. Back in n8n, add a Slack node after the Webhook node
  2. Connect your Slack credential (Slack App with chat:write permission)
  3. Configure:
    • Channel: #sales (or your preferred channel)
    • Message:
Slack Message Templatetext
*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

  1. In n8n, click “Listen for test event” on the Webhook node
  2. In Odoo, confirm a test sale order
  3. Verify the webhook fires and the Slack message appears
  4. Activate the workflow

Exported workflow JSON

Here is the complete n8n workflow JSON — import this directly into n8n via Workflows → Import from File:

sale-order-slack.jsonjson
{
  "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

Workflow: Email Classificationtext
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

Workflow: Customer Summarytext
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 channel

Auto-generate product descriptions

Workflow: Product Descriptionstext
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 field

For 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:

Server Action: Generic n8n Webhookpython
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:

  1. Settings → Technical → Automated Actions
  2. Pick the model (Sale Order, Invoice, Helpdesk Ticket, etc.)
  3. Set the trigger condition (On Creation, On Update with filter, etc.)
  4. 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-5 for 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

Workflow: Nightly Synctext
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 results

Weekly sales digest

Workflow: Weekly Digesttext
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/SendGrid

Monthly cleanup: archive stale leads

Workflow: Monthly Cleanuptext
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 limit and offset. 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:

error-handler-slack.jsonjson
{
  "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-Hostedn8n Cloud
CostFree (Community Edition)From EUR 20/mo (Starter)
HostingYou manage (same server as Odoo)n8n manages
Latency to OdooSub-millisecond (same Docker network)Network latency (internet round-trip)
Data locationYour server, your jurisdictionn8n’s EU cloud (Germany)
UpdatesManual (pull new Docker image)Automatic
BackupsYou manageIncluded
SupportCommunity forumEmail support on paid plans
ScalingAdd resources to your serverPlan-based limits
Custom nodesFull accessLimited 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
Try OEC.sh Free

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.