How I Migrated from Zapier to n8n and Cut My Automation Bill to Zero
I was paying $120/month on Zapier and barely using a third of it. Here's the honest story of migrating to n8n — the wins, the failures, and the one thing that almost made me give up.
How I Migrated from Zapier to n8n and Cut My Automation Bill to Zero#
My Zapier bill in January 2026 was $119. I logged in to check which Zaps were actually running and found that 9 of my 17 active Zaps hadn't fired in over a month. I was paying for automations that had quietly stopped being useful while I wasn't looking.
That was the moment I decided to actually do the Zapier migration I'd been putting off for two years.
This is the honest version of that story. Not the polished "it was easy and everything is perfect" version — the real one, with the hours I wasted on a Docker networking problem, the Zap I thought would take 20 minutes and took a whole evening, and the one place where Zapier is still better.
Why I Stayed on Zapier for So Long#
I knew n8n existed. I'd seen it on Hacker News, read the comparisons, even installed it locally once "to try it." But I kept renewing Zapier because of inertia and a vague sense that the migration wasn't worth the trouble.
There were also real concerns:
- I have clients who depend on some of my automations. If they break during a migration, that's a professional problem.
- I'm a freelancer, not a sysadmin. The idea of maintaining a server felt like a new job.
- Zapier "just works." I understood it.
What finally pushed me over was that $119 bill. I did the math: $119/month is $1,428/year. For n8n on a €5/month Hetzner VPS, I'd pay €60/year. That's over $1,300 in savings for some weekend work. I could finally justify the time investment.
The Setup: What I Was Running on Zapier#
Before migrating, I audited everything. Here's what I actually had:
Active and useful (8 Zaps):
- New Typeform submission → Notion CRM + Gmail welcome email
- Stripe payment received → update Notion project status + send receipt
- New RSS item from 3 sources → Slack notification with summary
- Calendly booking → Google Calendar block + client confirmation email
- Gmail label "Needs Follow-up" → Notion task with 3-day due date
- New GitHub star on a repo → log to Google Sheets
- Monday 8 AM → fetch and email my weekly agenda
- New Twitter/X mention → Slack alert (so I don't miss client mentions)
Running but useless (5 Zaps):
- Old integrations with tools I no longer use
- A Zap that sent me daily news digests I never read
- Two duplicates I had forgotten about
Broken and never fixed (4 Zaps):
- Zaps with expired credentials I kept ignoring
- One that broke when a service changed their API
I deleted the 9 useless/broken ones immediately. That alone cut my Zapier usage significantly, but not enough to drop to a lower plan. The 8 active ones were what I needed to migrate.
Setting Up the Server#
I went with Hetzner Cloud, CX11 plan, €3.79/month. Ubuntu 22.04.
I installed Docker and used this Docker Compose file:
version: '3.8'
services:
n8n:
image: n8nio/n8n
restart: unless-stopped
ports:
- "5678:5678"
volumes:
- n8n_data:/home/node/.n8n
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=myusername
- N8N_BASIC_AUTH_PASSWORD=a_strong_password
- WEBHOOK_URL=https://n8n.mydomain.com
- N8N_HOST=n8n.mydomain.com
- N8N_PROTOCOL=https
volumes:
n8n_data:
I also set up Nginx as a reverse proxy with Let's Encrypt SSL. There are good tutorials for this specific setup — I followed the one on the n8n documentation and it worked on the first try.
Total setup time: About 2 hours, including DNS propagation wait time.
The one thing that bit me: Docker networking. My Ollama instance (I was already running it for other things) was on the host machine, not in Docker. When n8n tried to reach it via localhost:11434, it couldn't because "localhost" inside a Docker container refers to the container itself, not the host. The fix is to use host.docker.internal:11434 instead. Cost me 45 minutes of confused debugging.
Rebuilding the Zaps: What Was Easy, What Wasn't#
The Easy Ones#
RSS → Slack: This took 12 minutes. n8n has a native RSS Feed Trigger and Slack node. Exactly equivalent to what Zapier had, maybe even cleaner. Added a bonus IF node to filter only articles containing my keywords — something I couldn't do easily in Zapier without a paid filter step.
Monday morning agenda: 20 minutes. Schedule Trigger → Google Calendar node → Gmail. The Google Calendar credential setup took longer than the actual workflow.
GitHub star → Google Sheets: 15 minutes. GitHub webhook trigger already built in. Mapped the fields to my sheet columns. Done.
The Medium Ones#
Typeform → Notion + Gmail: 45 minutes. The complexity here was mapping Typeform's field structure to Notion properties. Typeform's response format is a nested array of answers, and you have to use .find() logic to extract specific fields by ID. Once I understood the data structure (the n8n Typeform node shows you the raw output on first run), it was straightforward. I actually made the Notion integration better than my original Zapier version — added AI-powered lead scoring using an Ollama node.
Calendly → Calendar + Email: 1 hour. Calendly changed their webhook format at some point, so their n8n documentation was slightly out of date. I had to inspect the actual webhook payload manually and adjust my field mappings. Not Zapier's fault, not n8n's fault — just API drift. But it required some digging.
Gmail label → Notion task: 40 minutes. Figuring out how to watch for a label on existing emails (not just new emails) required a different approach than I expected. I ended up using a Schedule Trigger (runs every 30 minutes) with a Gmail search query instead of a real-time trigger. Works fine.
The Difficult One#
Stripe → Notion + Receipt email: 2.5 hours. This was supposed to be easy. Stripe webhooks are well-documented, n8n has a native Stripe integration. What went wrong?
Two things. First, Stripe sends webhook events with nested metadata, and my specific Stripe product setup had a customer metadata format that differed from the documentation examples. I kept getting undefined on the fields I needed.
Second, my "send receipt" email had HTML formatting that worked fine in Zapier's HTML email builder but didn't render correctly when I pasted the same HTML into n8n's Gmail node. Turned out n8n was double-escaping some characters. The fix was using a Code node to construct the email HTML before passing it to the Gmail node, which gave me full control.
Once it worked, it was actually better than the Zapier version — I could include the specific project name from Notion in the receipt, which Zapier's version couldn't do without a premium lookup step.
What I Noticed After Two Weeks#
After running both in parallel for two weeks (Zapier active as backup, n8n running live), I turned off Zapier.
What's better in n8n:
- The execution log is dramatically better. For every run, I can click in and see exactly what data flowed through each node. In Zapier, debugging a failed Zap feels like looking at a black box.
- The branching logic. My Gmail label workflow now has an IF node that handles different client types differently — something Zapier charges extra for.
- The AI integration. Having Ollama directly in the workflow pipeline is something Zapier can't replicate.
- The cost. Three weeks in, my Hetzner invoice was €3.79. My Zapier bill would have been $119.
What I miss from Zapier:
- The integration library. n8n has 400+ integrations; Zapier has 6,000+. I had one Zap that used a small CRM tool that doesn't have an n8n node. I rebuilt it using the HTTP Request node and the CRM's REST API, which worked fine but took an extra hour to figure out.
- Zero maintenance. Zapier updates itself. With n8n on a VPS, I need to run
docker compose pull && docker compose up -doccasionally to update. It's a 2-minute task, but it's a task.
What surprised me: I thought the hardest part would be the technical setup. The hardest part was actually the mental shift from "I set this up once and it runs forever" to "I understand exactly how this works and can change it anytime." That's actually an upgrade, but it felt unfamiliar at first.
The Ongoing Cost#
After the migration:
- Hetzner VPS: €3.79/month
- Domain (I already had one): €0 additional
- n8n: Free (open source)
- Zapier: Cancelled
Monthly savings: ~€113/month. Annual: ~€1,356.
For a freelancer, that's real money. I've reinvested part of it into a slightly bigger VPS to run Ollama alongside n8n.
Should You Do This?#
If you're paying more than $30/month on Zapier and you have more than 5 automations, the migration is almost certainly worth your time. Budget a weekend, expect one or two workflows to be harder than expected, and don't try to migrate everything at once.
Start with your simplest Zap to get comfortable, then do the most important one (the one you'd be most upset if it broke), then work through the rest at your own pace.
The freedom of owning your automation infrastructure is something I didn't anticipate valuing as much as I do. When something breaks, I can debug it fully. When I want to change something, I change it — no plan limitations. When a new tool doesn't have a native integration, I just call its API directly.
It's more responsibility, but it's a responsibility that pays for itself quickly.
Frequently Asked Questions#
How long does it take to migrate from Zapier to n8n?#
For a freelancer with 5-15 Zaps, budget 1-2 weekends. Simple trigger-action Zaps take 15-30 minutes to rebuild. Multi-step Zaps with filters and formatters take 1-2 hours. Factor in extra time for credentials setup and end-to-end testing.
Can I export my Zaps and import them into n8n?#
No direct export/import exists. You rebuild each Zap manually. The silver lining: rebuilding forces you to clean up outdated automations. Most people end up with cleaner, more efficient workflows after migration.
What Zapier features does n8n not have?#
Zapier has more pre-built integrations (6,000+ vs n8n's 400+), a more beginner-friendly interface, and a more polished managed cloud option. For any app with a REST API, n8n's HTTP Request node fills the integration gap.
Is self-hosting n8n difficult to maintain?#
Lower maintenance than expected. Main tasks: update Docker image monthly (one command), monitor disk space for logs, re-authenticate credentials occasionally. Budget 15-30 minutes per month.
Frequently Asked Questions
Continue Reading
How I Built a Client Reporting System That Runs Itself (With n8n)
Client reports were taking 3 hours every Friday. After one weekend building an n8n automation, they now take 10 minutes to review and send. Here's the workflow, the mistakes I made, and the parts that surprised me.
How I Stopped Missing Leads by Building a $0 CRM Automation in n8n
A $4,000 project slipped through my fingers because I missed a contact form email. Here's the n8n automation I built to make sure that never happens again — and it cost nothing to run.
How I Fixed My n8n Workflow That Was Failing Silently for Three Weeks
My n8n workflow was silently failing every Tuesday for three weeks. No errors, no alerts, just nothing happening. Here's the debugging story and the monitoring setup I built so it can never sneak past me again.