I was paying $49/month on Make.com and hitting operation limits every few weeks.
My 23 scenarios handled lead captures, Slack notifications, email sequences, and weekly reports. But Make.com counts every module execution as an "operation" — a 6-module scenario running 200 times/month consumes 1,200 operations. With 23 scenarios, I was always near the limit and upgrading every quarter.
Two weeks after switching to n8n, I cut my automation bill to $0 (self-hosted). Here's the complete guide — with 3 import-ready workflow JSONs.
Make.com vs n8n: The Pricing Reality
Make.com charges per operation. n8n charges per workflow execution (not per node).
| Make.com | n8n (self-hosted) | |
|---|---|---|
| Free tier | 1,000 ops/month | Unlimited |
| Starter | $9/month (10k ops) | Free |
| Pro | $29/month (40k ops) | $24/month cloud / free self-hosted |
| 6-node workflow, 500 runs/month | 3,000 ops used | 500 executions |
| Custom code | Basic formula functions | Full Node.js/Python runtime |
| AI/LLM nodes | Limited | Native Claude, GPT-4o, Gemini |
| Self-hosting | No | Yes (Docker, npm, Railway) |
With n8n self-hosted: zero cost, unlimited workflows, unlimited executions.
The Concept Translation Dictionary
| Make.com | n8n | Notes |
|---|---|---|
| Scenario | Workflow | Same concept |
| Module | Node | Same concept |
| Operation | Execution (per workflow run) | n8n counts once per run, not per node |
| Bundle | Item | n8n calls data records "items" |
| Router | Switch node | Branch logic |
| Iterator | SplitInBatches | Loop over arrays |
| Aggregator | Merge + Code node | Combine results |
| Filter | IF node | Conditional branching |
| Instant Webhook trigger | Webhook node | Identical |
| Scheduler | Schedule Trigger node | Identical |
| Functions/Formulas | Code node (JavaScript) | Full Node.js runtime |
| Data Store | PostgreSQL / Airtable / Redis | More flexible |
| HTTP module | HTTP Request node | Same |
Migration 1: Lead Capture Form → Sheets + Confirmation Email
Make.com version: Webhooks → Google Sheets (Add Row) → Gmail = 3 ops per run.
At 200 leads/month = 600 operations/month just for this one scenario.
n8n equivalent:
{
"name": "Lead Capture - Webhook to Sheets",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "lead-capture",
"responseMode": "responseNode"
},
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [240, 300]
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": "YOUR_SHEET_ID",
"sheetName": "Leads",
"dataMode": "autoMapInputData"
},
"name": "Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [480, 300]
},
{
"parameters": {
"toEmail": "={{ $('Webhook').item.json.body.email }}",
"subject": "Thanks for reaching out!",
"message": "Hi {{ $('Webhook').item.json.body.name }},\n\nWe received your message and will reply within 24 hours."
},
"name": "Gmail",
"type": "n8n-nodes-base.gmail",
"position": [720, 300]
}
],
"connections": {
"Webhook": {"main": [[{"node": "Google Sheets", "type": "main", "index": 0}]]},
"Google Sheets": {"main": [[{"node": "Gmail", "type": "main", "index": 0}]]}
}
}
Key difference: Make.com uses {{1.name}} (bundle notation). n8n uses {{ $('Webhook').item.json.body.name }} or just {{ $json.body.name }} when referring to the previous node's output.
Migration 2: Stripe Payment → Slack + Log to Sheets
Make.com version: Webhooks → Slack (Send Message) → Google Sheets = 3 ops/run.
At 150 payments/month = 450 ops/month.
{
"name": "Stripe Payment Notifier",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "stripe-payment",
"responseMode": "lastNode"
},
"name": "Stripe Webhook",
"type": "n8n-nodes-base.webhook",
"position": [240, 300]
},
{
"parameters": {
"channel": "#payments",
"text": "=💰 New payment: ${{ ($('Stripe Webhook').item.json.body.data.object.amount / 100).toFixed(2) }} from {{ $('Stripe Webhook').item.json.body.data.object.billing_details?.name || 'Customer' }}"
},
"name": "Slack",
"type": "n8n-nodes-base.slack",
"position": [480, 200]
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": "YOUR_SHEET_ID",
"sheetName": "Payments",
"columns": {
"mappingMode": "defineBelow",
"value": {
"Timestamp": "={{ new Date().toISOString() }}",
"Amount": "={{ $('Stripe Webhook').item.json.body.data.object.amount / 100 }}",
"Customer": "={{ $('Stripe Webhook').item.json.body.data.object.billing_details?.name }}",
"Status": "={{ $('Stripe Webhook').item.json.body.data.object.status }}"
}
}
},
"name": "Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [480, 400]
}
],
"connections": {
"Stripe Webhook": {
"main": [
[
{"node": "Slack", "type": "main", "index": 0},
{"node": "Google Sheets", "type": "main", "index": 0}
]
]
}
}
}
Migration tip: Make.com runs Slack then Sheets sequentially (2 separate operations). The n8n fan-out pattern (one node → two connections) runs both in parallel — faster, still 1 execution.
Migration 3: Scheduled Weekly Report
Make.com version: Scheduler → Google Sheets (Get Rows) → Tools (Array Aggregator) → Gmail = 4 ops/run. Weekly = 208 ops/year.
{
"name": "Weekly Sales Report",
"nodes": [
{
"parameters": {
"rule": {
"interval": [{"field": "weeks", "weeksInterval": 1, "triggerAtDay": [1], "triggerAtHour": 8}]
}
},
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [240, 300]
},
{
"parameters": {
"operation": "getAll",
"documentId": "YOUR_SHEET_ID",
"sheetName": "Orders",
"options": {"returnAll": true}
},
"name": "Get Orders",
"type": "n8n-nodes-base.googleSheets",
"position": [480, 300]
},
{
"parameters": {
"jsCode": "const items = $input.all();
const total = items.reduce((sum, i) => sum + Number(i.json.Amount || 0), 0);
const count = items.length;
const avg = count > 0 ? (total / count).toFixed(2) : 0;
return [{ json: { total: total.toFixed(2), count, avg } }];"
},
"name": "Calculate Stats",
"type": "n8n-nodes-base.code",
"position": [720, 300]
},
{
"parameters": {
"toEmail": "you@yourdomain.com",
"subject": "=Weekly Sales Report — {{ $now.toFormat('yyyy-WW') }}",
"message": "=<h2>Weekly Sales Report</h2><p><b>Revenue:</b> ${{ $json.total }}</p><p><b>Orders:</b> {{ $json.count }}</p><p><b>Avg Order:</b> ${{ $json.avg }}</p>"
},
"name": "Send Report",
"type": "n8n-nodes-base.gmail",
"position": [960, 300]
}
],
"connections": {
"Schedule Trigger": {"main": [[{"node": "Get Orders", "type": "main", "index": 0}]]},
"Get Orders": {"main": [[{"node": "Calculate Stats", "type": "main", "index": 0}]]},
"Calculate Stats": {"main": [[{"node": "Send Report", "type": "main", "index": 0}]]}
}
}
Migration tip: Make.com's Array Aggregator + Formula syntax → n8n's Code node. Full JavaScript gives you far more flexibility: conditional logic, external API calls, complex calculations.
What's Harder in n8n (Honest)
- UI polish: Make.com's module search and drag-and-drop is more beginner-friendly.
- App coverage: Some niche SaaS tools have Make integrations but no n8n community nodes yet.
- Error messages: Make.com gives clearer errors for non-technical users.
- Initial setup: Self-hosting requires Docker or a VPS. Make.com is SaaS — just sign up.
If you run under 10 simple scenarios and hate command lines: Make.com is fine. If you're technical, building complex AI workflows, or hitting operation limits: n8n wins.
Migration Checklist
- [ ] List all Make.com scenarios + module count + monthly run frequency
- [ ] Calculate operations per scenario (modules × runs)
- [ ] Install n8n (
npx n8nfor local, Docker for production) - [ ] Start with your highest-operation scenario first (biggest immediate saving)
- [ ] Use the concept table above to translate each module
- [ ] Test with n8n's test webhook URL before switching live traffic
- [ ] Update webhook URLs in your forms/services to n8n production URLs
- [ ] Disable Make.com scenario after confirming n8n works
- [ ] Repeat for remaining scenarios over 2-3 weeks
- [ ] Cancel Make.com subscription after 30 days
Ready-Made Templates (Skip the Migration Work)
Already running n8n? These pre-built templates save hours of setup:
- Email Auto-Responder — keyword-based Gmail auto-replies ($15)
- Lead Capture to CRM — webhook → score → Sheets → Slack ($19)
- Invoice Generator — automated HTML invoices ($19)
- Social Media Cross-Poster — one post → Twitter/LinkedIn/Facebook ($19)
- Complete FlowKit Bundle — all 15 templates for $97 (save $255)
Browse all 15 templates at stripeai.gumroad.com.
Alex Kane builds automation tools at FlowKit. Ready-to-use n8n workflow templates for businesses, developers, and teams.









