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.
Two ways in
Section titled “Two ways in”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.
Start with the trial
Section titled “Start with the trial”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 keys you need
Section titled “The keys you need”Shopify
Section titled “Shopify”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_inventorythe 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
Section titled “WooCommerce”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.
What comes across
Section titled “What comes across”| 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.
Redirects: the other half of the job
Section titled “Redirects: the other half of the job”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.
Orders are archived, not replayed
Section titled “Orders are archived, not replayed”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.
Coupons
Section titled “Coupons”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, blog and collections
Section titled “Reviews, blog and collections”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.
While it runs
Section titled “While it runs”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.
Running it again
Section titled “Running it again”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.
Things that save you a bad afternoon
Section titled “Things that save you a bad afternoon”- 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.
Large catalogues
Section titled “Large catalogues”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.
What doesn’t come across yet
Section titled “What doesn’t come across yet”- 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.