Google Sheets to MailerLite, subscribers without duplicates
Your email list should be an asset. But when the same lead gets imported twice (or five times), it turns into a cleanup project you never asked for.
Email marketers usually spot the damage first, because campaigns start misfiring. A marketing manager feels it when segments don’t match reality, and a business owner sees it in inflated counts and messy reporting. This Sheets MailerLite dedupe automation keeps new subscribers flowing in without duplicates, so your groups and fields stay consistent.
Below is the exact n8n workflow, what it automates, and what you can expect once it’s running.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to MailerLite, subscribers without duplicates
flowchart LR
subgraph sg0["Start Workflow Flow"]
direction LR
n0@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/MailerLite.svg' width='40' height='40' /></div><br/>Get a subscriber"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Create subscriber and assign.."]
n3@{ icon: "mdi:play-circle", form: "rounded", label: "Start Workflow", pos: "b", h: 48 }
n4@{ icon: "mdi:cog", form: "rounded", label: "End workflow", pos: "b", h: 48 }
n3 --> n0
n1 --> n4
n1 --> n2
n0 --> n1
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n3 trigger
class n0 database
class n2 api
classDef customIcon fill:none,stroke:none
class n1,n2 customIcon
The Problem: Duplicate subscribers quietly break your list
Google Sheets is where leads land because it’s fast, familiar, and everyone can access it. Then you export, import, copy-paste, or “just quickly sync it” into MailerLite. And that’s where things get annoying. A repeated import can create duplicates, overwrite fields you didn’t mean to touch, or dump people into the wrong group. Now you’re second-guessing every segment and spending an hour before every send doing list hygiene instead of writing better emails.
It adds up fast. Here’s where it breaks down in real teams:
- Manual imports make it easy to re-upload the same rows, especially when multiple people touch the sheet.
- Duplicates inflate subscriber totals, which means you pay for contacts you shouldn’t be paying for.
- Fields drift over time (country, company, name formatting), so segments stop behaving predictably.
- Group assignment becomes guesswork when group IDs in MailerLite don’t match what’s in the sheet.
The Solution: Sync Google Sheets to MailerLite with dedupe logic
This n8n workflow reads your contact rows from a Google Sheet, checks MailerLite to see if each email already exists, and only creates subscribers that are truly new. If a match is found, it stops for that contact and moves on. If no match is found, it creates the subscriber via an HTTP request (so you can control the payload) and assigns the subscriber to the right MailerLite group using the group_id you store in the sheet. The end result is simple: your sheet stays your intake form, and MailerLite stays clean.
The workflow starts when you manually launch it in n8n. It pulls rows from Google Sheets, searches MailerLite for each email, then creates only the missing subscribers and tags them into the correct group. Anything already in MailerLite gets skipped automatically.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you collect about 200 new leads a week in a shared Google Sheet, then import them into MailerLite before your next newsletter. Manually, you might spend 30 minutes exporting, importing, and checking for duplicates, plus another 30 minutes fixing group mistakes and weird field formatting. With this workflow, you hit run, let it process, and you’re done in about 10 minutes (mostly waiting). That’s roughly an hour back every week, and the list stays clean.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store new leads and fields.
- MailerLite to create subscribers and assign groups.
- MailerLite API key (get it from your MailerLite account settings).
Skill level: Beginner. You’ll connect accounts, confirm sheet columns, and paste an API key.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Manual run when you need it. You launch the workflow in n8n, which is perfect for “batch sync” moments like before a campaign send or after a webinar.
Contacts are pulled from Google Sheets. The workflow reads rows from your chosen document and sheet. Your columns should include Email, first_name, last_name, Company, Country, and group_id so the subscriber record is complete.
Each email is checked in MailerLite. For every row, n8n searches MailerLite for an existing subscriber with that email address. If the subscriber exists, the flow ends for that contact using a simple “do nothing” finish node.
Only truly new subscribers get created. When no match is found, an HTTP Request creates the subscriber and applies the group_id from your sheet, so segmentation stays aligned with how you organize campaigns.
You can easily modify which columns you map to which MailerLite fields based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
Set up the manual trigger to start the workflow on demand for testing and controlled runs.
- Add and open Manual Launch Trigger.
- Leave default settings since this trigger requires no configuration.
- Connect Manual Launch Trigger to Fetch Sheet Rows.
Step 2: Connect Google Sheets
Configure the Google Sheets node to read subscriber data from your spreadsheet.
- Open Fetch Sheet Rows.
- Credential Required: Connect your googleSheetsOAuth2Api credentials.
- Select the Document using the list picker and set it to
{YOUR_GOOGLE_SHEETS_DOCUMENT_ID}. - Select the Sheet Name and set it to
gid=0(or your target sheet).
Email, first_name, last_name, Company, Country, and group_id.Step 3: Set Up Subscriber Retrieval
Look up each subscriber in MailerLite using the email from your sheet to decide whether to create them.
- Open Retrieve Subscriber.
- Credential Required: Connect your mailerLiteApi credentials.
- Set Operation to
get. - Set Subscriber ID to
={{ $json.Email }}. - Confirm the flow connection from Fetch Sheet Rows to Retrieve Subscriber.
Email, the lookup will fail. Ensure column names match the expressions used.Step 4: Configure Output/Action Nodes
Create new subscribers and add them to a group when they are not found in MailerLite.
- Open Create Subscriber + Group.
- Credential Required: Connect your mailerLiteApi credentials.
- Set URL to
https://connect.mailerlite.com/api/subscribersand Method toPOST. - Enable Send Body and set Specify Body to
json. - Set JSON Body to
={ "email": "{{ $json.Email }}", "fields": { "name": "{{ $json.first_name }}", "last_name": "{{ $json.last_name }}", "company": "{{ $json.Company }}", "country": "{{ $json.Country }}" }, "groups": ["{{ $json.group_id }}"] }. - Confirm that Retrieve Subscriber outputs to both Finish Flow and Create Subscriber + Group in parallel.
- Leave Finish Flow as-is to clearly mark the end of each execution.
Step 5: Test and Activate Your Workflow
Run a manual test to verify sheet data is fetched and subscribers are created or skipped as expected.
- Click Execute Workflow in n8n to run Manual Launch Trigger.
- Verify Fetch Sheet Rows returns rows and Retrieve Subscriber executes without credential errors.
- Confirm new subscribers are created through Create Subscriber + Group when not found.
- Check that each path concludes at Finish Flow to confirm the workflow completed.
- Toggle the workflow to Active when ready for production use.
Common Gotchas
- Google Sheets access can be the silent blocker. If the workflow suddenly returns zero rows, check the connected Google account, the Document ID, and that the sheet name still matches.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- MailerLite API credentials can expire or lose permissions after account changes. If creates fail, regenerate the API key in MailerLite and update it anywhere it’s referenced in n8n (especially the HTTP Request node).
Frequently Asked Questions
About 30 minutes if your sheet columns are ready.
No. You will connect your accounts and paste an API key. The dedupe logic is already built into the workflow.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in MailerLite costs (API access is included on most plans).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but you’ll swap the Manual Launch Trigger for a Schedule Trigger so it runs every day (or every hour). You can also adjust the mapping by editing the fields sent in the Create Subscriber + Group HTTP Request, which is where first name, last name, company, country, and group_id are applied. Common tweaks include adding custom fields, sending UTM source into a field, or skipping rows that don’t have a group_id.
Usually it’s an expired or rotated API key that wasn’t updated in n8n, especially in the HTTP Request node. It can also be a permission issue on the MailerLite account, or a payload mismatch if you changed field names in the sheet and forgot to update the request body.
On n8n Cloud Starter you can run a few thousand executions per month, and self-hosting is mainly limited by your server. In practice, syncing a sheet with a few thousand rows is normal, but you’ll want to run it in batches if you’re importing tens of thousands at once.
Often, yes, because dedupe requires a lookup plus conditional logic, and n8n handles that without turning it into an expensive multi-step bill. You also get a self-hosting option, which is honestly a big deal once you’re syncing frequently. The tradeoff is setup: Zapier can feel quicker for a simple two-step push, while n8n is better when you care about data quality and control. If you want help deciding, Talk to an automation expert and you’ll get a clear recommendation for your situation.
Clean subscribers in MailerLite shouldn’t require a “cleanup day” on your calendar. Set this up once, and your Google Sheets intake can scale without the duplicate chaos.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.