Squarespace to Shopify: converting a product CSV export
Of all the platforms here, Squarespace's row model is the closest fit to Shopify's: one row per variant, product fields on the first. What still breaks is the units, the stock column and the handle.
Where the file comes from
In Squarespace open the Products & Services panel, click Products, and use Export all (or select products and Export selected). Shopify calls the result SquarespaceProductDownload.csv and publishes the complete field mapping in its migrating-from-Squarespace guide, which is where every column name below is quoted from.
The headers are title case with spaces: Product ID, Variant ID, Product Type, Product Page, Product URL, Title, Description, SKU, Option Name 1…Option Value 3, Price, Sale Price, On Sale, Stock, Categories, Tags, Weight, Visible.
Pitfall 1: Product URL is the handle, and it has to be handle-shaped
Shopify’s table maps Product URL → Handle, with the warning that a handle “can contain letters, dashes, and numbers, but no spaces, accents, or other characters, including periods”. Squarespace’s value is a URL slug, so it is usually already close — but a product whose slug carries an accent or a stray full stop is rejected.
Because Product URL repeats on every variant row of a product, it is also the grouping key, and the preset pins grouping to it rather than leaving auto-detect to guess. The converter slugifies whatever arrives — folding accents, lowercasing, collapsing punctuation to a single dash — and the validator reports anything it cannot repair as Handle … is not a valid Shopify handle.
Pitfall 2: Weight is in pounds
Shopify’s own mapping table is unambiguous: “Convert pounds to grams by multiplying the values by 453.6.” A 0.35 lb cap exports as 0.35.
Leave the source unit on grams and Shopify stores that cap at nought grams, because Weight value (grams) takes an integer and 0.35 rounds to zero. Every carrier-calculated shipping quote is then wrong, and nothing in the import report tells you. The preset declares the source unit as lb, so 0.35 becomes 159 grams and Weight unit for display is set separately. If your Squarespace store was configured in kilograms, change the unit in step 2 — the file does not record which it is.
Pitfall 3: Stock can say “Unlimited”
Squarespace lets a product have unlimited stock, and writes that word into the cell. Shopify ’s guide anticipates it and tells you to “remove any non-numerical characters” when mapping Stock → Variant Inventory Qty.
Import the word and Shopify fails the row with “Inventory quantity is not a number”. The validator reports Inventory quantity “Unlimited” is not a whole number first, naming the row. The right fix is usually to clear the cell and leave inventory tracking off for that product, or to give it a number and set Continue selling when out of stock to CONTINUE — which is how Shopify expresses “keep selling regardless”.
Pitfall 4: Sale Price and On Sale are two columns describing one price
Squarespace keeps the regular price in Price, the discounted one in Sale Price, and a Yes/No flag in On Sale. Shopify has no flag: the price a customer pays goes in Price and the struck-through former price goes in Compare-at price.
So for a product on sale the two columns have to swap — sale price into Price, regular price into Compare-at price — and for a product not on sale they must not. That is a per-row decision a column mapping cannot express, which is why the preset maps Price → Price and leaves Compare-at price blank. Sort by On Sale in the sheet and fix those rows before importing, or every discount silently disappears.
Pitfall 5: option combinations must be unique within a product
Squarespace allows two variants with the same option values — it tells them apart by Variant ID. Shopify does not: a repeated combination inside one product fails the whole import with Validation failed: options are not unique, and because the import stops, nothing after that row arrives either.
Variant IDs are also dropped on purpose — they are Squarespace database ids with no Shopify meaning, so they cannot be used to keep two identical combinations apart. The validator reports Duplicate variant “M / Charcoal” inside product … before you upload; the bundled sample contains exactly that case. Merge the rows, or give one a distinguishing option value.
What the preset maps
Product URL → URL handle, Title → Title, Description → Description, Default Vendor Name → Vendor, Categories → Type, Tags → Tags, SKU → SKU, Price → Price, Stock → Inventory quantity, Weight → Weight value (grams) with the pounds conversion, and the three Option Name/Option Value pairs → Option1–3. Status is draft.
Product image URL is left unmapped because Shopify’s published table does not include an image row — there is no documented Squarespace image header to rely on. Open your file, find the image column, and map it in step 3; if one cell holds several URLs, pick the split image list formula and the extra image rows are generated. Product ID, Variant ID and Product Page are dropped as Squarespace-internal, and Product Type (which holds PHYSICAL or DIGITAL) is structural — for a digital product you want Requires shipping: FALSE, which is a constant you set rather than a column you map.
Before you upload to Shopify
- Import into a development store or a draft-status batch first. Set the default status to
draftin the tool and nothing goes live by accident. - Shopify caps a product CSV at 15 MB. Bigger catalogues are split into numbered parts, and a product is never split across two files.
- Overwriting existing products by handle is destructive: a blank cell can erase data that is currently there. Export your live products first if you are updating rather than creating.
Full column contract: the Shopify product CSV format, column by column. Nexum Gate is not affiliated with Shopify Inc.