← All writing
· 2 min read

Notes from a migration that went sideways

A site move that should have been routine, the three things that broke, and the boring checklist I now refuse to skip.

seo

Replatforming a site is supposed to be a solved problem. You map the old URLs to the new ones, you 301 everything, you watch Search Console for a fortnight, and traffic lands roughly where it started. That’s the theory. This one lost 30% of organic sessions in nine days, and clawing it back taught me more than a dozen clean migrations ever did.

Here’s what actually happened, and the checklist I now run before anyone touches DNS.

What broke

Three failures, in order of how long each took to notice:

  • Redirect chains, not redirects. The old CMS already had a layer of /produkt//products/ rewrites. The new one added its own. Google was following three hops to reach a page, and for a chunk of the catalogue it simply stopped.
  • Canonical tags pointing at staging. The build shipped with <link rel="canonical"> still aimed at the staging. subdomain. Every page was politely telling Google it was a copy of a URL that returned 404 in production.
  • A noindex that outlived its purpose. Left over from the pre-launch environment. One line in a shared header template. It took the site down from search faster than anything else on this list.

None of these show up in a spot check of the homepage. All three show up immediately in a full crawl. Guess which one we did first.

The checklist I don’t skip anymore

I run this the morning of the switch and again 24 hours after:

  1. Crawl the new site fully, filter for anything that isn’t a 200.
  2. Crawl the old URL list against production — every one should 301 in a single hop to a live page.
  3. Grep the rendered HTML for staging, noindex, and canonical — three strings, thirty seconds, saves a fortnight.
  4. Confirm the sitemap lists new URLs only, and resubmit it.
  5. Diff Search Console coverage daily for two weeks. Don’t wait for traffic to tell you — coverage moves first.

What I’d tell past me

The migration didn’t fail because it was hard. It failed because “it’s routine” became permission to skip the crawl. The recovery was fast once we looked properly — most of it came back within three weeks — but the fastest fix is the one you never need because you checked the rendered HTML before you cut over.

Boring checklists are boring precisely because they work. Skip them and the excitement comes back.