Squarespace to Shopify, clean imports via Google Sheets
Customer migrations sound simple until you hit the CSV. Columns don’t match, names land in the wrong place, and Shopify throws import errors that send you back into spreadsheet hell. This is exactly what Shopify import automation is meant to fix.
Ecommerce managers feel it during a replatform. Agency teams doing migrations feel it across clients. And business owners doing it “just this once” quickly realize it’s never just once, because you end up re-importing after you clean the file.
This workflow converts a Squarespace Contacts export into a Shopify-ready customer file using Google Sheets. You’ll see what it changes, how the flow works, and what you need to run it reliably.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Squarespace to Shopify, clean imports via Google Sheets
flowchart LR
subgraph sg0["Manual Flow"]
direction LR
n0["<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/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook"]
n1@{ icon: "mdi:database", form: "rounded", label: "Shopify Customers", pos: "b", h: 48 }
n2@{ icon: "mdi:database", form: "rounded", label: "Read Squarespace profiles", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Append Squarespace profiles", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Extract items from webhook s..", pos: "b", h: 48 }
n6@{ icon: "mdi:play-circle", form: "rounded", label: "Manual trigger", pos: "b", h: 48 }
n0 --> n5
n6 --> n2
n4 --> n1
n4 --> n3
n2 --> n1
n3 --> n4
n5 --> n4
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 n6 trigger
class n1,n2,n3 database
class n0 api
classDef customIcon fill:none,stroke:none
class n0 customIcon
The Challenge: Shopify customer imports break on messy CSVs
Squarespace exports contacts in a format that makes sense to Squarespace, not Shopify. So you export “Profiles,” open the CSV, and start the familiar routine: split full names, normalize phone numbers, figure out which field is “Email” vs “Email Address,” and delete columns Shopify will reject. Then you import, get an error report, and do it again. It’s slow, it’s easy to mess up, and it’s mentally draining because every tweak feels risky when real customers are involved.
It adds up fast. Here’s where the friction usually shows up.
- Shopify’s import template expects specific column names and ordering, so even “small” differences can cause the upload to fail.
- Manual cleanup invites mistakes like shifted rows, broken delimiters, or accidentally stripping leading zeros from phone numbers.
- Duplicates sneak in when you re-run the process, which means more customer record cleanup after the fact.
- The work is hard to delegate, because everyone “fixes” the sheet a little differently.
The Fix: Convert Squarespace contacts into Shopify format automatically
This n8n workflow takes your Squarespace contact export and turns it into a Shopify-compatible customer import file by using a structured Google Sheets template as the “source of truth.” You can run it manually after you paste/import the Squarespace CSV into the input sheet, or fire it via webhook by uploading the CSV file directly. Once the file is parsed, the workflow loops through each contact, maps fields into the correct Shopify columns, and writes clean rows into the output sheet (“Shopify Customers”). When it finishes, you export the Shopify Customers sheet as a CSV and import it into Shopify with far fewer surprises.
The workflow starts with either a webhook upload or a manual run that reads the input sheet. Then it processes contacts in batches (so big exports don’t choke the run) and writes standardized customer rows back into Google Sheets. Your final output is a Shopify-ready CSV you can import immediately.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you’re migrating 2,000 contacts. Manually, you might spend about 2 hours just fixing columns, removing problem fields, and testing imports (and that’s if nothing weird happens). With this workflow, you paste/import the Squarespace CSV into the input sheet or upload it via webhook, then let n8n map and write rows into the Shopify Customers sheet. Your “hands-on” time is closer to 10 minutes, plus a short wait while it processes in batches.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for the input/output template.
- Squarespace Contacts CSV export to provide the source data.
- Google Sheets API credentials (get them from Google Cloud Console).
Skill level: Beginner. You’ll connect Google Sheets, copy a template, and run a webhook or manual trigger.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
Two ways to start. You can trigger it by uploading a Squarespace CSV file to an n8n webhook, or you can run it manually after importing the CSV into the “Squarespace Profiles (Input)” sheet.
The file (or sheet) gets read and parsed. If you use the webhook, the workflow extracts records from the uploaded CSV. If you run it manually, it retrieves rows from Google Sheets instead.
Contacts are processed in batches. n8n loops over items with a batch iterator (Split in Batches), which keeps runs stable when you’re dealing with hundreds or thousands of contacts.
Shopify-ready rows are written to the output sheet. The workflow updates the “Shopify Customers (Output)” sheet so the columns match Shopify’s customer import CSV format. It also appends the original profile data to the input sheet so you have a clean record of what was processed.
You can easily modify the column mapping to match your Shopify setup (tags, marketing consent, default addresses) based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the inbound trigger that receives uploaded profile files and an optional manual trigger for backfills.
- Add and configure Incoming Webhook Trigger with HTTP Method set to
POSTand Path set tosubmit-profiles. - In Incoming Webhook Trigger, keep Allowed Origins set to
*if you expect requests from multiple domains. - Add Manual Launch Start to allow on-demand runs that bypass the webhook.
⚠️ Common Pitfall: The inbound request must include a binary file field named file, or Parse Upload Records will not find the upload.
Step 2: Connect Google Sheets
Connect your Google Sheets account so the workflow can read and write profile and customer data.
- Open Append Profile Sheet and select the spreadsheet with Document set to
1yf_RYZGFHpMyOvD3RKGSvIFY2vumvI4474Qm_1t4-jMand Sheet set tosquarespace_profiles. - Open Retrieve Profile Sheet and set Document to
1yf_RYZGFHpMyOvD3RKGSvIFY2vumvI4474Qm_1t4-jMand Sheet tosquarespace_profiles. - Open Update Customer Sheet and set Document to
1yf_RYZGFHpMyOvD3RKGSvIFY2vumvI4474Qm_1t4-jMand Sheet toshopify_template. - Credential Required: Connect your
googleSheetsOAuth2Apicredentials in Append Profile Sheet, Retrieve Profile Sheet, and Update Customer Sheet.
Step 3: Set Up File Parsing and Batching
Parse the uploaded file and process records in manageable batches before writing to Sheets.
- Configure Parse Upload Records with Binary Property Name set to
fileto extract rows from the incoming upload. - Configure Batch Item Iterator with Batch Size set to
1000to process rows in chunks. - Confirm the flow: Incoming Webhook Trigger → Parse Upload Records → Batch Item Iterator.
Tip: Use Flowpast Branding as a visual note only—no configuration is required.
Step 4: Configure Output Actions and Mapping
Define how each profile row is appended or updated in both the profile and customer sheets.
- In Append Profile Sheet, keep Operation set to
appendOrUpdateand map fields like Email to{{ $json.Email }}and Billing Address 1 to{{ $json['Billing Address 1'] }}. - In Update Customer Sheet, keep Operation set to
appendOrUpdateand map Tags ton8n, squarespace, {{ $json['Last Order Date'] ? "ground-control," : "" }}. - Also in Update Customer Sheet, verify Email is set to
{{ $json.Email }}and Default Address Address1 is set to{{ $json['Billing Address 1'] }}for matching and updates. - Understand the branching: Batch Item Iterator outputs to both Update Customer Sheet and Append Profile Sheet in parallel.
- Ensure the manual backfill path is connected: Manual Launch Start → Retrieve Profile Sheet → Update Customer Sheet.
⚠️ Common Pitfall: The Update Customer Sheet uses Matching Columns set to Email. If emails are missing or inconsistent, records may not update as expected.
Step 5: Test and Activate Your Workflow
Run a manual test and confirm data appears correctly in both sheets before turning the workflow on.
- Click Execute Workflow on Manual Launch Start to test the backfill path and verify Retrieve Profile Sheet → Update Customer Sheet updates data.
- Send a test
POSTrequest to the Incoming Webhook Trigger URL with a binary file field namedfile, and confirm rows are appended to Append Profile Sheet. - Check Update Customer Sheet to confirm fields like Tags and Email were populated according to the expressions.
- Once successful, toggle the workflow to Active for production use.
Watch Out For
- Google Sheets credentials can expire or need specific permissions. If things break, check the Google Cloud Console credential status and the sheet sharing access first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Common Questions
About 30 minutes if your Google Sheets access is ready.
Yes. You’ll mainly be copying a Google Sheets template and connecting your Google account in n8n.
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 Google Sheets API usage (usually negligible for small migrations).
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.
You can. Most customizations happen in the Google Sheets mapping and the “Update Customer Sheet” write step, where you decide what lands in Shopify’s columns. Common tweaks include adding customer tags, setting marketing consent fields the way your region requires, and choosing how to handle blanks (skip the field vs. write an empty value). If you have multiple Squarespace exports, keep one template per client to avoid accidental overwrites.
Usually it’s expired OAuth access or the connected Google account doesn’t have permission to the template sheet. Reconnect Google Sheets in n8n, then confirm the exact spreadsheet is shared with that account. Also check that you didn’t rename tabs the workflow expects (for example, the input/output sheet names) because the node may be pointing at the old reference.
It handles typical migration-sized exports easily (thousands of contacts) because it processes rows in batches. On n8n Cloud, capacity mainly depends on your monthly executions and how many rows you write per run. If you self-host, there’s no execution limit, but very large files may need bigger batch sizes or more server memory.
Often, yes, because this kind of file conversion benefits from batch processing, repeatable mapping, and the option to self-host when you’re doing a lot of runs. Zapier and Make can work, but CSV-in, clean-CSV-out flows usually get fiddly and can become expensive once you’re iterating rows. n8n also makes it easier to support both a manual trigger and a webhook trigger in the same workflow, which is handy when you’re working with clients. The tradeoff is setup time: you’ll spend a little longer up front, then you stop paying that tax every migration. If you want a second opinion, Talk to an automation expert.
Clean customer imports are boring work, which is exactly why they should be automated. Set this up once, and the next migration feels a lot less dramatic.
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.