Applies to
migration.url-inventory.
Covers migration.url-inventory. Applies only when the project replaces a site that is already
live.
The launch redirects page covers how to redirect correctly. This one is about the step before it, which is the step that decides what the work costs.
The number is the deliverable
A redirect map is priced by how many URLs it covers, and almost nobody counts before quoting. The count is not a detail of the task, it is the task's size, and it is knowable weeks before launch from a site that is still up and still crawlable.
A worked example, from a live project. A four-language corporate site being rebuilt: the brief described a new site, said nothing about the old one, and the estimate was built from the new site's page count. The old site had 2,362 indexed blog posts plus roughly 52 pages per language. None of it was being migrated. Every one of those URLs was going to 404 on launch day.
That is not a rounding error on an estimate. It is a separate piece of work that appeared in no brief, no build plan and no question list until somebody thought to crawl the site that already existed.
Four sources, because none of them is complete
| Source | What it knows | What it misses |
|---|---|---|
| The old sitemap | What the old CMS thinks it published | Anything the CMS forgot, and anything hand-built |
| A full crawl | Everything reachable by following links | Orphans, and anything behind a form |
| Search Console | What Google has actually indexed, including URLs you forgot | Only 1,000 rows per query in the UI, so export via the API |
| Analytics, 12 months | What people actually visit, including from old campaigns | Anything with no traffic, which is still most of the value |
Merge, deduplicate, and keep the column saying where each URL came from. That column is what lets you defend the number later.
Break it down before you total it
A single total is not useful for pricing, because the templates are not equally expensive. Break it by language and by template:
EN blog 1229 pages 52
FR blog 404 pages 52
ES blog 369 pages 52
PT blog 360 pages 52
Read that way, the shape of the job is obvious in a sentence: the blog is the work, the pages are an afternoon, and three quarters of the blog is one language.
Unknown is not zero
If a section's count cannot be explained - the crawl found 300 and the sitemap says 40 - record it as unknown and go and find out. Recording it as zero is how a section gets dropped silently, and the discovery arrives as a 404 spike a week after launch, when the old site is gone and the list cannot be rebuilt.
Do this before the estimate
The whole point is timing. After launch it is archaeology, and an incomplete one: you are reconstructing what used to exist from other people's links. Before launch it is a crawl.