Google Sheets to Mailchimp, clean imports every time
Your lead list is “somewhere” in Google Sheets, and your Mailchimp audience is “kind of” up to date. Then a campaign goes out and you notice it: duplicates, weirdly formatted names, and new signups that never made it into the list.
This Sheets Mailchimp import problem hits marketing managers first. But founders running their own newsletters and agency teams maintaining client lists feel it too, because manual imports always break at the worst time.
This workflow pulls contacts from Google Sheets, cleans and formats them, pushes them into Mailchimp, and leaves you with a clear import summary so you know what happened.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets to Mailchimp, clean imports every time
flowchart LR
subgraph sg0["When clicking 'Execute workflow' Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n1@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking 'Execute workf..", pos: "b", h: 48 }
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/code.svg' width='40' height='40' /></div><br/>Format Subscriber Data"]
n3["<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/mailchimp.dark.svg' width='40' height='40' /></div><br/>Add to MailChimp"]
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Create Import Summary", pos: "b", h: 48 }
n5@{ icon: "mdi:database", form: "rounded", label: "Get Google Sheet Data", pos: "b", h: 48 }
n0 --> n2
n3 --> n4
n5 --> n0
n2 --> n3
n1 --> n5
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 n1 trigger
class n5 database
class n2 code
classDef customIcon fill:none,stroke:none
class n2,n3 customIcon
The Problem: Messy spreadsheet leads create messy email lists
Google Sheets is where leads go to “wait,” especially if they come from a form, an event list, a partner referral, or a VA doing manual entry. Then someone exports a CSV, imports it into Mailchimp, and hopes the columns line up. They rarely do. Full names get dumped into the wrong field, phone numbers vanish, and duplicates creep in when you re-import a “latest” sheet next week. It’s not just time wasted. It’s confidence lost, because you stop trusting your own audience count.
The friction compounds. Here’s where it usually breaks down.
- You end up reformatting columns by hand because one sheet uses “Email,” another uses “Email address.”
- Full names like “Mary Jane Watson” don’t split cleanly, so personalization looks sloppy in campaigns.
- Duplicate imports force you to clean your audience later, which is honestly the worst kind of busywork.
- No one can tell what actually imported, so you’re stuck spot-checking rows and guessing.
The Solution: Auto-import Google Sheets contacts into Mailchimp (cleanly)
This n8n workflow turns your Google Sheet into a reliable “source of truth” for Mailchimp imports. You start the workflow manually (or schedule it to run automatically), and it retrieves all rows from your chosen sheet. Next, it maps your sheet’s columns into consistent fields, then prepares a subscriber payload that Mailchimp understands. That’s where the cleanup happens: full names get split into first and last name, emails are placed correctly, and phone numbers can be included as merge fields. Finally, the workflow attempts to add each contact to your Mailchimp audience and produces an import report so you can see what worked, what skipped, and what needs attention.
The workflow begins when you launch it in n8n (or on a schedule). It pulls rows from Google Sheets, formats each subscriber, then pushes them to Mailchimp. At the end, you get a simple summary you can use for QA or client reporting.
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 from a Google Form feeding into Sheets. Manually, someone exports CSV, cleans name fields, checks for obvious duplicates, then imports into Mailchimp, which is easily about 60 minutes (sometimes more when the sheet is messy). With this workflow, you run it (or let it run daily), then spend about 10 minutes reviewing the import summary and fixing the handful of rows that were missing an email or had a strange name format. You get most of that hour back, every week.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for the lead spreadsheet source.
- Mailchimp to add contacts to your audience.
- Mailchimp API key (optional) (get it from Mailchimp: Account → Extras → API keys)
Skill level: Beginner. You’ll connect accounts, paste a sheet ID, and choose the right audience in Mailchimp.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Manual or scheduled start. You trigger the workflow in n8n using the manual launch, or you swap it to a Schedule Trigger so it runs every morning before you check email.
Pull rows from Google Sheets. n8n retrieves the records from your chosen spreadsheet and worksheet. This is why your column names matter, because the workflow expects a consistent structure (like “Names” and “Email address”).
Clean and prepare subscriber data. The workflow maps fields and formats each contact for Mailchimp, including splitting a full name into first and last name and attaching a phone number as a merge field if you have it.
Add to your Mailchimp audience and summarize. Each contact is sent to Mailchimp, and the workflow continues even when a specific row fails. At the end, it builds an import report so you can see counts and any obvious problems.
You can easily modify which columns get mapped and which merge fields are sent to Mailchimp based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow starts manually so you can test the full import process on demand.
- Add the Manual Launch Trigger node as your workflow trigger.
- Leave all settings at default, since this node requires no configuration.
- Connect Manual Launch Trigger to Retrieve Sheet Records to begin the flow.
Step 2: Connect Google Sheets
Pull subscriber records from your Google Sheet before mapping and transforming them.
- Select the Retrieve Sheet Records node.
- Set Document to the Google Sheet ID:
YOUR_GOOGLE_SHEET_ID. - Set Sheet Name to
YOUR_SHEET_NAME. - Credential Required: Connect your Google Sheets credentials.
- Connect Retrieve Sheet Records to Map Sheet Fields.
Step 3: Set Up Field Mapping and Payload Preparation
Normalize sheet fields and convert them into a Mailchimp-ready subscriber payload.
- Open Map Sheet Fields and add three assignments:
- Set Names to
={{ $json.Names }}. - Set Email address to
={{ $json['Email address'] }}. - Set Phone Number to
={{ $json['Phone Number'] }}. - Open Prepare Subscriber Payload and paste the JavaScript exactly as provided:
- Set JavaScript Code to
const subscribers = [];\n\nfor (const item of $input.all()) {\n subscribers.push({\n json: {\n email_address: item.json[\"Email address\"],\n status: \"subscribed\",\n merge_fields: {\n FNAME: item.json.Names.split(' ')[0] || '',\n LNAME: item.json.Names.split(' ').slice(1).join(' ') || '',\n PHONE: item.json[\"Phone Number\"] || ''\n }\n }\n });\n}\n\nreturn subscribers;. - Ensure Map Sheet Fields connects to Prepare Subscriber Payload.
Step 4: Configure Mailchimp Import and Reporting
Send each transformed subscriber to Mailchimp and then build a summary report.
- Open Append to Mailchimp List and set List to
YOUR_MAILCHIMP_LIST_ID. - Set Email to
={{ $node['Prepare Subscriber Payload'].json.email_address }}. - Set Status to
subscribed. - Add merge fields:
- FNAME →
={{ $json.merge_fields.FNAME }}, LNAME →={{ $json.merge_fields.LNAME }}, PHONE →={{ $json.merge_fields.PHONE }}. - Credential Required: Connect your Mailchimp credentials.
- Open Build Import Report and set importSummary to
📊 **MailChimp Import Summary**\n\n**Import Date:** {{ DateTime.now().toFormat('yyyy-MM-dd HH:mm:ss') }}\n**Total Processed:** {{ $items().length }} contacts\n\n**Email:** {{ $json.email_address }}\n**Status:** {{ $json.status || 'Processed' }}\n\n**Source:** Google Sheets Import. - Connect Prepare Subscriber Payload → Append to Mailchimp List → Build Import Report.
YOUR_MAILCHIMP_LIST_ID with a real list ID or Mailchimp will reject the request.Step 5: Test and Activate Your Workflow
Validate the data flow before enabling it for ongoing use.
- Click Execute Workflow to run Manual Launch Trigger and process your current sheet rows.
- Confirm that Append to Mailchimp List creates or updates subscribers in your Mailchimp audience.
- Check Build Import Report output to verify the summary text and processed count.
- Once verified, toggle the workflow to Active for production use.
Common Gotchas
- Google Sheets permissions can be sneaky. If the workflow suddenly can’t read your sheet, check the Google Sheets OAuth connection inside n8n credentials first.
- Mailchimp rejects subscribers for small reasons (like an invalid email format). Check the execution data on the Mailchimp node to see the exact error message, then fix the matching row in Sheets.
- Name parsing is never perfect when people enter “Dr. Sam (Marketing)” or add extra spaces. If you care about pristine personalization, tweak the “Prepare Subscriber Payload” code once and reuse it.
Frequently Asked Questions
About 30 minutes if your Google Sheet and Mailchimp audience are ready.
No. You’ll connect accounts and paste in your Sheet ID and tab name. The included formatting already handles common name and field cleanup.
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 Mailchimp costs (your plan) and normal API usage, which is usually negligible for simple subscriber adds.
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, and it’s a common tweak. Add the columns to your Google Sheet, then update the “Map Sheet Fields” set node and the “Prepare Subscriber Payload” code node to include those fields. In Mailchimp, create matching merge fields in your audience settings, then map them in the “Append to Mailchimp List” node. After that, your import summary will reflect the expanded payload.
Usually it’s an expired or incorrect API key, or the wrong audience/list ID was pasted into the Mailchimp node. It can also happen when Mailchimp blocks a row due to an invalid email address format, which you’ll see in the node’s execution output. Fix the credential or the bad row, then re-run the workflow.
Thousands per run is normal, as long as your n8n plan and Mailchimp account can handle the volume.
Often, yes, because this workflow is built for bulk imports, data cleanup, and a post-run summary, not just “one row in, one contact out.” n8n also makes it easier to add logic like skipping bad rows, continuing on errors, and shaping payloads without paying extra for every branch. Zapier or Make can be great if your needs are extremely simple or you want a very guided setup, but bulk jobs can get pricey fast. With n8n, you can self-host for unlimited executions, which matters if you import frequently. If you’re torn, Talk to an automation expert and we’ll sanity-check the best option for your list size and workflow.
Once this is running, your list stops being a fragile spreadsheet project and starts behaving like infrastructure. Set it up, review the summary, and get back to the work that actually moves revenue.
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.