Reconciled inventories, blockers with evidence and owners, and a rollback the release owner has run at least once before the go/no-go call.

A migration can appear complete while valuable URLs, existing redirects, or template-level search controls are missing from the release candidate. We identify those differences while the team can still change, delay, or stop the release.

Reconciled inventories, named blockers, and a go/no-go call you can defend.

A migration team compares current and candidate site structures before approving launch.

Some of the 500+ brands we've worked with

See all references
  • Enerjisa
  • Domino’s
  • Madame Coco
  • HangiKredi
  • Canbebe
  • BAT
  • Turna.com

The work follows a fixed sequence: define the comparison rules, reconcile evidence, test templates, rehearse rollback, and issue an owned release decision.

  1. Lock the comparison rules

    We record hosts, locales, environments, freeze dates, URL identity rules, protected journeys, owners, exclusions, and aligned Search Console and analytics baseline periods.

    A contract defining the compared populations, valid sources, exception owners, and stop evidence.

    AI assist
    A first pass at this contract gets drafted from host, locale, and environment lists in existing crawls and CMS records, with any gap against the real source site flagged.
    Human gate
    Before the freeze date locks, the migration lead settles the URL identity rule for trailing slashes, parameters, and case, and names an owner for each exception. Scope contract sign-off
  2. Reconcile source and candidate URLs

    We join crawls, sitemaps, CMS records, Search Console, analytics, logs, media, backlink targets, campaign destinations, and redirect history, then classify each record.

    A source-linked matrix with coverage totals, retained differences, and unmatched records.

    AI assist
    AI joins the crawl, sitemap, CMS, Search Console, analytics, log, backlink, and redirect-history exports across hundreds of thousands of rows and surfaces which records failed to match on any key.
    Human gate
    Every unmatched or ambiguous row gets read individually. Genuine gap, normalization artifact, or a URL that never mattered are three different answers. Unmatched-row review
  3. Compare technical contracts by template

    On representative URLs, we compare status, source and rendered content, canonical, robots, hreflang, sitemaps, internal links, pagination, structured data, errors, and caching.

    Reproducible template diffs naming the affected cohort, changed control, owner, and retest.

    AI assist
    AI diffs the pre- and post-migration crawl snapshots template by template and clusters the deltas so one canonical or hreflang regression doesn't surface as a thousand separate line items.
    Human gate
    Our migration lead separates the intentional redesign decisions from the accidental regressions, and gives every real regression an owner and a retest date. Template-diff triage
  4. Rehearse failures and rollback

    We test redirects, indexability, localized routes, navigation, forms, analytics, server failures, caching, and rollback on the candidate, keeping environment limits visible.

    A pass, review, or block record plus a rollback instruction exercised under agreed conditions.

    AI assist
    AI runs the scripted failure scenarios across the candidate's redirects, forms, and localized routes in parallel and flags which checks came back inconclusive rather than pass or fail.
    Human gate
    Whether an inconclusive result blocks the release is a judgment call, and the release owner makes it after running the rollback procedure at least once themselves. Rollback rehearsal accepted
  5. Issue the go/no-go pack

    We combine baselines, protected cohorts, diffs, dependencies, retests, monitoring, exception owners, and rollback triggers. Critical evidence cannot become post-launch work just to protect the date.

    An owned record of passes, reviews, blockers, and the action attached to each.

    AI assist
    AI assembles the go/no-go pack from the upstream evidence, baselines, diffs, open blockers, and retest status, into one reviewable record instead of scattered tickets.
    Human gate
    The launch group decides go or no-go, and no date pressure moves a genuine blocker into "monitor after launch" without an accountable owner attached. Go/no-go call

AI joins the exports and rehearses the failures; people triage the rows and make the call.

AI drafts the scope contract from host, locale, and environment lists in existing crawls and CMS records, joins crawl, sitemap, CMS, Search Console, analytics, log, backlink, and redirect-history exports across hundreds of thousands of rows to surface unmatched records, diffs pre- and post-migration crawl snapshots template by template so one regression does not surface as a thousand line items, runs the scripted failure scenarios across redirects, forms, and localized routes and flags inconclusive checks, and assembles the go/no-go pack into one reviewable record. The decision is the launch group's. No audit score replaces URL- and template-level evidence, we do not remove source rows, narrow the population quietly, or downgrade a critical asset to make the candidate look ready, and we do not guarantee unchanged rankings, traffic, or crawling after migration.

The useful output is not a finding count. These artifacts let SEO, product, engineering, analytics, and release owners decide from the same URL evidence.

  • Decision matrix

    Source-to-candidate reconciliation matrix

    Accepted when

    Every in-scope URL or asset has provenance, current and candidate state, template and locale context, a discrepancy class, and an explicit exclusion or unresolved-match note.

  • Architecture map

    Critical asset and continuity map

    Accepted when

    Protected cohorts connect their search or business basis to the required treatment, owner, acceptance check, and rollback consequence without treating missing traffic as low value.

  • Prioritized backlog

    Migration blocker and dependency backlog

    Accepted when

    Each item includes affected scope, reproducible evidence, severity, owner, correction, retest condition, deadline, and residual risk.

  • Audit report

    Launch acceptance and rehearsal report

    Accepted when

    The report records passes, accepted exceptions, blockers, monitoring sources, decision owners, and the tested rollback trigger behind the go/no-go call.

We call it done when: The reconciliation matrix, continuity map, blocker backlog, and acceptance report are done when every in-scope URL or asset carries provenance, current and candidate state, template and locale context, a discrepancy class, and an explicit exclusion or unresolved-match note, every protected cohort connects its search or business basis to a required treatment, owner, acceptance check, and rollback consequence, every blocker names its scope, reproducible evidence, severity, owner, correction, retest condition, deadline, and residual risk, and the report records the passes, accepted exceptions, monitoring sources, decision owners, and tested rollback trigger behind the call.

This audit fits while both sites remain inspectable and the migration can change. It turns a broad SEO request into specific URL, template, ownership, and release decisions.

A good fit when

  • The current site and a stable release candidate are available for side-by-side crawling, rendering, and control checks.
  • URL history is split across sitemaps, CMS, Search Console, analytics, backlinks, logs, campaigns, and old redirects, so no one can reconcile the source inventory.

Better handled as other work when

  • The new site is already live and the immediate job is to diagnose a measured loss. That calls for post-migration investigation.
  • Critical findings cannot change scope, delay launch, trigger a retest, or activate rollback. Without a decision path, the audit becomes an unused issue list.

If one of these is closer to your situation, start here instead: SEO Migration

We call it done when: The inventories reconcile, critical URL and template differences carry evidence and owners, unresolved blockers stay where everyone can see them, and the launch group can make a go/no-go call on tested checks and a rollback they have rehearsed.

  • Ahrefs

    adds backlink targets that crawls and analytics may overlook

  • Screaming Frog

    crawls current and candidate sites under identical comparison rules

  • Sitebulb

    clusters source-to-candidate differences into reproducible template regressions

  • Schema App

    diffs structured data coverage between old and candidate templates

  • Google Search Console

    identifies search-visible URLs and controls the migration must preserve

  • Google Analytics

    marks protected landing pages, events, and journeys before release

  • Weglot

    checks locale routes, alternates, and fallback behavior on candidates

The current site, the release candidate, your constraints, and whoever owns the decision. From there we define the smallest useful comparison and the checks behind a definitive go/no-go.
Discuss the audit with Zeo

Yes, when other approved evidence keeps them in scope. Sitemaps, CMS records, logs, backlinks, campaign use, locale relationships, legal or operational needs, and future roles can matter. Low observed traffic alone does not make a URL disposable.