Why I switched from Zapier
Been running automation for my e-commerce store - email notifications, inventory updates, customer support routing. Started with Zapier because it's the default choice everyone recommends.
Hit the free tier limit in about a week. Then they wanted $20/month for 750 tasks. Upgraded, hit that limit within a month. Next tier is $50/month for 2000 tasks.
Did the math - I was paying $600/year and still hitting limits. That's when I found n8n. Self-hosted, no task limits, free forever.
The savings
Zapier Professional Plan: $600/year
n8n (self-hosted): $0/year
Saved: $600/year + unlimited tasks
What n8n actually is
It's workflow automation similar to Zapier. You connect services, set triggers, define actions. The main difference is you run it on your own server instead of their cloud.
That means:
- No per-task pricing - run 10 or 10 million workflows, doesn't matter
- Your data stays on your server - better for privacy
- 400+ integrations - Gmail, Slack, Notion, Telegram, databases, APIs
- Visual workflow editor - drag and drop, no coding required
- Can write custom code when needed - JavaScript/Python nodes
Getting n8n running
Simplest way is Docker. One command and you're done:
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8n
Access it at http://localhost:5678
For production, use Docker Compose:
version: "3.8"
services:
n8n:
image: n8nio/n8n
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=your-password
volumes:
- n8n_data:/home/node/.n8n
restart: always
volumes:
n8n_data:
No-Docker option:
npm install n8n -g
n8n start
Docker is easier to manage and update. That's what I'd recommend.
First automation: Gmail to Telegram
Here's what I set up first: important emails get forwarded to Telegram instantly. No need to constantly check email.
Step 1: Create Gmail trigger
Add a Gmail Trigger node:
- Click "Add node" → Search "Gmail"
- Select "Trigger" (not "Send Email")
- Connect your Gmail account (OAuth, safer than password)
- Set filters - I only want emails with "urgent" in subject
Step 2: Add Telegram action
Add Telegram node to send the message:
- Search for "Telegram" node
- Select "Send Text" (or "Send Photo" for attachments)
- Connect your Telegram bot (create one via @BotFather)
- Map the email data to the message
The complete workflow
Here's what it looks like:
Gmail Trigger
↓
(Filter: subject contains "urgent")
↓
IF → Match found → Telegram Send Message
↓
(Send to my personal chat ID)
Map the email content to Telegram:
// In Telegram node, message field:
{{ $json.subject }}
From: {{ $json.from }}
{{ $json.text }}
Saved me countless times. Customer urgent issues reach me instantly even when I'm away from computer.
Notion integration: Auto-create database entries
My use case: customer orders come via email, automatically create a database entry in Notion for tracking.
The workflow
Gmail Trigger (new emails)
↓
(Filter: from "orders@shop.com")
↓
Extract order data (JavaScript)
↓
↓
Notion Create Database Item
↓
(Customer: {{ $json.customerName }})
(Order: {{ $json.orderId }})
(Amount: {{ $json.amount }})
Extract data from email body
Email body is plain text, need to parse it:
// Code node to extract order data
const emailText = $input.item.json.text;
// Parse order info (adjust regex based on your format)
const orderId = emailText.match(/Order #(\w+)/)?.[1];
const customerName = emailText.match(/Customer: (.+)/)?.[1];
const amount = emailText.match(/Amount: \$(\d+)/)?.[1];
return {
json: {
orderId,
customerName,
amount,
rawEmail: emailText
}
};
Create Notion database entry
Connect Notion and select your database:
// Notion node configuration
Database: Orders (select your DB)
Properties:
- Order ID: {{ $json.orderId }}
- Customer: {{ $json.customerName }}
- Amount: {{ $json.amount }}
- Status: New (default value)
- Date: {{ $now.toISO() }}
Now every order email automatically creates a tracked entry in Notion. My team can see all orders in one place without manual entry.
More complex automations
Error handling and retries
Things fail sometimes. Add error workflows:
Main workflow
↓
Try → Notion Create Item
↓
↓
Error Node
↓
↓
IF → Is API error → Wait 5min → Retry (3 times)
↓
IF → Still failed → Send alert to Telegram
Schedule regular tasks
n8n has a cron trigger for scheduled workflows:
Cron Trigger (every morning at 9am)
↓
↓
Notion Query Database
↓
(Filter: Status = "Pending Follow-up")
↓
↓
Gmail Send Email
↓
(To: {{ $json.customerEmail }})
(Subject: "Following up on your order")
HTTP requests for APIs
Need to hit a custom API? HTTP Request node handles it:
// Trigger when new order received
↓
↓
HTTP Request (POST to your API)
↓
URL: https://api.your-shop.com/orders
Method: POST
Body: {
"orderId": "{{ $json.orderId }}",
"customer": "{{ $json.customerName }}"
}
Authentication: Bearer Token (your API key)
Data transformation
Sometimes data needs cleaning before using:
// Code node to clean and format data
const rawData = $json;
// Clean phone number format
const phone = rawData.phone.replace(/[^0-9]/g, '');
// Format currency
const amount = parseFloat(rawData.amount.replace('$', '')).toFixed(2);
// Extract domain from email
const email = rawData.customerEmail;
const domain = email.split('@')[1];
return {
json: {
...rawData,
phone,
amount,
emailDomain: domain
}
};
Problems I hit
Gmail connection lost
OAuth tokens expire after a week. Fixed by:
# Reconnect Gmail credential in n8n
# Or use service account with longer expiry
# Enable "Less Secure Apps" in Gmail settings (not recommended but works)
Notion rate limiting
Too many requests too fast. Added delays:
# Add Wait node after Notion operation
# Or batch operations using Code node
# Process 10 items at a time instead of all at once
Telegram bot not responding
Wrong chat ID format. Fixed by:
# Get correct chat ID
# Message @userinfobot on Telegram
# Send /start to receive your chat ID
# Format is usually numbers, can include @username for channels
Workflow stops randomly
Server restarted or Docker container died. Fixed by:
# Add restart policy in Docker Compose
restart: always
# Or run n8n with process manager like PM2
pm2 start n8n
Memory usage growing
Long-running workflows accumulate data. Fixed by:
# Enable "Execute Workflow" node with data cleanup
# Or split large workflows into smaller chains
# Regular n8n updates fix memory leaks
n8n vs Zapier vs others
| Feature | n8n (self-hosted) | Zapier |
|---|---|---|
| Cost | Free | $20-600+/year |
| Task limits | Unlimited | 100-150k/month depending on plan |
| Integrations | 400+ | 6000+ |
| Hosting | Your server | Cloud (included) |
| Setup difficulty | Medium | Easy |
| Custom code | Built-in JavaScript/Python | Code by Zapier (extra cost) |
If you have basic needs and budget, Zapier is fine. If you're hitting limits or want to save money, n8n pays off quickly.
What I automate now
- Customer support: Urgent emails → Telegram notification
- Order tracking: Order emails → Notion database entries
- Social media: New Instagram posts → Save to spreadsheet
- Inventory alerts: Low stock emails → Slack notification to team
- Backup: Important emails → Save to Google Drive
- Reports: Daily sales summary → Email to myself at 9am
All of this would cost hundreds per month on Zapier. With n8n it runs on a $5/month VPS with zero task limits.
Would I recommend it?
n8n saved me about $600/year compared to Zapier. The free cloud tier is generous if you don't want to self-host.
Setup takes maybe an hour. After that it just works. Occasionally need to reconnect OAuth tokens, but that's minor.
If you're running a business and tired of hitting automation limits, give n8n a shot. The savings alone make it worth the time investment.
Link: n8n.io | Docs: docs.n8n.io