Integration BlueprintUse case: open-source automationUpdated 2026-10-19

Integrating NocoDB and n8n for Open-Source Automation

Combining NocoDB and n8n provides an entirely self-hostable alternative to Airtable and Zapier. NocoDB turns relational databases like PostgreSQL and MySQL into programmable spreadsheets with auto-generated REST APIs, while n8n handles complex logic using node-based execution workflows and native JavaScript or Python runtimes. This integration eliminates proprietary vendor lock-in and per-seat or per-task SaaS subscription fees.

Explore: Databases & Spreadsheets · Workflow Automation

Comparison matrix

FeatureNocoDBn8nEdge
License ModelAGPLv3 Open SourceFair-code (Sustainable Use License)NocoDB
Primary ArchitectureDatabase GUI with Auto-REST/GraphQL APIsWorkflow Automation & Orchestration EngineTie
Self-Hosting CapabilitiesDocker, Node.js, Kubernetes (Unrestricted)Docker, npm, Kubernetes (Unrestricted community)Tie
Native Integrations Count~40 Third-party connectors & storage plugins1,100+ Pre-built integration nodesn8n
Custom Scripting SupportSQL queries and formula fieldsFull JavaScript and Python runtime nodesn8n
Authentication Methodsxc-token header and JWT tokensX-N8N-API-KEY, Basic Auth, OAuth2Tie
Execution / Rate LimitsUnlimited on self-hosted instancesUnlimited runs on self-hosted instancesTie
Relational Schema HandlingDirect schema migrations on MySQL, Postgres, SQLiteStateless payload processing with internal state storeNocoDB
Start freeTry NocoDB →Try n8n →

ROI metrics

Hours saved / mo

42

NocoDB / mo

$0

n8n / mo

$24

Break-even

1.8 wks

Annual savings

$15,600

Replacing an Airtable Team tier ($20/user/mo for 10 users = $2,400/yr) and Zapier Team plan ($69/mo = $828/yr) with self-hosted NocoDB and n8n Cloud or self-hosted n8n saves over $15,000 annually while preventing vendor lock-in and removing API row caps.

Step-by-step setup guide

  1. 1.Deploy Services via Docker Compose

    Create a shared Docker network running PostgreSQL 15, NocoDB on port 8080, and n8n on port 5678 to enable direct inter-container networking.

    version: '3.8'
    services:
      nocodb:
        image: nocodb/nocodb:latest
        ports: ['8080:8080']
        environment:
          - NC_DB=pg://postgres:5432?u=app&p=secret&d=appdb
      n8n:
        image: docker.n8n.io/n8nio/n8n:latest
        ports: ['5678:5678']
        environment:
          - N8N_HOST=n8n.internal
          - WEBHOOK_URL=http://n8n:5678/
  2. 2.Generate NocoDB API Token

    In the NocoDB web interface, navigate to User Settings > API Tokens. Generate an API token and copy the generated xc-token value for n8n credentials.

    curl -X POST 'http://localhost:8080/api/v2/meta/tokens' -H 'xc-auth: YOUR_ADMIN_JWT' -H 'Content-Type: application/json' -d '{"description":"n8n-worker-token"}'
  3. 3.Create n8n Webhook Trigger Node

    Open the n8n canvas, add a 'Webhook' trigger node, set HTTP Method to POST, and copy the Production Webhook URL path (e.g., /webhook/nocodb-sync).

  4. 4.Register NocoDB Outbound Webhook

    Open NocoDB table settings, navigate to Webhooks, select the 'After Record Insert' event, and set the destination URL to the n8n webhook endpoint.

    curl -X POST 'http://localhost:8080/api/v2/meta/bases/BASE_ID/tables/TABLE_ID/hooks' -H 'xc-token: YOUR_XC_TOKEN' -H 'Content-Type: application/json' -d '{"event":"records.after.insert","url":"http://n8n:5678/webhook/nocodb-sync","notification":{"type":"URL"}}'
  5. 5.Execute Data Transformation and Update via REST

    Add an HTTP Request node in n8n that reads the incoming payload, calculates business logic, and updates status flags back in NocoDB via PATCH.

    curl -X PATCH 'http://localhost:8080/api/v2/tables/TABLE_ID/records' -H 'xc-token: YOUR_XC_TOKEN' -H 'Content-Type: application/json' -d '{"Id":12,"Status":"Processed","ProcessedAt":"2023-10-27T10:00:00Z"}'

Webhook payload example

POST http://n8n:5678/webhook/nocodb-sync · event: records.after.insert

{
  "event": "records.after.insert",
  "base_id": "p_9b4e1f72",
  "table_id": "m_5d2a8b90",
  "table_name": "CustomerOrders",
  "data": [
    {
      "Id": 1084,
      "CustomerEmail": "lead@enterprise.com",
      "OrderValue": 1450.00,
      "Status": "Pending",
      "CreatedAt": "2023-10-27T14:32:01.000Z",
      "UpdatedAt": "2023-10-27T14:32:01.000Z"
    }
  ]
}

NocoDB: pros & cons

  • ✅ Connects directly to existing PostgreSQL, MySQL, and SQLite databases
  • ✅ Exposes production-ready REST and GraphQL endpoints automatically
  • ✅ Zero per-user licensing fees when deployed on private infrastructure
  • ⚠️ Formula and rollup features are less mature than proprietary spreadsheet tools
  • ⚠️ No native workflow canvas for multi-branch sequential conditional logic

n8n: pros & cons

  • ✅ Native sandboxed JavaScript and Python execution nodes for data formatting
  • ✅ Over 1,100 modular integration nodes with visual error debugging
  • ✅ Supports parallel worker scaling via Redis queues in queue mode
  • ⚠️ Steeper initial configuration curve compared to pure SaaS automation tools
  • ⚠️ Requires ongoing server maintenance, image patching, and database backups

FAQ

How do I authenticate n8n HTTP requests against NocoDB v2 API?

Pass the NocoDB API token in the custom request header as 'xc-token: YOUR_API_TOKEN'. Do not use Bearer auth unless authenticating through the short-lived xc-auth JWT endpoint.

Can NocoDB trigger workflows on specific column updates?

Yes. NocoDB webhook configurations support filters based on conditions and trigger events including 'records.after.update', which outputs both current row data and changed field maps.

What is the throughput capacity for self-hosted NocoDB to n8n pipelines?

A standard 2 vCPU, 4GB RAM Docker host handles 80 to 120 webhook executions per second. For higher volumes, run n8n in Queue Mode powered by Redis and multiple worker containers.

How are relational links between NocoDB tables handled inside n8n?

NocoDB includes linked table primary keys in payloads. To retrieve foreign row objects, use an n8n HTTP Request node targeting 'GET /api/v2/tables/{tableId}/links/{linkFieldId}/records/{recordId}'.

Related integrations & comparisons