Ecwid to Shopify: converting a product CSV export
Ecwid puts several kinds of record in one file and tells them apart with a type column. Shopify has one kind of record. Knowing which Ecwid rows to keep is most of the work.
Where the file comes from
In the Ecwid control panel go to Catalog → Products, optionally filter, then use Export all or Export all found. The full column list is published in Ecwid’s list of supported CSV columns, and the row model in its CSV format guidelines.
Only one column is required to create a product: Ecwid states that “to create new products, product_name is required”, and product_sku or product_internal_id is what identifies an existing one. Everything else is optional, so two exports from two stores can have genuinely different headers.
Pitfall 1: the type column mixes five kinds of row in one file
Ecwid’s guidelines list the values a type cell can take: product, product_option, product_variation, product_file, category, site_redirect and customer. One file can contain all of them, and if every row is a product the column may be omitted entirely.
Shopify’s product CSV has nothing analogous. A category row imported as a product creates a product named after a category; a product_option row creates a product named after an option. Delete every row whose type is not product or product_variation before you load the file — the converter maps columns, it does not decide which of your rows are products.
Pitfall 2: the variation option column is named after your own option
This is the one that defeats a shared preset. Ecwid names the variation option column product_variation_option_{Option name}, where the braces are replaced by whatever you called the option. Its documentation gives both product_variation_option_Size and product_variation_option_{Select color} as real examples — the second including the braces, because the merchant literally named the option that.
No preset can know your option names, so the built-in mapping leaves Option1 unmapped and you set it in step 3: find the product_variation_option_… columns in your file and map each to an Option value, putting the option name in as a constant. The bundled Ecwid sample has one option called Size, so its column is product_variation_option_Size and the sample supplies that mapping itself — which is exactly the manual step you will repeat for your own file.
Pitfall 3: a variation row inherits what it does not override
Ecwid documents the inheritance: for a new variation “variation price will be set equal to the base product price”. So product_variation_price is blank on rows that simply use the product’s price, and the real price is on the product row instead.
Shopify has no inheritance at all — every variant row needs its own price, and a blank one imports as 0.00. Those two models cannot be satisfied by one column mapping, which is why the validator warns Price is empty — Shopify will import it as 0.00 on the variant rows of the sample. Fill the gaps down in the sheet before importing, or accept that every inheriting variant is free. The same applies to product_variation_weight and product_variation_quantity.
Pitfall 4: gallery images are numbered columns, not a list
The main image is product_media_main_image_url. Extra images are product_media_gallery_image_url_1, product_media_gallery_image_url_2 and so on — Ecwid’s reference says to “use several columns for them”, with the alt text in a matching product_media_gallery_image_alt_N. A product with six images has six columns, and the next product may have two.
Shopify wants one URL per row: the first on the product’s own row, then one extra row per remaining image with an incrementing Image position. The preset maps the main image only. To bring the gallery across, join the numbered columns into one semicolon-separated cell in the sheet, map that, and choose the split image list formula — the extra rows are then generated for you. Ecwid also only accepts URLs starting http:// or https://, and so does Shopify; the validator rejects anything else.
Pitfall 5: quantity is blank for unlimited, and SKUs may repeat
Ecwid treats an empty product_quantity as unlimited stock. Shopify has no such value: it wants a whole number, and expresses “keep selling” with Continue selling when out of stock: CONTINUE instead. Leave inventory tracking off for those products, or give them a number and set oversell to CONTINUE. Any text in the cell — the sample has a literal unlimited — is reported as Inventory quantity “unlimited” is not a whole number.
Ecwid also permits non-unique and empty SKUs, and says so: “If you have non-unique or empty SKUs in your store, you can only identify products by their IDs.” Shopify accepts duplicates too, which means nothing stops you importing a catalogue whose SKUs cannot identify a variant. The validator reports each duplicate with its row numbers so the decision is yours and not accidental.
What the preset maps
product_name → Title, product_description → Description, product_brand → Vendor, product_category_1 → Type, product_sku → SKU, product_price → Price, product_compare_to_price → Compare-at price, product_quantity → Inventory quantity, product_weight → Weight value (grams) with the kg conversion, product_media_main_image_url → Product image URL, product_media_main_image_alt → Image alt text, and product_enabled → Published on online store. Status is draft.
type and product_internal_id are not mapped: the first is structural and the second is an Ecwid database id with no Shopify meaning. Columns ending in a language code — product_media_main_image_alt_fr and its relatives — are translations, which belong in a Shopify localisation app rather than in the product CSV. Ecwid’s shipping_freight and fixed_shipping_rate_only legacy fields are dropped too: Shopify models per-product shipping with shipping profiles, set in the admin.
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.