URL list diff
The single most useful check after a site migration: yesterday's URL list against today's. A text diff is useless here because the order changes and the same URL appears in a different position — this compares as sets, so you get three clean lists and the number that matters, which is how many URLs vanished.
Summary
How to use
- Paste the old or expected list into A and the new or actual list into B.
- Turn on the normalization rules that apply. If one list came from a sitemap and the other from analytics, they will differ in trailing slashes and
www— ignore those or every URL will look changed. - Only in A is the important box: those URLs existed and now do not. Every one of them needs a redirect, or it is a 404 for anyone with the old link.
- Only in B is the new-content list — useful for checking the sitemap picked everything up, and for spotting URLs you did not intend to publish.
- The Summary flags duplicates within each list too, which is a finding in itself.
Four ways to use it
Migration audit. Crawl before, crawl after, diff. Only in A is your redirect to-do list — take it straight to the redirect map generator once you have decided the new destinations.
Sitemap versus reality. Sitemap URLs in A, crawled URLs in B. URLs only in A are in your sitemap but not linked anywhere (orphans, or stale entries); URLs only in B are reachable but not submitted.
Staging versus production. Catches the page that never got deployed, and the staging-only page that did.
Indexed versus intended. Search Console export in B, sitemap in A. What is indexed but not in your sitemap is often the parameter variants and duplicates you did not know were being crawled — feed that into the canonical grouper.
FAQ
Does the order of lines matter?
No. Both sides are compared as sets, and duplicates within a list collapse to one entry — with the duplicate count reported so you know it happened.
Which normalization should I turn on?
Match the sloppiness of your inputs. Two exports from the same crawler need none. A sitemap against an analytics export usually needs host and trailing-slash normalization. Ignoring query strings is right when comparing page inventories and wrong when the parameters identify the page.
Can it show me changes within a URL?
No — it answers present-or-absent. For a URL that exists in both lists in slightly different form, the URL diff compares two URLs component by component.
Is there a size limit?
Only memory. The comparison is hash-based, so tens of thousands of URLs per side is fine.