Why n8n Instead of Zapier or Make
| Feature | n8n (self-hosted) | Zapier | Make (Integromat) |
|---|---|---|---|
| Monthly cost | $0 (self-hosted) | $20–$100+ | $9–$60+ |
| Executions | Unlimited | 750–100,000 | 1,000–10,000 |
| Custom code | Yes (JavaScript) | No | Limited |
| AI nodes | Yes (built-in) | Yes (limited) | Yes (limited) |
| Self-hosting | Yes | No | No |
| Privacy | Full (your server) | Their servers | Their servers |
| Complexity | Medium | Easy | Medium |
The verdict: n8n has a steeper initial setup than Zapier but is completely free when self-hosted, handles unlimited automation runs, and lets you write custom JavaScript for anything the visual builder can't do.

Step 1: Install n8n
Option A: Quick Cloud Test (No Setup, 14-Day Free Trial)
Go to n8n.io and start a cloud trial. Good for learning, not for permanent use.
Option B: Self-Host on Railway (Recommended — $5/month)
- Go to railway.app
- Click New Project → Deploy from Template
- Search "n8n" and click Deploy
- Railway gives you a URL like
https://n8n-production-xxxx.up.railway.app - Set these environment variables in Railway:
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=your-username
N8N_BASIC_AUTH_PASSWORD=your-strong-password
N8N_HOST=your-railway-url.up.railway.app
WEBHOOK_URL=https://your-railway-url.up.railway.app/
Option C: Self-Host on Your Own Server (Cheapest Long-Term)
# On a VPS (DigitalOcean $4/month, Hetzner €3.79/month)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
npm install -g n8n
# Start n8n (runs on port 5678)
n8n start
# For production: use PM2 to keep it running
npm install -g pm2
pm2 start n8n --name n8n
pm2 save
pm2 startup
Understanding n8n Concepts
Nodes
Every action in n8n is a node. A node can be:
- A trigger (what starts the workflow): Schedule, Webhook, Email received
- An action (what the workflow does): Send email, Update spreadsheet, Call API
- A transformation (modify data): Set field, Filter, Merge
Workflows
A workflow is a series of connected nodes. Data flows from left to right. Each node receives the output of the previous one.
Expressions
n8n uses {{ }} syntax to reference data from previous nodes:
| Expression | Meaning |
|---|---|
| `{{ $json.email }}` | Email field from the current node's JSON |
| `{{ $node["Node Name"].json.name }}` | Name from a specific node |
| `{{ $now.format('YYYY-MM-DD') }}` | Current date formatted |
| `{{ $items().length }}` | Count of items from previous node |
Your First Workflow: New Form Submission → Email Notification → Google Sheets
What This Does
- Someone fills in a contact form on your website
- n8n receives the submission via webhook
- Sends you a notification email
- Adds the contact to a Google Sheet for tracking
Step 1: Set Up the Webhook Trigger
- Create a new workflow
- Add Webhook node
- Set Method: POST
- Copy the webhook URL (something like
https://your-n8n.com/webhook/contact-form) - Set this as your form's action URL
Step 2: Send a Notification Email
Add a Send Email node (use Gmail or SMTP):
- To: your@email.com
- Subject:
New contact: {{ $json.body.name }} - Body:
New contact form submission:
Name: {{ $json.body.name }}
Email: {{ $json.body.email }}
Message: {{ $json.body.message }}
Time: {{ $now.format('MMMM D, YYYY h:mm A') }}
Step 3: Add to Google Sheets
Add a Google Sheets node:
- Operation: Append Row
- Sheet: Your tracking spreadsheet
- Column mapping:
- A (Name): {{ $json.body.name }}
- B (Email): {{ $json.body.email }}
- C (Message): {{ $json.body.message }}
- D (Date): {{ $now.format('YYYY-MM-DD HH:mm') }}
Click Save and Activate. Your automation is live.
Workflow 2: Daily News Summary to WhatsApp
Automatically sends you a morning briefing every day at 7am.
Nodes Required
- Schedule Trigger: Every day at 7:00 AM
- HTTP Request: GET
https://newsapi.org/v2/top-headlines?country=ng&apiKey=YOUR_KEY - Code: Format the articles into a readable message
// In the Code node
const articles = items[0].json.articles.slice(0, 5)
const message = articles.map((a, i) =>
`${i + 1}. *${a.title}*\n_${a.source.name}_\n`
).join('\n')
return [{ json: { message: `📰 *Morning News Brief*\n\n${message}` } }]
- Twilio (WhatsApp): Send the formatted message to your number
Workflow 3: AI-Powered Customer Support Triage
When a customer emails your support address, n8n:
- Reads the email
- Uses AI to classify it (billing, technical, general, urgent)
- Routes to the right team/label in Gmail
- Sends an auto-reply based on category
// Groq classification node (HTTP Request)
// Method: POST
// URL: https://api.groq.com/openai/v1/chat/completions
// Headers: Authorization: Bearer YOUR_GROQ_KEY
// Body:
{
"model": "llama-3.1-8b-instant",
"messages": [
{
"role": "system",
"content": "Classify this customer email into ONE category: billing, technical, general, urgent. Return only the category word."
},
{
"role": "user",
"content": "{{ $json.text }}"
}
]
},
Then use an If node to route based on {{ $json.choices[0].message.content }}.
Workflow 4: Social Media Auto-Poster
Write posts in Notion → n8n picks them up → auto-posts to Twitter, LinkedIn, and Instagram.
Setup
- Create a Notion database with columns: Content, Platform, Post Time, Status
- Notion Trigger: Watches for rows where Status = "Ready to Post"
- Switch Node: Routes by Platform field
- Twitter node: Posts text content
- LinkedIn node: Posts professional update
- HTTP Request → Instagram Graph API: Posts image + caption
- Notion node: Updates Status to "Posted"
Best n8n Practices
| Practice | Why It Matters |
|---|---|
| Name every node clearly | Impossible to debug unnamed nodes in complex workflows |
| Add error handling | Use the Error Trigger node to get notified when workflows fail |
| Use environment variables for API keys | Never hardcode credentials in nodes |
| Test with sample data | Use the "Execute Step" button on each node before going live |
| Add retry logic for API calls | External APIs fail intermittently |
| Document complex workflows | Future you will not remember what you built |

