In brief
- A migration plan should give the count of everything that moves, a decision for every plugin that matters, the number of redirects, a timeline, what is excluded and one fixed price.
- A QA report puts the old store's counts next to the new store's and explains every difference. An unexplained gap is a defect, not a rounding error.
- The scan sizes the job; the plan corrects it. In this sample the connected scan found 3,207 German URLs the public scan could not see, which doubled the redirect count.
The migration plan
This is what you get within one business day of a scan and, where needed, a read-only connection to your store. Nothing in it is a range or an "up to".
1 · What moves connected scan, 29 Sep
| Data | Count | Becomes on Shopify |
|---|---|---|
| Products | 2,840 | Products. 2,791 published, 49 drafts kept as drafts. |
| Variations | 16,470 | Variants. 57 products need restructuring (section 3). |
| Product images | 11,360 | Product media, with alt text. |
| Categories | 46 | Collections. The 31 nested ones become a nested menu, because Shopify collections are flat. |
| Custom fields (ACF) | 14 | 12 metafield definitions and one metaobject for the size chart. How |
| Customers | 18,406 | Customers, with email marketing consent as recorded. |
| Orders | 41,230 | Order history since March 2020, linked to customers by email. |
| Active subscriptions | 612 | Shopify Subscriptions contracts, Stripe cards attached, same price and next billing date. |
| Reviews | 7,945 | Judge.me. 64 star-only reviews cannot be imported (section 2). |
| Gift cards with a balance | 138 | Shopify gift cards with the same codes and balances. |
| Active coupons | 64 | Discount codes. |
| Pages and posts | 207 | 23 pages and 184 blog posts, with SEO fields. |
| German translations | 3,047 | Imported through Translate & Adapt under /de/. |
2 · Plugin decisions
| On WooCommerce | On Shopify | Why, and what to know |
|---|---|---|
| WooCommerce Subscriptions | Shopify Subscriptions | Free, by Shopify. Stripe customer IDs are attached, so nobody re-enters a card. Details |
| WPML | Shopify languages + Translate & Adapt | German moves to /de/. Product tags cannot be translated on Shopify; 9 German-only tags are renamed. |
| Checkout Field Editor | Cart attributes | The "gift message" field moves to the cart page. Editing checkout itself needs Shopify Plus, which this store does not need. |
| Advanced Custom Fields | Metafields + 1 metaobject | Fabric, care and fit notes become filterable product data. |
| Customer Reviews (CusRev) | Judge.me | Judge.me needs text and a rating, so the 64 star-only reviews stay behind. Kept in the export you receive. |
| Yoast SEO | Shopify SEO fields | Titles and descriptions carried over for every product, collection, page and post. |
| Klaviyo | Klaviyo for Shopify | Reconnected. Flows keep working; their triggers are re-checked. |
| Stripe | Shopify Payments | Saved one-off cards do not transfer; subscription cards do. |
| WP Rocket | Nothing | Shopify serves the store from its own CDN and cache. |
3 · Products above Shopify's 3-option limit 57 products
- 31 products: Fit and Length merge into one option, such as "Slim / Long". Stock and prices per combination are kept.
- 18 products: split by Fit into two products each, linked as siblings. Each old URL redirects to the Regular fit product.
- 8 products: "Material" was set as a variation attribute but never changes price or stock. It becomes a metafield.
- 41 "Any size" variations are expanded into concrete sizes. Their shared stock is split as agreed with you on 30 Sep.
4 · Redirects 6,512 URLs
The public scan estimated 3,305 old URLs. The connected scan also found the German versions, which WPML serves under /de/, so the real number is 6,512. Every one gets a 301 to its new address and is tested before launch. How the URL map works
5 · Timeline 4 weeks
Launch avoids the 1st of the month, when 540 of the 612 subscriptions renew.
6 · Not included
- Your Shopify plan, Judge.me plan and any other app, paid directly to their providers.
- New product photography, copywriting or design beyond your current brand.
- Shopify's new-merchant promotions: a store built by a partner and transferred to you is not eligible.
7 · Price
The QA report
Three weeks later you receive this with the password to your preview store. It is the document you approve, or refuse, the work against.
1 · Reconciliation old store vs new store
+18: the 18 products split by Fit, as planned.
+142: the 41 "Any size" variations expanded into concrete sizes.
−23: these files already returned 404 on the old server. List attached; send replacements and we add them.
−35: records sharing an email address, merged because Shopify needs one email per customer. Each merge is listed.
−3: these customers' cards had already expired at Stripe. Names attached, so you can ask them for a new card.
−64: the star-only reviews from the plan, kept in your export.
Match same count. Explained differs for a stated reason. Your action needs a decision from you before launch.
2 · Redirects 6,512 tested
| URL type | Old URLs | 301 → 200 | Result |
|---|---|---|---|
| Products | 5,582 | 5,582 | Pass |
| Categories | 92 | 92 | Pass |
| Tag archives | 424 | 424 | Pass to filtered collections |
| Pages and posts | 414 | 414 | Pass |
| Total | 6,512 | 6,512 | No chains, no redirects to the home page |
3 · Checked by hand 50 random products
Price, compare-at price, SKU, stock, variant images and German title, compared field by field with the old store: 50 of 50 correct. The sample is drawn after the import, not chosen by us.
4 · Speed mobile Lighthouse, median of 3 runs
Your report shows your measured numbers, whatever they turn out to be. Apps you add after launch change them.
5 · Open before approval
- Contact the 3 subscribers with expired cards (list attached).
- Approve the German menu labels.
- Confirm Tuesday 20 Oct for launch.
How to read them, even if they are not ours
Use these two documents as a yardstick for any migration offer, including ours. A few things separate a plan you can hold someone to from a sales page.
- Counts, not categories. "We migrate your products and customers" says nothing. 2,840 products and 18,406 customers can be checked later.
- A decision for every plugin. Each plugin either has a replacement, is not needed, or leaves something behind. The last kind should be named before you sign, like the 64 star-only reviews here.
- Redirects counted per language. Multilingual stores have a URL per language. If the redirect count matches the product count, the plan has missed something.
- Every difference explained. Customer counts almost always drop, because Shopify requires one customer per email address. A report that shows a perfect match everywhere on a large store deserves a second look.
- Payment after the report. If the money is due before you can see the result, the QA report is decoration.
Our migration terms say what you can hold us to, and the 48-step checklist covers the same ground if you run the move yourself.
Want this for your store?
- Free scan in about 20 seconds
- A written plan within one business day
- One fixed price, valid 30 days
- QA report before you pay
- 30 days of fixes after launch
- Say no at any point, owe nothing
Frequently asked questions
What should a Shopify migration plan include?
The count of every data type that moves, a decision for every plugin that matters, how products above Shopify's three-option limit are restructured, the number of URLs that need a 301 redirect, a timeline, what is not included, and one fixed price.
What is a migration QA report?
A reconciliation of the old store against the new one: the count of each data type on both sides, with every difference explained, plus redirect tests, hand-checked samples and speed measurements. It is what you check before approving the new store.
Why can customer counts differ after a migration to Shopify?
Shopify requires each customer to have a unique email address, so WooCommerce customer records that share an email are merged into one. A good QA report lists how many were merged and which ones.