Overview
Run the quick pass before every launch and the full pass every quarter, and treat each row as pass-fail. Numeric pass conditions not tied to a documented Google metric (the 10 percent index gap, the JS budget, title and description lengths, the three-click depth) are house targets, not engine rules; Google rewrites titles and snippets and sets no character limit. The topic pages in this folder explain the why.
Crawl and index
| Check | Pass if | Tool |
|---|---|---|
robots.txt at root | Returns 200; no Disallow: / | curl -I |
sitemap.xml | Returns 200; lists every canonical URL with accurate <lastmod> | Browser, GSC Sitemaps |
| Sitemap submitted | GSC shows “Success” with discovered URLs above 0 | GSC Sitemaps |
| Indexed count vs sitemap | Within 10% of sitemap count | GSC Pages report |
No noindex on indexable pages | No <meta name="robots" content="noindex"> in production | View source |
| Canonical self-referential | Every page declares its own URL | View source |
| Redirects | Every old URL reaches a 200 page in one hop; no loops | curl -sIL |
See technical, redirects, and sitemaps-deep.
Performance
Google’s page experience signals use CrUX field data, not lab scores.
| Check | Pass if | Tool |
|---|---|---|
| LCP at p75 | 2.5 s or less | GSC Core Web Vitals, PageSpeed |
| INP at p75 | 200 ms or less | GSC Core Web Vitals |
| CLS at p75 | 0.1 or less | GSC Core Web Vitals |
| TTFB at p75 | 0.8 s or less (not a Core Web Vital) | PageSpeed Insights |
| JS shipped | Under 200 KB compressed on content pages | DevTools Coverage |
| LCP image | Preloaded or fetchpriority="high"; not lazy-loaded | View source |
See core-web-vitals and optimize-core-web-vitals.
On-page elements
| Check | Pass if | Tool |
|---|---|---|
One <h1> | Exactly one; matches page intent | View source |
| Heading order | No skipped levels | axe DevTools |
| Title tag | Unique; 50-60 characters; primary keyword early | View source |
| Meta description | Unique; 130-160 characters | View source |
Image alt | Every content image has descriptive text | axe DevTools |
| Anchor text | Descriptive, not “click here” | Screaming Frog |
See title-tags.
Content quality
Google’s core ranking systems absorbed the helpful content system in March 2024.
| Check | Pass if | Tool |
|---|---|---|
| Original information | At least one number, screenshot, or command output per editorial page | Manual review |
| Intent match | H1 answers the target query | SERP comparison |
| Topical focus | Each section has 5 or more pages on one topic | Folder count |
last_updated honest | Date matches the latest meaningful body change | Git log |
| AI-assisted drafts | Facts checked; adds value beyond existing pages; AI use disclosed where readers would ask | Manual review |
| No scaled thin pages | No batch of templated or lightly rewritten pages | Manual review |
See core-updates and e-e-a-t.
Internal linking
| Check | Pass if | Tool |
|---|---|---|
| Depth | Every page within 3 clicks of home | Screaming Frog |
| No orphans | Every URL has an inbound internal link | Screaming Frog |
| Anchor variety | No bulk identical anchors to one URL | Screaming Frog |
| MOC coverage | Each folder index lists every page | Manual review |
See internal-linking and site-architecture.
Structured data
| Check | Pass if | Tool |
|---|---|---|
| Valid JSON-LD per page type | Passes Rich Results Test and schema.org validator | Both |
| BreadcrumbList below root | Present; labels match visible crumbs | Rich Results Test |
| Schema matches body | No FAQPage or Product markup for content the page lacks | Manual review |
| GSC enhancements | Errors: 0 | GSC |
See structured-data and schema-markup-deep.
Discoverability files
| Check | Pass if | Tool |
|---|---|---|
/llms.txt | Returns 200; lists primary pages with summaries | curl |
/ai.txt | Returns 200; states crawl preferences | curl |
/favicon.ico | Returns 200 without a redirect | curl -I |
Mobile
| Check | Pass if | Tool |
|---|---|---|
| Viewport tag | width=device-width, initial-scale=1 | View source |
| Content parity | Same content, structured data, and links as desktop | GSC URL Inspection |
| Usability | No horizontal scroll; touch targets at least 24 px (WCAG 2.2), 48 px as the design target | Lighthouse, DevTools |
See mobile-first.
Security
| Check | Pass if | Tool |
|---|---|---|
| HTTPS everywhere | Every http:// URL 301s to https:// | curl -I |
| Certificate | No warning; expiry over 30 days out | openssl s_client |
| Mixed content | None | DevTools Console |
| HSTS | Strict-Transport-Security: max-age=31536000 | curl -I |
Analytics
| Check | Pass if | Tool |
|---|---|---|
| GSC Domain property | Verified | GSC |
| Bing Webmaster Tools | Verified; sitemap submitted | BWT |
| AI citations | BWT AI Performance report (introduced February 2026) reviewed for Copilot citations | BWT |
| Web analytics | Tag fires on every page | Plausible, GA4 |
| Server logs | Retained 90+ days; bot traffic by user-agent extractable | Hosting dashboard |
Run the 30-minute quick pass before every deploy
Skip rows that did not change in this release.
- Confirm
sitemap.xmlandrobots.txtreturn 200. - Run PageSpeed Insights on the home page and one content page; both pass.
- Spot-check one new page for one H1, a unique title, and
alttext. - Run Rich Results Test on one new page; no errors.
curl /llms.txtandcurl /ai.txtreturn 200.- URL Inspection on one new page shows “URL is on Google” or “Submitted and indexed” after the next crawl.
Run the full pass every 90 days
- Crawl the whole site with Screaming Frog or Sitebulb; export depth, orphan, and broken-link reports.
- Pull 90 days of GSC Performance, Pages, Core Web Vitals, and Enhancements data, plus the BWT AI Performance report.
- Walk every table, mark pass or fail in a shared sheet, and open one ticket per fail by category.
- Schedule the next audit before closing this one.
Related
- technical
- discoverability-files
- core-updates
- core-web-vitals
- e-e-a-t
- structured-data
- title-tags
- internal-linking
- optimize-core-web-vitals
- master-google-search-console
- launch-a-new-site: the launch twin of this audit checklist
- glossary