Moving from WooCommerce to Shopify: a redirect sheet that maps every old product URL to its new Shopify page, ready to import as Shopify's URL redirect CSV
What you get: one Google Sheet that turns your old WooCommerce shop into a finished Shopify URL redirect file. The map tab has one row per old product URL (for example /product/oak-chopping-board/), matched to the new Shopify product page (/products/oak-chopping-board-large) by SKU first, then by title, with a column you can type over by hand. Every row says how it was matched and gets a check: ok, ok: to collection (no product match, so it goes to the closest collection you chose), duplicate or path Shopify will not redirect. The redirects tab keeps only the ok rows in two columns, Redirect from and Redirect to, which you download as CSV and import in Shopify under Content → Menus → URL redirects. Old links from Google, Pinterest, newsletters and other sites then land on the right product instead of a "Page not found". Formulas are below. The example rows are made up.
The finished sheet
map tab (example rows are made up)
| Redirect from (old path) | Old SKU | Old title | Handle by SKU | Handle by title | Your handle | Redirect to | Matched by | Check |
|---|---|---|---|---|---|---|---|---|
| /product/oak-chopping-board/ | OAK-L | Oak chopping board, large | oak-chopping-board-large | /products/oak-chopping-board-large | SKU | ok | ||
| /product/linen-apron-sage/ | Linen apron – sage | linen-apron-sage | /products/linen-apron-sage | title | ok | |||
| /product/gift-box-2025/ | GB-25 | Gift box 2025 | /collections/gift-boxes | no match: closest collection | ok: to collection | |||
| /shop/ | /collections/all | no match: closest collection | path Shopify will not redirect |
redirects tab (what you import)
| Redirect from | Redirect to |
|---|---|
| /product/oak-chopping-board/ | /products/oak-chopping-board-large |
| /product/linen-apron-sage/ | /products/linen-apron-sage |
| /product/gift-box-2025/ | /collections/gift-boxes |
Who this is for, and when you need it
Small shops moving their own store from WooCommerce to Shopify (the same sheet works from other platforms the scraper can read). WooCommerce product pages usually sit under /product/ and Shopify's under /products/, so every old product link breaks on the day you point your domain at Shopify unless you add a redirect for it. Build the sheet while both stores exist: the old shop still live, the new Shopify store set up with its products. Google's site move guidance also suggests moving in a quieter period if your traffic is seasonal, so if you can choose, avoid the weeks just before Black Friday.
Step 1: list your old product URLs in a tab named scrape
With the product data scraper
Open the E-commerce Product Data Scraper (Shopify, WooCommerce, any shop) on the Apify Store and run it on your old shop:
{
"startUrls": [{ "url": "https://your-old-shop.example" }],
"maxProductsPerShop": 5000,
"includeDescription": false
}
maxProductsPerShop: set it above your number of products (the default is 100). You pay only for products delivered.includeDescription: off, because the sheet needs only the URL, SKU and title.- For WooCommerce shops the scraper reads the WooCommerce Store API, so you get each product's real public URL, SKU and title. It follows robots.txt and reads your shop's terms page; if your own terms forbid automated access, it skips the shop and charges nothing. Check the run's Storage → Key-value store →
SHOPS_SUMMARY: your shop should showok.
Export the dataset as CSV. In your Google Sheet use File → Import → Upload, "Insert new sheet", and name the tab scrape. Keep the headers as they are; the formulas look up url, sku and title by name.
Free, without the scraper
Paste your old product URLs into column A of a tab named scrape with the header url, and add sku and title columns if you have them. WordPress lists product URLs in its sitemap (often /wp-sitemap-posts-product-1.xml, or /product-sitemap.xml if an SEO plugin makes the sitemap). Your analytics "top pages" report is worth adding too, because Google's guidance is to start with the URLs that get traffic and links.
Step 2: export your new Shopify products into a tab named shopify
In Shopify admin go to Products → Export, choose all products and the plain CSV option, and import the file into the same Google Sheet as a new tab named shopify. The current export has columns named Title, URL handle and SKU (one row per variant; the title is only on the first row of each product). Older exports call them Handle and Variant SKU; if yours do, change those names in the formulas.
Step 3: the settings tab
settings!B1: where unmatched products go, for example/collections/allor better a real collection such as/collections/gift-boxes. Google advises against sending many old URLs to the home page: it can confuse visitors and may be treated as a soft 404.
Step 4: build the map tab
Row 1 headers as in the table above (columns A to J below). Put these in row 2 and fill down as far as your scrape tab goes.
- A Old URL:
=IFERROR(INDEX(scrape!$A:$ZZ, ROW(), MATCH("url", scrape!$1:$1, 0)), "") - B Redirect from: the path only, because Shopify redirects within your domain use relative paths:
=IF(A2="", "", REGEXREPLACE(A2, "^https?://[^/]+", "")) - C Old SKU:
=IF(A2="", "", IFERROR(INDEX(scrape!$A:$ZZ, ROW(), MATCH("sku", scrape!$1:$1, 0)), "")) - D Old title:
=IF(A2="", "", IFERROR(INDEX(scrape!$A:$ZZ, ROW(), MATCH("title", scrape!$1:$1, 0)), "")) - E Handle by SKU:
=IF(C2="", "", IFERROR(INDEX(shopify!$A:$ZZ, MATCH(C2, INDEX(shopify!$A:$ZZ, 0, MATCH("SKU", shopify!$1:$1, 0)), 0), MATCH("URL handle", shopify!$1:$1, 0)), "")) - F Handle by title (ignores capitals and extra spaces):
=IF(D2="", "", IFERROR(INDEX(shopify!$A:$ZZ, MATCH(LOWER(TRIM(D2)), ARRAYFORMULA(LOWER(TRIM(INDEX(shopify!$A:$ZZ, 0, MATCH("Title", shopify!$1:$1, 0))))), 0), MATCH("URL handle", shopify!$1:$1, 0)), "")) - G Your handle: empty. Type a Shopify handle here to override the match, for example when you merged two old products into one.
- H Redirect to:
=IF(B2="", "", IF(G2<>"", "/products/"&G2, IF(E2<>"", "/products/"&E2, IF(F2<>"", "/products/"&F2, settings!$B$1)))) - I Matched by:
=IF(B2="", "", IF(G2<>"", "you", IF(E2<>"", "SKU", IF(F2<>"", "title", "no match: closest collection")))) - J Check:
=IF(B2="", "", IF(REGEXMATCH(LOWER(B2), "^/(products|collections|apps|application|cart|carts|orders|services|shop|a|community|tools)(/|$)"), "path Shopify will not redirect", IF(COUNTIF($B:$B, B2)>1, "duplicate", IF(I2="no match: closest collection", "ok: to collection", "ok"))))
Work down the sheet in this order: fix every duplicate (usually the same product listed twice in the scrape), then look at every ok: to collection row: if the product still exists on Shopify under another name or SKU, type its handle in column G so the visitor lands on the product itself. Rows marked path Shopify will not redirect are fine to leave: for example WooCommerce's /shop/ page can't be redirected because Shopify reserves paths beginning with /shop, and an old path that already starts with /products/ only works if the Shopify handle is the same.
Step 5: the redirects tab, then import into Shopify
- New tab named
redirects. In A1 typeRedirect from, in B1Redirect to. In A2:=FILTER({map!B2:B, map!H2:H}, LEFT(map!J2:J, 2)="ok") - With the redirects tab open, use File → Download → Comma-separated values (.csv). Compare the header row with Shopify's sample URL redirect CSV (linked from the "Import your URL redirects" section of Shopify's help page) and match its header names if they differ.
- In Shopify admin go to Content → Menus → URL redirects → Import, add the file, review the import, then import the redirects.
- Shopify redirects only from URLs that are broken on the Shopify store, so they start working once your domain points at Shopify and the old pages no longer exist there. Shopify allows up to 100,000 URL redirects (more on Plus).
- Test ten old URLs from the sheet in a private browser window after the switch, including your three best sellers. Then keep the redirects: Google's guidance is at least a year, and longer is better for people following old links.
Categories are not in the scrape. Add your old category pages by hand at the bottom of the map tab (WooCommerce usually uses /product-category/name/), and type the matching Shopify collection path, such as /collections/name, straight into column H over the formula.
Partner programme opening soon
Partner programme opening soon: join the free waitlist. Planned terms are 50% of each referred sale (75% once you have 5+ paying customers), single level, paid through Gumroad only from revenue received.
Sources
- Shopify URL redirects: relative paths within your domain, redirects work only from broken (404) URLs, no redirects from
/products,/collections,/collections/allor paths beginning/apps,/application,/cart,/carts,/orders,/services,/shop; reserved/a/,/community/,/tools/; limit 100,000 (Plus 20,000,000); import and sample CSV under Content → Menus → URL redirects; 301 redirects cached: Shopify Help Center, Creating and managing URL redirects (read 22 Oct 2026). - Shopify product CSV columns
Title,URL handle,SKU; older column names still accepted: Shopify Help Center, Using CSV files to import and export products (read 22 Oct 2026). - Map old URLs to new ones, start with sitemaps and pages with traffic and links, use permanent redirects, don't redirect many URLs to one irrelevant page such as the home page (soft 404), test the redirects, keep them at least a year, move in a quieter period: Google Search Central, Site moves with URL changes (read 22 Oct 2026).
- Product data scraper inputs and outputs (
startUrls,maxProductsPerShopdefault 100,includeDescription, WooCommerce Store API,SHOPS_SUMMARYstatuses, skipped shops not charged): Apify Store page (Actor input schema and README read 22 Oct 2026).
Related
- Facebook and Instagram shop catalogue feed from your own store
- Wholesale line sheet from your own Shopify or WooCommerce store
- Google Shopping product listing check sheet
Unadhi Guides are free, independent explainers. We correct errors as soon as we find them: write to mininglife7@gmail.com.