Overview
An SEO audit is a structured pass over the site that surfaces every issue blocking ranking or click-through. Run the quick version before every launch and the full version every quarter. Treat each row as pass-fail; do not move to the next category until the current one is green. The deep-dive pages in this folder explain the why; this page is the operational checklist.
Crawl and index
Verify that Google can find, fetch, and index every page that should rank.
| Check | Pass if | Tool |
|---|---|---|
robots.txt at site root | Returns 200; no Disallow: / line | curl -I |
sitemap.xml at site root | Returns 200; lists every canonical URL with <lastmod> | Browser, GSC Sitemaps |
| Sitemap submitted | GSC shows “Success” with discovered URLs > 0 | GSC Sitemaps |
| Indexed count vs sitemap | Within 10% of sitemap URL count | GSC Pages report |
| No orphan pages | Every URL has at least one internal inbound link | Screaming Frog |
No noindex on indexable pages | Production <head> has no <meta name="robots" content="noindex"> | View source |
| Canonical present and self-referential | Every page declares its own URL as canonical | View source |
See technical for the canonical and robots rules in detail.
Performance
Field metrics from real users decide ranking eligibility; lab metrics do not.
| Check | Pass if | Tool |
|---|---|---|
| LCP 75th percentile | Under 2.5 seconds | GSC Core Web Vitals, PageSpeed |
| INP 75th percentile | Under 200 milliseconds | GSC Core Web Vitals |
| CLS 75th percentile | Under 0.1 | GSC Core Web Vitals |
| TTFB 75th percentile | Under 800 milliseconds | PageSpeed Insights |
| Total JS shipped | Under 200 KB compressed for content pages | Chrome DevTools Coverage |
| LCP image preloaded | <link rel="preload" as="image" fetchpriority="high"> set | View source |
See core-web-vitals and audit-site-for-core-web-vitals for the fix loop.
On-page
The per-page elements that decide whether a page can rank for its target query.
| Check | Pass if | Tool |
|---|---|---|
One <h1> per page | Exactly one; matches page intent | View source |
| Heading order | H2 to H3 to H4 with no skips | axe DevTools |
| Title tag length | 50-60 characters; primary keyword included | View source |
| Meta description | 130-160 characters; unique per page | View source |
Image alt attributes | Every content image has descriptive alt text | axe DevTools |
| Internal anchor text | Descriptive, not “click here” or “read more” | Screaming Frog |
See title-tags and internal-linking.
Structured data
JSON-LD that powers rich results and clarifies the page entity to Google.
| Check | Pass if | Tool |
|---|---|---|
| Valid JSON-LD on every page type | Passes Rich Results Test | Rich Results Test |
| BreadcrumbList on every page below root | Present and labels match visible crumbs | Rich Results Test |
| Schema matches body | No FAQPage schema for pages without an FAQ section | Manual review |
| No structured data errors in GSC | Enhancements reports show Error: 0 | GSC Enhancements |
See structured-data and schema-markup-deep.
Discoverability files
The root-served text files that crawlers and AI agents read first.
| Check | Pass if | Tool |
|---|---|---|
/llms.txt | Returns 200; lists primary pages with summaries | curl |
/ai.txt | Returns 200; states crawl preferences | curl |
/humans.txt | Optional; present if the site is editorial | curl |
/favicon.ico | Returns 200; not a redirect | curl -I |
See discoverability-files for the full list and format.
Content quality
The signals that drive the Helpful Content classifier and human raters.
| Check | Pass if | Tool |
|---|---|---|
| Original information per editorial page | At least one number, screenshot, or command output | Manual review |
| Intent match | H1 answers the target query verbatim | SERP comparison |
| Site-wide topical focus | Each section has 5 or more pages on one topic | Folder count |
last_updated reflects real edits | Date matches the latest meaningful body change | Git log |
| AI-assisted drafts edited | Every paragraph has been rewritten with specifics | Manual review |
See helpful-content-update and e-e-a-t.
Internal linking
The link graph that distributes equity and tells Google what each page is about.
| Check | Pass if | Tool |
|---|---|---|
| Every page reachable in 3 clicks from home | Crawler depth report shows max depth = 3 | Screaming Frog |
| No orphan pages | Inbound internal links > 0 for every URL | Screaming Frog |
| Anchor text descriptive and varied | No bulk identical anchors to one URL | Screaming Frog |
| MOC pages link to every child | Each folder index lists every page in the folder | Manual review |
See internal-linking and site-architecture.
Mobile
Google indexes the mobile version of every page.
| Check | Pass if | Tool |
|---|---|---|
| Mobile-friendly | No horizontal scroll, tap targets >= 48 px | GSC, PageSpeed |
| Viewport meta tag | <meta name="viewport" content="width=device-width, initial-scale=1"> | View source |
| Mobile and desktop content parity | Same content, same structured data, same links | Mobile-Friendly Test |
See technical for the mobile-first rule set.
Security
HTTPS is a ranking signal and a trust signal.
| Check | Pass if | Tool |
|---|---|---|
| HTTPS on every URL | Every http:// 301 redirects to https:// | curl -I |
| Valid certificate | No browser warning; expiry > 30 days | openssl s_client |
| No mixed content | Page and all subresources served over HTTPS | DevTools Console |
| HSTS header | Strict-Transport-Security: max-age=31536000 | curl -I |
Analytics
Confirm the measurement plane is intact before judging any other signal.
| Check | Pass if | Tool |
|---|---|---|
| GSC Domain property verified | Property switcher shows the domain | GSC |
| Bing Webmaster Tools verified | Sitemap submitted, no verification warnings | BWT |
| Web analytics installed | Tag fires on every page; bounce rate plausible | Plausible, GA4, etc. |
| Server logs retained 90+ days | Bot traffic by user-agent extractable | Hosting dashboard |
30-minute quick audit
Use before every deploy. Skip rows that did not change in this release.
- Crawl and index: confirm
sitemap.xmlandrobots.txtreturn 200. - Performance: PageSpeed Insights on the home page and one content page; both Good.
- On-page: spot-check one new page for one H1, valid title length, descriptive
altattributes. - Structured data: Rich Results Test on one new page; no errors.
- Discoverability:
curl /llms.txtandcurl /ai.txtboth return 200. - Analytics: GSC URL Inspection on one new page shows “URL is on Google” or “Submitted and indexed” on next crawl.
Full quarterly audit
Use every 90 days. Every row, every category.
- Run a full-site crawl with Screaming Frog or Sitebulb.
- Export the depth, orphan, and broken-link reports.
- Pull 90 days of GSC Performance, Coverage, Core Web Vitals, and Enhancements data.
- Walk every category table top to bottom; mark pass or fail in a shared sheet.
- Open one ticket per fail. Assign by category.
- Schedule the next audit before closing the current one.