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.