A migration is any change that alters URLs, rendering or domain: redesigns, CMS or framework swaps, domain changes, HTTP to HTTPS, consolidating sites. It is the highest-stakes routine operation in SEO. Done well, traffic dips slightly for a few weeks; done badly, years of accumulated equity evaporate in a deploy. The difference is process.
The iron rules#
- Every old URL gets a response plan. Redirect (301 or 308) to its closest equivalent, or a deliberate 410. No mass 404s, no "the homepage will catch it."
- Redirect to equivalents, not the homepage. Blanket homepage redirects are treated as soft 404s, so equity evaporates anyway.
- One change at a time when possible. Domain + design + platform + content all at once means when traffic drops, you cannot isolate why.
- Measure before, so you can verify after.
Phase 1: Inventory (before anything else)#
Build the complete list of URLs that matter from a full crawl, Search Console (everything with impressions in the last 16 months), analytics (everything with sessions), sitemaps and your backlink tool (everything with external links). Union these; the result is your migration universe. For each URL, record current clicks, conversions and linking domains. That is your baseline and your prioritization weight.
Also record the non-URL settings that tend to get lost: robots.txt rules (including AI crawler rules), CDN bot settings, hreflang, structured data, and Search Console settings such as the Search generative AI control.
Phase 2: The redirect map#
A spreadsheet (or generated file) mapping every old URL to its new home:
old_url,new_url,type
/blog/2019/05/seo-tips,/guides/seo-basics,301
/products.php?id=42,/products/ergo-chair,301
/old-category/,/new-category/,301
/discontinued-thing,(410 gone),410Rules of thumb:
- Pattern-redirect where structure allows (
/blog/:year/:month/:slug → /guides/:slug), and itemize the exceptions. - No chains: old → new directly, including fixing existing old redirects to point at the final destination.
- Equivalence by intent: the new URL should satisfy the same query.
In Next.js, bulk redirects live in config:
async redirects() {
return [
{ source: "/blog/:year/:month/:slug", destination: "/guides/:slug", permanent: true },
{ source: "/products.php", destination: "/products", permanent: true },
];
},permanent: true sends a 308, which Google treats like a 301. For very large maps, look the redirect up at the edge or in Next.js's proxy (formerly middleware) from a key-value store rather than shipping thousands of static entries.
Phase 3: Pre-launch on staging#
Audit the new site as if it were a stranger's (audit playbook): crawl it, verify titles, canonicals, structured data and rendered content against production. Then test the redirect map against staging with a script: fetch every old URL and assert a one-hop 301 or 308 to the mapped target.
Phase 4: Launch day#
□ robots.txt correct on production (no staging disallow!)
□ noindex absent from production templates
□ CDN/WAF bot rules carried over (search and AI search bots allowed)
□ Redirect map live: spot-check top-100 old URLs
□ New sitemap submitted in Search Console; old sitemap left up briefly
(it helps engines discover the redirects faster)
□ Domain change? → Change of Address tool for EVERY variant
(www and non-www), plus Bing Webmaster Tools Site Move
□ Canonicals point to new URLs (not old, not staging)
□ Analytics + Search Console verified on the new property
□ Annotation added on the Search Console chart for launch day
□ Internal links updated to final URLs (not riding redirects)Phase 5: Monitor and stabilize#
Expect temporary flux, from days to a few weeks, while engines reprocess. Google's canonicalization docs (July 2026) note it may hold pages in a duplicate cluster for up to two weeks after fixes. Watch daily at first:
- Search Console Page indexing on both properties: old URLs should drain as "Page with redirect", new ones fill the index.
- Crawl stats: a spike is normal (Google revisiting everything); sustained 404 spikes are your gaps. Patch the redirect map as they surface.
- Traffic by section vs your Phase 1 baseline: section-level losses point at section-level mistakes (a template's canonical, a missed pattern).
- Server logs: Googlebot hitting old URLs and getting anything other than a 301 means more work.
Keep redirects live for as long as possible: Google's site move guidance says generally at least a year, and link equity keeps flowing through them for as long as external links point at old URLs. Judge success at +90 days against pre-migration clicks and conversions, not against the post-launch dip.
Next: E-commerce SEO, where migrations, faceted navigation and product data meet.