301→302301→302
A temporary redirect where a permanent one belongs.
Found by Redirect checker →
redirect loopredirect loop
The URL redirects back to itself and never settles.
Found by Redirect checker →
Import & compare

Compare crawls before and after

Before/after crawl diffs, declared URL migrations and segment diffs from saved scans, without crawling again.

Compare crawls before and after

Compatible comparisons

Native crawls and Screaming Frog may find different URL populations; compare them only with compatible scope and configuration.

Compare crawls before and after

Migrations

Declare the migration and check what moved, what broke and what was lost.

How it works

Three steps, one saved scan

  1. Save a scan for each side

    Run crawl-site before and after the change, or import a Screaming Frog audit. Each run leaves one saved file you can compare later.

  2. Diff the two saved files

    compare-crawls reads both files and sorts every finding into entered, left, appeared or disappeared. It fetches nothing.

  3. Tell a fix from a missing page

    left means the URL was fetched by both crawls and the finding is gone. disappeared means the URL was not rechecked, so it proves nothing. Use verify-fixes for a verdict on specific findings.

What it checks

Checks in this feature

CheckWhat it meansSeverityEvidence
BROKEN_PAGE_4XXA page returns a 4xx. The diff shows whether it entered (new breakage) or left (fixed on a URL both crawls fetched).CriticalBefore and after finding rows for the same URL
SERVER_ERROR_5XXA page returns a 5xx. The same entered, left or disappeared logic applies between the two crawls.CriticalBefore and after finding rows for the same URL
TITLE_MISSINGThe title element is missing on a page. A regression shows as an entered row, a fix as a left row.CriticalBefore and after finding rows for the same URL
REDIRECT_CHAINA redirect chain has two or more hops. Useful after a migration to confirm chains were not added.ImportantBefore and after finding rows for the same URL
CANONICAL_MISSINGAn indexable page has no canonical URL. Catches canonicals dropped in a template release.ImportantBefore and after finding rows for the same URL
URL_NOT_IN_SITEMAPAn indexable page is missing from the sitemap. Shows whether the sitemap caught up with the release.TipBefore and after finding rows for the same URL
How to run it

One command

bash
seohead compare-crawls --before ./scans/before.sqlite --after ./scans/after.sqlite

Install first: installation guide. Every command also runs as an MCP tool for AI agents.

FAQ

Questions

Compare crawls before and after
No. It reads two saved audit or scan files and makes no requests. verify-fixes is the command that fetches selected URLs again.
Only with compatible scope and settings. Native crawls and Screaming Frog can find different sets of URLs. If the recorded crawl settings differ, the comparison is refused unless you pass --force.
Not known. A finding that disappeared means the page was not rechecked. Only left means the URL was fetched by both crawls and the finding is gone.
Audits above 10,000 pages or issues need an explicit --out-dir. The output is a new compare.v2 folder with NDJSON files and a manifest. Add --compression gzip to shrink the files.
Only with a declared url-correspondence.v1 file that lists origin and path pairs (--correspondence). It does not guess pairs from titles or content.

Check your redirects locally