n8n: Self-Hosted Zapier Alternative - Automate Workflows for Free

Connect Gmail, Notion, and Telegram without paying $1000/year for task limits.

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