Etsy to Shopify: converting a product CSV export

An Etsy listings download is a snapshot of listings, not of variants. Shopify's importer is the other way round. These are the differences that decide whether your catalogue arrives intact.

Open the converter with this presetField names verified against a published export spec.

Where the file comes from

In Etsy go to Shop Manager → Settings → Options → Download Data, and under Currently for Sale Listings click Download CSV. You get a file called EtsyListingsDownload.csv, with headers in capitals: TITLE, DESCRIPTION, PRICE, CURRENCY_CODE, QUANTITY, TAGS, MATERIALS, SKU, and the variation pairs VARIATION 1 NAME / VARIATION 1 VALUES. The path and the file name are both specified in Shopify’s migrating-from-Etsy guide, which is also where the variation column names below are quoted from.

One limit catches everyone on the first attempt, and Shopify states it plainly: “The CSV file from Etsy only includes listings that are currently available for sale.” Sold-out, expired and draft listings are simply absent. If you keep seasonal stock deactivated, raise its quantity and reactivate it before you export, or it will not be in the file at all — and nothing downstream can recover a row that was never there.

Pitfall 1: one row per listing, not one row per variant

This is the whole problem. Etsy writes a single row for a listing and compresses its variations into VARIATION 1 VALUES as a list — S,M,L. Shopify needs one row per purchasable combination, sharing a handle. Shopify’s guide spells out the arithmetic: a shirt with three sizes and three colours “will need 9 rows in total”.

Import the Etsy row as-is and Shopify creates one variant whose option value is the literal string “S,M,L”. Customers can then buy “S,M,L”. Nothing errors; the catalogue is just wrong. Etsy’s export does not contain the per-combination rows, so no tool can conjure them — the values have to be expanded into rows, one combination each, with its own SKU and quantity. Do that in the sheet before you load it here, and the preset maps the expanded file correctly.

Pitfall 2: SKUs arrive as a list too

Shopify’s guide gives the exact shape: a listing with VARIATION 1 VALUES of S,M,L has a SKU cell of TS123-S,TS123-M,TS123-L. One cell, three SKUs, positionally aligned with the values.

Map that cell straight to SKU and all three variants claim the SKU “TS123-S,TS123-M,TS123-L”. Because the string is identical on every row, the validator reports SKU is used on 3 rows before you download, which is the cheap version of the same discovery. Split the SKU list alongside the values, in the same order.

Pitfall 3: two variation axes, and Shopify allows three

Etsy supports two variation types per listing; Shopify supports three options. That direction is harmless — the preset maps VARIATION 1 and VARIATION 2 onto Option1 and Option2 and leaves Option3 free. What is not harmless is the reverse: if you have been faking a third axis inside a variation value (“Small / Red / engraved”), it stays one option value in Shopify and no amount of mapping separates it.

Note also that Etsy’s per-variation prices live in the values cell as price modifiers, not as a price per combination. When you expand the rows you have to write the absolute price into each one; Shopify has no concept of a modifier.

Pitfall 4: images are URLs on Etsy’s servers

The image columns hold links to Etsy’s CDN, not files. Shopify downloads each URL at import time, so the links must still resolve at the moment you import — and they belong to a shop you are leaving. Import while the Etsy listings are still live, then let Shopify re-host, and verify the images appear before you close anything.

The preset deliberately leaves Product image URL unmapped. Shopify’s guide documents the title, price, quantity, SKU and variation columns, and the Variant Image column you add yourself, but it never names Etsy’s own image headers — and merchant reports disagree about whether they are IMAGE1…IMAGE10 or one comma-joined cell. Rather than ship a guessed header inside a preset marked verified, open your file, look at the image column, and map it in step 3. If it is one cell holding several URLs, pick the split image list formula and the extra image rows are generated for you.

Pitfall 5: the price is a number in your shop currency

PRICE and CURRENCY_CODE are separate columns, and Shopify’s product CSV has no currency column at all — the store’s own currency decides. If your Etsy shop sells in a currency your Shopify store does not use, the numbers import unchanged and silently become prices in the new currency. Convert before importing; this tool will not guess an exchange rate for you.

Separately, a European seller’s export often writes 45,00 rather than 45.00. Shopify rejects anything that is not a plain number. The converter normalises both separator conventions, strips currency symbols and writes two decimal places, so 45,00 arrives as 45.00.

What the preset maps

TITLE → Title, DESCRIPTION → Description, SKU → SKU, PRICE → Price, QUANTITY → Inventory quantity, TAGS → Tags, and VARIATION 1/2 NAME and VALUES → the Option1/Option2 pairs. Products import as draft with Published on online store set to FALSE, on purpose: an Etsy description is written for Etsy buyers, and you will want to read it again before it is live.

MATERIALS is not mapped. Shopify has no materials field in the product CSV; the closest home is a metafield or a line in the description, and writing it into Tags would mix materials with your real tags. CURRENCY_CODE is dropped for the reason above.

Before you upload to Shopify

  • Import into a development store or a draft-status batch first. Set the default status to draft in 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.