What is n8n?
n8n is a fair-code workflow automation platform often used as an alternative to Zapier. It uses the Sustainable Use License โ source-available and self-hostable, though some enterprise features are commercial. You self-host it on your server (Docker, K8s) and run executions with no per-task fees, limited only by your infrastructure (CPU, RAM, database).
Every workflow is JSON and can be exported to git. When logic exceeds drag-and-drop, write JavaScript inline; Python support is also available. Unlike Zapier's task-based pricing, n8n self-hosted has no per-execution charges.
Core Capabilities
-
1
Workflow Nodes
Connect nodes (operations) with edges (data). Each node: fetch, transform, send. No code required for basic flows.
-
2
Code Node (JS/Python)
Write
JavaScript(mature) orPython(newer) for custom logic. Uses the built-in Node.js environment; arbitrary npm/pip packages require self-host customization. -
3
Webhook Triggers
Trigger workflows via
POSTto your webhook URL. For GitHub, forms, third-party callbacks. -
4
HTTP Request Node
GET/POST/PUT/DELETEto any API. Headers, body, auth (Bearer, OAuth). -
5
AI Agent Node
Build AI-powered workflows by connecting LLM nodes with tools and chains. Connects to OpenAI, Anthropic, and more.
How n8n Works
Self-Host or Use Cloud
Deploy via Docker or use n8n Cloud. Self-hosted = full control, no per-execution fees, limited by your server. Cloud = managed, easier setup, paid tiers.
Build Workflows Visually
Drag nodes onto the canvas, connect them with edges. Set triggers (webhook, cron, manual). Map data between node outputs and inputs.
Add Code Where Needed
Drop a Code node anywhere in the workflow. Write JavaScript or Python to transform data, call external APIs, or implement custom business logic.
Export and Version Control
Every workflow is JSON. Export it, store it in git, deploy programmatically. Credentials require separate handling outside the JSON export.
Use Cases
- โ High-volume pipelines: 100K+ executions/month where Zapier's task pricing becomes prohibitive.
- โ Data compliance workflows: HIPAA/GDPR-sensitive data that must stay on-premises.
- โ Developer automation: GitHub webhook โ run tests โ post Slack status โ update Jira.
- โ AI agent orchestration: Multi-step LLM chains with custom tool calls and memory management.
n8n vs Zapier vs Make
| Factor | n8n | Zapier | Make |
|---|---|---|---|
| Pricing Model | Free self-hosted; paid cloud tiers | Task-based ($20+/mo) | Operations-based ($9+/mo) |
| Self-Hosting | Yes (Docker) | No | No |
| Code Nodes | JS + Python | Limited | JS only |
| AI Agent Node | Beta | Yes | Limited |
| Version Control (Git) | JSON workflows | No | No |
| Learning Curve | Steeper (dev-first) | Easy | Medium |
Pros and Cons
Pros
- + No per-execution fees on self-hosted
- + JS/Python code nodes for complex logic
- + Workflows exportable as JSON (git-friendly)
- + Fair-code licensed (source available)
- + Budget-friendly at scale
- + Full data ownership on self-host
Cons
- - DevOps required for self-hosting
- - Steeper learning curve than Zapier
- - Fewer integrations than Zapier (400+ vs 6,000+)
- - Cloud tier still has costs
- - Less polished UI vs Make's canvas
- - Community support vs enterprise SLA
Practical Gotchas
- !Credential storage: Self-hosted โ you manage encryption. Cloud โ encrypted, but trusting n8n's infrastructure.
- !No SLA on self-hosted: You own uptime. Network down = workflow doesn't run. Plan for backups and monitoring.
- !Webhook timeout limits: n8n Cloud webhooks may timeout depending on your plan. Use async patterns for long-running operations.
- !Breaking changes in versions: Node APIs sometimes change between versions. Pin your Docker image; test upgrades carefully.
- !Execution history bloat: The execution log database can grow rapidly at scale. Plan for regular pruning or external storage.
- !Queue mode complexity: Scaling with queue mode (Redis/Bull) introduces operational complexity and concurrency bottlenecks.
- !Credential migration: Moving credentials between environments (dev โ staging โ prod) is a manual, error-prone process.
Pricing
n8n pricing changes frequently. Check the official pricing page for current plans.
Self-Hosted (Free Software)
- Cost: Free software; you pay for your own server infrastructure
- Executions: No per-execution fees (limited by your infrastructure)
- Best for: Teams or high-volume users with DevOps capacity
n8n Cloud (Paid Tiers)
- Best for: Teams who want managed hosting without DevOps overhead
- Tiers: Starter, Pro, Enterprise โ see n8n.io/pricing for current rates
- Features: Managed infrastructure, support, and collaboration tools vary by plan
Self-hosting removes per-execution fees but requires DevOps work. Cloud is managed but costs add up at scale. Choose based on your team's capacity and volume.
Alternatives to n8n
Zapier
Easiest onboarding for non-technical users; task-based pricing; no self-hosting option.
Make (formerly Integromat)
Visual canvas with good balance between power and ease; cheaper operations-based pricing; browser-based only.
Temporal
For microservices and durable execution patterns; enterprise-grade; not general automation.
Prefect / Apache Airflow
Data engineering pipelines and workflow orchestration; not designed for general business automation.
JSON Workflow Example
{
"name": "Webhook-to-Slack Workflow",
"nodes": [
{
"type": "n8n-nodes-base.webhook",
"name": "Webhook",
"parameters": {
"httpMethod": "POST",
"path": "incoming-webhook"
},
"position": [250, 300]
},
{
"type": "n8n-nodes-base.httpRequest",
"name": "HTTP Request",
"parameters": {
"url": "https://api.example.com/users",
"authentication": "bearerToken",
"method": "GET"
},
"position": [450, 300]
},
{
"type": "n8n-nodes-base.if",
"name": "Check Status",
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json.status }}",
"operation": "equals",
"value2": "active"
}
]
}
},
"position": [650, 300]
},
{
"type": "n8n-nodes-base.slack",
"name": "Slack Notification",
"parameters": {
"resource": "message",
"operation": "sendMessage",
"channel": "C01ABCDEF12",
"text": "User status is active",
"otherOptions": {}
},
"credentials": {
"slackApi": {
"id": "1",
"name": "Slack credentials"
}
},
"position": [850, 150]
}
],
"connections": {
"Webhook": {
"main": [
[
{"node": "HTTP Request", "type": "main", "index": 0}
]
]
},
"HTTP Request": {
"main": [
[
{"node": "Check Status", "type": "main", "index": 0}
]
]
},
"Check Status": {
"main": [
[
{"node": "Slack Notification", "type": "main", "index": 0}
]
]
}
}
}