How to Migrate from Zapier to n8n (Step-by-Step)

How to Migrate from Zapier to n8n: A Step-by-Step Guide

I paid Zapier $400 per month for two years. Every time I needed another Zap or hit a task limit, the price went up. When I finally migrated to n8n, I replaced all 47 Zaps, gained more power and flexibility, and cut my automation costs to nearly zero by self-hosting.

If you are considering the same move, this guide will save you the trial-and-error I went through. I will walk you through the entire migration process — from auditing your existing Zaps to recreating them in n8n, with all the gotchas and solutions I discovered along the way.

I am Javier, a startup consultant based in Chile. Automation is a core part of how I run my business and serve clients. My move from Zapier to n8n was one of the best operational decisions I have made, and I want to help you make it smoothly.

My Migration Story: Why I Left Zapier

Before we get into the how, let me share the why.

I started with Zapier in 2022 when I needed simple automations: send a Slack message when a form is submitted, sync Google Sheets with my CRM, post to social media on a schedule. Zapier was perfect for that — easy to set up, no technical knowledge needed.

But as my business grew, so did my automation needs. I went from 5 Zaps to 47. Simple two-step automations became multi-step workflows with conditional logic, data transformations, and API calls. And Zapier’s pricing scaled right along with it.

Here is what my Zapier bill looked like over time:

Month 1-6: Starter plan, $20/month, 5 Zaps
Month 7-12: Professional plan, $50/month, 20 Zaps
Month 13-18: Professional plan with extras, $150/month, 35 Zaps
Month 19-24: Team plan, $400/month, 47 Zaps with 50,000 tasks

That is $4,800 per year on automation. And every time I wanted to add a complex workflow with paths and filters, I needed premium features that cost even more.

The breaking point came when I needed to build a workflow that called an API, processed the response, split it into multiple paths, and stored results in a database. In Zapier, this required premium actions, multiple Zaps chained together, and I still could not do everything I needed. In n8n, it was a single workflow that took me 30 minutes to build.

What my migration saved me:

– Zapier cost: $400/month ($4,800/year)
– n8n self-hosting cost: $7/month for a Hetzner VPS ($84/year)
– Annual savings: $4,716
– Time to migrate: About 2 weeks (working on it part-time)

The savings alone justified the switch, but the real win was capability. n8n lets me build automations that were simply not possible in Zapier, no matter how much I paid.

Step 1: Audit Your Existing Zaps

Before touching n8n, you need a complete picture of what you are migrating. This step is critical — do not skip it.

Export your Zap list

Zapier does not have a bulk export feature for workflows. You need to document them manually.

Create a spreadsheet with these columns:

| Zap Name | Trigger App | Trigger Event | Action Steps | Status | Priority | Notes |
|—|—|—|—|—|—|—|
| New Lead to Slack | Typeform | New Entry | Slack: Send Message | Active | High | Runs 20x/day |
| Daily Report | Schedule | Every Day | Google Sheets, Gmail | Active | Medium | Morning report |
| … | … | … | … | … | … | … |

Categorize your Zaps

Group them by complexity:

Simple (1-2 steps): Trigger and one action. These are the easiest to migrate and should go first.

Medium (3-5 steps): Multiple actions, maybe a filter or formatter. Straightforward in n8n.

Complex (6+ steps or multi-path): Paths, filters, formatters, delays, lookups. These benefit the most from n8n’s capabilities.

Chained Zaps: Multiple Zaps connected via webhooks because Zapier could not handle the full workflow in one Zap. In n8n, these become a single workflow.

Identify dependencies

Note which Zaps depend on each other. If Zap A triggers Zap B via a webhook, you will combine them into one n8n workflow.

Also note which services each Zap uses. Make a list of all apps — you will need to set up credentials for each one in n8n.

Prioritize the migration order

I recommend migrating in this order:

1. Low-risk, simple Zaps first — Build confidence and learn n8n
2. High-frequency Zaps — These save the most tasks/money
3. Complex Zaps — Save these for when you are comfortable with n8n
4. Chained Zaps — Combine them into single workflows

Step 2: Set Up n8n

You have two options for running n8n:

Option A: n8n Cloud (fastest start)

Sign up for n8n cloud and you will have a running instance in minutes. This is what I recommend during migration — you can focus on recreating workflows without worrying about server setup. Move to self-hosting later if you want.

Option B: Self-hosted (cheapest long-term)

If you want to self-host from the start, follow my self-hosting guide to set up n8n on a VPS with Docker.

Set up your credentials

Before building workflows, set up credentials for all the services your Zaps use.

1. Go to Credentials in the left sidebar
2. Click Add Credential
3. Search for the service (e.g., Google Sheets, Slack, HubSpot)
4. Follow the setup steps (usually OAuth2 or API key)
5. Test the credential

Tip: Set up all credentials at once before starting workflow migration. This way, you are not interrupted by credential setup when you are in the flow of building.

Services that work differently in n8n

Most services connect similarly in both platforms, but a few have differences:

Google services: n8n uses OAuth2. You need to create a Google Cloud project and enable the relevant APIs. The n8n documentation has step-by-step guides for this.
Slack: n8n supports both OAuth2 (quick) and custom Slack App (more control). I recommend the custom app approach for full functionality.
Email (SMTP): Zapier has a built-in email action. In n8n, you connect your own email service via SMTP or use the Gmail/Outlook nodes.

Step 3: Map Zapier Concepts to n8n

The biggest mental shift is understanding how n8n’s concepts map to Zapier’s. Here is the translation table:

| Zapier Concept | n8n Equivalent | Notes |
|—|—|—|
| Zap | Workflow | Same concept, more powerful in n8n |
| Trigger | Trigger Node | First node in the workflow |
| Action | Node | Any node that performs an action |
| Path | IF Node + branches | More flexible than Zapier Paths |
| Filter | IF Node | Use conditions to filter items |
| Formatter | Code Node or Set Node | Transform data inline |
| Delay | Wait Node | Pause workflow execution |
| Looping | Loop Node or SplitInBatches | Process items in a loop |
| Lookup | Merge Node or Code Node | Cross-reference data |
| Webhooks by Zapier | Webhook Node | Same concept, built-in |
| Schedule | Schedule Trigger | Cron-based scheduling |
| Multi-step | Just add more nodes | No step limits |
| Tasks (billing unit) | Executions | Not billed on self-hosted |
| Premium apps | All apps included | No tier restrictions |

Key differences to understand

Data structure: Zapier passes data as flat key-value pairs between steps. n8n passes full JSON objects and arrays. This means you can work with nested data, arrays of items, and complex structures natively in n8n.

Multiple items: In Zapier, each task processes one item. If a trigger returns 10 items, Zapier runs the Zap 10 times. In n8n, a single execution can process multiple items through the workflow. This is more efficient but requires understanding n8n’s item-based processing.

Expressions: Zapier uses dropdowns to reference previous step data. n8n uses expressions like `{{ $json.fieldName }}` or `{{ $(‘Previous Node’).item.json.fieldName }}`. This is more flexible but takes a bit of learning.

Error handling: Zapier has basic error notifications. n8n has dedicated error handling nodes, retry logic, and error workflows. You can build much more resilient automations.

Step 4: Recreate Your Workflows

Now for the main work. Let me walk through migrating different types of Zaps.

Migrating a Simple Zap (Trigger + Action)

Zapier Zap: When a new row is added to Google Sheets, send a Slack message.

n8n Workflow:

1. Add a Google Sheets Trigger node
– Operation: Row Added
– Select your spreadsheet and sheet
– Poll interval: Every minute (or use webhook mode)

2. Add a Slack node
– Operation: Send Message
– Channel: Select your channel
– Message: Use expressions to insert data: `New row added: {{ $json.Name }} – {{ $json.Email }}`

3. Activate the workflow

That is it. Two nodes, same functionality, no per-task charges.

Migrating a Multi-Step Zap

Zapier Zap: When a form is submitted, check if the email exists in HubSpot. If yes, update the contact. If no, create a new contact. Either way, send a Slack notification.

n8n Workflow:

1. Webhook node — Receives the form submission
2. HubSpot node — Search for contact by email
3. IF node — Does the contact exist?
– Condition: `{{ $json.total }}` greater than 0
4. HubSpot node (yes path) — Update existing contact
5. HubSpot node (no path) — Create new contact
6. Merge node — Combine both paths
7. Slack node — Send notification

In Zapier, this requires a Path step (premium) and careful configuration. In n8n, it is a straightforward branching workflow.

Migrating Chained Zaps

Zapier setup: Zap 1 processes data and sends it to a webhook. Zap 2 receives the webhook and continues processing. Zap 3 handles errors from Zap 2.

n8n approach: Combine everything into a single workflow. n8n has no step limits, so there is no reason to split workflows unless they serve genuinely different purposes.

1. Start with Zap 1’s trigger
2. Add all processing steps from Zap 1
3. Continue with Zap 2’s steps (no webhook needed — just keep adding nodes)
4. Add an Error Trigger workflow for error handling
5. Done — one workflow replaces three Zaps

Migrating Zapier Formatters

Zapier’s Formatter step handles text transformations, date formatting, number operations, and more. In n8n, you have several options:

For simple transformations, use expressions:

– Lowercase: `{{ $json.name.toLowerCase() }}`
– Uppercase: `{{ $json.name.toUpperCase() }}`
– Trim: `{{ $json.text.trim() }}`
– Extract email domain: `{{ $json.email.split(‘@’)[1] }}`

For date formatting, use Luxon (built into n8n):

– Format date: `{{ DateTime.fromISO($json.date).toFormat(‘yyyy-MM-dd’) }}`
– Add days: `{{ DateTime.fromISO($json.date).plus({ days: 7 }).toISO() }}`

For complex transformations, use the Code node:

“`javascript
const items = $input.all();

return items.map(item => {
return {
json: {
fullName: `${item.json.firstName} ${item.json.lastName}`,
email: item.json.email.toLowerCase().trim(),
signupDate: DateTime.fromISO(item.json.created).toFormat(‘MMM dd, yyyy’),
isEnterprise: item.json.plan === ‘enterprise’
}
};
});
“`

Migrating Zapier Filters

Zapier filters stop a Zap from continuing if conditions are not met. In n8n, use the IF node:

Zapier Filter: Only continue if email does not contain “test.com”

n8n IF Node:
– Condition: `{{ !$json.email.includes(‘test.com’) }}`
– True path: Continue processing
– False path: Do nothing (or log the filtered item)

The IF node is more powerful because you can route filtered items to different paths instead of just stopping.

Migrating Scheduled Zaps

Zapier: Schedule trigger runs every day at 9 AM.

n8n: Add a Schedule Trigger node:
– Trigger Times: Every Day
– Hour: 9
– Minute: 0
– Timezone: America/Santiago (set your timezone)

n8n’s Schedule Trigger supports cron expressions for complex schedules that Zapier cannot handle, like “every weekday at 9 AM and 5 PM” or “first Monday of every month.”

Step 5: Test Everything

Testing is where most migration problems get caught. Do not skip this.

Test each workflow individually

1. Use n8n’s Test workflow button (or Test step for individual nodes)
2. Provide realistic test data
3. Verify the output matches what Zapier produced
4. Check edge cases: empty fields, special characters, large datasets

Run in parallel temporarily

For critical workflows, run both the Zapier Zap and the n8n workflow simultaneously for a few days:

1. Keep the Zapier Zap active
2. Activate the n8n workflow
3. Compare outputs to verify they match
4. Once confident, disable the Zapier Zap

Common test scenarios

– What happens when the trigger has no data?
– What happens when a field is empty or null?
– What happens when the API returns an error?
– Does the workflow handle multiple items correctly?
– Does the timing/scheduling work as expected?

Common Gotchas and Solutions

Here are the issues I encountered during my migration and how I solved them.

Gotcha 1: Data structure differences

Problem: Zapier flattens nested data. n8n preserves it. If your Zap references `Contact Name`, n8n might have it as `contact.name` or `properties.name`.

Solution: Use the Set node to restructure data or reference nested fields with dot notation in expressions: `{{ $json.contact.name }}`

Gotcha 2: Trigger timing differences

Problem: Zapier polls every 1-15 minutes depending on your plan. n8n’s polling triggers have configurable intervals, and some triggers use webhooks for instant execution.

Solution: For time-sensitive workflows, use webhook-based triggers in n8n. For polling triggers, set the interval to 1 minute. Note that n8n does not deduplicate automatically for all triggers — check if the specific trigger node handles this.

Gotcha 3: Missing integrations

Problem: A few Zapier-specific apps do not have n8n equivalents. For example, Zapier’s built-in Email, Digest, and Storage actions.

Solution:
Email: Use the Send Email node with SMTP or the Gmail/Outlook nodes
Digest: Use the Code node with n8n’s static data to collect items, then send a batch summary on a schedule
Storage: Use a database node (Postgres, Supabase) or a file-based approach
Any missing app: Use the HTTP Request node with the app’s API

Gotcha 4: Expression syntax

Problem: Zapier uses dropdown menus to reference data. n8n uses JavaScript-based expressions.

Solution: Learn the basics of n8n expressions:
– Reference current node input: `{{ $json.fieldName }}`
– Reference a specific node’s output: `{{ $(‘Node Name’).item.json.fieldName }}`
– Use JavaScript methods: `{{ $json.text.replace(‘old’, ‘new’) }}`
– Conditional values: `{{ $json.status === ‘active’ ? ‘Yes’ : ‘No’ }}`

The learning curve is real but short. After a few workflows, expressions become second nature.

Gotcha 5: Multi-item processing

Problem: In Zapier, each trigger event creates a separate task. In n8n, a trigger can return multiple items at once, and all nodes process all items by default.

Solution: Understand n8n’s item processing model:
– Most nodes process each item individually (like Zapier)
– Some nodes aggregate items (Merge, Code with `$input.all()`)
– Use the SplitInBatches node when you need to process items one at a time with delays

Gotcha 6: Webhook URLs change

Problem: If you use Zapier webhooks as triggers and other services send data to those URLs, you need to update those services with new n8n webhook URLs.

Solution: Set up the Webhook node in n8n first, copy the production URL, then update the sending service. Use the test mode to verify data is received correctly before going live.

Migration Timeline

Based on my experience, here is a realistic timeline:

| Phase | Duration | Activities |
|—|—|—|
| Audit | 1-2 days | Document all Zaps, categorize, prioritize |
| Setup | 1 day | Install n8n, set up credentials |
| Simple Zaps | 2-3 days | Migrate simple trigger-action workflows |
| Medium Zaps | 3-4 days | Migrate multi-step workflows |
| Complex Zaps | 3-5 days | Migrate complex and chained workflows |
| Testing | 2-3 days | Parallel testing, edge cases |
| Cutover | 1 day | Disable Zapier, verify n8n |
| Total | 2-3 weeks | Working on it part-time |

If you have fewer than 20 Zaps and they are mostly simple, you could do this in a week.

After Migration: What to Expect

The first week

You will find a few workflows that need adjustments. This is normal. Check execution logs daily and fix any issues that come up. The n8n community forum is an excellent resource when you get stuck.

The first month

By now, your workflows should be running smoothly. You will start noticing things you can do in n8n that were not possible in Zapier — complex branching, code nodes for data transformation, sub-workflows for reusable logic.

Long term

You will build more sophisticated automations because n8n removes the limitations that held you back. I went from 47 Zaps doing simple tasks to about 30 n8n workflows doing much more complex work. Fewer workflows, more capability.

And your Zapier bill? Zero.

Canceling Zapier

Once your n8n workflows are running reliably:

1. Run parallel for at least one week
2. Verify all workflows produce correct outputs
3. Turn off all Zaps (do not delete them yet — keep them as reference)
4. Downgrade to the free Zapier plan
5. After one month of successful n8n operation, delete your Zaps and close your account

Keep your Zapier account on the free tier for a month as a safety net. You can always re-enable a Zap if something goes wrong with the n8n replacement.

Wrapping Up

Migrating from Zapier to n8n is one of those decisions that pays off immediately and keeps paying off over time. You get more powerful automations, no per-task pricing, full data control, and the flexibility to build anything you can imagine.

Is the migration work? Yes, about two to three weeks of part-time effort. Is it worth it? Absolutely. My annual savings of nearly $5,000 would justify far more work than that. And the capability gain — being able to build automations that Zapier simply cannot handle — is the real long-term value.

If you are ready to make the switch, start with n8n and begin with your simplest Zaps. Build confidence, learn the platform, and work your way up to the complex ones. You will wonder why you did not switch sooner.

Frequently Asked Questions

How long does it take to migrate from Zapier to n8n?

The timeline depends on the number and complexity of your Zaps. For a typical setup with 20 to 50 Zaps, expect two to three weeks of part-time work. Simple trigger-action Zaps take 5 to 10 minutes each to recreate. Multi-step Zaps with paths and filters take 20 to 45 minutes. Complex chained Zaps might take an hour or more. I migrated 47 Zaps in about two weeks while still running my regular work. Start with the simple ones to build confidence and save the complex ones for when you are comfortable with n8n.

Will I lose any functionality by switching from Zapier to n8n?

In the vast majority of cases, no — you will gain functionality. n8n supports more complex logic, has no step limits, includes code execution, and offers advanced error handling that Zapier lacks. The only areas where Zapier has an edge are a few niche integrations that only exist as Zapier-specific apps, and the simplicity of Zapier’s point-and-click interface for very basic automations. For any integration gap, n8n’s HTTP Request node lets you connect to any API directly, so you are never truly stuck.

Can I keep using Zapier for some things and n8n for others?

Yes, you can run both platforms simultaneously. Some people keep Zapier for one or two simple automations and use n8n for everything complex. However, I recommend fully migrating for simplicity. Running two platforms means maintaining credentials, monitoring, and mental context in two places. If cost is the concern, n8n handles simple and complex automations equally well, so there is no reason to keep paying Zapier for the simple ones. During migration, running both in parallel for testing is a good practice though.

🚀 Ready to automate?

Start your free n8n trial today.

Try n8n Free →