E-commerce
WooCommerce to Shopify: eight gotchas after the cutover
Every WooCommerce to Shopify migration looks finished at the cutover. The bill comes due the morning after. Here are the eight things that wake you up at 3am.

At 02:17 the DNS TTL on the old A record finally times out, and the new Shopify storefront becomes the canonical truth. The staging cart had passed every test. The redirect map looked complete in the spreadsheet. The team went to bed. By 09:00 the support inbox has 312 password-reset requests, the finance lead is asking why order numbers restarted at #1001, and Search Console is shouting about 404s on URLs nobody has thought about since 2019.
This is the part of a WooCommerce to Shopify migration nobody writes about. The cutover itself is boring. The week after is where the bill comes due. What follows is a field guide to the eight things that go wrong after the cutover, ranked by how many nights of sleep each one cost a real team. We have done this migration more than a dozen times across furniture, supplements, and B2B parts. The order below is the order of pain.
1. The password reset flood
WooCommerce stores customer passwords as phpass hashes (the same scheme WordPress uses). Shopify uses bcrypt and will not accept a phpass hash on the standard customer import. Every returning customer wakes up logged out and unable to sign in. They click "forgot password" and your transactional email stack, which is also new and probably warming up, melts.
The fix is not technical, it is a comms plan. Before cutover, queue a "we moved, here is a one-click magic link" email to every customer with a recent order. Stagger sends by region to spread the support load. After cutover, replace the default Shopify password reset email with one that explains the move in two sentences, in plain language. Pre-write three macros for your support tool: "I moved my account but my order is missing," "the magic link expired," "I never got the email." You will need all three on Tuesday.
2. The redirect map that wasn't a map
Most teams export a redirect map by crawling the old site, listing /shop/product-slug, mapping it to /products/handle, and feeling done. They miss four categories of URL every time.
- Category and tag archives: /product-category/lighting/, /product-tag/oak/.
- Paginated archives: /shop/page/4/.
- Old blog post URLs that linked to products that no longer exist.
- UTM-laden ad URLs that customer service still pastes into emails.
Shopify's URL Redirects tool accepts a CSV but caps each line at a single source-to-target pair, no wildcards. You will end up with a 4,000-row file. Generate it, do not type it. Crawl the old site with Screaming Frog or Sitebulb before the DNS flip, export every internal URL, then write a small script that maps each one to its Shopify equivalent and writes "/" for anything you cannot resolve. The "/" lines are not lazy. They are a deliberate choice to bounce orphaned traffic to the homepage rather than serve a 404 that Google will then index.
Do not redirect old product URLs to category pages "because they are similar." Google treats that as a soft 404 within six weeks and you lose the link equity you migrated to capture.
3. EU VAT and OSS quietly sliding out of compliance
If you ship to EU consumers, you are on the One Stop Shop scheme and your old WooCommerce stack probably had a VAT plugin doing the math. Shopify Tax handles this differently. The rate tables are correct, but the threshold logic and the way Shopify treats B2B reverse-charge invoices is not the same as the WooCommerce EU VAT Number extension.
The trap: Shopify will happily charge 21% Dutch VAT to a German B2B customer with a valid VAT ID, because the tax exemption rules need to be configured per-customer or per-market. Until you tell Shopify, every cross-border B2B order is wrong. Audit the first ten such orders by hand. If the VAT line is wrong you are not only damaging customer trust, you are filing an incorrect OSS return three months later and explaining it to your accountant.
4. Subscriptions you forgot were subscriptions
WooCommerce Subscriptions sits on top of WC and ties recurring billing to the customer's saved payment method. None of that maps to Shopify cleanly. The new store needs a subscription app (Recharge, Bold, Skio, or Shopify's native Subscriptions API). The bigger problem is the payment vault: moving recurring tokens from your old gateway into the new one usually requires the customer to re-authorise.
Build a spreadsheet before cutover with every active subscription, its next billing date, its frequency, and its product. Treat the first billing cycle after cutover as manual. Email each subscriber a heads-up the day before their next charge, with a one-click link to confirm their card on the new store. Skipping this step turns a 5% involuntary churn rate into 25% in the first month.
5. Transactional email landing in spam
Your old store sent through WP Mail SMTP or a Postmark or SendGrid plugin. The sending domain had DKIM and SPF records pointed at that provider. Shopify sends transactional email through its own infrastructure, and unless you set up the sender authentication CNAMEs before the first order, the password reset and order confirmation emails go straight to Gmail's Promotions tab or worse.
Add the Shopify CNAMEs at least 48 hours before cutover, not the night before. DNS propagation plus DMARC reporting lag means you do not actually know whether your mail is landing in the inbox for another day after that. Watch the postmaster.google.com dashboard for the first two weeks and treat any dip in inbox placement as a P1.
6. Gift card balances stranded on the old database
Gift cards are the migration item nobody puts on the spreadsheet because nobody thinks about them until a customer emails. WooCommerce stores balances in a custom table (or in postmeta if you used the YITH plugin or Smart Coupons). Shopify has its own gift card object with its own code format. There is no native bridge.
Two options. One: export every outstanding gift card balance, issue a new Shopify gift card with the same balance and a new code, then email the customer the new code with an apology. Two: build a small support workflow where customer service manually issues a Shopify gift card on demand when a customer presents an old code. We have done both. The first is more work upfront and zero work after. The second is one Slack message per claim, forever. Pick deliberately.
7. Shipping rules that almost worked
WooCommerce shipping zones are arbitrary. You can have a 4kg-to-5kg tier that costs €12.50 for the Benelux on Tuesdays, layered on top of a table rate plugin and a free-shipping-over-€75 rule and a carrier-calculated PostNL fallback. Shopify shipping zones are simpler, which sounds good until you realise your real rate card was three plugins stitched together.
Before cutover, dump the last 90 days of orders with their shipping cost charged and shipping cost paid to the carrier. After cutover, re-run the same orders through the new Shopify rates and compare. If the new rates are systematically higher, you are undercharging customers and losing carts at checkout. If lower, you are leaving margin on the table. Either way you find out before the customer does, which is the entire point.
8. Order ID sequence breaking your accounting integration
Shopify orders start at #1001 by default. Your bookkeeping software, your ERP, your Exact Online or Moneybird or Yuki connector, all expect order numbers to continue from where WooCommerce left off (for example #38914). They will not. Some integrations silently skip "missing" orders. Others throw duplicate-key errors and stall the nightly sync. Finance will not notice for two weeks because the totals still roughly match.
Shopify lets you set the starting order number once, before the first order is placed, in Settings > Checkout. Set it to one above the last WooCommerce order number. Confirm the accounting integration picks up the first new order before celebrating. This is a five-minute fix that becomes a four-day forensic reconciliation if you skip it.
The cutover is not the migration. The week after is the migration. Everything you forgot becomes a support ticket between Tuesday morning and Friday afternoon.
The honourable mentions
A few smaller items that have stolen sleep but did not crack the top eight. Product reviews stored in WooCommerce's native reviews table do not import into Shopify Product Reviews or Judge.me automatically; you need a CSV export and a CSV import, and the star ratings sometimes flatten to 5 if the field name does not match. Customer wishlists, almost always plugin-driven on WC, are usually a write-off; tell customers and offer a discount on a re-build. Wholesale pricing tiers from B2B for WooCommerce need a Shopify B2B catalog rebuild from scratch. None of these will wake you at 03:00, but each one costs a Tuesday.
The pre-cutover trick that actually helps
The most useful thing we ever did on a migration was running the new Shopify store in parallel for two weeks under a staging subdomain, with a small percentage of real customers routed to it via a feature flag at the WP level. That caught the password issue (we sent magic links), the email deliverability issue (we warmed the sending domain), and the subscription issue (we rebuilt the recurring schedule by hand) before they became a 312-ticket morning.
When we ran a migration for a Rotterdam home-furnishings retailer last autumn, the one thing that surprised everyone was the order-ID gap. We had every other item covered. The accounting team was on holiday during cutover week and the Exact Online sync silently failed for nine days. That kind of detail is why we keep the eight-point list above pinned to the wall, and why we usually wrap a legacy migration with two weeks of paid hand-holding rather than calling it done at DNS flip.
If you are migrating in the next quarter, the cheapest thing you can do today is run Screaming Frog on your current store, export every internal URL to a CSV, and start the redirect map. You will not regret having the file ready, and the act of building it will surface three other problems before they bite.
Key takeaway
The cutover is not the migration. The week after is the migration, and the password reset flood is the first bill that lands.
FAQ
Can I import customer passwords from WooCommerce to Shopify?
No. WooCommerce uses phpass hashes and Shopify uses bcrypt. Every returning customer needs to reset their password or sign in via a magic link emailed before or after cutover.
Will my old product URLs redirect to the new Shopify ones automatically?
No. Shopify only auto-redirects when you rename a handle inside Shopify. WooCommerce permalinks need a manually built CSV in Shopify's URL Redirects tool, including category and tag archives.
What happens to recurring subscriptions when I move from WooCommerce to Shopify?
They do not transfer. You need a Shopify subscription app and, in most cases, a re-authorisation from the customer because the payment token cannot be moved across processors.
Why did my accounting integration break after cutover?
Shopify starts orders at #1001 by default. Most accounting connectors expect sequential numbering. Set the Shopify starting order number to one above the last WooCommerce one before any order is placed.