Skip to content
← All tutorials
05Tutorial / Migrations

How to migrate a website without losing search traffic

A stage by stage walk through a site move, from scoping it to closing it 90 days after launch: what to do, in what order, on which day, and with which files.

Written for
Business owners, marketers and project leads running a redesign, replatform, domain change or merger
You finish with
A launched site with every valuable old URL redirected, its indexing confirmed in Search Console, and a closing report that shows what moved and what is left to fix.
stages
7stages
tasks
75tasks
tools
2tools
to read
57 minto read

Some experience · Takes 8 to 16 weeks of preparation, then 90 days of monitoring
By Mani Bharij · Updated 7 October 2026

Before you start

5 things to have ready
  1. 01Admin access to Search Console for the current site, and to the DNS for every domain involved, old and new.
  2. 02Access to analytics with at least a year of organic landing page data, and someone who can export from the current CMS.
  3. 03A crawler that can crawl a list of URLs, crawl behind a password and render JavaScript, such as Screaming Frog's SEO Spider (licensed, for sites over 500 URLs) or Sitebulb.
  4. 04A named developer who will build the redirects and be on hand for launch day and the week after it.
  5. 05A launch date that sits outside your busiest trading weeks, with room to move it.

A website migration is any change that makes search engines relearn a site that already ranks: a new domain, new URLs, a new platform, new templates, or two sites becoming one. The ways a migration loses traffic are well known: no benchmark, an incomplete redirect map, a staging block that went live, or nobody checking Search Console until the enquiries dried up. Nearly all of them come from steps that were skipped or done in the wrong order. This tutorial takes you through the work in order, from the first scoping meeting to the report you write once the move has settled.

It is written for the person who owns the project, whether or not there is an SEO on the team. If you are a business owner or project lead, it tells you what to ask for, what files should exist at each point and what must be true before you let the site go live. If you are the SEO, it gives you an order of work and a set of checks you can hand to developers. It suits sites from a few hundred to tens of thousands of URLs. A very large site, with millions of URLs or many country sites, needs everything here plus engineering work on log analysis and phased releases that is beyond its scope.

There are seven stages. The first four happen before launch and take most of the time. The fifth is launch day. The last two cover the 90 days after it. Each stage ends with a checkpoint: the things you should have in hand before you move on. A running example follows the stages through: a hypothetical kitchen design and fitting company in Leeds that is merging its site with a sister bathroom business under a new brand. The background reading is the website migrations guide, and three posts go further on single parts of the job: how to build a redirect map, what to check in the first month after a migration and migrating to or from Shopify.

Stage 01 / 07Weeks 1 to 2

Scope the migration and agree who signs off on launch

Know exactly what is changing, how risky that combination is, when the launch can safely happen, and who has the authority to stop it.

Most migrations start as a design or technology project, and search is added later. By then the decisions that set the risk have often been made: the new platform, the URL pattern, the domain, the launch date. Start by writing down everything that will be different on launch day, because each change is a separate thing Google has to process.

List every change, including the ones nobody called a migration

Go through the list below with whoever is running the build. Ask about each item directly, because some changes arrive as side effects. A new CMS usually brings its own URL patterns. A new design often drops copy from category and service pages. A move to a hosted platform changes hosting and the CDN without anyone deciding to.

ChangeWhat it means in practiceGuidance to read
DomainEvery URL gets a new hostname, such as a rebrand from one .co.uk to another, or .co.uk to .comSite moves with URL changes1 and the Change of Address tool2
URL structurePaths change on the same domain: /services/kitchens.php becomes /kitchens/Site moves with URL changes1
Platform or CMSNew system, usually bringing new URLs, templates and markup at onceSite moves with URL changes, if any URL changes1
Design and templatesNavigation, internal links, headings and on-page copy changeNo separate guide. Change one thing at a time where you can1
Content cut or mergedPages retired or combinedSite moves with URL changes, on 404, 410 and redirects for removed content1
Hosting or CDNServers and DNS change, URLs stay the sameChanging your hosting3
JavaScript renderingContent and links built in the browser by a frameworkJavaScript SEO basics4
HTTP to HTTPSProtocol changes on every URLSite moves with URL changes1
Merging sitesTwo sets of URLs collapse into one siteSite moves with URL changes, applied to each old site1
International structureccTLDs, subdomains or folders change, and hreflang with themSite moves with URL changes, plus the hreflang documentation5
What can change in a migration, and which guide covers it

It helps to see a site as layers. A change high in the stack, such as the domain, gives every URL below it a new address. A change lower down, such as the templates, leaves the addresses alone but changes what Google finds at them. Mark which layers your project touches before you talk about dates.

Diagram

What can change at each layer of a site

  1. 01

    Domain

    The hostname every URL sits on. Changing it changes every address on the site.

    • example.net to example.com
    • Two domains merged into one
    • www to non-www
  2. 02

    DNS

    Where the domain points, and how long resolvers cache the answer.

    • DNS at the registrar
    • DNS at a CDN
    • TTL lowered before a switch
  3. 03

    Server and CDN

    The machines and network that answer requests, including firewall and bot rules.

    • Own server
    • Managed host
    • CDN in front of the origin
  4. 04

    Platform

    The CMS or framework that builds pages and decides URL patterns, redirects and robots.txt.

    • WordPress
    • Shopify
    • A hosted CMS
    • A JavaScript framework
  5. 05

    Templates

    Layouts, navigation, internal links and the markup each page type outputs.

    • Same templates
    • Redesign
    • New components
  6. 06

    URLs

    The paths on the domain.

    • /services/shaker-kitchens.php to /kitchens/shaker/
    • Blog dates removed from paths
  7. 07

    Content

    Copy, headings, images and files on each page.

    • Carried across as is
    • Merged
    • Retired
    • Rewritten after launch
Each layer can change on its own, and a migration is any combination of them. The examples are from the kitchen company in the running example.

Take out anything that can wait

The safest sequence is one change at a time, each planned after the last.1 Combining a move with a redesign of the content and URL structure will probably bring some traffic loss while Google relearns and reassesses the pages, and Google's own Change of Address help page says as much.2 Few businesses can do everything in sequence, but most can take one or two things out of launch day. The ones I would move first are a content rewrite (do it after the move has settled), a hosting change that can happen weeks before (a move where URLs stay the same follows a separate, lower-risk process3), and an HTTP to HTTPS switch that should have happened years ago anyway.

Size also affects how you launch. Small and medium sites are best moved all at once, while large sites can move one section at a time.1 Moving a section first lets you see how Google handles your redirects before the rest of the site depends on them, at the cost of running two structures side by side for a while.

Score the risk

Tick everything that changes in your migration in the tool below. It builds the checklist each change adds, grouped by phase, and gives an overall risk level. The kitchen company ticks domain, URL structure, platform, design, content being cut, hosting and merging two sites, which puts it at the top level. That is a fair reading: it is the riskiest kind of move most businesses make.

Tool / Checklist builder

Migration scope and checklist builder

What is changing in your migration?

Tick everything that applies to build your checklist.

Weights are practitioner judgement about how much each change adds to search risk. They are a planning aid and do not predict traffic.

Pick the launch window

Time the move for a period of lower traffic if you can.1 Use your own data: export organic sessions and conversions by week for the last two years and find the quietest stretch. Then work back from it. A launch date should have the full preparation time in front of it, and at least two working weeks after it with no other releases, no sales campaign and the developers who built the redirects still on the project. I would avoid launching on a Friday or before a holiday, because the first 48 hours are when a blocking fault does most damage and is cheapest to fix.

In the running example, say the kitchen company's enquiries peak from January to March and dip in late summer. The design agency proposed a launch in early February. The team moves it to the first week of September, which also gives two extra months for the merge.

The timeline below shows how the stages fit around a launch for a project like the kitchen company's, with about 12 weeks of preparation. A smaller project compresses the first four stages. The 90 days after launch compress much less, because they depend on how quickly Google recrawls the site.

Diagram

A migration from scoping to day 90

135791113151719212325
Go and no-go reviewLaunch dayDay 30Day 90
Week 1 to 2

Scope and sign-off

Stage 1: list the changes, score the risk, pick the launch window and agree the go and no-go criteria.

  • Scope and sign-off, week 1 to 2: Stage 1: list the changes, score the risk, pick the launch window and agree the go and no-go criteria.
  • Benchmark and inventory, week 2 to 4: Stage 2: crawl, exports, the protected list and the new Search Console property. Refreshed in launch week.
  • Redirect map and parity, week 3 to 8: Stage 3: map every old URL, check it for chains and loops, and record what each important page has.
  • Staging tests, week 9 to 11: Stage 4: test every redirect and template on a protected staging server.
  • Final snapshot and launch, week 12 to 12: Stage 5: content freeze, final exports, then the launch day sequence.
  • Daily checks, week 13 to 14: Stage 6: robots.txt, redirects, 404s, server errors and Search Console every day.
  • Weekly checks, week 15 to 16: Stage 6: Crawl Stats, indexing and clicks by template once a week to day 30.
  • Close and report, week 17 to 25: Stage 7: compare with the benchmark and last year, clean up, and write the closing report by day 90.
An example plan with 12 weeks of preparation. Stage numbers match the stages in this tutorial.

Make search a launch gate

Agree in writing, before the build starts, that the site does not go live until the search checks pass, and name the person who signs them off. Without that agreement, a launch date set by a marketing campaign or a contract end date tends to win. The checks are concrete, which makes them easy to agree to now and hard to argue with later.

CriterionMust be true before launch
Redirect mapEvery old URL with clicks, conversions or linking domains has a decision, and the full list has been tested on staging
Redirect testNo moved URL returns anything other than one 301 or 308 to its mapped URL, which returns 200
Content parityEvery page on the protected list has its copy, title, headings and structured data on the new template
DirectivesThe production robots.txt is written and reviewed, and no indexable template carries a noindex
TrackingAnalytics and conversion tracking fire on every template
PeopleThe developer who built the redirects is available for launch day and the following week
RollbackThe old site can be put back within hours if something structural fails
Go and no-go criteria to agree at the start (practitioner judgement)

Two documents make the agreement easier to reach: a short briefing for the people who approve the budget and the date, and the go and no-go checklist itself. An AI assistant can draft both from your details. The prompts below are written to stop it inventing figures or rules.

Prompt /ChatGPT, Claude or similar

Write the stakeholder briefing

You are helping a project lead explain the search risk of a website migration to senior colleagues who are not SEO specialists. Context: [the business, e.g. a kitchen design company in Leeds]. We are [describe the move: new domain, new platform, new design, merging two sites]. Organic search brings in [number] enquiries or sales a month, according to our analytics. Planned launch: [date]. Our quietest trading period is [months]. Task: write a one-page briefing of no more than 400 words that explains what is changing, why search traffic may fluctuate for a few weeks after launch, what we are doing to protect it, what we need from them (a launch date in a quiet period, developer time for two weeks after launch, and agreement that the search lead can stop the launch if the checks fail), and how we will report at 30 and 90 days. Rules: plain British English, explain any technical term in a few words, make no promises about rankings or traffic, and use no figures I have not given you. If you need a number you do not have, leave a [placeholder]. End with three questions colleagues are likely to ask, with short answers.

Fill in the parts in brackets before you send it

CheckReplace every placeholder with your own figures from analytics. Check that the draft does not promise traffic will hold: visibility can fluctuate during any move.
Prompt /ChatGPT, Claude or similar

Draft the go and no-go checklist

You are a technical SEO helping a project team prepare a website migration. Context: we are moving [old domain or domains] to [new domain] and changing [platform, URL structure, design, hosting: list what applies]. The site has about [number] URLs, and the most valuable pages are [page types, e.g. service pages and area pages]. Launch is planned for [date], and [name and role] signs off search. Task: write a go and no-go checklist for a launch review one week before go-live. Cover redirects, content parity, robots.txt and noindex, canonicals, XML sitemaps, analytics and conversion tracking, server capacity, rollback and staffing for launch week. Format: a table with the columns Criterion, Evidence that proves it (a file, report or test result), Owner, If it fails (delay launch, launch with a dated fix, or accept the risk). After the table, list anything you left out because it depends on details I have not given, and mark which criteria are your judgement and which come from Google's published site move guidance.

Fill in the parts in brackets before you send it

CheckCompare the draft with the go and no-go table above before you circulate it. Delete anything presented as a Google rule that you cannot find in Google's own documentation.
Tasks0 of 7 done
Stage 02 / 07Weeks 2 to 4, refreshed in launch week

Benchmark the old site and list every URL it has

Capture how the old site performs and every URL it has, in files you keep, before anything changes.

The benchmark serves two jobs. It is the record you compare against after launch, so you can tell normal movement from damage. It is also the raw material for the redirect map and the parity check. Both jobs fail if the data is gathered after the old site has started to change, and much of it cannot be gathered at all once the old site is switched off.

Set up the folder first

Make one shared folder for the migration with a dated subfolder for each export, for example 2026-06-15-benchmark. Every file in this stage goes there, unedited, with a short readme saying what each file is and how it was exported. Nobody overwrites anything. You will take a second snapshot in launch week, and you need both.

Crawl the old site and save everything

Run a full crawl of each old site with JavaScript rendering on, and save the crawl file itself as well as the exports. Export, for every URL: status code, title, meta description, H1, canonical, meta robots and X-Robots-Tag, hreflang, word count, inlinks, outlinks and structured data types. If your crawler can store the HTML of each page, turn that on for the templates that matter. When someone asks in October what the old service page said, the answer is in that file.

Set up the crawler

Two desktop crawlers are common for this work, and either will do. Screaming Frog's SEO Spider is free for up to 500 URLs. JavaScript rendering, saving and opening crawls, crawl configuration and the Search Console and analytics integrations need a paid licence.6 Sitebulb is the other common choice. Any crawler works if it can render JavaScript, crawl a list of URLs, log in to a protected site and save the crawl.

  • In Screaming Frog, open Configuration > Spider > Rendering and choose JavaScript, which renders each page in headless Chrome.7
  • Under Configuration > Spider > Extraction, tick Store HTML and Store rendered HTML, so the raw and rendered source of every page is saved to disk.7
  • Leave Configuration > Robots.txt on Respect robots.txt for the benchmark, which is the default, so the crawl sees what a search engine is allowed to see.7 Run a second crawl with Ignore robots.txt only if you need the blocked URLs in the inventory as well.
  • Screaming Frog saves crawls automatically in its default database storage mode, and File > Crawls reopens them.8 Keep a copy of the crawl in the benchmark folder too.
  • In Sitebulb, the site crawl and a URL list are both crawl sources in the audit settings, so you can add your sitemap URLs as an uploaded .csv or .txt list alongside the crawl.9

Collect old URLs from every source

No single source has every URL. Good starting points are your sitemaps, your server logs or analytics for the URLs with the most traffic, and your CMS.1 Include images and downloads such as PDFs, because they can have search traffic or links of their own.1 The website migrations guide sets out what each source adds and misses. Here is what to export from each, as files.

SourceExportNotes
CrawlerFull crawl file plus a CSV of every URL with the fields aboveCrawl again in launch week
XML sitemapsA copy of every sitemap file the old site serves, and any older ones you can findOld sitemaps list URLs nobody links to any more
Search ConsolePerformance by page, and by page and query, for the longest range availableThe interface export is capped. The Search Analytics API returns up to 25,000 rows per request and pages beyond that with startRow10
Search ConsolePage indexing report: indexed and not indexed counts with reasons, plus example URLsSo problems that already existed are not blamed on the move later11
Search ConsoleCrawl Stats: total requests, response codes and host statusIt covers the past 90 days only, so take a screenshot and an export now12
AnalyticsOrganic landing pages with sessions and conversions for the last 12 to 16 monthsInclude revenue or lead value where you track it
Backlink toolEvery linked-to URL on each old domain with its count of linking domainsDeep pages and PDFs with links are the ones most often missed
Server logsAt least a few weeks of requests, filtered to GooglebotShows URLs no other source has
CMSEvery published item with its URL and an ID that will survive the move, such as a SKU or post IDUsed for exact matching in the redirect map
Server or pluginEvery existing redirect ruleThese become rows in the new map, pointed at final URLs
Benchmark exports and the file to keep for each

Use a long date range for Search Console and analytics. Sixteen months of data lets you tell a real drop from one that happens every year.13 For a seasonal business that context is the only way to read the post-launch numbers fairly.

In Search Console, open the Performance report for search results, set the date filter to the last 16 months, and export the page data. In Google Analytics 4, select Reports, then Engagement > Landing page, and add the secondary dimension Session default channel group so you can separate organic search from other traffic. If the report is missing from the menu, an editor can add it back to the navigation.14 Export the results with key events (conversions) included, because a page that brings in few visits can still produce most of the enquiries.

Build the protected list

From the exports, build a short list of the URLs that matter most. Take the top pages by organic clicks, the top pages by conversions or revenue, and every page with more than a handful of linking domains, and combine them. Keep it short enough that a person can check every URL on it by hand. Every URL on the protected list gets hand-checked at every stage that follows: mapped by a person, compared for content on staging, tested by hand on launch day and reported on individually afterwards.

In the running example, say the kitchen site's protected list comes to 54 URLs: the homepage, 9 service pages, 12 area pages, 18 blog posts that bring in most of the organic clicks, 8 project case studies and 6 brochure PDFs that local sites link to. The bathroom site adds 21 more. The PDFs would not have appeared in a crawl at all, because the current design no longer links to them. They came from the backlink export.

Set up Search Console for the new site now

Verify both the old and new sites in Search Console, including all their variants, and review any settings you made for the old site.1 Do it in this stage. A Domain property covers every subdomain and protocol, and it can only be verified with a DNS record.15 Verifying the new domain weeks before launch means its property is ready on launch day, and that whoever controls DNS has already been found. The Crawl Stats report is only available for root-level properties, which is another reason to use Domain properties or root URL-prefix properties.12

Tasks0 of 12 done
Stage 03 / 07Weeks 3 to 8

Build the redirect map and the content parity check

Decide where every valuable old URL goes, and confirm that the pages it lands on keep the content and tags that earned its rankings.

This stage produces two spreadsheets. The redirect map says what every old URL should do on launch day. The parity check says whether each important page on the new site still has what the old page had. In my view these two sheets prevent more avoidable losses than anything else in the project.

The redirect map

The method is set out step by step in how to build a redirect map: exact matches from the CMS first, pattern rules for whole templates second, and a manual pass for every URL with traffic or links. Here are the rules the map has to follow, and the decisions you will have to make on the way.

  • One to one wherever an equivalent exists. Decide where each old URL should redirect to.1 A service page goes to the same service page, a case study to the same case study, a PDF to the same PDF on the new site.
  • The closest equivalent where the page has changed. Where several old pages have been merged into one, redirecting all of them to the merged page is fine.1 A discontinued service can go to the parent page that covers what replaced it.
  • Never mass-redirect to the homepage. Redirecting many old URLs to one irrelevant destination such as the homepage can confuse users, and Google may treat it as a soft 404.1 If there is no equivalent, return a 404 or 410.1 In the HTTP standard, a 410 means the page is gone and that this is likely to be permanent.16
  • Permanent, server-side redirects: a 301 or a 308.1 The HTTP standard defines both as a move to a new permanent URI. The difference is that a browser may turn a POST into a GET after a 301 but must not after a 308,16 which matters for forms and not for ordinary pages.17 Google's indexing pipeline uses a 301 or 308 as a signal that the target should be canonical, and does not treat a 302 or 307 that way.18 Bing's guidelines ask for 301s for permanent URL changes and keep 302s for changes of less than two days.19
  • No chains. Googlebot can follow up to 10 hops, but each old URL should redirect straight to its final destination.1 Add every existing redirect from the old site to the map and point it at the final new URL.
Diagram

Common migration shortcuts and where they stand

  • Redirecting each old page to its closest new equivalent with a 301 or 308

    The standard approach: each old URL mapped to its new one with a permanent server-side redirect.

    Fine to doFine to do
  • Redirecting several merged pages to the page that absorbed them

    Each old URL still lands on a page that covers its content.

    Fine to doFine to do
  • Returning 404 or 410 for pages with no equivalent

    The expected response for content you are not moving to the new site.

    Fine to doFine to do
  • Redirecting every old URL to the new homepage

    It can confuse users, and Google may treat it as a soft 404.

    A grey area: handle with careA grey area: handle with care
  • Using 302 redirects for pages that have moved for good

    Google follows a 302 but does not treat it as a signal that the new URL should be canonical.

    A grey area: handle with careA grey area: handle with care
  • Leaving old redirects to chain into the new ones

    Googlebot follows up to 10 hops, but the guidance is to redirect straight to the final URL.

    A grey area: handle with careA grey area: handle with care
  • Launching with the staging Disallow: / still in robots.txt

    Blocks that were only needed for the migration should come off at launch, and crawlers can cache robots.txt for up to a day.

    A grey area: handle with careA grey area: handle with care
  • Dropping the old domain and its redirects a month after launch

    The guidance is to keep the redirects, and keep paying for the old domain, for at least a year.

    A grey area: handle with careA grey area: handle with care
None of these breaks the law or a Google policy. The ones marked caution are shortcuts that search engine documentation advises against, and each one can cost rankings.

Use the template below as the starting sheet. The example rows are invented for the kitchen company and show the four cases you will meet most: an exact match, a pattern match, a manual match for a file with links, and a retired page. Delete them before you start.

Tool / Template

Redirect map template

AOld URLThe full old address, normalised: one protocol, one hostname, consistent trailing slash, tracking parameters removed.BNew URLThe single final destination, as a full URL. Leave blank for retired pages.CStatus code301 or 308 for moved pages, 404 or 410 for retired ones.DPage typeThe template: service, area, article, case study, PDF, campaign and so on. Used to write and check pattern rules.EClicks (last 12 months)Organic clicks from Search Console. Sets the review priority.FBacklinksCount of linking domains from your backlink tool. Finds deep pages with link value.GMatch typeExact, Pattern, Manual, Parent or Retire. Tells a reviewer how much to trust the row.HTestedWhat the server returned in the last test run: first status, final URL, final status and hop count.INotesWho decided and why, especially for Parent and Retire rows.
https://www.example.net/services/shaker-kitchens.phphttps://www.example.com/kitchens/shaker/301Service1,2406ExactStaging: 301 > 200, 1 hopMatched on CMS page ID. On the protected list.
https://www.example.net/blog/2021/03/planning-a-kitchen-layout/https://www.example.com/guides/planning-a-kitchen-layout/301Article8602PatternStaging: 301 > 200, 1 hopRule /blog/yyyy/mm/slug/ to /guides/slug/. Old site also had a redirect from /blog/?p=412 to this URL, now pointed straight at the new one.
https://www.example.net/downloads/brochure-2022.pdfhttps://www.example.com/brochures/kitchen-brochure.pdf301PDF354ManualStaging: 301 > 200, 1 hopNot in the crawl. Found in the backlink export. Linked from four local directories.
https://www.example.net/offers/spring-sale-2023/410Campaign00RetireStaging: 410Expired offer with no traffic or links and no equivalent page.

9 columns, 4 example rows to replace

One row per old URL. The example rows are hypothetical and use example domains. Fill in Tested from the staging and production test runs, never by hand.

Use an assistant for first-draft matches

For the manual pass, an AI assistant can suggest matches between two lists of URLs much faster than you can by eye. Treat its output as suggestions for a person to approve. Work in batches of a few hundred rows, include page titles as well as URLs, and check that the number of rows that comes back equals the number you sent.

Prompt /ChatGPT, Claude or similar

Match old URLs to new ones from two lists

You are a technical SEO building a redirect map for a website migration. I will paste two lists. List A is old URLs from [old domain], each with its page title. List B is new URLs from [new domain], each with its page title. Task: for every URL in List A, suggest the single best match in List B, judged on the topic and purpose of each page, using the titles as well as the words in the URL. If nothing in List B is a close match, write NO MATCH. Do not suggest the homepage unless the old URL is the old homepage. Format: a table with the columns Old URL, Suggested new URL, Confidence (high, medium or low), Reason (one short sentence). Return exactly one row for every URL in List A, in the same order, and give the row count at the end. If you cannot finish the whole list, say where you stopped. List A: [old URL, tab, page title, one per line] List B: [new URL, tab, page title, one per line]

Fill in the parts in brackets before you send it

CheckOpen both pages for every row on the protected list, and decide every medium and low confidence row yourself. Check the row count against what you pasted. A NO MATCH row still needs a decision: a parent page, a 404 or a 410.

Decisions that need a person

Merges and rebrands produce overlapping pages. In the running example both old sites have a Leeds showroom page, a finance page and an about page. For each pair, compare clicks, linking domains and copy, keep the stronger page as the base for the new one, bring across anything useful from the weaker one, and redirect both old URLs to the new page. Write the decision in the Notes column.

Blog archives are the other common argument. Cutting old posts with no clicks and no links is reasonable, and they can return 410. Posts with links but no successor are a judgement: if the subject still matters to the business, keep the post. Before cutting a group of posts, check the conversions column as well as clicks. A post that brings in few visits can still be the one that people read before they ask for a quote.

Check the map for chains and loops

Before the map goes to the developer, check it in the spreadsheet. Normalise trailing slashes and hostnames in both columns first, so the comparisons work. With Old URL in column A and New URL in column B, put =IF(COUNTIF(A:A,B2)>0,"Chain","") in a new column and fill it down. A flagged row points at a URL that itself redirects, so change its New URL to that row's destination. Then =IF(A2=B2,"Loop",IF(COUNTIFS(A:A,B2,B:B,A2)>0,"Loop","")) flags a row that points at itself, or two rows that point at each other. Fix every flagged row and run both formulas again until nothing is flagged.

Prompt /ChatGPT, Claude or similar

Check a redirect map for chains, loops and bad patterns

You are reviewing a redirect map for a website migration before it goes to the developer. I will paste it as CSV with the columns Old URL, New URL, Status code. Check every row for: (1) chains, where a New URL also appears in the Old URL column; (2) loops, where following the rows leads back to a URL already visited; (3) rows where Old URL and New URL are the same once a trailing slash is ignored; (4) many old URLs pointing at the homepage or at any one single URL; (5) moved rows with a status code other than 301 or 308, and rows with no New URL that are not 404 or 410; (6) New URLs that are not absolute, or that use a hostname other than [new domain]. Format: a table with the columns Row, Old URL, Problem, Suggested fix. Then the number of rows checked and a count for each problem type. Work only from the rows I paste and do not guess what the server does. If the list is too long to check every row, say so and tell me where you stopped. [paste the CSV]

Fill in the parts in brackets before you send it

CheckUse this as a second check after the spreadsheet formulas, and confirm the counts. Assistants can skip rows in a long paste. The test that counts is requesting every URL from the server in stage 4.

Decide where the redirects will live

The redirects have to run on whatever answers requests for the old URLs. For a domain change, the old domain must keep pointing at something that returns them, for at least a year. These are the common options, with short examples using the kitchen company's URLs. Each provider's documentation has the full syntax, and the platform, server or CDN you are on will usually decide it for you.

Diagram

Where to implement redirects

Pattern rulesWorks across domainsStatus code controlNo developer needed
Apache config or .htaccessRedirectMatch takes regular expressions. Plain Redirect defaults to a 302.
nginx configreturn and rewrite in the server block, and map with include for long lists.
Cloudflare Bulk RedirectsA static list at account level, with no regular expressions or query strings.
Shopify URL redirectsCSV import of Redirect from and Redirect to. Only works from URLs that return a 404.
WordPress Redirection pluginCSV import with an optional regex column, and a 404 log.

Weak Strong Best in the row

Practitioner judgement, based on each provider's documentation at the time of writing.
  • Apache. Redirect and RedirectMatch come from mod_alias, and with no status given Redirect sends a temporary 302, so always state one: Redirect 301 /services/shaker-kitchens.php https://www.example.com/kitchens/shaker/. A pattern rule reads RedirectMatch 301 ^/blog/[0-9]+/[0-9]+/(.+)$ https://www.example.com/guides/$1, and a retired page can return 410 with Redirect gone /offers/spring-sale-2023/. Apache applies these in the order they appear and the first match wins, so put one-to-one rules above patterns.20
  • nginx. One URL: location = /services/shaker-kitchens.php { return 301 https://www.example.com/kitchens/shaker/; }. A pattern: rewrite ^/blog/[0-9]+/[0-9]+/(.+)$ https://www.example.com/guides/$1 permanent;, where the permanent flag returns a 301.21 For hundreds of one-to-one rows, a map block can hold the list, loaded from a separate file with include, which keeps the server block short.22
  • Cloudflare Bulk Redirects. A large list of static redirects defined at account level, which can apply across the domains in the account, so it suits a domain change where the old domain stays on Cloudflare. It does not support regular expressions.23 The CSV columns are source URL, target URL and status code, then four optional settings, so a row reads www.example.net/services/shaker-kitchens.php,https://www.example.com/kitchens/shaker/,301,,,,.24 The status can be 301, 302, 307 or 308, and defaults to 301.25 In the dashboard, create a Bulk Redirect List, import the CSV, then create a Bulk Redirect Rule that uses the list and select Save and Deploy. A source URL cannot include a query string.26
  • Shopify. In the admin, go to Content > Menus > URL redirects, select Import, add the CSV with Redirect from and Redirect to columns, and import it. Shopify only redirects from broken URLs, so a page that still loads at the old path will not redirect, and a store can hold up to 100,000 redirects, or 20,000,000 on Plus.27 The paths it cannot redirect are covered in migrating to or from Shopify.
  • WordPress. The Redirection plugin is a common choice. It manages redirects, logs 404 errors, supports regular expressions, imports and exports CSV, and can create a redirect when a post's permalink changes.28 Its import takes source and target, with optional regex and HTTP code columns, for example /old-url/.*,/new-url,1,301.29 Several SEO plugins include redirect managers too. Whichever you use, check the status code the server sends.

If the new site is being built with an AI coding agent such as Claude Code or Cursor, the free Migrations skill in my skill pack is written for this step. It plans the redirect map, implements it for the framework in use, and verifies every mapping on the served output.

The content and metadata parity check

A redirect passes signals to a new URL. The page at that URL still has to deserve what it inherits. Build a second sheet with one row per URL on the protected list, and columns for what the old page had and what the new page has: title, meta description, H1, approximate word count of the main copy, number of internal links pointing to it, structured data types, canonical and indexability. Fill the old columns from the benchmark crawl now. Fill the new columns from the staging crawl in the next stage.

Several parts of the new site have to point at the new URLs: internal links, a self-referencing canonical on each new URL, and hreflang annotations if the site uses them.1 Add those to the parity sheet as yes or no columns. Internal links should go straight to the canonical URL.30

PageOldNew on stagingAction
Shaker kitchens service pageTitle and H1 match, about 900 words, 14 internal links in, Service and BreadcrumbList markupTitle matches, about 300 words, 3 internal links in, no structured dataRestore the copy and markup to the new template, and add the page to the Kitchens menu
Leeds area pageAbout 600 words, LocalBusiness markup, linked from footerAbout 600 words, LocalBusiness markup, linked from footer and Showrooms pageNone
Parity check for the kitchen company: an invented example of two rows
Tasks0 of 12 done
Stage 04 / 07The last 2 to 4 weeks before launch

Test the new site on a protected staging server

Prove on staging that every redirect, template and directive behaves as planned, while keeping staging itself out of search.

Staging is where you find out whether the map and the templates work. Everything you can test here is cheaper to fix than the same fault found in production. It also has to be kept out of Google while you test it, and the way that is done matters on launch day.

Protect staging with a password

Use HTTP authentication or an IP allow-list for staging, and do not rely on robots.txt. robots.txt is not a mechanism for keeping a page out of search results, and a disallowed URL can still be indexed if it is linked from elsewhere.31 Bing's guidelines say the same: robots.txt controls crawl access, not indexing.19 The standard itself says its rules are not a form of access authorisation.32 A noindex tag only works if the page can be crawled, because a crawler blocked by robots.txt never sees it.33 Password protection keeps URLs out of results as well as away from crawlers.31 It also has the advantage that it cannot be carried into production as a search directive by mistake, because the site plainly does not work for visitors until it is removed.

Some teams block crawling on the development site with robots.txt anyway. If you do, prepare what the robots.txt should look like once the move starts.1 Whatever you use on staging, write the production robots.txt now as a separate file in the deployment, review it, and add it to the launch day checks.

How to put staging behind a password

  • Apache. Create a password file with htpasswd -c /path/to/.htpasswd staging, then protect the staging site in its config or .htaccess with AuthType Basic, AuthName "Staging", AuthUserFile /path/to/.htpasswd and Require valid-user. Basic authentication sends the password unencrypted, so serve staging over HTTPS.34
  • nginx. Add auth_basic "Staging"; and auth_basic_user_file /etc/nginx/.htpasswd; to the staging server block. The password file can be made with htpasswd or openssl passwd.35
  • Cloudflare Access. If staging sits behind Cloudflare, Access can put a login in front of the staging hostname. Access is deny by default, and an Allow policy can admit people by email address or by email domain.36 For crawlers and scripts, create a service token and send it as the CF-Access-Client-Id and CF-Access-Client-Secret headers,37 with a Service Auth policy that accepts it.36
  • Hosted platforms and site builders. Many have their own password or preview features. Whatever you use, check from a logged-out browser that a visitor gets a login prompt and no content.

Test every redirect from the list

Ask the developer to deploy the redirect rules on staging so that the old paths resolve against the staging hostname. Then run the whole Old URL column through a crawler in list mode, or a script, with redirects followed and recorded. The URL Inspection tool suits single URLs; for large numbers, use command line tools or scripts.1 For each row, record the first status code, the final URL, the final status code and the number of hops, and write the result into the Tested column. Every moved row should show one 301 or 308 to its New URL, and that URL should return 200. Every retired row should return its 404 or 410.

Check the status code the server returns, because the setting in an admin screen can be wrong. Some platforms and redirect plugins default to temporary redirects. A 302 is followed, but Google's indexing pipeline does not use it as a signal that the target should be canonical.18 Fix mismatches at their source, in the rule or the row, then rerun the full list. Partial reruns miss a rule that broke something else.

Running the list test in a crawler or with curl

In Screaming Frog, switch to Mode > List and upload or paste the Old URL column, rewritten to the staging hostname.8 Turn on Configuration > Spider > Advanced > Always Follow Redirects, which follows each redirect to its final target in list mode.7 Add the staging credentials under Configuration > Authentication, which handles basic and digest authentication and forms-based logins.8 When the crawl finishes, Reports gives you All Redirects and Redirect Chains, the second listing every URL that redirects two or more times. Export from list mode with the Export button to keep the rows in the order you uploaded them, so they line up with the map.8

In Sitebulb, start an audit, tick URL List under Crawl Sources, upload the list as a .csv or .txt file, and untick Crawl Website if the list is the only source. Links are not followed in this mode, and every URL in the list has to be on the same subdomain as the start URL, so a merge of two old domains needs one audit per domain.9 Credentials go on the Authentication tab of the audit settings. Ticking Is Staging Site under Robots Directives lets the crawl ignore a root Disallow on staging.40

For a quick check without a crawler, curl tests one URL at a time, or a list in a loop. curl -s -o /dev/null -u user:password -w "%{http_code} %{redirect_url}\n" https://staging.example.com/services/shaker-kitchens.php prints the first status code and the URL the redirect points to. Add -L to follow the redirects, and %{num_redirects} and %{url_effective} to the format to print the number of hops and the final URL.41 The Shopify migration post has a full loop over a CSV for bash and PowerShell.

Crawl staging and compare it with the benchmark

Crawl staging from the homepage with rendering on and the same settings as the benchmark crawl. Fill in the new columns of the parity sheet, then look across the whole crawl for the faults that hide in templates.

CheckPass
CanonicalsEvery indexable page has a self-referencing canonical, as an absolute URL, that will output the production domain once live.30 A canonical pointing at the staging hostname or an old URL fails.
Internal linksNavigation, breadcrumbs, footers and body links point straight at new URLs, never through a redirect.1
DirectivesNo indexable template has a noindex in the meta robots tag or the X-Robots-Tag header.33 Check the header separately, because it does not show in the page source.
hreflangEvery alternate URL is updated to its new address, fully qualified, and every pair links back to each other.5 See how to audit hreflang.
Structured dataEach template outputs the same schema types and properties as the old template did, describing content that is visible on the page.
RenderingTitles, canonicals, main copy, links and structured data are present in the raw HTML. In Google's words, server-side or pre-rendering is still a great idea, because not all bots can run JavaScript.4
Status codesA made-up URL returns a real 404. A "not found" view served with a 200 is a soft 404.4
XML sitemapsOnly canonical, indexable new URLs, written as absolute production URLs.42
Page speedKey templates are no slower than the old ones in your lab tests. Run the same test on the old and new template and compare.
TrackingAnalytics and conversion events fire on every template, including forms and calls.
Staging checks and what a pass looks like

If the site moves to a JavaScript framework, compare the raw HTML response of each new template with the rendered version, and treat a thin raw HTML as a launch blocker. Vercel's analysis of crawler traffic on its own network, published in December 2024, found that none of the major AI crawlers it tracked, including OpenAI's, Anthropic's and Perplexity's, executed JavaScript, so content that only appears after rendering is invisible to them.43 Google may skip rendering when it finds a noindex in the initial HTML, so a noindex that JavaScript is meant to remove can keep the page out entirely.4 The method is covered in checking what crawlers see on a JavaScript site.

In the running example, say the staging crawl turns up three faults. The new service template outputs about a third of the old copy because the designer moved the long text into a tab that is only filled in by JavaScript. Canonicals use the staging hostname because the developer hard-coded it. And the area pages are reachable only from a map widget, so they have almost no internal links. All three are fixed on staging and the full test is run again.

Hold the go and no-go review

About a week before launch, walk through the criteria agreed in stage 1 with the sponsor and the developer, using the test results as evidence. If a criterion fails, the launch moves. That is cheaper than launching and fixing forward under pressure, and it is why the criteria were agreed at the start.

Tasks0 of 11 done
Stage 05 / 07Launch day

Launch in the right order and check it within the hour

Switch over with no window where old URLs fail, rule out every complete failure within the first hour, and tell Google about the move.

Launch day is a sequence. Most of the faults that do lasting damage are visible within minutes to someone who knows where to look, and fixed in minutes by the developer who built the site. So the order matters, and so does who is in the room.

Diagram

Launch day, in order

01

Final snapshot

Freeze content on the old site, take a final crawl and final Search Console exports, and save them in a new dated folder.

Step 1 of 8
Click through the steps. Each one is in the checklist below with the detail.

The day before

Freeze content changes on the old site 24 to 48 hours before launch, so nothing is published that the map does not cover. Take the final crawl and the final Search Console and analytics exports, and save them in a new dated folder next to the benchmark. If the hosting is changing, the DNS TTL should have been lowered to a few hours at least a week before the move,3 so check that was done. Confirm who is on call: the developer who built the redirects, the person who signs off search, and someone who can make DNS changes.

The first hour

Deploy the new site and the redirects together. Then remove the staging protection and check robots.txt before anything else. Any noindex or robots.txt blocks that were only needed for the migration come off now.1 Two details make robots.txt worth checking first. The Robots Exclusion Protocol lets crawlers use a cached copy for up to 24 hours,32 and Google generally caches it for that long,44 so a Disallow that is live for even a short time may be what crawlers work from for the rest of the day. And if robots.txt returns a server error, the standard tells crawlers to assume everything is disallowed.32 Google stops crawling the site for the first 12 hours while it keeps trying to fetch the file.44 A robots.txt that returns a 404 is treated as if there were no file, with no restrictions.3244

Then run the full redirect list against production, and the protected list by hand in a browser. Expect Google to crawl the new site more heavily than usual after a migration, and make sure the site has the capacity to handle it,1 so tell the host to expect it and watch the server for errors.

Telling search engines about the move

Submit the new XML sitemap in Search Console so Google learns about the new URLs.1 The migrations guide also covers submitting a sitemap of the old URLs so their redirects are found sooner. Search Console may warn that the URLs in it redirect, which is expected here.1 A sitemap is a hint, and submitting one does not guarantee it will be downloaded or used.42 Submit the new sitemap in Bing Webmaster Tools too. Bing treats sitemaps as a way to improve accuracy and freshness without guaranteeing visibility, and asks site owners to use IndexNow to tell it when URLs are added, updated or removed.19

To submit, open the Sitemaps report in the new property, paste the sitemap URL into the submission box and select Submit. The status should read Success. Couldn't fetch or Has errors needs fixing the same day.45 To spot-check pages, type the full URL into the inspection bar at the top of any Search Console screen, select Test live URL, then View tested page to see the screenshot, HTML and HTTP headers Google received.39 Inspecting an old URL that redirects shows the result for the old URL itself, not for the redirect target.39

If the domain or subdomain changed, submit a Change of Address in Search Console for the old site.1 The tool has conditions, and it is worth checking each one before you start it.

  • You must own both the old and new properties in Search Console, using the same Google account.2
  • The tool works on domain-level properties, such as example.com, and not on path-level ones such as example.com/shop.2
  • The old homepage must 301 redirect to the new homepage. The tool runs a quick check that you own both sites and that a few pages return 301s before it sends the request.2
  • Use it for every subdomain variant of the old domain, including www and non-www.2
  • Do not use it for HTTP to HTTPS moves, path changes within a domain, www to non-www changes, or moves without URL changes.2
  • Do not chain moves. After moving site A to site B, you cannot immediately submit another move from B to C.2

To file the move, open the Change of Address tool in the old site's domain-level property and follow its instructions. It runs pre-move checks first. Critical failures have to be fixed before you can go on, while warnings can be passed. Once the critical checks pass, every site in the move shows a notice in Search Console that the move is in progress, for 180 days.2 If you have to roll back within that time, the steps are to remove the redirects, add 301s from the new site to the old one, and select Cancel Move in the tool on the old site, for each affected domain.2

Merges raise a case Google's help page does not spell out. In the running example, the bathroom site's homepage redirects to www.example.com/bathrooms/, not to the new homepage, because that is the right equivalent for users. The tool's condition is a redirect from old homepage to new homepage, so its check may not pass for that domain. The same help page does describe traffic from the other site, or sites, being added to the new one as a move progresses,2 which suggests more than one site can move into one. I would submit the request for the kitchen domain, whose homepage does redirect to the new homepage, and rely on clean one-to-one redirects for the bathroom domain if its check fails. The redirects do the main work either way.

Review the settings you configured for the old site in Search Console and carry them over, point ad campaigns at the new landing pages, and ask the sites that link to your old content to update their links.1 That last job starts today with the profiles and listings you control.

If the site was built with an AI coding agent, the Launch QA skill in my skill pack runs against the production URL and checks the things that most often stop a new site being indexed, including staging noindex and robots blocks, auth walls, preview hosts in canonicals and sitemaps, and redirects. It splits the results into launch blockers and fix-this-week. It does not replace the full redirect test.

Tasks0 of 15 done
Stage 06 / 07Days 1 to 30

Watch the first 30 days and fix faults the same day

Confirm that Google is following the redirects and indexing the new URLs, and catch and fix every fault while it is still cheap.

In the first month, judge the migration on whether the mechanics work. Visibility in search may fluctuate temporarily during a move; this is normal, and rankings settle down over time.1 For a medium-sized site it can take a few weeks or more for Google to start showing the new URLs instead of the old ones, and longer for larger sites.1 That is the only timeline Google publishes. Traffic in week one tells you little, so watch the redirects, crawling and indexing.

The detailed reading of each Search Console report, and a table of signals that separate normal movement from a fault, are in what to check in the first month after a migration. This stage sets out the routine around them: what to check, how often, and what to do with what you find.

The check routine

WhenCheckWhere
Days 1 to 3, twice a dayrobots.txt, server errors, redirects for the protected list, conversions recordedBrowser, server logs or host dashboard, analytics
Days 1 to 14, dailyNew 404s, 5xx responses, Googlebot requesting old URLs and getting 301s, new URLs getting 200sServer logs, filtered to verified Googlebot
Days 1 to 14, dailyPage indexing reasons for the new sitemap, and the Sitemaps reportSearch Console, new property
Weekly from day 7Response codes and host statusCrawl Stats report, both properties
Weekly from day 14Clicks and impressions by template against the benchmarkSearch Console Performance report, both properties
How often to check what in the first 30 days (practitioner judgement)

In the Page indexing report, old URLs should move into Page with redirect, and new URLs should become indexed. You can filter the report to a single sitemap,11 so filter to the new sitemap and look at why any of those URLs are not indexed. Reasons such as Not found (404), Soft 404, Redirect error, URL blocked by robots.txt and URL marked 'noindex' each point at a specific fault.11

In the Crawl Stats report, most responses should be 200 or similar unless you are doing a site reorganisation or move, in which case 301 and 308 responses are probably what you wanted.12 Watch host status for robots.txt fetching, DNS resolution and server connectivity.12 Server errors matter most: 5xx and 429 responses make Google's crawlers slow down, and indexed URLs that keep returning them are eventually dropped.46 If the hosting changed too, a temporary drop in crawl rate straight after the change is normal, followed by a steady increase over the next few days.3

To open the Crawl Stats report, select Settings in the property, then Crawl stats, and open the report. Selecting a row in the response table, such as Not found (404), lists example URLs with the crawl time and response code for each request.12 Do this in both the old and the new property.

Triage 404s against the map

Every 404 that appears after launch has one of three explanations, and the redirect map tells you which. Export new 404s from the logs and from the Page indexing report each day and look each one up.

The URL in the mapWhat it meansWhat to do
Marked RetireWorking as plannedNothing, unless it has links or traffic you missed, in which case reconsider
Marked with a New URLThe rule did not deploy or was overriddenAsk the developer to fix the rule, and rerun the full list
Not in the mapThe inventory missed itAdd the row, decide a destination, and deploy the redirect the same day
What a new 404 means, by where it sits in the map

In Google, a 404 and a 410 have the same effect: an indexed URL that returns either is removed from the index.46 So a valuable URL that 404s for weeks loses its place, and fixing it early is worth far more than fixing it late. After a fix that the Page indexing report flagged, use Validate fix. Validation typically takes up to about two weeks.11

Find 404 patterns in the logs

Missing redirects usually come in groups that share a pattern, such as print versions, old tag pages or paginated archives. On servers that write the common combined log format, the status code is the ninth space-separated field and the path the seventh, so grep Googlebot access.log | awk '$9 == 404 {print $7}' | sort | uniq -c | sort -rn | head -50 lists the 50 paths that requests claiming to be Googlebot most often get a 404 for. Check your log format first, and verify that the requests really come from Google, as described in the first month after a migration. On WordPress, the Redirection plugin's 404 log does a similar job inside the admin.28

Prompt /ChatGPT, Claude or similar

Turn a list of 404s into redirect rules

You are helping me fix 404 errors after a website migration. Below is a list of old URL paths that now return 404, with the number of requests for each. The site moved from [old URL pattern, e.g. /blog/yyyy/mm/slug/] to [new URL pattern, e.g. /guides/slug/]. Task: group the paths into patterns. For each pattern, write a regular expression that matches every path in the group and nothing else in the list, the replacement that produces the new URL, and two example old paths with the URL each would redirect to. Write the rules for [Apache RedirectMatch, nginx rewrite, or the WordPress Redirection plugin]. List any paths that do not fit a pattern separately, as one-to-one redirects for me to decide by hand. Format: a table with the columns Pattern, Regex, Replacement, Example old path, Example new URL, Requests covered. Flag any regex that could also match URLs that should not redirect, and say if you are unsure of the syntax for the server I named. [paste paths and request counts]

Fill in the parts in brackets before you send it

CheckTest every rule on staging, or on a copy of the config, against the full redirect map before it goes live. A regex that is slightly too broad can redirect pages that were working. Check each destination exists and returns 200.

Use Request indexing sparingly

The URL Inspection tool lets you request indexing for a URL, but there is a daily limit to how many requests you can submit.39 Use it for the homepage and a handful of the most valuable pages, and for any page you have just fixed. For everything else, the redirects and sitemaps do the job. The same tool shows the Google-selected canonical next to the one you declared,39 which is the quickest way to confirm Google is treating a new URL as the canonical.

Tasks0 of 9 done
Stage 07 / 07Days 30 to 90

Close the migration and report on it

Finish the clean-up, decide whether the move is complete, and leave a record that anyone can pick up later.

By the second month the mechanics should be settled and the question becomes whether search traffic has transferred. This stage is about measuring that fairly, finishing the work that launch day left, and handing the site back to normal running with nothing that can quietly break later.

Compare like with like

Compare each template against the benchmark, and compare the same weeks a year earlier as well as the weeks before launch. Comparing the last three months year on year, as well as against the previous period, rules out drops that happen every year.13 Search Console assigns clicks and impressions to the canonical URL Google selects for each page,47 so add the old property and the new property together for each template until the old URLs have dropped out.

A small drop in position, such as from 2 to 4, is a different thing from a large drop, such as from the top 10 to position 29 across many queries.13 The second kind, still present after the first month and concentrated in one template, is a fault to investigate. Compare that template's raw HTML, internal links and redirects with the benchmark crawl, which is exactly what the saved files are for.

Decide when the move is done

Google gives no point at which a migration is finished, so set your own criteria. These are the ones I would use, and the move is complete when all of them are true.

  • Most old URLs show as Page with redirect in the old property, and the new sitemap shows most of its URLs indexed.
  • No unexplained 404s or soft 404s have appeared for two weeks.
  • Crawl Stats shows a stable pattern of mostly 200 responses on the new property, with no host status problems.
  • Clicks for each template are within the range you would expect from the same period last year, or the gap is explained and has an owner.
  • Every item on the fault log is fixed or has an agreed plan.

Once most of the old URLs have left the index, remove the old URL sitemap. A sitemap should list the URLs you want in search results,42 and Bing's guidelines ask for deleted or redirected URLs to be removed from sitemaps promptly.19 If the hosting changed, shut down the old infrastructure only once its traffic reaches zero.3

To remove a sitemap, select it in the Sitemaps report, open the three-dot menu and choose Remove sitemap. Removing it from the report does not stop Google visiting those URLs,45 which is what you want while the redirects do their work.

What stays in place for a year or more

Google's site move guide says to keep the redirects for as long as possible, generally at least one year.1 The Change of Address help page asks for at least 180 days, longer if you still see traffic to them from Google Search, and recommends continuing to pay for the old domain for at least a year so nobody else can buy it and use it for malicious purposes.2 I would treat a year as the minimum for both and keep the redirects indefinitely. They cost almost nothing, and links, bookmarks and printed brochures keep sending people to the old URLs for years.

Write the closing report

Keep it short and factual. The people who read it are the sponsor who approved the project and whoever looks after the site next. It should cover what changed and when, clicks and conversions by template against the benchmark and against last year, the faults found and fixed, anything still open with an owner, and what has to stay in place. File it in the migration folder with the redirect map, the benchmark and the fault log.

Prompt /ChatGPT, Claude or similar

Draft the closing report

You are helping me write the closing report for a website migration. It is for the business owner and for whoever looks after the site next. Context: we moved [describe the move] on [launch date]. Below I paste (1) organic clicks and conversions by page template for the 90 days after launch, the same 90 days a year earlier, and the 90 days before launch; (2) our fault log; (3) open items with owners. Task: write a report of no more than 600 words with these sections: What changed; Results by template; Faults found and fixed; Still open (owner and date for each); What must stay in place (redirects, old domains and their renewal dates, the redirect map). Describe the results plainly, including any template that is worse than last year. Use only the numbers I give you. Do not explain a change unless the fault log or my notes support the explanation, and where the cause is unknown, say so. [paste tables, fault log and notes]

Fill in the parts in brackets before you send it

CheckCheck every number in the draft against your exports before it goes out. Assistants sometimes round or transpose figures, and any explanation it adds without evidence should be cut.

In the running example, say the report at day 90 shows service and area pages back in line with the same months last year, the blog still slightly behind with its new URLs now indexed, and the bathroom site's former pages above last year because they now have links from the kitchen pages. The open items are a backlink outreach list of 30 sites and two case studies still missing structured data. Those numbers are invented for the example. Yours will differ, and the report should say plainly where they are worse.

Tasks0 of 9 done
Questions8 answered

Common questions

01Will we lose traffic when we migrate our website?
Some movement is normal. Visibility may fluctuate temporarily during a move, and rankings settle down over time.1 Whether there is a lasting loss depends mostly on how much changes at once, how complete the redirect map is, and whether the new pages keep the content of the old ones. Nobody can promise no change at all.
02How long does it take Google to process a site migration?
Google says that for medium-sized sites it can take a few weeks or more before the new URLs start to show instead of the old ones, and longer for larger sites.1 It does not give a tighter figure, so plan to monitor for at least 90 days.
03Should we change the domain and redesign the site at the same time?
Avoid it if you can. Change one thing at a time where possible.1 Combining a move with a redesign of the content and URL structure will probably cause some traffic loss while Google reassesses the pages.2 If both must happen, keep the content as close to the old site as possible at launch and rewrite later.
04Is it safe to block our staging site with robots.txt?
Not on its own. robots.txt is not a way to keep pages out of search results, and a blocked URL can still be indexed if linked from elsewhere.31 Bing's guidelines make the same point.19 Use a password or HTTP authentication, which also cannot be carried into production as a crawl block by accident.
05How long should we keep the old domain and its redirects?
Keep redirects for as long as possible, generally at least one year,1 and keep paying for the old domain for at least a year so nobody else can buy it and misuse it.2 In my view there is rarely a reason ever to remove them.
06Do we need the Change of Address tool?
Only when moving from one domain or subdomain to another. It is not meant for HTTP to HTTPS, path changes on the same domain, www to non-www changes, or moves without URL changes.2 You need to own both properties with the same Google account, and the old homepage must 301 to the new one.2
07Can we run a migration without an SEO on the team?
On a small site with few changes, yes, if someone follows the stages and the developer is willing to test redirects properly. On a site with a domain change, a new platform or a merger, I would bring in someone who has done it before, at least for the redirect map, the staging test and the first fortnight after launch.
08Should we move the whole site at once or one section at a time?
Moving all URLs at once is the advice for small and medium sites; large sites can move one section at a time.1 A section-first move shows how your redirects behave before the rest of the site depends on them.
References47 sources

Sources

  • Platform docs44
  • Regulator2
  • Industry study1
  1. 01Site Moves and MigrationsGoogle Search CentralPlatform docs
  2. 02Change of Address toolSearch Console HelpPlatform docs
  3. 03Changing Your Web Hosting and SEOGoogle Search CentralPlatform docs
  4. 04Understand JavaScript SEO BasicsGoogle Search CentralPlatform docs
  5. 05Localized Versions of your PagesGoogle Search CentralPlatform docs
  6. 06Screaming Frog SEO Spider Website CrawlerScreaming FrogPlatform docs
  7. 07SEO Spider ConfigurationScreaming FrogPlatform docs
  8. 08SEO Spider GeneralScreaming FrogPlatform docs
  9. 09How to crawl a URL ListSitebulb SupportPlatform docs
  10. 10Search Analytics: queryGoogle for DevelopersPlatform docs
  11. 11Page indexing reportSearch Console HelpPlatform docs
  12. 12Crawl Stats reportSearch Console HelpPlatform docs
  13. 13Debug Google Search Traffic DropsGoogle Search CentralPlatform docs
  14. 14[GA4] Landing page reportGoogle Analytics HelpPlatform docs
  15. 15Add a website or platform property to Search ConsoleSearch Console HelpPlatform docs
  16. 16RFC 9110: HTTP SemanticsIETFRegulator
  17. 17Redirections in HTTPMDN Web DocsPlatform docs
  18. 18Redirects and Google SearchGoogle Search CentralPlatform docs
  19. 19Bing Webmaster GuidelinesBing Webmaster Tools HelpPlatform docs
  20. 20mod_aliasApache HTTP Server DocumentationPlatform docs
  21. 21Module ngx_http_rewrite_modulenginx documentationPlatform docs
  22. 22Module ngx_http_map_modulenginx documentationPlatform docs
  23. 23Bulk RedirectsCloudflare DocsPlatform docs
  24. 24CSV file format for Bulk RedirectsCloudflare DocsPlatform docs
  25. 25URL redirect parametersCloudflare DocsPlatform docs
  26. 26Create Bulk Redirects in the dashboardCloudflare DocsPlatform docs
  27. 27Creating and managing URL redirectsShopify Help CenterPlatform docs
  28. 28RedirectionWordPress.org PluginsPlatform docs
  29. 29Import and exportRedirectionPlatform docs
  30. 30How to Specify a Canonical with rel="canonical" and Other MethodsGoogle Search CentralPlatform docs
  31. 31Robots.txt Introduction and GuideGoogle Search CentralPlatform docs
  32. 32RFC 9309: Robots Exclusion ProtocolIETFRegulator
  33. 33Block Search Indexing with noindexGoogle Search CentralPlatform docs
  34. 34Authentication and AuthorizationApache HTTP Server DocumentationPlatform docs
  35. 35Module ngx_http_auth_basic_modulenginx documentationPlatform docs
  36. 36Access policiesCloudflare DocsPlatform docs
  37. 37Service tokensCloudflare DocsPlatform docs
  38. 38Settings Reading screenWordPress.org DocumentationPlatform docs
  39. 39URL Inspection toolSearch Console HelpPlatform docs
  40. 40Authentication for crawling staging sitesSitebulb SupportPlatform docs
  41. 41curl man pagecurlPlatform docs
  42. 42Build and Submit a SitemapGoogle Search CentralPlatform docs
  43. 43The rise of the AI crawlerVercelIndustry study
  44. 44How Google Interprets the robots.txt SpecificationGoogle for DevelopersPlatform docs
  45. 45Sitemaps reportSearch Console HelpPlatform docs
  46. 46How HTTP Status Codes Affect Google's CrawlersGoogle for DevelopersPlatform docs
  47. 47What are impressions, position, and clicks?Search Console HelpPlatform docs
Keep going

Stuck on a stage?

Send me a message on LinkedIn with the stage you are on and what you are seeing. I read everything that comes in.