Self-Host n8n: The Zapier Alternative 2026
Self-Host n8n: The Zapier Alternative 2026
Zapier charges $600/month for 2,000 tasks. n8n gives you unlimited tasks, unlimited workflows, and 400+ integrations for the cost of a $5–15/month VPS. It's the most popular open-source workflow automation tool in the world — 100,000+ GitHub stars — and it's built for developers who want code-level control alongside visual workflow building.
This guide walks through production-grade self-hosting: Docker Compose with PostgreSQL, nginx reverse proxy, and the configuration options that matter for real workloads.
Quick Verdict
Use Zapier if automation is an occasional tool for non-technical teammates who need zero setup. Self-host n8n if you're running any significant number of workflows, paying Zapier more than $50/month, or want AI agent capabilities, custom code nodes, and full data ownership.
Why n8n Over Zapier
| Factor | n8n (self-hosted) | Zapier |
|---|---|---|
| Cost | ~$10/mo infrastructure | $20–600+/mo |
| Workflows | Unlimited | Capped by plan |
| Executions | Unlimited | 750–50,000+/mo |
| Code nodes | ✅ JavaScript + Python | ❌ |
| AI agent nodes | ✅ (built-in, any LLM) | Limited |
| Self-host | ✅ | ❌ |
| Custom integrations | ✅ (HTTP + code) | ❌ |
| Data stays on your server | ✅ | ❌ |
| Webhooks | Unlimited | Capped |
| Sub-workflows | ✅ | Limited |
At scale, the difference is stark: a company running 50,000 executions/month pays $0 extra on self-hosted n8n vs $400–600/month on Zapier.
Requirements
- Docker + Docker Compose installed
- A VPS or server (2GB RAM minimum; 4GB recommended for heavy workloads)
- A domain name with DNS access
- Basic comfort with the command line
Step 1: Production Docker Compose Setup
The default SQLite setup works for testing. For production, use PostgreSQL — it handles concurrency, large workflow histories, and doesn't lock during writes.
# docker-compose.yml
version: "3.8"
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: n8n
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: n8n
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U n8n"]
interval: 10s
retries: 5
n8n:
image: docker.n8n.io/n8nio/n8n:latest
restart: unless-stopped
ports:
- "5678:5678"
environment:
- DB_TYPE=postgresdb
- DB_POSTGRESDB_HOST=postgres
- DB_POSTGRESDB_PORT=5432
- DB_POSTGRESDB_DATABASE=n8n
- DB_POSTGRESDB_USER=n8n
- DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}
- N8N_HOST=${N8N_HOST}
- N8N_PORT=5678
- N8N_PROTOCOL=https
- WEBHOOK_URL=https://${N8N_HOST}/
- GENERIC_TIMEZONE=America/New_York
- N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
volumes:
- n8n_data:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
volumes:
postgres_data:
n8n_data:
Create your .env file:
# .env
POSTGRES_PASSWORD=choose_a_strong_password_here
N8N_HOST=n8n.yourdomain.com
N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
The N8N_ENCRYPTION_KEY encrypts credentials stored in the database. Generate this once and never change it — changing it invalidates all stored credentials and you'll need to re-enter every integration's auth.
Step 2: Set Up HTTPS with Caddy
Create a Caddyfile alongside your docker-compose.yml:
n8n.yourdomain.com {
reverse_proxy n8n:5678
}
Add Caddy to your docker-compose.yml:
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
depends_on:
- n8n
Add caddy_data to your volumes section. Point your domain's A record to your server IP, then:
docker compose up -d
n8n will be accessible at https://n8n.yourdomain.com with automatic SSL.
Step 3: Initial Setup
On first access, n8n prompts you to create an owner account. Complete this immediately — leaving n8n without an account exposes your instance publicly.
After logging in:
- Create a workspace (or use the default)
- Set up credentials — go to Settings → Credentials and configure your integrations (Slack, Gmail, Airtable, etc.)
- Enable community nodes (optional) — Settings → Community Nodes → turn on to install third-party node packages
Step 4: Your First Workflow
n8n workflows consist of trigger nodes (what starts the workflow) and action nodes (what it does).
Example: Slack notification when GitHub issue is created
[GitHub Trigger] → [Slack node]
- Create new workflow → Add node → Trigger → GitHub
- Configure: Repository, Event: "Issues", Action: "opened"
- Add a Slack node: Channel
#engineering, Message:New issue: {{$json.title}} by {{$json.user.login}} - Activate workflow → flip the toggle at top-right
Webhooks are created automatically in your GitHub repo when you activate the workflow.
Core n8n Concepts
Code Nodes
n8n's most powerful feature: run custom JavaScript or Python inside any workflow step.
// Code node example: transform and filter data
const items = $input.all();
return items
.filter(item => item.json.status === 'active')
.map(item => ({
json: {
id: item.json.id,
name: item.json.name.toUpperCase(),
processed_at: new Date().toISOString(),
}
}));
This lets you handle any data transformation, API response parsing, or business logic that no-code nodes can't cover.
AI Agent Nodes (2026 Key Feature)
n8n has first-class AI agent support. Build agents that:
- Use any LLM (OpenAI, Anthropic, Groq, local Ollama)
- Call tools (search the web, query databases, send Slack messages)
- Loop until a task is complete
- Pass results to downstream workflow nodes
[Chat Trigger] → [AI Agent node] → [Send Email]
↓
[Tool: HTTP Request]
[Tool: Postgres Query]
[Tool: Slack]
Connect to your local Ollama for a fully self-hosted AI automation stack: zero API costs, zero data leaving your server.
Sub-Workflows
Call workflows from other workflows using the Execute Sub-Workflow node. This enables modular automation architecture — shared logic in one workflow called from many others.
Webhooks
Any workflow can start with a Webhook trigger. n8n generates a URL like https://n8n.yourdomain.com/webhook/abc123. Send a POST request to it, and your workflow fires. Essential for integrating with external services that push data (Stripe webhooks, GitHub events, custom apps).
400+ Built-In Integrations
n8n's integration library covers every common SaaS tool:
Productivity: Notion, Airtable, Google Sheets, Coda, Basecamp Communication: Slack, Discord, Telegram, Teams, Email (IMAP/SMTP) CRM: Salesforce, HubSpot, Pipedrive, Twenty, EspoCRM Development: GitHub, GitLab, Jira, Linear, PagerDuty Data: PostgreSQL, MySQL, MongoDB, Redis, Elasticsearch Files: Google Drive, Dropbox, Nextcloud, S3 AI: OpenAI, Anthropic, Groq, Hugging Face, Ollama, LangChain Finance: Stripe, PayPal, QuickBooks, Xero
For anything not covered, use the HTTP Request node — it can call any REST API with full control over headers, auth, and body.
Production Hardening
Limit Concurrent Executions
Prevent runaway workflows from exhausting server resources:
# Add to .env
EXECUTIONS_PROCESS=own
N8N_CONCURRENCY_PRODUCTION_LIMIT=20
Configure Execution History Pruning
By default, n8n keeps all execution logs. On high-volume instances this grows quickly:
EXECUTIONS_DATA_PRUNE=true
EXECUTIONS_DATA_MAX_AGE=168 # Keep last 7 days (hours)
EXECUTIONS_DATA_SAVE_ON_ERROR=all
EXECUTIONS_DATA_SAVE_ON_SUCCESS=none # Don't save successful runs (saves disk)
SMTP for Email Notifications
N8N_EMAIL_MODE=smtp
N8N_SMTP_HOST=smtp.yourprovider.com
N8N_SMTP_PORT=587
N8N_SMTP_USER=your@email.com
N8N_SMTP_PASS=your_password
N8N_SMTP_SENDER=n8n@yourdomain.com
Backup Your Instance
Back up two things: PostgreSQL data and n8n credentials/workflow files.
#!/bin/bash
# Daily backup
DATE=$(date +%Y-%m-%d)
# Database backup
docker exec n8n-postgres-1 pg_dump -U n8n n8n > "/opt/backups/n8n-db-$DATE.sql"
# n8n data volume
docker run --rm -v n8n_data:/data -v /opt/backups:/backup \
alpine tar czf "/backup/n8n-data-$DATE.tar.gz" /data
n8n vs Make vs Zapier: The Full Picture
| n8n (self-hosted) | Make | Zapier | |
|---|---|---|---|
| Free tier | Unlimited (self-host) | 1,000 ops/mo | 100 tasks/mo |
| Paid plans | Enterprise only | $9–$29+/mo | $20–$600+/mo |
| Code nodes | ✅ JS + Python | ❌ | ❌ |
| AI agents | ✅ Native | Via HTTP | Limited |
| Webhook triggers | Unlimited | Capped | Capped |
| Data privacy | Your server | Make servers | Zapier servers |
| Learning curve | Medium | Low | Low |
| Integrations | 400+ | 2,000+ | 6,000+ |
| Self-host option | ✅ | ❌ | ❌ |
n8n has fewer pre-built integrations than Zapier, but the HTTP Request node and Code nodes fill the gap for any technical user. If you're passing data through from Zapier to a custom script anyway, n8n replaces both steps.
Migrating from Zapier
- Audit your Zaps — identify your most-used and most-expensive workflows
- Start with simple triggers — webhook-based Zaps migrate in minutes
- Recreate in n8n — n8n's UI is workflow-centric (closer to Make than Zapier; expect a short learning curve)
- Test in parallel — run Zapier and n8n side-by-side for 1–2 weeks before cancelling
- Import/export — n8n workflows are JSON; you can share and version-control them
Most teams complete the migration in a weekend. The workflows that require re-learning are multi-step ones with complex filters — plan extra time for those.
Scaling Beyond a Single Instance
For teams with high execution volumes or multi-region requirements, n8n supports a queue mode that separates the main process (UI + job scheduling) from worker processes (execution):
# Additional env vars for queue mode
N8N_EXECUTION_MODE=queue
QUEUE_BULL_REDIS_HOST=redis
QUEUE_BULL_REDIS_PORT=6379
Add Redis to your docker-compose and spin up worker containers alongside the main n8n instance. Workers pick up jobs from the Redis queue — this lets you scale horizontally and prevents heavy workflows from blocking the UI.
A single n8n instance handles most teams' needs up to ~100k executions/month. Queue mode becomes relevant at larger volumes or when workflows with long execution times (multi-minute API calls, large data processing) would otherwise block others.
Error Handling and Alerting
n8n's error workflows are a production must. Create a dedicated error-handling workflow:
- Create a new workflow named "Error Handler"
- Add a Error Trigger node
- Add a Slack (or email) notification with
{{ $json.execution.error.message }} - In Settings → Workflows, set the Error Workflow to this new workflow
Now any workflow that throws an uncaught error will page you via Slack with the workflow name, error message, and execution ID for debugging.
For structured monitoring, pair n8n with Uptime Kuma (another OSS tool) to ping your n8n health endpoint every 60 seconds:
GET https://n8n.yourdomain.com/healthz
# Returns: { "status": "ok" }
Template Library
n8n's template library (available in-product at Templates → Explore) includes 1,000+ community-contributed workflows. Common starting points:
- Lead enrichment: Enrich new HubSpot contacts with Clearbit or Apollo data
- Invoice processing: Parse PDF invoices with AI, extract line items, push to QuickBooks
- Content pipeline: Monitor RSS feeds, summarize with Claude/GPT, post to Slack
- Database sync: Sync Airtable → PostgreSQL on a schedule
- Incident response: PagerDuty alert → create Linear issue → Slack thread
Templates import as JSON and serve as working starting points — modify for your environment rather than building from scratch.
n8n Cloud vs. Self-Hosted
If managing Docker infrastructure isn't your priority, n8n Cloud is worth knowing:
| n8n Cloud Starter | n8n Cloud Pro | Self-Hosted | |
|---|---|---|---|
| Price | $20/month | $50/month | ~$10/month (VPS) |
| Executions | 2,500/month | 10,000/month | Unlimited |
| Users | 1 | 5 | Unlimited |
| Support | Priority | Community | |
| Setup | Zero | Zero | 30 min |
Self-hosted wins on price at any meaningful execution volume. Cloud makes sense when you want n8n running in 2 minutes with zero ops overhead.
When Self-Hosting n8n Makes Sense
Self-host n8n if:
- You're paying Zapier/Make more than $30/month
- You need custom code in your automations
- Privacy matters (customer data shouldn't pass through third-party servers)
- You want to build AI agent workflows with local or cloud LLMs
- You have a developer on the team who can manage Docker
Don't self-host if:
- Your team is non-technical and needs Zapier's polish and 6,000+ integrations
- You only have 5–10 simple automations with no scaling plans
- Downtime for your automation workflows would be business-critical (use Zapier's SLA)
n8n's Fair-Code License
n8n uses a "fair-code" license (Sustainable Use License). It's free for internal use — including internal tools, personal projects, and running automations for your own organization. You cannot host n8n as a paid service for external customers without a commercial license.
For the vast majority of self-hosters, this makes zero practical difference. If you're building an automation SaaS platform on top of n8n, contact n8n for a commercial license.
Browse all Zapier alternatives at OSSAlt.
Related: 10 Open-Source Tools to Replace SaaS in 2026 · Coolify vs Vercel: Cost Comparison 2026