Skip to content

Moving in from Shopify or WooCommerce

Bringing across your catalogue, your customers and your order history from your current shop, without losing the ranking you already had on Google.

It lives in Panel → Migration. Nothing needs configuring first.

Connect to your shop. Give it the address and a pair of read-only keys and it fetches everything by itself. This is what you want almost always: nothing to export, no files that come out half-finished, and it brings what a CSV cannot — orders, coupons, reviews.

Upload a CSV. For anyone who can’t or won’t hand over keys to their shop, and for platforms we don’t cover yet. It brings products and customers.

The “Try it first” switch is on, and it’s worth leaving on: it brings 20 of each thing so you can see how your catalogue looks here before you bring twenty thousand.

Look at it, and if you’re happy, undo the trial and run the whole thing. Undoing a trial of twenty products is one button; undoing a full migration pointed at the wrong shop is one button too, but half an hour later and with your heart in your mouth.

The address is the one ending in .myshopify.com, not your pretty domain: the API only understands that one.

The token comes from a private app with read access to:

Scope What for
read_products catalogue, variants, collections
read_inventory weight — yes, weight lives in inventory
read_customers customers
read_orders order history

🔴 Without read_inventory the whole catalogue arrives with no weights at all, and no error. Shopify moved weight off the variant in 2024 and put it on the inventory item, which needs a different scope. A catalogue with no weights charges every shipment at the base rate. If it happens we tell you at the end — but it’s cheaper to grant it up front.

WooCommerce → Settings → Advanced → REST API → Create key, with read permission. You get a key (ck_…) and a secret (cs_…).

If your hosting swallows the authentication header — plenty of Apache setups do — we detect it, retry another way and tell you, rather than fixing it behind your back.

Shopify WooCommerce CSV
Products, variants, prices, stock
Images (rehosted on your shop)
Categories and collections
SEO title and description
Custom fields
Customers and addresses
Order history
Coupons
Reviews
Blog posts

And always, with any of the three: the redirect map.

SEO: the part almost nobody takes with them

Section titled “SEO: the part almost nobody takes with them”

The SEO title is not the product title. On the page it reads “T-shirt”; on Google it needs to read “Organic cotton t-shirt | My Shop”. If you’ve spent years writing those, they’re part of why people find you.

It comes from Shopify’s own columns and, on WooCommerce, from Yoast or Rank Math — the two that between them cover almost all of WordPress. With another plugin you lose nothing you had: there simply isn’t any.

More than half of the shops that change platform lose Google traffic, and it’s almost never a penalty: it’s old URLs that stop existing without saying where they went.

We generate one permanent redirect per old URL, one to one. Sending everything to the home page doesn’t count: to Google that’s an error page in disguise.

It includes Shopify’s collection-nested URLs (/collections/clothing/products/t-shirt), which are half the product traffic of a Shopify shop and the ones everyone forgets.

It comes out in four formats — nginx, Apache, JSON and CSV — and you can download it before importing anything, which is when you need it: before you touch the DNS.

It only covers products. Static pages and filtered URLs you had indexed are not in there: pull those from Search Console and add them by hand.

An order from two years ago comes in as history. It doesn’t move stock, doesn’t charge anything, doesn’t send a single email and doesn’t award points.

That isn’t a technical detail: a thousand migrated orders moving stock leave your catalogue sold out before you open, and a “your order is on its way” to a customer from 2024 is the worst possible first impression for a shop that has just been born.

  • With its original date. With today’s, your sales reports lie and your returns window reopens for the entire catalogue at once.
  • With its number, if you ask. The new shop’s numbering is pushed above it so your first real order doesn’t collide with one from two years ago.
  • Linked to its customer and its products, so it shows up under “my orders” and you can refund what sold before the switch.
  • A line for a product you no longer sell still comes in, with its title, SKU and price. That’s what you need to help whoever is asking.

The status is translated to pending, completed or cancelled, and the original is kept as it was — Shopify splits status across two fields and WooCommerce merges both into one, so any translation loses something.

They come across with their code, their discount, their usage limit and how many times they’ve already been used — without that, a hundred-use coupon spent ninety-seven times arrives with a hundred left.

An expired one comes across too, but switched off: that way anyone holding it gets “this has expired” instead of “this doesn’t exist”, and the old orders that used it can still be explained.

🔴 The conditions don’t travel yet. Minimum spend, product or category restrictions, email restrictions, “can’t be combined”… none of that comes across, and a coupon without its condition discounts where it shouldn’t. You get the list with each code on it, so you can check them before you advertise them.

Reviews don’t go back into moderation. They already went through it on your old shop; putting eight hundred back in the queue means re-checking by hand what was already checked, and what actually happens is that nobody does it and your product pages end up with none. Whatever you marked as spam or binned stays behind.

From the blog you get published posts, not drafts. The blog belongs to WordPress, not WooCommerce, and WooCommerce keys don’t authenticate its routes. Posts come with their cover image, their byline and their publication date.

Shopify’s automated collections come across frozen. An automated collection is a rule (“everything under £20”) that Shopify re-evaluates by itself. Here it arrives with the products it held on moving day, as a normal category: it works the same on day one and stops updating itself. We tell you which ones, by name.

You see the stages, not a percentage: when something is slow, what you need to know is what is slow. You can pause it and carry on later.

Problems appear at the top, in two blocks: what didn’t come in and what did come in but is worth a look. They’re deliberately not tucked behind a disclosure — a migration that finishes “fine” with twelve warnings is one you need to review before opening.

Undo removes what that migration brought and tells you what it couldn’t undo. Staying quiet about that would be worse than not offering it.

Days pass between the migration and the DNS switch, and your old shop keeps selling. Run it again and it brings only what’s new: what’s already here is recognised and updated, not duplicated. Not the products, not the customers, not the history.

Run it as many times as you like.

  • The price that comes across is the one the customer pays, not the struck-through one. Bringing the old price would sell dearer than your original shop.
  • Weight converts itself to the shop’s unit, whether it arrives in kilos, pounds, grams or ounces. Mistaking pounds for kilos inflates every shipment by 120%.
  • Anything hidden comes in as a draft. Archived products on Shopify too: publishing them would reopen something you closed on purpose.
  • Passwords don’t travel. What Shopify and WooCommerce store are hashes from their own algorithm. Your customers come in as records and create their account with the same email next time they buy. Tell them before you open, or you find out through their messages.
  • Email consent is copied, never assumed. Only someone who said so explicitly comes in subscribed; blank or odd is a no, and if an email appears twice the no wins. The GDPR asks for an affirmative act, and “they were already on my list” is not a legal basis.
  • Barcodes are unique across the whole shop. If your export repeats one, the first keeps it and the rest are left blank — rather than losing the product altogether. We tell you how many.
  • Check your taxes before you open. Every platform stores VAT its own way: look at whether your prices include tax.

Connecting has no size limit: the job runs in the background, can be paused and resumes where it left off if something is cut. On Shopify a full export is requested and we wait for it to be prepared, which on a large catalogue is minutes.

With CSV the file limit is 25 MB. If your catalogue is bigger, split it: since nothing gets duplicated, you can upload the parts one after another.

  • Variant-level custom fields on Shopify. Product-level ones do.
  • Coupon conditions (see above).
  • Static pages and navigation menus.
  • Shipping zones and rates, and tax classes.
  • WordPress blog drafts.