Rebuilding Simple Workflows: 1-to-1 Migration
- Map a source Zap or Scenario by listing its trigger, actions, field mappings, and any filters before opening n8n
- Find the n8n equivalent node for each action using the node search panel
- Map data fields using n8n's expression syntax and reference previous nodes by name
- Verify that the migrated workflow produces identical outputs to the source before disabling it
What Makes a Workflow Simple
A simple workflow for migration purposes is one with 2–5 nodes, a single trigger, linear execution (no loops or branches), and actions in apps that have native n8n nodes. Examples: "New HubSpot contact → create Slack notification", "Schedule → fetch RSS feed → send email", "Typeform submission → create Airtable row". These are direct 1-to-1 rebuilds that most people can complete in under 30 minutes each.
Step 1: Open the Source Workflow and Map It
Open the Zap or Scenario you are migrating. Write down:
- The trigger: what app, what event, what data it produces.
- Each action: what app, what operation, what input fields it needs, and where those inputs come from (trigger data, previous step data, or static values).
- Any filters: what conditions currently stop the workflow mid-run.
This mapping — even just as a quick list on paper — prevents you from forgetting a field mapping halfway through the rebuild.
Step 2: Find the n8n Equivalent Nodes
In n8n, search for each app by name in the node panel. Most popular apps (Gmail, Slack, HubSpot, Google Sheets, Airtable, Notion, Stripe) have dedicated nodes with the same operations as their Zapier/Make equivalents. For apps without a native n8n node, use the HTTP Request node with the app's API documentation.
Step 3: Build and Map Data Fields
Add the trigger node first. Use the Manual Trigger temporarily — it lets you run the workflow manually with test data to see what fields are available. Then add each action node and map the input fields using n8n's expression editor ({{ $json.field_name }}).
Common field mapping patterns:
- The trigger node's output is referenced as
{{ $json.field }}in all following nodes. - A previous node's output is referenced as
{{ $('Node Name').item.json.field }}. - Static values are just typed directly without any expression syntax.
Step 4: Test with Real Sample Data
Run the workflow with a test trigger. For webhook-triggered workflows, use the Webhook Trigger's test URL — send a sample payload to the test URL and see the data appear in the node output panel. For scheduled or app-event workflows, use the Manual Trigger to fire the workflow with the last available data.
Check: does each action produce the correct output? Do all field mappings resolve correctly? Is the data formatted the way the receiving app expects?
Step 5: Verify Outputs Match the Source
Before switching, run both the source (Zapier/Make) and the n8n workflow with identical input data and compare the outputs side-by-side. They should produce the same result in the receiving app — the same HubSpot contact fields, the same Slack message content, the same row values in Airtable. Any discrepancy needs to be investigated and resolved before the source workflow is disabled.
Document as You Go
Update your audit spreadsheet after each migration: mark the workflow as Migrated, add the n8n workflow ID, and note any differences from the original (fields renamed, logic simplified, etc.). This documentation is invaluable if a migrated workflow behaves unexpectedly weeks later.
- Write down the trigger, actions, and field mappings from the source workflow before building — this prevents mid-build confusion
- Use Manual Trigger during development to run the workflow manually and inspect node outputs at each step
- Compare outputs side-by-side between old and new before switching — identical results are the cutover gate
- Document each migrated workflow in the audit spreadsheet as you go — the ID and any changes for future reference