← Back to Blog
n8n · Zapier Migration

How I Migrated 47 Zapier Zaps to Self-Hosted n8n (and Saved $800/month)

✍️ Hamza Bilal 📅 November 2024 ⏱ 11 min read
n8nZapier MigrationCost SavingDevOps

A client was paying $840/month for a Zapier Business plan. They had 47 active Zaps across their sales, operations, and customer support teams. After the migration to self-hosted n8n, their monthly automation cost dropped to $8/month — the EC2 instance running n8n.

Here's the exact process I used over 3 weeks, including the 3 edge cases that almost broke production.

Phase 1: Audit (Week 1, Days 1–3)

Before touching anything, I audited every Zap. I created a spreadsheet with:

The 47 Zaps broke down like this:

CategoryCountNotes
CRM automation (HubSpot/Close)18High criticality
Slack notifications9Easy to migrate
Google Sheets sync7Medium complexity
Email parsing/routing6Complex — needed code nodes
Payment/Stripe webhooks4High criticality
Misc (3rd party apps)3Needed custom HTTP nodes

Phase 2: n8n Setup (Week 1, Days 4–5)

Set up n8n on AWS EC2 (t3.small, Ubuntu 22.04) with Docker Compose, Nginx, SSL via Certbot. Full setup takes about 2 hours. (See my guide: How to Self-Host n8n on AWS EC2)

Phase 3: Migration by Priority (Week 2)

I migrated lowest-criticality Zaps first to build confidence, then moved to high-criticality CRM flows.

The Zapier-to-n8n Equivalents

Zapiern8n Equivalent
Webhook triggerWebhook node
Filter stepIF node
Paths (branching)Switch node
Formatter (text)Set node + JS expression
Delay stepWait node
Looping (not native)SplitInBatches node
Code stepCode node (JS or Python)
HTTP requestHTTP Request node

The 3 Edge Cases That Nearly Broke Things

Edge Case 1: Zapier Formatter date parsing

Several Zaps used Zapier's Formatter to parse dates like "Dec 15, 2024" into ISO format. n8n doesn't have a direct equivalent — I used a JS Code node:

const raw = $json.date_string; // "Dec 15, 2024"
const parsed = new Date(raw);
return [{ json: { date_iso: parsed.toISOString() } }];

Edge Case 2: Multi-step looping

One Zap used Zapier's native looping (beta feature) to iterate over a list of contacts. n8n handles this differently — you split the input array, process each item, then merge results. The SplitInBatches node is the key.

Edge Case 3: HubSpot pagination

A Zap that fetched all contacts from HubSpot hit the 100-contact API limit on the Zapier node. In n8n, the HubSpot node handles pagination automatically with the "Return All" toggle — actually better than Zapier in this case.

Parallel running period: For 5 days, I ran both Zapier and n8n simultaneously for the 12 highest-criticality Zaps. I compared outputs in a Google Sheet. This caught 2 discrepancies (both were the date parsing edge case above) before I turned off Zapier.

Phase 4: Monitoring Setup (Week 3)

After full cutover, I set up a monitoring layer:

# n8n error catch workflow
# Set as "Error Workflow" in n8n settings (Settings → Error Workflow)
# Triggers automatically on any failed execution
Trigger: Error Trigger
→ Send Slack DM: "❌ n8n Error in: {{$json.workflow.name}}\nError: {{$json.execution.error.message}}"

The Numbers After 60 Days

Zapier migrations are one of my core services. If you're on a $200+ Zapier plan, the math almost always works in favour of migrating. Get a free migration assessment.

Hire Me For This

I migrate Zapier workflows to self-hosted n8n — saving clients $200–$800/month. Every Zap rebuilt with better logic and full documentation.