A WooCommerce to Shopify migration free of app fees sounds too good to be true, because most migration guides end with a paid app. The honest answer is more useful than that: moving your product catalogue can be free, but a whole shop migration cannot. Products are one part of a shop. Customers, orders, discounts, pages and redirects are other parts, and some of those will cost time even when they do not cost money. This guide separates the free parts from the parts that are not free, so you can plan a migration without surprise bills, and without paying for a tool to do a job a free tool already does well.
Start with the catalogue, because that is where a paid app usually earns its fee, and where a free route is genuinely strong. If you can move products, images, variants and sale prices cleanly for free, you have removed the largest and most tedious part of the migration.
What "free" actually covers
A free product migration covers the export from WooCommerce, the reshaping of that data into Shopify's import format, and the import into Shopify itself. Shopify does not charge to import a CSV file, and WooCommerce does not charge to export your own products. A free extractor, such as WeCalculator's Shopify Product Extractor, reads a WordPress shop through the WooCommerce Store API, takes a whole store catalogue in one run, and produces a Shopify-ready CSV with 96 columns, variants, sale prices and images included. It needs no account, adds no watermark, and stores nothing: links are fetched on demand to build your CSV in your browser.
What free does not cover is everything else around the products. Your Shopify plan itself is not free after any trial period. A custom theme, a paid app for a feature Shopify does not include, and professional help with redirects or design are not free either. None of that means the product migration has failed. It means you should budget for the shop, not just for the move, and judge a "free migration" claim by what it actually includes.
Only move products you own or have the right to sell and describe. Product titles, descriptions and photographs belong to their source stores, so if you are moving your own WooCommerce shop, that is straightforward. If a supplier has authorised you to list their products, respect that permission, and write your own descriptions where the original copy is protected.
The free route, step by step
First, audit the WooCommerce catalogue. Count products, not spreadsheet rows. A product in three sizes and two colours is one product with six variants, and Shopify must receive it that way: one handle, one row per variant, image rows in display order. Note sale products, because Shopify needs both the selling price and the compare-at price to show a discount.
Second, export the catalogue. Paste a product link, a category page, or the whole shop homepage into the extractor, with the collection or whole-store option ticked as appropriate. The tool can take up to 100 products per collection or store run, so a large shop should be worked category by category, with a simple list of what has been exported, reviewed and imported.
Third, review the results before you download. Check a sample across the catalogue: a simple product, a variable product, and a sale product. Look at photographs in order, variant SKUs, prices and compare-at prices. A mistake spotted here costs minutes. The same mistake spotted after a full import costs hours.
Fourth, test with two products. Import one simple product and one variable product into Shopify, open them in Shopify Admin, and check the title, description, price, photographs, variants and stock. When those two look right, import the full category, read Shopify's preview, and check the import summary. Set Status to draft for a large first import, so nothing goes live before you have reviewed it, then publish in bulk when you are happy.
A simple worked example shows why the test step matters. Suppose a category has 60 products. Importing 2 first leaves 58 to go, but if the test reveals that a sale price is landing in the wrong column, you fix that pattern once, and all 58 remaining products benefit. Skipping the test does not save time. It moves the same fix to a point where it is far more expensive.
What a paid app adds, and when you might still want one
Paid migration apps usually add convenience, not magic. They may move customers and orders as well as products, handle redirects in bulk, or offer support when something goes wrong. For a small shop with a simple catalogue, that convenience may not be worth the fee, because the free product route already covers the hardest manual work: retyping.
For a large shop, the calculation changes. Moving thousands of products, customers and orders, with redirects for every old address, is a project in its own right, and paying for help can be sensible. The key is to compare like with like. Ask any paid tool exactly what it moves, whether it moves images and variants correctly, and what happens to products it cannot read. A tool that invents data to fill a gap is not better than a free tool that reports a failure clearly. A failed product can be typed in manually. A silently wrong product can mislead a customer.
The same test applies to any method, free or paid: two test products first, a full review before publishing, and a check of sale prices and photographs across the catalogue. No app removes the need for that review.
What free migration does not move
This is the part that causes the most disappointment, so it is worth stating plainly. A product extractor moves products. It does not move customer accounts, order history, discount codes, blog posts, pages, or your search ranking. Customers will need new accounts on Shopify unless you use a separate customer migration, and old order history will not appear in Shopify unless you import it through a separate process.
That limitation also answers a question that often appears alongside free migration searches: how to migrate customer data from WordPress to Shopify. Customer data is a separate export, from WordPress users and WooCommerce customers, into a Shopify customer CSV, and it carries privacy responsibilities that a product export does not. Do not mix the two jobs, and do not assume a product tool has moved your customers. Keep the product migration and the customer migration as two checklists, and work through them separately.
Redirects are another separate job. When your Shopify shop is live, old WooCommerce product addresses will not automatically point to the new Shopify addresses. Plan redirects for your most visited products and categories before you close the old shop, and keep the old shop running for a short while as a fallback.
Common free-migration mistakes
The most common mistake is splitting variants into separate products, by giving each size or colour its own handle. Shopify then imports a row of near-identical listings instead of one product with variants. Keep one handle per product, and let the tool deduplicate handles where titles repeat.
The second mistake is ignoring currency. Prices are copied in the source store's currency, and the tool does not convert currencies. If your WooCommerce shop and your Shopify shop use different currencies, adjust prices before you download, or edit them in Shopify afterwards.
The third mistake is publishing before reviewing. A large import set to published goes live with every error included. A large import set to draft can be reviewed, corrected and published in bulk, with far less risk.
Frequently asked questions
Is a WooCommerce to Shopify migration really free?
The product catalogue move can be free, using WooCommerce's own export or a free extractor, plus Shopify's free CSV import. Your Shopify plan, theme and any extra apps are separate costs, and they are not part of the migration itself.
Can a free tool move my whole shop, including customers and orders?
No. A free product extractor moves products, images, variants and prices. Customers, orders, discounts and pages need separate methods, and should be planned as separate steps in the migration.
What should I do if some products fail to export?
Check the message for each failed product. Common reasons are a store blocking automated access, a rate limit, or a price hidden behind a login. Type those products in manually, and keep going with the rest of the batch, rather than abandoning a migration that is otherwise working.
Try the free route with the Shopify Product Extractor, starting with two test products, and only then import the full catalogue.