SEO Migration.

Redirects

How to build a redirect map that actually holds

Most redirect maps are built from a traffic export, which is why most redirect maps miss the URLs carrying the links. Here is the method that does not.

By Arsal Riaz, Technical SEO Consultant Published Updated 7 min read
Definition
A redirect map — A redirect map is a row-per-URL document stating where each old URL goes on the new site, which status code is used, and why the mapping is what it is. It is the only artifact that makes redirect coverage checkable — without one, nobody can confirm whether a specific URL was handled.

Every post-migration recovery project I have seen starts the same way. Someone exports the top pages from Search Console, discovers that forty of them now 404, and asks how a redirect map that was signed off could have missed them.

It missed them because of how it was built.

The traffic export problem

The default method is to export the top pages by clicks, map those, and write pattern rules for everything else. It is fast, it feels comprehensive, and it systematically misses the URLs that matter most for the site’s overall authority.

Here is why. The pages that earn organic clicks and the pages that have accumulated external links are two different sets with partial overlap.

A conference talk write-up from 2019 might get thirty organic visits a year and have links from two hundred domains. It will not appear anywhere near a top-pages export. It is doing real work for your domain, and a pattern rule built around your current content taxonomy will not have anticipated it.

The fix is to build the source list from three inputs and take the union: the Search Console pages export, a full crawl, and a referring-domains export. Then rank twice — once by clicks, once by referring domains — and treat the top of each list as tier one.

Pattern rules first, so the exceptions become countable

The instinct is to start mapping URLs individually. Don’t. Start with the rules.

Write the pattern rules that handle the bulk — /blog/2019/slug to /notes/slug, /category/x to /shop/x. Then run them against the actual URL inventory and record two numbers: how many URLs matched, and how many did not.

That second number is the real scope of the project, and it is now a countable list rather than an anxiety. On a typical mid-sized site, rules handle 85–90% and the remaining 10–15% is where the whole engagement lives.

Critically: test the rules against the inventory, not against the pattern. Every rule has exceptions. The URLs created before the current template existed, the manual one-offs someone made in the CMS, the legacy paths from two platforms ago. They only appear when you run the rule against real data.

The exception rows are content decisions

What is left after the rules is not a technical problem. It is a set of business questions wearing technical clothing.

Where should a discontinued product go — the closest replacement, or the category? Which of two overlapping guides survives a consolidation? Does a campaign landing page from 2021 with forty referring domains get redirected to the current equivalent, or is there no current equivalent?

None of these have a correct answer that a crawler can determine. They need someone who knows the business, and they need a deadline.

This is why the map has an owner column. An exception row without a named owner is a row that will be resolved at 6pm on the Thursday before launch by whoever is still online, and it will be resolved with a catch-all.

Testing is per URL, not per rule

“The rule covers that directory” is not evidence. A rule can be correct and still produce the wrong result for a specific URL, because another rule runs first, or because the URL has a trailing slash the rule does not anticipate, or because the destination itself redirects.

Test tier-one URLs individually against the target environment and record two things per URL: the final status code and the hop count. Anything that is not a single hop to a 200 is a finding.

Then do it again against production immediately after cutover. Staging and production edge configurations differ more often than anyone expects, and the whole point of the exercise is to catch that before Google does.

The verified column

Add a date column recording when each row was last tested. It seems bureaucratic until week three post-launch, when someone asks whether a particular section was ever checked and the honest answer is that nobody remembers.

It also surfaces a real risk: releases after launch introduce redirect chains. A rule added in week three often runs before the migration rules and quietly adds a hop to everything. Re-testing tier one at the 30-day mark catches it. The date column is what tells you it is time.


The full sequence this fits into is on the website migration SEO services page, and the phase gates are set out in the migration checklist. If you want to check your own coverage before doing anything else, the diagnostic on the homepage is the short version of this method.

The columns of a working redirect map, with the purpose of each and what goes wrong when it is omitted.
Column Purpose What breaks without it
Old URL The source, exactly as it appears in the inventoryNothing is testable
New URL The specific destination, not a pattern"A rule covers it" is not a verifiable claim
Status code Usually 301; 410 for deliberate removalsRemovals get treated as accidents
Priority tier Which testing pass this URL belongs toQA effort spreads evenly over unevenly valuable URLs
Reason Why, when the mapping is not one to oneThe decision gets re-litigated in month three
Owner Who decides, where a decision is neededUndecided rows default to a catch-all under deadline pressure
Verified Date the URL was tested against the target environmentNobody knows which rows were checked and which were assumed
Redirect map columns and why each one earns its place

When to build one

  • Any migration where URLs change, however small the change looks.
  • Site consolidations, where two inventories merge into one.
  • Large-scale content pruning or archive removal.

When it is overkill

  • A handful of pages with no external links.
  • A redesign where URLs genuinely do not change at all.
  • Adding new pages without touching existing ones.

The method, in order

Roughly a day of work for a mid-sized site, most of it in step four.

  1. 01

    Build the source list from three inputs, not one

    Search Console pages export for 12 months, a full crawl of the current site, and referring domains from any backlink tool. Deduplicate the union of all three.

    Output Combined source inventory

  2. 02

    Tier by clicks and by referring domains separately

    Two rankings, not one blended score. The pages at the top of each list are frequently different pages, and blending them hides that.

    Output Two-axis tier list

  3. 03

    Write pattern rules for the bulk

    Most URLs map by rule. Doing this first converts the remainder into a countable exception list instead of an unbounded problem.

    Output Rules with match counts

  4. 04

    Resolve exceptions individually, with an owner each

    This is where the day goes. Retired products, dead campaigns, categories that no longer exist. Each needs a named person and a date.

    Output Exception rows with owners

  5. 05

    Decide the 410 list explicitly

    Pages with no relevant destination return 410 Gone. Recording it as a decision is what stops it looking like an oversight later.

    Output Documented removal list

  6. 06

    Test tier one URL by URL

    Against staging, then against production after cutover. Record final status code and hop count per URL, and date the verification column.

    Output Verified map

Questions people ask before starting

How many URLs should a redirect map cover?

Every URL with organic clicks or referring domains in the last twelve months, which is usually far fewer than the total indexable count. Beyond that the return diminishes sharply, but everything inside that set needs a named destination rather than a rule that probably covers it.

Can I just use pattern rules instead?

For the bulk, yes. The problem is that every pattern has exceptions — URLs created before the current template, manual one-offs, legacy paths — and those exceptions are disproportionately old, deep and heavily linked. Rules for the bulk, explicit rows for the exceptions.

What do I do with pages that have no equivalent?

Redirect to the closest genuinely relevant page, usually the parent category, or return 410 Gone. Never the homepage. Google treats an irrelevant redirect as a soft 404, so the ranking is lost either way and you have added a hop for nothing.

Migration coming up?

If this raised a question about your own move, send the specifics — the launch date and what is changing is enough to start.

Reply
Typically within one business day.
Hours
Monday to Friday, 9am–6pm US Eastern.
First call
Scoping, not a pitch. No deck.