Web/Guru

WooCommerce to Shopify Migration Without Losing Rankings: Checklist and 301 Redirect Template (2026)

A phased WooCommerce to Shopify migration checklist, a URL mapping table, a redirect CSV in Shopify's import format and a script to build the map.

Published
Updated
September 25, 2026
Read time
9 min read
Written by
Webguru
WooCommerce to Shopify Migration Without Losing Rankings: Checklist and 301 Redirect Template (2026)
/On this page01 / 09

Moving from WooCommerce to Shopify doesn't cost you rankings by itself. What costs rankings is old URLs that stop working, pages that lose their titles and content on the way over, and a launch that leaves Google guessing where everything went. The good news is that all three are preventable if you plan the URLs before you plan the theme.

This guide gives you a phased checklist, a URL mapping table for default WooCommerce permalinks, a redirect CSV in the exact format Shopify imports, and a short script to build the redirect map from a crawl. Migrating from Magento instead? See our Magento to Shopify migration guide for the data mapping, then come back here for redirects.

What changes when you move to Shopify

Shopify's URL structure is fixed. Products live under /products/, collections under /collections/, pages under /pages/ and blog posts under /blogs/<blog-handle>/<post-handle>. You can edit the handle (the last part of the address), but not the prefix. Even Shopify's Translate & Adapt app can translate /products/shoes into /products/zapatos, but it can't translate the word products.

That means almost every WooCommerce URL changes, even when the slug stays the same. Three other Shopify rules shape your redirect plan:

  • Redirects only fire on broken URLs. Shopify says you can redirect only from URLs that show Page not found or a 404. If the old path still loads a page on Shopify, the redirect is ignored.
  • Some paths can't be redirected at all. Shopify blocks redirects from URLs that begin with /apps, /application, /cart, /carts, /orders, /services or /shop, and from the fixed paths /products, /collections and /collections/all.
  • Handles are generated from titles. They're lowercase, special characters become hyphens, and duplicates get -1 added. Two products both called "Potion" become potion and potion-1. Check handles after import instead of assuming they match your old slugs.

Check your WooCommerce shop base now. If your product URLs look like /shop/hoodie-with-logo/ (WooCommerce's "Shop base" permalink option), Shopify's built-in redirects can't catch them because they begin with /shop. Test this on your Shopify store before you set a launch date. Workarounds exist, but they aren't the server-side 301s Google recommends, so if most of your organic traffic lands on /shop/ URLs, get a technical review first.

What data moves, and what doesn't

DataHow it movesWatch out for
ProductsShopify's free Store Migration app, a product CSV, or a third-party migration appShopify allows up to three options and 2,048 variants per product. Shopify's WooCommerce guide says options on products with more than three aren't imported.
CustomersCustomer CSV that matches Shopify's headings, or a migration appPasswords can't be migrated. Customer CSV files must be 15 MB or smaller, so split large lists.
Order historyThird-party apps (Shopify's guide names LitExtension, Matrixify and Ablestar) or the APIImport products first, then customers, then orders. Staff set to receive new order notifications get an email for each imported order.
ReviewsReview apps with their own import toolsShopify's WooCommerce guide says you can't export or migrate reviews from WooCommerce to Shopify directly.
Blog posts and pagesMigration apps or the APIThe default blog is called News, so posts land at /blogs/news/… unless you create a blog with a different handle.
ImagesImported with products and postsImage URLs change from /wp-content/uploads/… to Shopify's CDN. Alt text only survives if your tool carries it.

Shopify's WooCommerce guide describes the Store Migration app importing your WooCommerce product CSV and notes it's in early access for certain stores. Its App Store listing also mentions customer data. For anything beyond a simple catalog, plan on a combination of the app, CSVs and a paid migration app.

On passwords: Shopify's new customer accounts don't use them. Customers enter their email and get a one-time 6-digit code, which takes most of the pain out of this step. If you still run legacy accounts, read our legacy customer accounts migration guide before launch.

WooCommerce to Shopify URL mapping table

These are default WooCommerce and WordPress permalinks. Yours may differ, so check Settings > Permalinks in WordPress before you map anything.

WooCommerce URL patternShopify targetNotes
/product/blue-hoodie//products/blue-hoodieDefault product base. Map 1:1 when the handle matches.
/shop/blue-hoodie/ or /shop/hoodies/blue-hoodie//products/blue-hoodie"Shop base" options. Shopify blocks redirects from /shop, so test first.
/product-category/hoodies//collections/hoodiesDefault category base.
/product-category/clothing/hoodies//collections/hoodiesNested categories flatten to one collection handle.
/product-category/hoodies/page/2//collections/hoodiesPaginated archives. Redirect only if indexed or linked.
/product-tag/organic/The closest relevant collectionDefault tag base. Let low-value tag pages return 404.
/about-us//pages/about-usWordPress pages with "Post name" permalinks.
/blog/wash-a-hoodie/ or /2024/05/wash-a-hoodie//blogs/news/wash-a-hoodieDepends on your permalink setting. Match your real pattern.
/category/news//blogs/newsPost category archives.
/?p=123, /?page_id=45, /?product=111Test before relying on itPlain permalinks. Shopify says URLs with query strings might not work as expected with redirects, and / is your homepage, which always loads. Check whether any of these are indexed or linked first.
/wp-content/uploads/…/hoodie.jpgThe new image URLOnly for images with image search traffic or backlinks.

Google's guidance is to avoid sending many old URLs to one irrelevant page, such as the homepage, because it can be treated as a soft 404. Redirect each old URL to its closest match, redirect merged content to the page that replaced it, and let content you've deliberately dropped return a 404 or 410.

Redirect CSV template for Shopify

This is the header row from Shopify's own sample template. Save it as a UTF-8 .csv file:

csv
Redirect from,Redirect to
/product/blue-cotton-hoodie/,/products/blue-cotton-hoodie
/product/old-ceramic-mug/,/products/stoneware-mug
/product-category/hoodies/,/collections/hoodies
/product-category/clothing/t-shirts/,/collections/t-shirts
/product-tag/organic/,/collections/organic-cotton
/about-us/,/pages/about-us
/blog/how-to-wash-a-hoodie/,/blogs/news/how-to-wash-a-hoodie
/category/news/,/blogs/news
  • Redirect from is a path. Use it exactly as your crawl shows it. WooCommerce URLs usually end in a slash, so spot-test the version without the slash after import.
  • Redirect to can be a relative path on your primary domain or a full URL for another domain.
  • Point every row at the final URL. Google advises avoiding chained redirects.
  • Limits: 100,000 redirects on most plans, 20,000,000 on Plus.

To import, go to Content > Menus, click View URL Redirects, then Import, add the file and click Import redirects. Shopify's redirects are 301s.

Build the redirect map from a crawl and an export

You need three lists:

  1. Old URLs. Crawl the live WooCommerce site, then add every page from your Search Console Performance export and your most-linked pages from a backlink tool. Google's site move guide also suggests checking server logs for recently visited URLs.
  2. Old slugs and SKUs. The WooCommerce REST API (/wp-json/wc/v3/products) returns each product's slug, permalink and sku. The core WooCommerce product CSV export doesn't include slugs.
  3. New handles. Export products from Shopify. The current product CSV has URL handle and SKU columns. Older templates use Handle.

This Node.js script (Node 18 or later, no packages to install) matches products by slug first, then falls back to SKU when Shopify changed the handle. Anything it can't map goes to a review file for a human decision. Save the three CSV files next to it and run node map-redirects.mjs.

js
// node map-redirects.mjs  (Node 18+, no dependencies)
import { readFileSync, writeFileSync } from "node:fs";
// Minimal CSV parser: handles quoted fields, commas and line breaks inside quotes
function readCsv(path) {
  const text = readFileSync(path, "utf8").replace(/^/, "");
  const rows = [];
  let row = [], field = "", quoted = false;
  for (let i = 0; i < text.length; i++) {
    const ch = text[i];
    if (quoted) {
      if (ch === '"' && text[i + 1] === '"') { field += '"'; i++; }
      else if (ch === '"') quoted = false;
      else field += ch;
    } else if (ch === '"') quoted = true;
    else if (ch === ",") { row.push(field); field = ""; }
    else if (ch === "\n") { row.push(field.replace(/\r$/, "")); rows.push(row); row = []; field = ""; }
    else field += ch;
  }
  if (field || row.length) { row.push(field); rows.push(row); }
  const [header, ...body] = rows.filter((r) => r.some((c) => c.trim()));
  return body.map((r) => Object.fromEntries(header.map((h, i) => [h.trim(), (r[i] ?? "").trim()])));
}
const toCsv = (rows) => rows.map((r) => r.map((c) => (/[",\n]/.test(c) ? `"${c.replace(/"/g, '""')}"` : c)).join(",")).join("\n") + "\n";
// Shopify product export: carry the handle forward in case variant rows leave it blank
const skuToHandle = new Map();
const handles = new Set();
let current = "";
for (const r of readCsv("shopify_products.csv")) {
  current = r["URL handle"] || r["Handle"] || current;
  if (!current) continue;
  handles.add(current);
  if (r["SKU"]) skuToHandle.set(r["SKU"], current);
}
// WooCommerce REST export saved as CSV with slug and sku columns
const slugToSku = new Map(readCsv("woo_products.csv").filter((r) => r.sku).map((r) => [r.slug, r.sku]));
const rules = [
  [/^\/product\/([^/]+)\/?$/, "product"],
  [/^\/product-category\/(?:[^/]+\/)*([^/]+)\/?$/, "/collections/{}"],
  [/^\/blog\/([^/]+)\/?$/, "/blogs/news/{}"],
];
const redirects = [["Redirect from", "Redirect to"]];
const review = [["Old path", "Reason"]];
for (const { url } of readCsv("old_urls.csv")) {
  const path = new URL(url).pathname || "/";
  const rule = rules.find(([pattern]) => pattern.test(path));
  if (!rule) { review.push([path, "no rule"]); continue; }
  const [pattern, target] = rule;
  const slug = decodeURIComponent(path.match(pattern)[1]);
  if (target !== "product") {
    redirects.push([path, target.replace("{}", slug)]); // confirm these handles exist
    continue;
  }
  const handle = handles.has(slug) ? slug : skuToHandle.get(slugToSku.get(slug));
  if (handle) redirects.push([path, `/products/${handle}`]);
  else review.push([path, "no matching product"]);
}
writeFileSync("redirects.csv", toCsv(redirects));
writeFileSync("review.csv", toCsv(review));
console.log(`${redirects.length - 1} redirects, ${review.length - 1} to review`);

Prefer a spreadsheet? Put old URLs in column A of Google Sheets and Shopify handles in column A of a sheet named Handles, then:

  • B2 (path): =REGEXEXTRACT(A2,"^https?://[^/]+(/[^?#]*)")
  • C2 (product slug): =IFERROR(REGEXEXTRACT(B2,"^/product/([^/]+)/?$"),"")
  • D2 (target): =IF(C2="","",IF(COUNTIF(Handles!A:A,C2),"/products/"&C2,"CHECK"))

Filter column D for blanks and CHECK. Those rows are your manual work.

The migration checklist

Before you build

  • Crawl the WooCommerce site and save titles, meta descriptions, H1s, canonicals and structured data for your top pages.
  • Export Search Console Performance data by page and by query, as far back as it goes. This is your baseline.
  • List your priority keywords and their current positions.
  • Note your permalink settings, especially any /shop/ base.
  • Decide keep, merge or drop for each URL.
  • Decide whether the domain stays the same. Search Console's Change of Address tool is only for moves between domains or subdomains.
  • List every system that reads or writes store data: ERP, inventory, email, accounting and feeds.

During the build

  • Import products, then customers, then order history. Turn off staff new-order notifications before importing orders.
  • Fix products with more than three options before import.
  • Compare Shopify handles with old slugs and keep them identical where you can.
  • Carry over SEO titles, meta descriptions and image alt text. Google recommends descriptive filenames, titles and alt text for images.
  • Check product structured data. Shopify's Liquid structured_data filter outputs a schema.org Product or ProductGroup for products and an Article for blog posts, but your theme decides whether it's used.
  • If you sell in several languages (for example with WPML or Polylang on WooCommerce), set up Shopify Markets subfolders and Translate & Adapt. Shopify generates hreflang tags and canonical URLs automatically, but translated URL handles have to be added manually for each language. Map old translated URLs to the translated Shopify ones.
  • Update links inside product descriptions and blog posts that still point to old WooCommerce URLs.
  • Reconnect integrations. If stock or orders sync with other systems, plan that as its own workstream. Our Shopify integrations service covers that.
  • Build and import the redirect CSV.

Launch day

  • Pick a plan and remove the storefront password. While it's on, Shopify hides every page from visitors and search engines.
  • Connect the domain and set it as primary.
  • Re-crawl your full old URL list. Each one should return a single 301 to a page that returns 200.
  • Submit Shopify's automatically generated sitemap.xml in Search Console.
  • If the domain changed, submit a Change of Address for the old site.
  • Place test orders and confirm purchase tracking fires. Our Thank you page tracking guide shows how.
  • Update Google Merchant Center, ad campaigns, email templates and social profile links.

The first 30 days

  • Check the Search Console Page indexing report every few days for Not found (404), Soft 404 and Redirect error. Add missing redirects, then click Validate fix.
  • Compare clicks and impressions per page against your baseline. Google says medium-sized sites can take a few weeks or more before the new URLs replace the old ones, and rankings may fluctuate in the meantime.
  • Track your priority keywords weekly. Look for pages that dropped and stayed down, not day-to-day noise.
  • Keep redirects in place. Google says generally at least one year, and recommends considering keeping them indefinitely for users.

When you can do this yourself

A small catalog, default permalinks, one language and no integrations is a realistic do-it-yourself project with the Store Migration app, CSVs and the template above. Bring in help when you have /shop/ URLs, several languages, a large order history, or systems that must keep syncing. Whoever you hire, check how they'll handle redirects and testing using our developer vetting checklist. After launch, ongoing Shopify maintenance can keep an eye on 404s and app changes.

Want help with your WooCommerce to Shopify migration?

We plan the URL map, move your products, customers, orders and content, and test every redirect before the domain switches. Tell us about your store through our WooCommerce to Shopify migration service and we'll scope the migration with you.

Sources

/Tags#Shopify#Migration#SEO

Written by

Webguru

Shopify Development Team

Webguru.pk is a Shopify development team in Lahore, Pakistan, building stores, custom apps and integrations for brands worldwide.

/Share

Need a hand with this?

We design, build and fix this kind of work for Shopify, SaaS and AI products.

/faqs

WooCommerce to Shopify Migration: Frequently Asked Questions

Usually not. Shopify puts products under /products/, collections under /collections/, pages under /pages/ and blog posts under /blogs/, and you can only edit the handle at the end of the URL. You can keep the same slugs as handles, then 301 redirect each old URL to its new address.

A CSV with two columns headed Redirect from and Redirect to, as in Shopify's sample template. Redirect from is the old path, and Redirect to is a relative path or a full URL. You import it under Content > Menus > View URL Redirects > Import.

Shopify only redirects from broken URLs, so if the old path still loads a page, the redirect is ignored. Shopify also can't redirect URLs that begin with prefixes such as /shop, /cart or /apps, and URLs with query strings might not work as expected.

No. Shopify says passwords are encrypted outside Shopify and can't be migrated with a CSV. With Shopify's new customer accounts, customers sign in with their email and a one-time 6-digit code, so they don't need a password.

Only if your domain or subdomain changes, for example from example.com to example.net. If you keep the same domain, you don't use it, but you still need 301 redirects and a new sitemap submitted in Search Console.

Google recommends keeping redirects for as long as possible, generally at least one year, and suggests considering keeping them indefinitely for users.

Moving from WooCommerce to Shopify? Keep your rankings.

We map every old URL, migrate your data and test each redirect before your domain switches.

or write to+44 7882 755642