An audit that opens with a score ends in an argument about the score. An audit that opens with reachability ends in a list somebody can work.
Here is the order that produces the second one, with a worked example.
Reachability first
Before reading a single title, establish what the crawler can reach.
- Read
robots.txtand the sitemap for allow and disallow rules. - Crawl same-origin links from the home page, breadth first.
- Record every redirect chain and where it lands.
- List pages the sitemap names that no link reaches.
Then the page, then the response
Page-level checks are what a reader sees. Response-level checks are what the server says. Keep them apart, because they have different owners.
Page: title, description, one h1, heading order, alt text, internal links.
Response: status code, canonical, duplicate content, redirect hops.
A worked example
Ridgeline Roofing is a fictional client with 41 indexable pages. The crawl took nine minutes and produced six findings.
| Finding | Pages | Fix | Owner |
|---|---|---|---|
| Six pages share one description | 6 | Write one description each | Content |
h1 missing on the contact page |
1 | Add the heading in the template | Developer |
| Two 404s from an old campaign URL | 2 | Redirect to the service page | Developer |
| Three images without alt text | 3 | Describe what each image shows | Content |
| A 4-hop redirect chain from the home page | 1 | Point the old path straight at the new one | Developer |
| Six pages are orphaned, sitemap only | 6 | Link them from the services hub | Content |
Six findings, 19 affected pages, and two owners. That is a workable week.
A score of 63 with no list is not.
How to know the audit is finished
- every finding names at least one URL, not just a count
- every finding names the rule it breaks
- every finding has an owner and roughly an hour of work
- the pages that passed are recorded too, so the work is visible
- the crawl date is on the report, because a site changes
The record, ready to copy
audit: ridgelineroofing.example
crawled: 2026-09-18, 09:14 America/New_York
pages found: 41 (39 reached by links, 2 sitemap only)
pages read: 41, no render needed
finding 1
rule: description duplicate
urls: 6, listed in the appendix
evidence: identical meta description on each
fix: write one description per page
owner: content
effort: about 90 minutes
finding 2
rule: missing h1
urls: 1, /contact
evidence: page starts at h2
fix: render the page title as h1
owner: developer
effort: about 10 minutes
passed
- every page returns 200
- one canonical per page, on the live host
- no noindex page appears in the sitemap
Troubleshooting
| Symptom | Likely cause | What to do |
|---|---|---|
| The crawl finds far fewer pages than the sitemap | Links are rendered by JavaScript | Render the crawl, or add server-side links |
| Every page reports a duplicate title | The template hardcodes one title | Fix the template, then re-crawl |
| Findings differ between two crawls | The site changed, or the crawl was capped | Record the cap, and crawl the same start URL |
| The report is 400 rows | Nothing was grouped by fix | Group by template, not by page |
| Nothing is found | The audit is shallow, not the site clean | Add response-level checks |
Acceptance: the audit is done when
- every finding names a URL and the rule it breaks
- every finding has an owner and a rough effort
- the passing checks are recorded beside the failures
- the crawl date and the page count are on the report
- the first three fixes are ordered by what they block
Limits
A crawl sees what a crawler sees. It cannot judge whether a page should exist.
It also cannot see traffic or intent. That work belongs to the search data and to a person who knows the business.
This page was written from this repository and from the audit feature’s own checks. No external audit tool was run, and nothing here claims a ranking outcome.