WooCommerce to Shopify Product Import: CSV, Migration App, or Custom Script

By Milan Dhameliya · · 9 min read

A bare Shopify CSV import will take your WooCommerce products, but it silently drops anything past 3 variant options, leaves WordPress shortcodes sitting raw in your descriptions, and can re-issue every variant ID the moment you re-import — breaking any subscription or loyalty app keyed to the old ones. Here's what each of the three real migration paths actually preserves, and which one fits a catalog like yours.

A plain Shopify CSV import will move your WooCommerce product titles, prices, and descriptions, but it will not preserve everything, and which gaps matter depends on your catalog: products with more than three attributes lose the extras entirely, HTML from WordPress page builders often renders as broken code instead of formatted text, and images can drop out completely if your spreadsheet tool re-sorted the file before you uploaded it. There are three real ways to move a WooCommerce catalog to Shopify — a bare CSV import, a paid migration app, or a custom script against the Admin API — and each one preserves a different slice of your data. Picking the wrong one is how a "successful" migration turns into three weeks of manually rebuilding product pages after the fact.

This isn't a "steps to import a CSV" walkthrough — Shopify's own help center already covers that. It's the part that guide leaves out: what actually breaks in each method, why, and who should pick which one.

What a bare CSV import actually does and doesn't preserve

Shopify's product CSV import is free, built into every plan, and genuinely fine for a small, simple catalog. It also has real, documented limits that most "how to migrate" posts skip past:

None of this makes CSV import a bad choice. For a catalog under a few hundred simple products with three or fewer real variant dimensions and descriptions that are already plain HTML, it's the fastest and cheapest path, and it's the one Shopify itself recommends first.

The variant ID trap almost nobody mentions

This is the gap that decides whether CSV import is safe for a store that already has other apps wired into it, and it's not in Shopify's migration guide at all — it's buried in the CSV reference documentation instead: "Changing data in the Option1 value, Option2 value, or Option3 value columns of the product CSV file deletes existing variant IDs, and creates new variant IDs." Shopify's own docs go on to warn that this can break third-party dependencies on those IDs.

In practice, that means if you import once, then re-import a corrected file with any variant option value edited — a typo fix in a color name, a renamed size label — every variant on that product gets a new ID, even though nothing about the product looks different to a shopper. If you have a subscription app, a loyalty program, a personalization tool, or any custom code that stored the old variant ID to remember what a customer bought, that reference is now pointing at nothing. This is exactly the kind of failure that shows up two weeks after go-live as "why did this customer's subscription stop renewing," not on migration day itself. If you expect to re-import corrected data more than once — and almost every migration does — treat your first CSV as a dry run on a duplicate development store, not the final import.

Migration apps: Matrixify, LitExtension, and Cart2Cart

Dedicated migration apps exist specifically to close the gaps above. They typically map WooCommerce's variable-product structure into Shopify's variant model more intelligently — collapsing extra attributes into metafields instead of dropping them, stripping or converting known page-builder shortcodes, pulling images by direct URL rather than relying on spreadsheet row order, and in some cases carrying over customer accounts, order history, and reviews that a plain product CSV was never going to touch.

What you're paying for is scope and reliability, not magic: no app can invent variant option slots Shopify's data model doesn't have, so a genuinely 4-attribute product still needs metafields or a bundling app on the Shopify side regardless of which migration tool moved it. And because these tools run their own transformation logic, you should still spot-check a sample of complex products after the run — a shortcode a tool doesn't recognize, or a WooCommerce attribute type it wasn't built to expect, can still slip through untouched. Budget for this route when your catalog has real complexity: heavy use of page builders in descriptions, products near or over the 3-option ceiling, or existing customer/order history you actually need on the new store rather than starting that ledger fresh.

A custom script against the Admin API

For a catalog large enough, or unusual enough, that neither a bare CSV nor an off-the-shelf migration app maps it cleanly, the third option is writing directly against Shopify's GraphQL Admin API. This is more work up front, but it's the only path that gives you full control over exactly how WooCommerce data becomes Shopify data, field by field.

The pieces you'd actually use:

This route makes sense when you have engineering time available and a catalog where the mapping logic itself is the hard part — heavily attributed B2B catalogs, products syncing from a PIM or ERP that WooCommerce was never the real source of truth for, or a migration where you need the import to be re-runnable idempotently without triggering the variant ID churn described above. It is not the right choice for a 200-SKU store on a deadline; that's what the first two options are for.

Which one fits your catalog

Whichever path you pick, do the redirect mapping before cutover, not after. Shopify's own migration guide recommends setting up URL redirects in advance for pages customers might have bookmarked or that other sites link to — and a redirect built from the same mapping you used to move the products is far more reliable than one reconstructed from memory once the old store is already gone. It's also worth revisiting why a WooCommerce store outgrows its platform in the first place before you commit engineering time to a migration path — the reasons that push a catalog toward Shopify usually point at which of these three methods is worth the investment.

The short version

A bare CSV import is free and fine for a simple catalog, but it silently drops a fourth product option, leaves page-builder shortcodes in your descriptions, can misalign images if the file gets re-sorted, and will reissue variant IDs — breaking any app that stored the old ones — the moment you correct and re-import it. A migration app closes most of those gaps for a licensing fee and is the right default for anything with real complexity. A custom script against the Admin API is more work but the only option that gives you full control over the mapping, and it's worth it when your catalog is large, structurally unusual, or needs to stay synced with an external system after go-live.

If you're weighing which of these three actually fits your catalog, or want a second pair of eyes on the redirect map before you cut over, get in touch — I've done this migration enough times to tell you in ten minutes which path is worth your time. For the broader "should we even move off WooCommerce" question, our full WooCommerce and Magento migration guide covers the decision itself, not just the product import.

Sources reviewed