Website Migration Checklist: Why Status Codes Aren't Enough
A website migration can pass a status check on every URL and still tell Google the wrong thing about almost every page. On the Sarelli Textiles move from WordPress to Laravel, every URL from the WordPress sitemaps answered with a 200 or a 301 while product and collection pages carried the wrong canonical tag. The five steps below come from that migration, and every seodima.com migration now runs them.
Step 1: Build the Complete URL Inventory
A migration's URL inventory has to be the complete list, never a sample, and it should merge the old XML sitemaps, the existing redirect rules, the URLs Google reports in Search Console, and the URLs that show up in the server logs.
On Sarelli, a first check of one sample URL per page type passed without a single error and still missed hundreds of broken addresses, which only the full list exposed.
Step 2: Sweep Every URL Against the New Build
The sweep requests every URL from the inventory on the new build and records its status code and redirect target, and on Sarelli the first full sweep found a large share of URLs that would have returned a 404.
The failures came in two groups. The first was collection pages nested several folders deep, which the new build had flattened to a single level. The second was localized information and download pages, including Arabic slugs with percent-encoded characters. A resolver for nested collection paths and exact captures of the localized pages fixed both groups, and the next sweep came back with every URL answering 200 or 301.
Step 3: Diff Every Page Head, Not Just the Status
A 200 status says nothing about what the page tells Google, so the third step compares the head of every URL on the new build with a capture from the live site: canonical tag, title, meta description, hreflang links, robots directives, and structured data identifiers.
On Sarelli, the new templates rebuilt the visible content correctly but never rewrote the head. Product pages pointed their canonical tags at a single product, and collection pages carried another collection's title and canonical. Left in place, the canonicals would have asked Google to fold thousands of product URLs into one. A head rewrite based on a verbatim capture of the WordPress heads fixed the canonicals, titles, and descriptions, and the next diff showed only the intended redirects.
The table below sums up what each check found on Sarelli and what it would have let through on its own.
| Check | What it found | What it would have missed |
|---|---|---|
| Sample check, one URL per page type | Nothing; every page type loaded | Hundreds of broken addresses |
| Full status sweep | Flattened collection paths and broken localized pages | Wrong canonicals and titles on pages that loaded fine |
| Head diff against the capture | Wrong canonicals, titles, descriptions, and page language | Only the intended redirects remained |
Step 4: Switch Over and Re-Run Everything on the Live Site
The same sweep and head diff run again on the live site right after the switch-over, because CDN caches, server configs, and environment settings differ from staging in ways a staging test can't show.
Sarelli's final switch-over re-ran the full sweep on production: every URL answered with its page or its intended redirect, and none returned a 404 or a server error. Sampled canonical tags matched the WordPress originals, including requests through Cloudflare, and the old server configuration stayed on disk as a one-command rollback.
Step 5: Watch Search Console After Launch
Search Console shows a migration's real result over the following weeks, through the Page indexing report, the Crawl stats report, and clicks compared year over year rather than against the weeks around the switch.
Other changes made in the same months, such as new content or a redesign, muddy any before-and-after comparison, so a migration report should say what else changed on the site instead of crediting every shift in traffic to the move.
Website Migration Checklist
The full website migration checklist fits on one screen, and each line is a check that passes or fails rather than a best practice to keep in mind.
- Merge the old sitemaps, redirect rules, Search Console URLs, and log URLs into one inventory.
- Capture the head of every live URL before the switch: canonical, title, description, hreflang, robots directives, and structured data IDs.
- Sweep every URL on the new build for status and redirect target, allowing one redirect hop at most.
- Diff every head against the capture and fix until only intended changes remain.
- Test non-Latin and percent-encoded slugs and trailing-slash variants explicitly.
- Keep a rollback that takes one command.
- Re-run the sweep and the head diff on the live site after the switch, through the CDN.
- Watch Page indexing, Crawl stats, and year-over-year clicks for the following weeks.
The checklist is the core of website migration SEO at seodima.com, and the Sarelli project is written up with the other technical SEO case studies.
Need This Checked on Your Website?
Send your website address and the problem you see, and Dmytro Verzhykovskyi replies personally with a written assessment, a recommended scope, and a fixed price, with no obligation.