Why People Search “ActiveCampaign or Mailchimp Alternative”
Many businesses start looking for alternatives to mainstream email marketing platforms because of a few common frustrations:
- Data privacy: Sharing sensitive customer data with third-party SaaS tools can feel risky.
- Cost: Subscription fees often scale with your contact list, quickly adding up.
- Flexibility & customization: Off-the-shelf platforms don’t always support the custom integrations growing teams need.
This often leads teams to search for terms like “Mailchimp alternatives,” “ActiveCampaign alternatives,” “Klaviyo alternatives,” or “free Mailchimp alternative.” Initially, they come across polished SaaS solutions like Zapier, Make.com, or larger marketing suites like HubSpot and Drip. But those who dig deeper eventually find n8n — a powerful open-source alternative that offers full control, flat pricing, and self-hosted flexibility.
For teams outgrowing the limits of mainstream platforms, n8n delivers robust email automation tailored exactly to their workflows.
What Makes n8n an Open-Source Marketing Automation Powerhouse
When marketers and founders discover n8n, it’s typically because they crave a no-code tool with more flexibility, predictable pricing, and full data ownership. As an open-source marketing automation solution, n8n excels at giving users complete control without surprise feature gates or inflated monthly fees.
Here’s exactly why n8n stands out:
Feature | Why It Matters for Users |
Unlimited contacts and emails | Forget per-contact charges, scale your marketing without anxiety or monthly fee jumps. |
Fully open source (MIT) | No vendor lock-in. Fork, extend, and customize as your needs grow. |
600+ integrations | Seamlessly integrate CRMs (HubSpot, Salesforce), payment platforms (Stripe, Paddle), AI services (OpenAI), and communication apps (Slack, Discord) without code. |
Visual workflow builder | Create email workflows easily via drag-and-drop. Zero coding needed. |
Workflow as JSON | Version-control your email sequences for better team collaboration. |
True data ownership | All data resides on your server. Perfect for compliance, privacy, and GDPR peace-of-mind. |
Want more detail on what you can get out of the box with n8n? Check out our related guide to setting up keyword alerts for another real-world example of how flexible n8n can be.
In short, n8n is ideal for teams outgrowing rigid platforms like ActiveCampaign or Mailchimp, but not yet ready for a fully custom-coded solution. It offers the flexibility, transparency, and scalability marketers need without requiring technical expertise.
n8n vs. ActiveCampaign vs. Mailchimp
Here’s a quick comparison of n8n, ActiveCampaign, and Mailchimp to help you choose the right tool for your automation needs.
Feature | n8n | ActiveCampaign | Mailchimp |
Pricing basis | Flat server | Contacts & features | Contacts & features |
Self-host / on-prem | ✓ | ✗ | ✗ |
Unlimited contacts | ✓ | ✗ | ✗ |
Visual builder | ✓ | ✓ | Partial |
Custom nodes/plugins | ✓ | ✗ | ✗ |
If you’re hunting “free alternatives to Mailchimp,” n8n tops the list.
Step-by-Step: Build a Production-Ready Email Workflow
n8n enables you to send automation emails based on user actions without relying on external SaaS tools.
Below you’ll find a step-by-step guide to building a complete email automation flow in n8n with clear logic, essential nodes, and real-world structure you can reuse.
Create a Secure Webhook
- Webhook node → POST → Path /email-automation
- Add header x-api-key: YOUR_RANDOM_TOKEN.
- Example payload:
{
"api_action": "contact_tag_add",
"email": "[email protected]",
"tag": "trial-started",
"first_name": "Jane",
"last_name": "Doe"
}
Route Events with a Switch
- Switch node → Mode: Rules → Routing Rules
Output | Condition (api_action is equal to) |
Add Contact | contact_add |
Add Tag | contact_tag_add |
Add Note | contact_note_add |
Add Event | event_add |
Here you can add your conditions with your Output Name.
Find Contacts if Exist
Before you can search for contacts, you need to store them somewhere. We’ll use a MySQL database in this example, but Google Sheets or any other database will work too. If you need help setting up MySQL, we’ve covered it in this blog post.
When this is completed you can follow this steps:
- Select user by email.
- IF found → Update name fields.
- ELSE → Insert new user.
- Wrap both in a Transaction to avoid race conditions.
If/Else Node
Use the If node to check whether a user with the given email already exists.
- If the condition is true, update the user’s data (if new data is provided).
- If the condition is false, create a new user in your database or sheet.
Merge Node
Use the Merge node to combine the two branches, whether the user was found or newly created. So the workflow continues with the user data in either case.
Handle Tags & Segmentation
In this step, we’ll assign a tag to the user.
First, check if the user already has the tag – if they do, skip tagging. If not, add the tag to ensure proper segmentation.
You can follow the same If → Update / Else → Insert logic as before. This will also be included in the final JSON workflow provided at the end of the post.
- Ensure tag exists in tags.
- Insert into user_tags only if not present.
- Tag branches you care about trigger drips (next step).
Start Tag-Based Email Flow
This is where email automation begins.
Just like the previous Switch node, create a new Switch based on the user’s tag. For example, if the tag is purchased-product-1, the corresponding automation flow should start.
- Switch on tags (trial-started, payment-failed, etc.).
- Check if the user is not unsubscribed.
- If the user is subscribed, insert a new row into the user_automations table.
- Use an Send Email node to send Email #1.
- Add a Wait node (e.g., 2 days).
- Send Email #2, then repeat the pattern (Wait → Email #3, etc.).
- At the end of the sequence, set finished = TRUE.
Send Email Node
In this example, we’ll use the Gmail node, but you can also use Send Email, Brevo, Microsoft Outlook, or any other supported provider.
Setting up a connection in n8n is straightforward, each node includes built-in guidance.
Important for Gmail users:
After creating your credentials in the Google Cloud Console, make sure to publish the app.
If you skip this step, the refresh token will expire after 7 days, and n8n will stop sending emails.
Unsubscribe Logic
A nested workflow appends an unsubscribe link and catches the callback Webhook to mark unsubscribed = TRUE, stopping all automations for that user.
Workflow Recap
By following the steps above, you can build custom logic using If/Else nodes, tag checks, and email sending. This gives you full control over user segmentation, automation flows, and personalized messaging – all without writing a single line of code.
Limitations of n8n and How to Mitigate Them
While n8n is incredibly flexible for no-code users, it’s not without trade-offs, especially as workflows grow in volume, complexity, or compliance requirements. Below are the most common limitations teams encounter, along with practical ways to work around them or know when it’s time to consider a custom solution.
Limitation | Impact | Mitigation |
Email deliverability / IP reputation | You’re responsible for IP health | Use warm-up services + trusted ESP (e.g., Resend, Mailersend) |
Large-scale delays (100k+ waits) | High memory usage | Offload delays to Redis or BullMQ |
Role-based access (RBAC) | Not available for teams in free plan | Use n8n Enterprise or add a custom auth layer |
No-code UX for marketers | Steep for non-technical users | Build a custom dashboard or stick with SaaS |
When No-Code Isn’t Enough: Time to Go Custom
n8n is great for building flexible workflows, but at a certain scale or complexity, no-code tools can hit their limits. Real-time triggers, advanced compliance, or large-scale user bases often require a more tailored solution.
Here are some common scenarios where going custom makes sense:
Scenario | Why Custom Wins | What Zingley Delivers |
Real-time, sub-100 ms triggers | WebSockets, event streams | Custom Node.js back-ends with socket support |
Million-user scale | Sharding, queue orchestration | Distributed architecture and autoscaling APIs |
Strict compliance (HIPAA, SOC 2) | Custom audit & encryption layers | Secure data flows, audit logs, custom auth |
Multi-tenant SaaS | Tenant isolation, usage billing | Multi-tenant platforms with billing logic |
At this stage, our team often steps in to help businesses transition from no-code tools to scalable, production-grade systems, whether that’s building a real-time backend, implementing complex data logic, or designing a custom dashboard that fits your workflow.
If you’re curious what that shift might look like for your team, Contact us to discuss your project, or try our free Outsourcing Calculator to explore development cost differences by region.through.
Full workflow JSON
Expand the accordion below to grab a ready-to-use workflow JSON.
How to import in n8n:
- Download & Import from file – click Download JSON, then in n8n choose …→ Import From File and select the download.
- Copy JSON URL & Import from URL – copy the raw file URL (e.g., from GitHub Gist), then pick … → Import From URL and paste the link.
Once imported, update the credentials, save the workflow, and you’re ready to go live.
{ "name": "Email Automation", "nodes": [ { "parameters": { "httpMethod": "POST", ...
{ "name": "Email Automation", "nodes": [ { "parameters": { "httpMethod": "POST", "path": "email-automation", "authentication": "headerAuth", "options": [] }, "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [ -3380, 960 ], "id": "60b2cfb2-c4bf-4933-9c9d-9fc5dbbb7af5", "name": "Webhook", "webhookId": "REDACTED", "credentials": { "httpHeaderAuth": { "id": "REDACTED", "name": "REDACTED" } } }, { "parameters": { "rules": { "values": [ { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "leftValue": "={{ $json.body.api_action }}", "rightValue": "contact_add", "operator": { "type": "string", "operation": "equals" }, "id": "d7a14948-005c-4bd9-b121-85a7ae986c51" } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Add Contact" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "6342e925-c0c8-4e7e-9cc9-00af07391a98", "leftValue": "={{ $json.body.api_action }}", "rightValue": "contact_view_email", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Check if contact exists" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "9eb045bf-1f00-4325-b64c-1ba76d5a43f7", "leftValue": "={{ $json.body.api_action }}", "rightValue": "contact_tag_add", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Add Tag" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "4014b382-a34b-4e28-bcc7-a8119a7bff29", "leftValue": "={{ $json.body.api_action }}", "rightValue": "contact_note_add", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Add Note To Contact" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "67f9fbb2-7c36-492b-8843-488f09d453f1", "leftValue": "={{ $json.body.api_action }}", "rightValue": "event_add", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Add Event to Contact" } ] }, "options": [] }, "type": "n8n-nodes-base.switch", "typeVersion": 3.2, "position": [ -3180, 920 ], "id": "3824371c-4ec3-4d0e-8571-8570bbf3aa6e", "name": "Switch" }, { "parameters": { "operation": "executeQuery", "query": "SELECT * FROM example_users WHERE email = '{{ $json.body.email }}'", "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -2840, 560 ], "id": "94dbb849-0dc4-4386-841d-941207686572", "name": "Get User By Email", "alwaysOutputData": true, "credentials": { "mySql": { "id": "REDACTED", "name": "REDACTED" } } }, { "parameters": [], "type": "n8n-nodes-base.merge", "typeVersion": 3.1, "position": [ -2120, 560 ], "id": "fbb78f2a-568f-4734-b670-e9dee93fd924", "name": "Merge" }, { "parameters": { "operation": "update", "table": { "__rl": true, "value": "example_users", "mode": "list", "cachedResultName": "example_users" }, "dataMode": "defineBelow", "columnToMatchOn": "example_user_id", "valueToMatchOn": "={{ $json.example_user_id }}", "valuesToSend": { "values": [ { "column": "first_name", "value": "={{ $('Webhook').item.json.body.first_name }}" }, { "column": "last_name", "value": "={{ $('Webhook').item.json.body.last_name }}" }, { "column": "updated_at", "value": "={{new Date()}}" } ] }, "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -2380, 460 ], "id": "34255b82-c8bb-4d16-b645-5a46b0f40ccb", "name": "Update User", "credentials": { "mySql": { "id": "REDACTED", "name": "REDACTED" } } }, { "parameters": { "table": { "__rl": true, "value": "example_users", "mode": "list", "cachedResultName": "example_users" }, "dataMode": "defineBelow", "valuesToSend": { "values": [ { "column": "email", "value": "={{ $('Webhook').item.json.body.email }}" }, { "column": "first_name", "value": "={{ $('Webhook').item.json.body.first_name }}" }, { "column": "last_name", "value": "={{ $('Webhook').item.json.body.last_name }}" } ] }, "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -2380, 660 ], "id": "93ddabe1-a78d-46d1-8a7c-45a63a0a4c89", "name": "Create User" }, { "parameters": { "operation": "executeQuery", "query": "SELECT * FROM example_users WHERE email = '{{ $('Webhook').item.json.body.email }}'", "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -1880, 560 ], "id": "4b7b92f6-f7be-4d05-beba-f009ec15a9b4", "name": "Get User By Email After Create\/Update", "alwaysOutputData": true }, { "parameters": { "operation": "executeQuery", "query": "SELECT * FROM example_users WHERE email = '{{ $json.body.email }}'", "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -2840, 960 ], "id": "c9716b64-d6e7-42e2-84e6-0b36645840a0", "name": "Get User By Email1", "alwaysOutputData": true, "credentials": { "mySql": { "id": "REDACTED", "name": "REDACTED" } } }, { "parameters": [], "type": "n8n-nodes-base.merge", "typeVersion": 3.1, "position": [ -2120, 960 ], "id": "414954c8-6aa7-4d9c-adbb-74cf7ef63b44", "name": "Merge1" }, { "parameters": { "operation": "update", "table": { "__rl": true, "value": "example_users", "mode": "list", "cachedResultName": "example_users" }, "dataMode": "defineBelow", "columnToMatchOn": "example_user_id", "valueToMatchOn": "={{ $json.example_user_id }}", "valuesToSend": { "values": [ { "column": "first_name", "value": "={{ $('Webhook').item.json.body.first_name }}" }, { "column": "last_name", "value": "={{ $('Webhook').item.json.body.last_name }}" }, { "column": "updated_at", "value": "={{new Date()}}" } ] }, "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -2380, 860 ], "id": "7c5824ec-b10d-46cd-8dad-474299ab0d17", "name": "Update User1" }, { "parameters": { "table": { "__rl": true, "value": "example_users", "mode": "list", "cachedResultName": "example_users" }, "dataMode": "defineBelow", "valuesToSend": { "values": [ { "column": "email", "value": "={{ $('Webhook').item.json.body.email }}" }, { "column": "first_name", "value": "={{ $('Webhook').item.json.body.first_name }}" }, { "column": "last_name", "value": "={{ $('Webhook').item.json.body.last_name }}" } ] }, "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -2380, 1060 ], "id": "7463fc94-949e-4cd3-81c7-55a746ad8aff", "name": "Create User1" }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "d7800e32-cf52-4958-9d0b-bce358d9a015", "leftValue": "={{ $json.example_user_id }}", "rightValue": "", "operator": { "type": "number", "operation": "exists", "singleValue": true } } ], "combinator": "and" }, "options": [] }, "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [ -2640, 560 ], "id": "740f46be-6ffc-4034-81d6-b06ec7bc6d10", "name": "User Exists" }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "d7800e32-cf52-4958-9d0b-bce358d9a015", "leftValue": "={{ $json.example_user_id }}", "rightValue": "", "operator": { "type": "number", "operation": "exists", "singleValue": true } } ], "combinator": "and" }, "options": [] }, "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [ -2640, 960 ], "id": "0359becb-0323-4bf6-ab84-f4b870d8a4e5", "name": "User Exists1" }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "230287d6-2841-4d49-a7ef-5576e181c0e1", "leftValue": "={{ $json.example_tag_id }}", "rightValue": "", "operator": { "type": "number", "operation": "exists", "singleValue": true } } ], "combinator": "and" }, "options": [] }, "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [ -1440, 960 ], "id": "65b7c7a7-80da-4ce4-8227-c88013d3db25", "name": "Tag Exists" }, { "parameters": { "operation": "select", "table": { "__rl": true, "value": "example_tags", "mode": "list", "cachedResultName": "example_tags" }, "where": { "values": [ { "column": "tag", "value": "={{ $('Webhook').item.json.body.tag }}" } ] }, "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -1660, 960 ], "id": "500d5b86-4ee7-47f8-b603-9eb0264526d8", "name": "Get Tag By Name", "alwaysOutputData": true }, { "parameters": { "operation": "executeQuery", "query": "SELECT * FROM example_users WHERE email = '{{ $('Webhook').item.json.body.email }}'", "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -1880, 960 ], "id": "91519276-ac0e-412f-a1bc-3992cc123b27", "name": "Get User By Email (Tag)", "alwaysOutputData": true }, { "parameters": { "table": { "__rl": true, "value": "example_user_tags", "mode": "list", "cachedResultName": "example_user_tags" }, "dataMode": "defineBelow", "valuesToSend": { "values": [ { "column": "example_user_id", "value": "={{ $('Get User By Email (Tag)').item.json.example_user_id }}" }, { "column": "example_tag_id", "value": "={{ $('Get Tag By Name').item.json.example_tag_id }}" } ] }, "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -820, 860 ], "id": "289c69d8-0fb7-4d04-8245-03b3e2d4a3de", "name": "Add Tag To User" }, { "parameters": { "table": { "__rl": true, "value": "example_tags", "mode": "list", "cachedResultName": "example_tags" }, "dataMode": "defineBelow", "valuesToSend": { "values": [ { "column": "tag", "value": "={{ $('Webhook').item.json.body.tag }}" } ] }, "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -1220, 1060 ], "id": "7c9d5b80-9418-4a7c-b6cc-f6a996445463", "name": "Add Tag to DB" }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "07fc467d-153e-47da-bcc1-be2291a99a94", "leftValue": "={{ $json.example_user_tag_id }}", "rightValue": "", "operator": { "type": "number", "operation": "exists", "singleValue": true } } ], "combinator": "and" }, "options": [] }, "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [ -1040, 860 ], "id": "e6693219-fe7b-4064-b50d-7d34573dfd24", "name": "If" }, { "parameters": { "operation": "select", "table": { "__rl": true, "value": "example_user_tags", "mode": "list", "cachedResultName": "example_user_tags" }, "where": { "values": [ { "column": "example_user_id", "value": "={{ $('Get User By Email (Tag)').item.json.example_user_id }}" }, { "column": "example_tag_id", "value": "={{ $json.example_tag_id }}" } ] }, "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -1220, 860 ], "id": "698a0f23-4ff8-4955-b7c4-fdeb7be08cb6", "name": "Get User Tags", "alwaysOutputData": true, "credentials": { "mySql": { "id": "REDACTED", "name": "REDACTED" } } }, { "parameters": { "rules": { "values": [ { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "leftValue": "={{ $('Tag Exists').item.json.tag }}", "rightValue": "purchased-product-1", "operator": { "type": "string", "operation": "equals" }, "id": "851512fa-3cf9-4236-9a21-0b6b12dabc22" } ], "combinator": "and" }, "renameOutput": true, "outputKey": "Product1 Purchased" }, { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "c52557d1-4121-4716-bcfb-80432106c85c", "leftValue": "={{ $('Tag Exists').item.json.tag }}", "rightValue": "newsletter", "operator": { "type": "string", "operation": "equals", "name": "filter.operator.equals" } } ], "combinator": "and" }, "renameOutput": true, "outputKey": "newsletter" } ] }, "options": [] }, "type": "n8n-nodes-base.switch", "typeVersion": 3.2, "position": [ -600, 860 ], "id": "70f17089-0184-4153-830c-71f66c7b7056", "name": "Switch1" }, { "parameters": { "table": { "__rl": true, "value": "example_user_automatizations", "mode": "list", "cachedResultName": "example_user_automatizations" }, "dataMode": "defineBelow", "valuesToSend": { "values": [ { "column": "example_user_id", "value": "={{ $('Get User By Email (Tag)').item.json.example_user_id }}" }, { "column": "name", "value": "Causal Inference Purchased" } ] }, "options": { "detailedOutput": true } }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ -280, 840 ], "id": "472e19aa-01bd-45e9-a982-a2caeeb9dbd5", "name": "Insert New Automatization", "alwaysOutputData": true }, { "parameters": { "operation": "update", "table": { "__rl": true, "value": "example_user_automatizations", "mode": "list", "cachedResultName": "example_user_automatizations" }, "dataMode": "defineBelow", "columnToMatchOn": "example_user_automatization_id", "valueToMatchOn": "={{ $('Insert New Automatization').item.json.data.insertId }}", "valuesToSend": { "values": [ { "column": "finished", "value": "1" } ] }, "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ 160, 840 ], "id": "dd5bb3ac-bf88-4459-b4eb-60ec41153b82", "name": "MySQL" }, { "parameters": { "amount": 2, "unit": "days" }, "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ 380, 840 ], "id": "12868a7f-b248-4212-be3a-f67badbb1848", "name": "Wait", "webhookId": "REDACTED" }, { "parameters": { "table": { "__rl": true, "value": "example_user_automatizations", "mode": "list", "cachedResultName": "example_user_automatizations" }, "dataMode": "defineBelow", "valuesToSend": { "values": [ { "column": "example_user_id", "value": "={{ $('Get User By Email (Tag)').item.json.example_user_id }}" }, { "column": "name", "value": "Causal Inference Purchased Email 2" } ] }, "options": { "detailedOutput": true } }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ 600, 840 ], "id": "e1d20075-2692-4fc8-abd1-069f7ebb79e1", "name": "Insert New Automatization1", "alwaysOutputData": true }, { "parameters": { "operation": "update", "table": { "__rl": true, "value": "example_user_automatizations", "mode": "list", "cachedResultName": "example_user_automatizations" }, "dataMode": "defineBelow", "columnToMatchOn": "example_user_automatization_id", "valueToMatchOn": "={{ $('Insert New Automatization1').item.json.data.insertId }}", "valuesToSend": { "values": [ { "column": "finished", "value": "1" } ] }, "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ 1040, 840 ], "id": "90e4366c-83ec-4f67-a733-95a12a4624f1", "name": "MySQL1" }, { "parameters": { "amount": 2, "unit": "days" }, "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ 1720, 860 ], "id": "901f131e-26a9-4f23-9181-ca4eaf2dead1", "name": "Wait1", "webhookId": "REDACTED" }, { "parameters": { "table": { "__rl": true, "value": "example_user_automatizations", "mode": "list", "cachedResultName": "example_user_automatizations" }, "dataMode": "defineBelow", "valuesToSend": { "values": [ { "column": "example_user_id", "value": "={{ $('Get User By Email (Tag)').item.json.example_user_id }}" }, { "column": "name", "value": "Causal Inference Purchased Email 3" } ] }, "options": { "detailedOutput": true } }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ 1940, 860 ], "id": "30e03239-f64f-4a9b-9c49-049659996dde", "name": "Insert New Automatization2", "alwaysOutputData": true }, { "parameters": { "operation": "update", "table": { "__rl": true, "value": "example_user_automatizations", "mode": "list", "cachedResultName": "example_user_automatizations" }, "dataMode": "defineBelow", "columnToMatchOn": "example_user_automatization_id", "valueToMatchOn": "={{ $('Insert New Automatization2').item.json.data.insertId }}", "valuesToSend": { "values": [ { "column": "finished", "value": "1" } ] }, "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ 2380, 860 ], "id": "4747248b-4ca9-48ea-b746-48671f8ecb41", "name": "MySQL2" }, { "parameters": { "amount": 2, "unit": "days" }, "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ 3060, 880 ], "id": "fed774a3-5d38-4982-bdd6-57fe2d2fc54a", "name": "Wait2", "webhookId": "REDACTED" }, { "parameters": { "table": { "__rl": true, "value": "example_user_automatizations", "mode": "list", "cachedResultName": "example_user_automatizations" }, "dataMode": "defineBelow", "valuesToSend": { "values": [ { "column": "example_user_id", "value": "={{ $('Get User By Email (Tag)').item.json.example_user_id }}" }, { "column": "name", "value": "Causal Inference Purchased Email 4" } ] }, "options": { "detailedOutput": true } }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ 3280, 880 ], "id": "4cc7e6f5-ab32-42b7-a311-db8c5d6f115d", "name": "Insert New Automatization3", "alwaysOutputData": true }, { "parameters": { "operation": "update", "table": { "__rl": true, "value": "example_user_automatizations", "mode": "list", "cachedResultName": "example_user_automatizations" }, "dataMode": "defineBelow", "columnToMatchOn": "example_user_automatization_id", "valueToMatchOn": "={{ $('Insert New Automatization3').item.json.data.insertId }}", "valuesToSend": { "values": [ { "column": "finished", "value": "1" } ] }, "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ 3720, 880 ], "id": "d78de538-464b-467c-958a-5d360c371f36", "name": "MySQL3" }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "e6eab65f-bc76-450d-96c8-2bef5452f4bf", "leftValue": "={{ $json.example_user_tag_id }}", "rightValue": "", "operator": { "type": "number", "operation": "exists", "singleValue": true } } ], "combinator": "and" }, "options": [] }, "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [ 1480, 840 ], "id": "8debeaa5-f0d3-4b33-ba8f-bbe3babf1fca", "name": "If Purshased Instrumental Variables" }, { "parameters": { "operation": "executeQuery", "query": "SELECT *\nFROM example_user_tags\nLEFT JOIN example_users ON example_user_tags.example_user_id = example_users.example_user_id\nLEFT JOIN example_tags ON example_user_tags.example_tag_id = example_tags.example_tag_id\nWHERE example_users.email = '{{ $('Webhook').item.json.body.email }}'\n AND example_tags.tag = 'purchased-instrumental-variables';", "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ 2620, 860 ], "id": "d8f90d49-fcb9-4a7f-90a4-43ae82fd88dc", "name": "Get User By Email And Tag1", "alwaysOutputData": true }, { "parameters": { "operation": "executeQuery", "query": "SELECT *\nFROM example_user_tags\nLEFT JOIN example_users ON example_user_tags.example_user_id = example_users.example_user_id\nLEFT JOIN example_tags ON example_user_tags.example_tag_id = example_tags.example_tag_id\nWHERE example_users.email = '{{ $('Webhook').item.json.body.email }}'\n AND example_tags.tag = 'purchased-instrumental-variables';", "options": [] }, "type": "n8n-nodes-base.mySql", "typeVersion": 2.4, "position": [ 1260, 840 ], "id": "1cd86463-cc73-4b8e-8d16-30a43ee306e4", "name": "Get User By Email And \"purchased-instrumental-variables\" Tag", "alwaysOutputData": true }, { "parameters": { "sendTo": "={{ $('Webhook').item.json.body.email }}", "subject": "Email 2", "message": "=Email 2", "options": { "appendAttribution": false, "senderName": "example" } }, "type": "n8n-nodes-base.gmail", "typeVersion": 2.1, "position": [ 820, 840 ], "id": "36cff70a-7fac-46ed-9032-22c119bff209", "name": "Email 2", "webhookId": "REDACTED", "credentials": { "gmailOAuth2": { "id": "REDACTED", "name": "REDACTED" } } }, { "parameters": { "sendTo": "={{ $('Webhook').item.json.body.email }}", "subject": "Email 1", "message": "=Email 1", "options": { "appendAttribution": false, "senderName": "example" } }, "type": "n8n-nodes-base.gmail", "typeVersion": 2.1, "position": [ -60, 840 ], "id": "22c2e7bd-ba1a-4b4c-9531-f296016b8a43", "name": "Email 1", "webhookId": "REDACTED", "credentials": { "gmailOAuth2": { "id": "REDACTED", "name": "REDACTED" } } }, { "parameters": { "sendTo": "={{ $('Webhook').item.json.body.email }}", "subject": "Email 3", "message": "=Email 3", "options": { "appendAttribution": false, "senderName": "example" } }, "type": "n8n-nodes-base.gmail", "typeVersion": 2.1, "position": [ 2160, 860 ], "id": "fa4f1778-6d2e-4864-9d2c-2bbdc1c2861f", "name": "Email 3", "webhookId": "REDACTED", "credentials": { "gmailOAuth2": { "id": "REDACTED", "name": "REDACTED" } } }, { "parameters": { "sendTo": "={{ $('Webhook').item.json.body.email }}", "subject": "Email 4", "message": "=Email 4", "options": { "appendAttribution": false, "senderName": "example" } }, "type": "n8n-nodes-base.gmail", "typeVersion": 2.1, "position": [ 3500, 880 ], "id": "8ab794dd-82b7-4a4a-be34-5fc26f21e66d", "name": "Email 4", "webhookId": "REDACTED", "credentials": { "gmailOAuth2": { "id": "REDACTED", "name": "REDACTED" } } }, { "parameters": { "conditions": { "options": { "caseSensitive": true, "leftValue": "", "typeValidation": "strict", "version": 2 }, "conditions": [ { "id": "e6eab65f-bc76-450d-96c8-2bef5452f4bf", "leftValue": "={{ $json.example_user_tag_id }}", "rightValue": "", "operator": { "type": "number", "operation": "exists", "singleValue": true } } ], "combinator": "and" }, "options": [] }, "type": "n8n-nodes-base.if", "typeVersion": 2.2, "position": [ 2820, 860 ], "id": "537aea4c-b550-4c81-a9f9-90bbb7fd7dbd", "name": "If Purshased Product 1" } ], "pinData": [], "connections": { "Webhook": { "main": [ [ { "node": "Switch", "type": "main", "index": 0 } ] ] }, "Switch": { "main": [ [ { "node": "Get User By Email", "type": "main", "index": 0 } ], [], [ { "node": "Get User By Email1", "type": "main", "index": 0 } ] ] }, "Get User By Email": { "main": [ [ { "node": "User Exists", "type": "main", "index": 0 } ] ] }, "Merge": { "main": [ [ { "node": "Get User By Email After Create\/Update", "type": "main", "index": 0 } ] ] }, "Update User": { "main": [ [ { "node": "Merge", "type": "main", "index": 0 } ] ] }, "Create User": { "main": [ [ { "node": "Merge", "type": "main", "index": 1 } ] ] }, "Get User By Email1": { "main": [ [ { "node": "User Exists1", "type": "main", "index": 0 } ] ] }, "Merge1": { "main": [ [ { "node": "Get User By Email (Tag)", "type": "main", "index": 0 } ] ] }, "Update User1": { "main": [ [ { "node": "Merge1", "type": "main", "index": 0 } ] ] }, "Create User1": { "main": [ [ { "node": "Merge1", "type": "main", "index": 1 } ] ] }, "User Exists": { "main": [ [ { "node": "Update User", "type": "main", "index": 0 } ], [ { "node": "Create User", "type": "main", "index": 0 } ] ] }, "User Exists1": { "main": [ [ { "node": "Update User1", "type": "main", "index": 0 } ], [ { "node": "Create User1", "type": "main", "index": 0 } ] ] }, "Tag Exists": { "main": [ [ { "node": "Get User Tags", "type": "main", "index": 0 } ], [ { "node": "Add Tag to DB", "type": "main", "index": 0 } ] ] }, "Get Tag By Name": { "main": [ [ { "node": "Tag Exists", "type": "main", "index": 0 } ] ] }, "Get User By Email (Tag)": { "main": [ [ { "node": "Get Tag By Name", "type": "main", "index": 0 } ] ] }, "Add Tag To User": { "main": [ [ { "node": "Switch1", "type": "main", "index": 0 } ] ] }, "Add Tag to DB": { "main": [ [ { "node": "Get Tag By Name", "type": "main", "index": 0 } ] ] }, "If": { "main": [ [], [ { "node": "Add Tag To User", "type": "main", "index": 0 } ] ] }, "Get User Tags": { "main": [ [ { "node": "If", "type": "main", "index": 0 } ] ] }, "Switch1": { "main": [ [ { "node": "Insert New Automatization", "type": "main", "index": 0 } ], [] ] }, "Insert New Automatization": { "main": [ [ { "node": "Email 1", "type": "main", "index": 0 } ] ] }, "MySQL": { "main": [ [ { "node": "Wait", "type": "main", "index": 0 } ] ] }, "Wait": { "main": [ [ { "node": "Insert New Automatization1", "type": "main", "index": 0 } ] ] }, "Insert New Automatization1": { "main": [ [ { "node": "Email 2", "type": "main", "index": 0 } ] ] }, "Wait1": { "main": [ [ { "node": "Insert New Automatization2", "type": "main", "index": 0 } ] ] }, "Insert New Automatization2": { "main": [ [ { "node": "Email 3", "type": "main", "index": 0 } ] ] }, "MySQL1": { "main": [ [ { "node": "Get User By Email And \"purchased-instrumental-variables\" Tag", "type": "main", "index": 0 } ] ] }, "Wait2": { "main": [ [ { "node": "Insert New Automatization3", "type": "main", "index": 0 } ] ] }, "Insert New Automatization3": { "main": [ [ { "node": "Email 4", "type": "main", "index": 0 } ] ] }, "MySQL2": { "main": [ [ { "node": "Get User By Email And Tag1", "type": "main", "index": 0 } ] ] }, "If Purshased Instrumental Variables": { "main": [ [], [ { "node": "Wait1", "type": "main", "index": 0 } ] ] }, "Get User By Email And Tag1": { "main": [ [ { "node": "If Purshased Product 1", "type": "main", "index": 0 } ] ] }, "Get User By Email And \"purchased-instrumental-variables\" Tag": { "main": [ [ { "node": "If Purshased Instrumental Variables", "type": "main", "index": 0 } ] ] }, "Email 2": { "main": [ [ { "node": "MySQL1", "type": "main", "index": 0 } ] ] }, "Email 1": { "main": [ [ { "node": "MySQL", "type": "main", "index": 0 } ] ] }, "Email 3": { "main": [ [ { "node": "MySQL2", "type": "main", "index": 0 } ] ] }, "Email 4": { "main": [ [ { "node": "MySQL3", "type": "main", "index": 0 } ] ] }, "If Purshased Product 1": { "main": [ [], [ { "node": "Wait2", "type": "main", "index": 0 } ] ] } }, "active": false, "settings": { "executionOrder": "v1" }, "versionId": "", "meta": [], "tags": [] }
Frequently asked questions
Is n8n a viable ActiveCampaign alternative for startups?
Yes if you can manage a small VPS and an ESP key, it covers onboarding, nurture, and dunning automation emails for cents.
Does n8n support split testing like Mailchimp?
Not out of the box. You can replicate it by using a Split Out node and tracking conversions via SQL or a database.
How many n8n integrations exist?
Over 600 core nodes, plus hundreds of community-created plugins.
Can I use n8n with my existing CRM or billing system?
Absolutely. n8n integrates with HubSpot, Pipedrive, Salesforce, Stripe, Paddle, and many others.
Is n8n GDPR-compliant?
Yes. Since you control where and how data is stored, it’s easier to stay compliant compared to SaaS tools with global data centers.
What if I need marketers (non-technical) to manage workflows?
n8n’s interface is user-friendly, but may be overwhelming at scale for non-technical users. You can build a simple internal dashboard or add a custom UI on top.
Can I migrate from Mailchimp or ActiveCampaign into n8n?
Yes, though it’s not automatic. You’ll need to export contacts and sequences manually, then rebuild workflows in n8n. The upside: full control and zero recurring fees.
Key takeaways
- n8n is a powerful open-source alternative to tools like ActiveCampaign and Mailchimp – ideal for teams that want flexibility, ownership, and cost control.
- You can build complete email workflows without writing code – capturing events, tagging users, and sending multi-step sequences.
- No per-contact pricing: You host everything, so scaling won’t punish your wallet.
- Limitations exist – especially with deliverability, high-volume waits, and non-technical usability – but most can be mitigated or extended with the right setup.
- When things get complex (multi-tenant logic, real-time triggers, or compliance needs), a custom solution is the better path forward.
- Start with n8n, validate your automation needs, and then level up with a solution built specifically for your business.