1. Opening Problem Statement
Meet Sarah, a digital marketing specialist who manages thousands of contacts and multiple marketing tags in her Systeme.io CRM account. Each week, she spends hours manually exporting contacts and tags from Systeme.io, filtering contacts based on tags, and importing new leads. Not only is the process tedious, but she constantly hits API rate limits, causing interruptions and repeated attempts. This wastes Sarah valuable time, increases the risk of data inconsistencies, and delays her campaigns.
Imagine losing an entire afternoon just trying to get accurate contact lists segmented by tags, or struggling to upload bulk contacts with customized fields through Systeme.io’s native import tool. On top of that, the chance of missing contacts or misapplying tags is high when done manually, which negatively impacts customer engagement and sales.
2. What This Automation Does
This n8n workflow automatically connects with Systeme.io’s API to streamline contact and tag management for you. Running this workflow will:
- Retrieve all contacts from your Systeme.io account, regardless of volume, handling pagination and rate limits.
- Fetch all tags used in your Systeme.io account to easily identify your marketing segments.
- Get contacts filtered by specific tag IDs, allowing you to target segmented lists effortlessly.
- Bulk-add multiple contacts with custom fields like “utm_source” via Systeme.io API, bypassing the limitations of Systeme.io’s native import tool.
- Handle API rate limits by automatically spacing requests to prevent failures or bans.
- Split the response data into manageable individual items for further processing or export.
By automating these tasks, Sarah can save hours each week, avoid manual errors, and focus on strategic marketing efforts.
3. Prerequisites ⚙️
- n8n Account (cloud or self-hosted) 🔌
- Systeme.io account with API access and API key 🔑
- HTTP Request node configured with Systeme.io API endpoint and authentication 🛠️
For self-hosting n8n, you might consider reliable providers like Hostinger for a smooth setup.
4. Step-by-Step Guide
Step 1: Set Up HTTP Request Node to Get All Contacts
Navigate to the n8n editor. Click + Add Node → Search for HTTP Request → Select it. Name it Systeme | Get all contacts.
Configure the node as follows:
- URL:
https://api.systeme.io/api/contacts - Method: GET
- Authentication: Set to your Systeme.io API key using HTTP Header Auth
- Query Parameters: Add
limitwith value100to get 100 contacts per request. - Enable pagination with parameter
startingAfterequal to the last item’s ID from previous response to fetch next page. - Set request interval to 1000ms to respect API rate limits.
- Configure the expression for pagination complete check:
{{$response.body.hasMore == false}}
Outcome: This node will fetch all contacts safely without hitting API limits.
Common mistake: Forgetting to configure pagination expressions leads to incomplete data.
Step 2: Use Split Out Node to Separate Each Contact
Click + Add Node → Search Split Out → Select it. Name it Split Out2.
Set the field to split out as items. Connect the output of Systeme | Get all contacts node to this node’s input.
This splits the bulk response into individual contact items for easier processing downstream.
Step 3: Retrieve All Tags with HTTP Request Node
Create another HTTP Request node called Systeme | Get All tags with URL https://api.systeme.io/api/tags and the same pagination and authentication setup as the contacts node.
Follow the same pagination configuration and add a connected Split Out node named Split Out for individual tags.
Step 4: Fetch Contacts by Specific Tag
Add an HTTP Request node named Systeme | Get contacts with tag.
Use URL: https://api.systeme.io/api/contacts and add a query parameter tags with the desired tag ID (e.g. “1012751”).
Configure pagination as before to retrieve all contacts with that tag, and connect it to a Split Out node named Split Out3.
Tip: To filter contacts by multiple tags, separate tag IDs with commas (e.g., “1012751,1012529”).
Step 5: Bulk Add Contacts With Custom Fields
Add an HTTP Request node called Systeme | Add contact.
Configure:
- Method: POST
- URL:
https://api.systeme.io/api/contacts - Batching enabled with batch size 9 (to avoid rate limit issues)
- Body type: JSON
- Sample JSON body:
{
"email": "{{ $json.emails }}",
"fields": [
{
"slug": "utm_source",
"value": "API"
}
]
}
This allows adding multiple contacts via API where you can customize fields like utm_source for tracking.
Step 6: Add Sticky Notes for Guidance
Place Sticky Note nodes next to each main node for quick tips and explanations. For example, near Systeme | Get all contacts, add a note that says “Use this to get all your contacts 👉”.
Step 7: Connect Nodes and Test
Make sure each HTTP Request node connects to its matching Split Out node. Trigger the workflow manually to see data retrieval and splitting working correctly.
Expected: You should see lists of contacts or tags split into individual items.
5. Customizations ✏️
- Filter by multiple tags: In the Systeme | Get contacts with tag node, modify the
tagsquery parameter to include comma-separated tag IDs (e.g., “1012751,1012529”) for more flexible segmentation. - Change batch size for adding contacts: In the Systeme | Add contact node’s batching settings, adjust
batchSizeto optimize for your API limits or data size. - Include additional custom fields: Modify the JSON body in Systeme | Add contact node to add more fields by replicating the “fields” array objects, like
{"slug": "phone", "value": "{{ $json.phone }}"}. - Dynamic tags input: Use a function or Set node before the Systeme | Get contacts with tag node to dynamically pass tag IDs from other workflows.
>
6. Troubleshooting 🔧
Problem: “Pagination expression error or incomplete data retrieval.”
Cause: Incorrect pagination completion expression or misconfigured startingAfter parameter.
Solution: Verify the expression {{$response.body.hasMore == false}} is exactly added, and the pagination parameters reference the correct last item ID in the response.
Problem: “HTTP Request rate limit errors or request failures.”
Cause: Too many requests sent too quickly.
Solution: Use the requestInterval parameter set to 1000ms in the pagination options to space out requests, preventing API bans.
7. Pre-Production Checklist ✅
- Ensure your Systeme.io API key is valid and has sufficient permissions.
- Test each HTTP Request node individually to confirm successful data retrieval.
- Verify pagination returns complete data sets by comparing with Systeme.io dashboard exports.
- Check Split Out nodes to confirm they produce individual items.
- For bulk add, validate the JSON structure in a small test batch before full run.
8. Deployment Guide
Once tested, activate the workflow in n8n. Schedule it to run on demand or via a trigger depending on your use case (e.g., time-based trigger for regular updates).
Monitor executions via n8n’s execution history and logs to catch any API errors.
9. FAQs
Q: Can I use this workflow with other CRM tools?
A: This workflow is specifically built for Systeme.io’s API, but the approach and node configurations can be adapted for other APIs with pagination and rate limits.
Q: Does this workflow consume lots of API credits?
A: It depends on your Systeme.io plan. Pagination helps optimize requests, but large datasets will naturally consume more API calls.
Q: Is my contact data kept secure?
A: Yes, the data flows only between n8n and Systeme.io servers using authenticated HTTPS requests.
10. Conclusion
By implementing this n8n workflow, you have automated the heavy lifting of managing contacts and tags in Systeme.io, saving Sarah—and you—hours of manual labor every week. You can now retrieve all contacts and tags, filter contacts by tags, and add contacts in bulk with customized fields safely and efficiently.
Next steps? Consider extending this automation by syncing contact data to Google Sheets, sending notification emails via Gmail when new contacts are added, or integrating with your marketing platforms for seamless campaign automation.
Start now and transform your contact management with powerful, tailored automation.