Shopify and WooCommerce both export products as CSV, and the two files have almost nothing in common. Shopify repeats a product's handle down one row per variant. WooCommerce writes one variable parent row and points each variation at it through a Parent column. This converts between the two shapes in either direction, and shows you a list of every column that did not survive the trip.
That list is the part worth reading. Plenty of columns have no honest counterpart on the other platform, and quietly filling them with guesses would produce a file that imports cleanly and sells the wrong thing.
What comes across untouched
Title and Name. Body (HTML) and Description. Variant SKU and SKU. Variant Price and Regular price. Variant Inventory Qty and Stock. Tags, which both platforms store as a comma-separated list.
Published is rewritten on the way across: Shopify writes TRUE and FALSE, WooCommerce writes 1 and 0, so the values are converted in both directions.
How variants are rebuilt
Going to WooCommerce, rows are grouped by Handle. A group with more than one variant row becomes a variable parent plus one variation row for each variant. The parent's SKU is set to the Shopify handle and every variation's Parent points at it, because WooCommerce has no handle column and a variation has to reference its parent somehow. Option 1 to 3 become Attribute 1 to 3, with the full list of values on the parent and one value on each variation.
Shopify's extra image rows carry a handle and an image and nothing else. Those never become variations. Their images are collected into the parent's Images cell, which is where WooCommerce expects the whole list.
Going the other way, each WooCommerce variation becomes its own Shopify row sharing a handle, with the product-level fields written once on the first row. Handles are built by slugifying the product name, and a second product with the same name gets a numbered suffix so no two products collide. A simple product with no variations comes out with Shopify's own Title and Default Title placeholder option. Images in the WooCommerce cell are spread back out: the first one lands on the first row, the rest become image rows with their positions.
What is left out, and why
Compare-at price and sale price mean different things on the two platforms, so neither crosses over. Weight is stored by Shopify in grams with a separate unit column and by WooCommerce as one number in the store's own unit, which makes any automatic conversion a guess. Barcodes, vendor, SEO fields, cost per item, tax class, shipping class, inventory policy and fulfilment service have no clean counterpart at all.
Grouped, external and downloadable product wiring is not attempted. Neither are metafields or "Meta:" columns. Both platforms cap options at three, so anything past the third is left behind.
Every column in your file that held data and was not mapped appears in the results with a count of how many rows carried a value. A dropped column with 400 filled cells is a different problem from one with two, and the count tells you which you are looking at.
Before you import the result
Open the converted file and read the two columns flagged as approximate. Shopify's Type holds one value where WooCommerce's Categories holds a list, so going to WooCommerce the type becomes the only category, and coming back only the first category survives. Neither is wrong exactly, but neither is what a careful merchandiser would have chosen.
Then run the output through a validator before the real import. A converted file is still a hand-assembled file, and the usual problems (duplicate SKUs, a price that picked up a stray character, a variation whose parent went missing) apply to it like any other.
Frequently asked questions
Can it convert a whole catalogue at once?
Yes, as far as your browser's memory allows. The file is parsed and rewritten in the page, so a large export is limited by your own machine and not by an upload size or a request timeout. Nothing is sent to a server at any point.
Why does the parent row's SKU get set to the Shopify handle?
WooCommerce links a variation to its parent through the Parent column, which takes either the parent's SKU or id: plus a numeric product ID. A file being imported for the first time has no IDs yet, so the SKU is the only stable link available, and the handle is already unique per product.
Will images be moved to the new store?
No. Image URLs are passed along as text. Nothing is fetched, downloaded or re-hosted here. WooCommerce will download the images itself during import if the cells hold reachable URLs.
What happens to a variation whose parent is missing from the file?
Converting to Shopify, it becomes a standalone single-variant product with its own handle instead of being dropped. You will see it in the output and can merge it into the right product by hand, which is better than silently losing a row.
Is the output ready to import as-is?
Treat it as a strong first draft. The mapped columns are correct, the dropped ones are listed for you, and the two approximate mappings need a human eye. Import a handful of products first and check how they look on the storefront before running the full file.
Related Utilities You Might Need
Stack Selector
Select your project scope, budget, and features to instantly receive a vetted, modern tech stack and service recommendation.
IBAN Generator
Generate format-valid, checksum-correct IBAN numbers for any supported country for testing and QA, and validate the checksum of any IBAN.
EAN / UPC Generator
Generate valid-checksum EAN-13, EAN-8, UPC-A and GTIN-14 product codes in bulk for test catalogs, and validate the check digit of any existing code.
