Key Takeaways
- A redirect map is a two-column decision list, old URL to new URL, with a status code and a priority beside each row.
- Build the inventory from a crawl, the sitemap, the Search Console 404 report and analytics landing pages, because no single source lists every URL that receives traffic.
- Strip the protocol and domain, normalise case and trailing slashes, then fuzzy match the remaining paths before looking the full destination URL back up.
- Use a permanent redirect for a page that has moved for good, validate that each target returns 200 with a single hop, and monitor the Page Indexing report after launch.
What a Redirect Map Has to Contain
A site migration keeps its rankings when every old URL that earned traffic or links resolves to the right new page. The redirect map is the file that makes that happen, and it is a spreadsheet before it is a server configuration.
Five columns are enough:
| Column | What It Holds | Why It Matters |
|---|---|---|
| Old URL | The path exactly as it appears in the crawl or report | This is the value the server rule matches, so it has to be complete |
| New URL | The destination path on the new site | A blank destination is a deliberate 410 decision, not an oversight |
| Status | 301 or 308 for a permanent move | The status tells search engines the new URL is the canonical one |
| Priority | Sessions, referring domains or revenue attached to the page | Review effort follows the value of the page rather than the alphabet |
| Match type | Exact, pattern or fuzzy | Records why a row was accepted, which shortens the review of the next run |
Google's guidance on redirects treats a permanent redirect as the signal that the target should be canonical, and recommends keeping redirects in place for as long as possible. That makes the status column a decision, not a default. A page removed without a successor is a 410 or a 404, and it should be recorded as such rather than pointed at the home page.
Build the URL Inventory
Start with four sources and merge them into one list. Each one misses something the others catch.
- A crawl of the old site: Pages that are linked internally and reachable from the navigation. This is the largest list and the easiest to gather.
- The XML sitemap: Pages the site intended to be indexed, including ones that are no longer linked.
- The Search Console 404 report: URLs that real visitors and crawlers requested after they stopped working. This is the only source that records demand for pages which no longer exist anywhere on the site.
- Analytics landing pages: The URLs that actually received organic sessions in the last 12 months, ranked by sessions.
Deduplicate the merged list on the normalised path before anything else. The same page usually appears with and without a trailing slash, in upper and lower case and with campaign parameters attached, and each variant looks like a separate URL until it is cleaned.
Normalise URLs Before Matching
Matching full URLs wastes precision. The protocol, the host and the query string differ between the old and new site by definition, so they add noise to every comparison.
-
Strip the protocol and host:
Reduce
https://www.example.com/pricing/teamsto/pricing/teams. - Decide on the trailing slash: Pick one convention and apply it to both columns. A mismatch here turns an exact match into a fuzzy one.
-
Lowercase the path:
Case-sensitive servers treat
/Pricingand/pricingas different pages. -
Drop tracking parameters:
Remove
utm_values and session identifiers, keeping only parameters that change the content, such as a product identifier.
Text Standardisation in Flookup applies these steps across the column in one pass, so both lists reach the matching step in the same shape.
Match Old Paths to New Paths
With clean paths on both sides, the comparison is between page slugs rather than between two unrelated domains. Three passes cover the list:
- Exact match first: A VLOOKUP or XLOOKUP on the normalised path resolves every page that kept its slug. These rows need no review.
- Fuzzy match the remainder: Run Fuzzy Match on the unmatched paths with a threshold around 80 per cent. Slugs that gained a word, changed a category or dropped an abbreviation land here. The fuzzy matching guide explains how the score is calculated.
-
Look the full URL back up:
The fuzzy step returns a matched path. Use it to retrieve the original destination URL from the new-site column:
=VLOOKUP(E2, D:B, 2, FALSE)
Review the fuzzy band by hand. A slug such as /blog/csv-tools matching /blog/csv-editor may be correct, while /pricing matching /pricing-enterprise sends a general visitor to the wrong plan. The map is a proposal until a person has read those rows.
Prioritise by Traffic and Links
Not every URL deserves the same review effort. Sort the map by organic sessions and by the number of external links pointing at the old URL. The top of that sort is where a mistake costs the most, and it is usually a small share of the list.
Three groups are worth separating:
- Pages with sessions and links: Review each one by hand and confirm the destination is the closest equivalent, not just the same category, even when the category label looks obvious.
- Pages with links but no sessions: These still pass authority through the redirect, so a wrong destination quietly sends link equity to an unrelated page.
- Pages with neither: Bulk-accept the fuzzy suggestions and spot-check a sample. If nothing links to the page and nobody visits it, the cost of an imperfect destination is low.
Validate the Map Before Launch
A map that looks correct in the sheet can still fail on the server. Four checks catch most of it before the DNS change:
- Every destination returns 200: A redirect to a page that itself returns 404 is worse than a direct 404, because it hides the problem behind a valid status code.
- One hop only: Old URL to new URL, not old to staging to new. Chains slow crawlers and dilute the signal.
- No loops: Check that no destination appears in the old URL column. A pair that points at each other produces a redirect error.
- No catch-all to the home page: Sending every unknown URL to the home page tells search engines that the content is gone and leaves the visitor without the page they wanted. Use a 404 or a targeted redirect.
Test the rules on a staging host with the production paths, then compare the status codes against the map. A script that requests each old URL and records the final status and destination turns this into a reviewable column, and it is the check that catches the rule that never fired.
After Launch
Keep the map in the sheet after deployment. It becomes the record of what changed, and it answers the first question of every post-migration report.
Monitor the Page Indexing report in Search Console for new 404s and soft 404s over the following weeks. A page that starts returning 404 after launch usually means a redirect rule was missed, a slug was renamed twice or an internal link still points at the old path. Fix those in the map and the internal link, not by widening a catch-all rule.
Update internal links to point at the new URLs directly. A redirect handles external links and bookmarks, but an internal link that still uses the old path adds a hop for every crawl and every visitor.
Frequently Asked Questions
How can Google Sheets help with an SEO site migration?
Google Sheets holds the redirect map, the URL inventory and the review decisions in one file. It imports the crawl, the sitemap and the Search Console export without a database, and the fuzzy match runs in the same sheet as the source data. The output exports as a two-column list for the server configuration.
What is URL mapping and why does it matter?
URL mapping records which new URL replaces each old one after a migration or redesign. It preserves link equity, sends visitors to the page they asked for and prevents the 404s that follow a broken migration. A map is also the audit trail when a ranking drops after launch.
Should I use a 301 or a 302 redirect?
Use a 301 or 308 for a permanent move, because Google treats a permanent redirect as a signal that the target should be canonical. Use a temporary redirect only when the change is genuinely temporary and the original URL will return. The status is a decision per row, not a global setting.
Can Flookup help with 404 detection after migration?
Flookup compares the old URL list against the new sitemap and scores the closest destination for each one, which turns an unstructured 404 list into candidate redirects. The scores need review, and the final check is a request to each URL that confirms a 200 response.