SEO audit checklist: 218 checks across four layers
An SEO audit checklist is the full list of checks that explain why a site ranks below its potential, covering crawling and indexing, topical coverage, competitor results pages and AI visibility. This one holds 218 checks in 38 categories, each with the method, the tool and the pass criteria, in the order we run them on client sites.
- 218 checks
- 4 layers
- No email required
Khairuzzaman ShariaFounder, Evariko · Last reviewed
The full SEO audit checklist
All 218 checks are listed below, grouped into 38 categories across the four layers. Work through the layers in order, because coverage means nothing on a site that cannot be crawled.
- 115Crawling and indexingRobots, sitemaps, indexation, speed, schema
- 55Topical coverageEntities, query networks, content mapping
- 26Competitor SERPsIntent, SERP features, authority
- 22AI visibilityAssistant mentions, entities, extractability
- Critical
Blocks indexing or ranking across the site. Fix before anything else.
- High
Holds back rankings on important pages. Fix in the first month.
- Medium
Limits performance. Fix once Critical and High are cleared.
- Low
Housekeeping. Fix when convenient.
Crawling and indexing
Can search engines reach, read and index your pages?
Every later layer depends on this one. A page that is blocked, duplicated or too slow to render is invisible regardless of how well it answers a question.
Robots and directives
10
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-001 | robots.txt returns 200 and is reachable at the domain root | Open /robots.txt in a browser and check the HTTP status | Browser, Screaming Frog | File loads with status 200; not 404, 5xx or a redirect loop | Critical |
| CI-002 | robots.txt does not block pages that should rank | Test key URLs against robots.txt rules | Search Console robots.txt report, Screaming Frog | No Disallow rule matches an indexable, ranking page | Critical |
| CI-003 | CSS, JavaScript and image files are not blocked | Check Disallow rules against /wp-content/, /assets/ and similar paths | Search Console URL Inspection | Rendered page in URL Inspection matches the live page | High |
| CI-004 | robots.txt declares the XML sitemap location | Look for a Sitemap: line in robots.txt | Browser | Absolute sitemap URL listed | Low |
| CI-005 | No accidental site-wide noindex | Search source of the homepage and key templates for noindex | View Source, Screaming Frog | No noindex on pages intended to rank | Critical |
| CI-006 | CMS 'discourage search engines' setting is off | Check WordPress Settings > Reading or the CMS equivalent | CMS admin | Setting unticked on production | Critical |
| CI-007 | No conflicting robots directives on the same URL | Compare meta robots, X-Robots-Tag header and robots.txt | Screaming Frog, curl -I | One consistent directive per URL | High |
| CI-008 | X-Robots-Tag headers set only where intended | Inspect response headers on HTML, PDF and image URLs | curl -I, Screaming Frog | No noindex header on indexable resources | High |
| CI-009 | Staging and development sites are blocked from indexing | Search site: for staging subdomains | Google search, Search Console | No staging URLs in Google's index | High |
| CI-010 | AI crawler access is a deliberate decision | Check robots.txt rules for GPTBot, Google-Extended, PerplexityBot, ClaudeBot | Browser | Allow or block chosen on purpose and documented | Medium |
XML sitemaps
7
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-011 | XML sitemap exists and returns 200 | Open the sitemap URL | Browser | Valid XML, status 200 | High |
| CI-012 | Sitemap is submitted in Search Console | Check the Sitemaps report | Search Console | Status 'Success' with a recent read date | High |
| CI-013 | Sitemap contains only indexable, canonical, 200 URLs | Crawl the sitemap list mode | Screaming Frog list mode | No redirects, 404s, noindex or non-canonical URLs | High |
| CI-014 | Every indexable page appears in a sitemap | Compare crawl of indexable URLs against sitemap URLs | Screaming Frog (Sitemaps tab) | No indexable orphans missing from sitemaps | Medium |
| CI-015 | Sitemap stays under 50,000 URLs and 50 MB per file | Count entries and file size | Browser, Screaming Frog | Split into a sitemap index where limits are reached | Low |
| CI-016 | lastmod dates reflect real content changes | Compare lastmod against actual edit dates | Browser | lastmod changes only when content changes | Low |
| CI-017 | Image and video sitemaps present where media drives traffic | Check for image or video sitemap entries | Browser | Present on media-heavy sites | Low |
Indexation
9
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-018 | Indexed page count matches expectations | Compare Search Console indexed count with the intended page count | Search Console Pages report | Gap under 10% and explained | High |
| CI-019 | 'Crawled, currently not indexed' pages reviewed | Export the report and sample URLs | Search Console Pages report | Cause identified for each pattern | High |
| CI-020 | 'Discovered, currently not indexed' pages reviewed | Export and sample URLs | Search Console Pages report | Cause identified; internal links or quality addressed | High |
| CI-021 | Key pages indexed individually | Inspect the ten most important URLs | Search Console URL Inspection | All report 'URL is on Google' | Critical |
| CI-022 | No low-value pages indexed (tags, search results, filters) | site: searches for parameter and archive patterns | Google search, Search Console | Low-value templates noindexed or excluded | Medium |
| CI-023 | 'Duplicate, Google chose different canonical' reviewed | Export and compare canonicals | Search Console Pages report | Google's choice matches the declared canonical | High |
| CI-024 | Soft 404s identified | Export soft 404 list | Search Console Pages report | No thin or empty pages returning 200 | Medium |
| CI-025 | Manual actions checked | Open the Manual actions report | Search Console | No manual actions | Critical |
| CI-026 | Security issues checked | Open the Security issues report | Search Console | No security issues reported | Critical |
Status codes and redirects
11
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-027 | No internal links point to 4xx pages | Crawl and filter by 4xx response | Screaming Frog | Zero internal links to 4xx | High |
| CI-028 | No 5xx server errors during crawl | Crawl and filter by 5xx | Screaming Frog, server logs | Zero 5xx responses | Critical |
| CI-029 | Redirects use 301 for permanent moves | Check redirect types | Screaming Frog | No 302 or 307 used for permanent changes | Medium |
| CI-030 | No redirect chains longer than one hop | Run the redirect chains report | Screaming Frog | Every redirect resolves in one hop | Medium |
| CI-031 | No redirect loops | Run the redirect chains report | Screaming Frog | Zero loops | Critical |
| CI-032 | Internal links point to final URLs, not redirects | Filter inlinks to 3xx URLs | Screaming Frog | Internal links updated to destination URLs | Medium |
| CI-033 | Deleted pages with backlinks redirect to a relevant page | Cross-check 404s against backlink data | Ahrefs or Semrush, Screaming Frog | Linked 404s redirect to the closest equivalent | High |
| CI-034 | Custom 404 page returns a true 404 status | Request a non-existent URL | curl -I | Status 404 with a helpful page | Medium |
| CI-035 | HTTP redirects to HTTPS in one hop | Request http:// version | curl -I | Single 301 to https:// | High |
| CI-036 | www and non-www resolve to one version | Request both hostnames | curl -I | One hostname; the other 301s to it | High |
| CI-037 | Trailing slash handled consistently | Request URLs with and without trailing slash | curl -I | One version 200, the other 301s | Medium |
Canonicalisation
6
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-038 | Every indexable page has a self-referencing canonical | Crawl and check canonical column | Screaming Frog | Canonical present and matches the URL | High |
| CI-039 | Canonicals use absolute URLs | Inspect canonical values | Screaming Frog | Full https:// URLs | Low |
| CI-040 | No canonical points to a redirect, 404 or noindex URL | Filter canonical targets by status | Screaming Frog | All canonical targets return 200 and are indexable | High |
| CI-041 | Only one canonical tag per page | Check for multiple canonical tags | Screaming Frog | Exactly one | Medium |
| CI-042 | Parameter URLs canonicalise to the clean URL | Crawl with parameters | Screaming Frog | Tracking and sort parameters canonicalise to base URL | Medium |
| CI-043 | Canonical is in the raw HTML, not only injected by JavaScript | Compare raw and rendered HTML | Screaming Frog (JS rendering), View Source | Canonical present in raw HTML | Medium |
Duplicate content
6
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-044 | No exact duplicate pages | Run duplicate content analysis | Screaming Frog (Content > Duplicates) | Zero exact duplicates | High |
| CI-045 | Near-duplicate pages reviewed | Check near-duplicates above 90% similarity | Screaming Frog | Merged, differentiated or canonicalised | Medium |
| CI-046 | No duplicate title tags across indexable pages | Filter duplicate titles | Screaming Frog | Every title unique | Medium |
| CI-047 | No duplicate H1s across indexable pages | Filter duplicate H1 | Screaming Frog | Every H1 unique | Medium |
| CI-048 | Printer, AMP or session-ID versions do not create duplicates | Search for alternate URL patterns | Screaming Frog, site: search | Alternates canonicalised or removed | Low |
| CI-049 | Boilerplate content does not outweigh main content | Compare template text to unique text on thin templates | Manual review | Unique main content dominates each page | Medium |
Site architecture
6
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-050 | Important pages within three clicks of the homepage | Check crawl depth | Screaming Frog (Crawl depth) | Core pages at depth 3 or less | High |
| CI-051 | No orphan pages | Compare crawl with sitemap and analytics URLs | Screaming Frog with GA4 and GSC connected | Every indexable page has at least one internal link | High |
| CI-052 | Navigation reflects the site's topical hierarchy | Map main navigation against core sections | Manual review | Core section reachable from main navigation | Medium |
| CI-053 | Breadcrumbs present and consistent | Check templates for breadcrumbs | Manual review, Screaming Frog custom extraction | Breadcrumbs on all inner pages, matching URL hierarchy | Low |
| CI-054 | Internal links use HTML anchor tags crawlers can follow | Check for links built with onclick or buttons | Screaming Frog, View Source | Navigational links are <a href> elements | High |
| CI-055 | Footer and sidebar links kept minimal | Count sitewide links | Screaming Frog (Inlinks) | No bloated sitewide link blocks | Low |
URL structure
5
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-056 | URLs are lowercase, hyphen-separated and readable | Review URL list | Screaming Frog | No uppercase, underscores or encoded characters | Low |
| CI-057 | URLs reflect the site hierarchy | Review folder structure | Screaming Frog | Folders mirror the topical structure | Medium |
| CI-058 | No words repeated within one URL | Scan URL paths | Screaming Frog export | Each word appears once per URL | Low |
| CI-059 | URL length kept short | Filter URLs over 100 characters | Screaming Frog | Core URLs short and descriptive | Low |
| CI-060 | No dynamic parameters on indexable pages | Filter URLs containing ? | Screaming Frog | Indexable pages use clean URLs | Medium |
JavaScript rendering
5
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-061 | Main content present in raw HTML or rendered reliably | Compare raw and rendered text | Screaming Frog JS rendering, URL Inspection | Main content visible in Google's rendered HTML | Critical |
| CI-062 | Internal links present after rendering | Compare link counts raw vs rendered | Screaming Frog | No links that exist only after user interaction | High |
| CI-063 | No content hidden behind clicks that crawlers cannot trigger | Test tabs, accordions and load-more buttons | URL Inspection, View Source | Content in the DOM on load | Medium |
| CI-064 | Lazy-loaded content uses crawler-safe methods | Check lazy-load implementation | URL Inspection | Content loads without scroll events | Medium |
| CI-065 | Titles, meta and canonicals not rewritten client-side | Compare raw vs rendered head | Screaming Frog | Head tags identical in raw and rendered HTML | Medium |
Page speed and Core Web Vitals
11
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-066 | Largest Contentful Paint under 2.5 seconds | Check field data | PageSpeed Insights, Search Console CWV report | 75th percentile LCP ≤ 2.5s | High |
| CI-067 | Interaction to Next Paint under 200 ms | Check field data | PageSpeed Insights, Search Console CWV report | 75th percentile INP ≤ 200ms | High |
| CI-068 | Cumulative Layout Shift under 0.1 | Check field data | PageSpeed Insights, Search Console CWV report | 75th percentile CLS ≤ 0.1 | Medium |
| CI-069 | Server response time (TTFB) under 800 ms | Test key templates | PageSpeed Insights, WebPageTest | TTFB ≤ 800ms | Medium |
| CI-070 | Images compressed and served in modern formats | Check image weights and formats | PageSpeed Insights, Screaming Frog | WebP or AVIF; no image over 200 KB without reason | Medium |
| CI-071 | Images have width and height attributes | Check img tags | Screaming Frog custom extraction | Dimensions declared to prevent layout shift | Low |
| CI-072 | Render-blocking CSS and JavaScript minimised | Check opportunities in PSI | PageSpeed Insights | Critical CSS inline; non-critical deferred | Medium |
| CI-073 | Unused fonts and font weights removed | List loaded font files | Browser DevTools Network tab | Only weights in use are loaded | Low |
| CI-074 | Fonts served locally with font-display: swap | Check font source and CSS | DevTools | Fonts from own domain with swap | Low |
| CI-075 | Caching and compression enabled | Check response headers | curl -I, GTmetrix | Brotli or Gzip on; cache headers set on static assets | Medium |
| CI-076 | Third-party scripts audited | List third-party requests | DevTools, WebPageTest | Every script justified; unused removed | Medium |
Mobile
6
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-077 | Site is responsive on all templates | Test key templates at mobile widths | Chrome DevTools device mode | No horizontal scroll or clipped content | High |
| CI-078 | Mobile and desktop content are equivalent | Compare content on both | Manual review | Same main content, headings and links | High |
| CI-079 | Tap targets adequately sized and spaced | Check buttons and links | Lighthouse | Targets at least 48x48 px | Low |
| CI-080 | Text readable without zoom | Check body font size | Lighthouse | Body text 16px or larger | Low |
| CI-081 | Viewport meta tag set correctly | View source | View Source | width=device-width, initial-scale=1 | Medium |
| CI-082 | No intrusive interstitials on mobile | Load pages from search on mobile | Manual review | No full-screen pop-ups blocking content on entry | Medium |
Security
5
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-083 | HTTPS on every page | Crawl for http:// URLs | Screaming Frog | All pages served over HTTPS | Critical |
| CI-084 | No mixed content | Crawl for insecure resources | Screaming Frog (Security tab), DevTools | Zero http:// resources on https:// pages | Medium |
| CI-085 | SSL certificate valid and not near expiry | Check certificate details | Browser, SSL Labs | Valid, auto-renewing | High |
| CI-086 | HSTS header set | Check response headers | curl -I, securityheaders.com | Strict-Transport-Security present | Low |
| CI-087 | CMS, theme and plugins up to date | Check update status | CMS admin | No outdated or abandoned plugins | Medium |
Structured data
9
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-088 | Organization schema on the homepage | Test homepage | Rich Results Test, Schema Markup Validator | Valid Organization with name, logo, url, sameAs | High |
| CI-089 | BreadcrumbList schema on inner pages | Test sample pages | Rich Results Test | Valid, matching visible breadcrumbs | Low |
| CI-090 | Article schema on editorial content | Test sample articles | Rich Results Test | Valid with author, datePublished, dateModified | Medium |
| CI-091 | Product schema on product pages | Test sample products | Rich Results Test | Valid with price, availability, reviews where real | High |
| CI-092 | LocalBusiness schema where a physical location exists | Test contact and location pages | Rich Results Test | Valid with NAP matching Google Business Profile | Medium |
| CI-093 | FAQPage schema matches visible text exactly | Compare schema text with page text | Rich Results Test, manual review | Word-for-word match | Medium |
| CI-094 | No duplicate schema blocks of the same type | View source for multiple JSON-LD blocks | View Source, Schema Markup Validator | One block per type per page | Medium |
| CI-095 | No schema errors in Search Console enhancements | Check Enhancements reports | Search Console | Zero invalid items | Medium |
| CI-096 | Schema describes only content visible on the page | Compare markup with page | Manual review | No hidden or invented claims in markup | High |
Internationalisation
6
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-097 | hreflang present where multiple languages or regions exist | Check head or sitemap for hreflang | Screaming Frog (hreflang tab) | Every language version annotated | High |
| CI-098 | hreflang tags are reciprocal | Run hreflang report | Screaming Frog | Every alternate links back | High |
| CI-099 | hreflang codes valid (ISO 639-1 / 3166-1) | Validate language and region codes | Screaming Frog, hreflang validator | No invalid codes such as en-UK | Medium |
| CI-100 | x-default declared | Check hreflang set | Screaming Frog | x-default present | Low |
| CI-101 | hreflang URLs are canonical and return 200 | Filter hreflang targets | Screaming Frog | No redirects or non-canonical targets | Medium |
| CI-102 | No automatic redirects based on IP or language | Load site with different locations | VPN, curl | Users and crawlers can reach every version | High |
Pagination and faceted navigation
5
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-103 | Paginated pages are indexable and self-canonical | Check page 2+ of listings | Screaming Frog | Page 2+ not canonicalised to page 1 | Medium |
| CI-104 | Paginated pages linked with crawlable links | Check pagination markup | View Source | <a href> links to next pages | Medium |
| CI-105 | Faceted filters do not create unlimited indexable URLs | Crawl filter combinations | Screaming Frog, log files | Low-value combinations noindexed, canonicalised or blocked | Critical |
| CI-106 | High-demand filter combinations have indexable landing pages | Match filter combinations to search demand | Keyword tool, Search Console | Demand-backed facets exposed as clean URLs | Medium |
| CI-107 | Infinite scroll has paginated fallback URLs | Disable JS and test listing pages | Browser | Each chunk has a unique crawlable URL | Medium |
Log files and crawl budget
4
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-108 | Server logs available for analysis | Request 30 days of access logs | Hosting provider | Logs obtained | Low |
| CI-109 | Googlebot crawls important pages frequently | Analyse Googlebot hits by section | Screaming Frog Log File Analyser | Core section receives the largest share of crawls | Medium |
| CI-110 | Crawl budget not wasted on parameters or low-value URLs | Group Googlebot hits by URL pattern | Log File Analyser | Under 10% of crawls on low-value URLs | Medium |
| CI-111 | Crawl stats show no host or availability problems | Open Crawl stats | Search Console Settings > Crawl stats | Host status green; no spikes in failed requests | High |
Images and media
4
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CI-112 | All meaningful images have descriptive alt text | Filter images missing alt | Screaming Frog | Alt text on every content image | Medium |
| CI-113 | Image file names describe the image | Review file names | Screaming Frog | No IMG_1234 style names on key images | Low |
| CI-114 | Decorative images use empty alt | Check decorative images | Manual review | alt="" on decorative images | Low |
| CI-115 | Videos have transcripts or text summaries | Review video pages | Manual review | Text equivalent on page | Low |
Topical coverage
Which questions in your subject does the site answer?
Coverage is judged against what a complete treatment of your subject requires, not against your page count. The gaps are usually where the demand is.
Source context and central entity
6
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| TC-001 | Source context defined | Write why the site exists in search and how it earns | Workshop, About page | One-sentence source context agreed | Critical |
| TC-002 | Central entity identified and recognised | Search '[entity] Wikipedia' and check Knowledge Graph | Google search, Wikidata | Entity recognised by Google | High |
| TC-003 | Central search intent stated | Combine source context with central entity as predicate + entity | Workshop | CSI written and used across templates | High |
| TC-004 | Central entity appears site-wide | Check templates for entity in titles, headings, boilerplate | Screaming Frog custom search | Entity present on every indexable template | Medium |
| TC-005 | Core and outer sections defined | Split topics into monetising core and supporting outer | Topical map | Every page assigned to core or outer | High |
| TC-006 | About page states source context and entity | Review About page | Manual review | Brand, entity and purpose stated plainly | Medium |
Query network
6
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| TC-007 | Seed queries collected for the central entity | Pull queries from Search Console, keyword tools and SERPs | Search Console, Ahrefs, Semrush | Seed list covers all prominent attributes | High |
| TC-008 | Entity attributes listed and filtered | List attributes, score for prominence, popularity and relevance | Spreadsheet, Wikidata | Attributes ranked by relevance to source context | High |
| TC-009 | People Also Ask and related searches captured | Scrape PAA and related searches for seed queries | SERP tools, AlsoAsked | Questions logged against attributes | Medium |
| TC-010 | Queries clustered by SERP overlap | Cluster by shared ranking URLs | Keyword Insights, Semrush clustering | Clusters reviewed manually | High |
| TC-011 | Sequential and correlative queries mapped | Trace what users search before and after key queries | Search Console, SERP related searches | Query paths documented | Medium |
| TC-012 | Search demand verified before creating new pages | Check volume and trend for each cluster | Keyword tool, Google Trends | Separate pages only where demand exists | Medium |
Content mapping
6
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| TC-013 | Every existing page mapped to one cluster | Map URLs to clusters | Spreadsheet | One primary cluster per page | High |
| TC-014 | Missing clusters identified | Compare clusters with existing pages | Topical map | Gap list sequenced by demand and relevance | Critical |
| TC-015 | Thin clusters identified | Flag clusters served by short or partial pages | Screaming Frog word count, manual review | Thin pages flagged for expansion or merge | High |
| TC-016 | One macro context per page | Read each page against its target cluster | Manual review | Each page answers one main question | High |
| TC-017 | Quality nodes identified and linked from homepage | List the most important core pages | Topical map, Screaming Frog | Quality nodes one click from the homepage | High |
| TC-018 | Publication sequence set | Order gaps into blocks that close one area at a time | Topical map | Sequence agreed | Medium |
Cannibalisation
3
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| TC-019 | No two pages target the same primary query | Search Console queries with multiple ranking URLs | Search Console, Semrush cannibalisation report | One ranking URL per primary query | High |
| TC-020 | Overlapping pages merged or differentiated | Review each overlap pair | Manual review | Merged with 301, or intents separated | High |
| TC-021 | Service pages and guides target different intents | Compare commercial pages with informational ones | Manual review | Commercial and informational intents separated | Medium |
Content quality
9
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| TC-022 | Main answer stated in the first paragraph | Read opening of key pages | Manual review | Definitive answer in the first two sentences | High |
| TC-023 | First sentence after each heading answers that heading | Review subordinate text | Manual review | Direct answer under every heading | Medium |
| TC-024 | Content covers the entities and attributes competitors cover | Compare entity coverage with top results | Manual review, NLP tools | No major entity or attribute missing | High |
| TC-025 | Claims use definitive language where facts are settled | Scan for may, might, could on settled facts | Manual review | Modal verbs only where uncertainty is real | Medium |
| TC-026 | Numbers, dates and units are specific | Scan for vague quantities | Manual review | Figures stated with units and sources | Medium |
| TC-027 | No contradictions between pages | Compare repeated facts across the site | Manual review | Same fact stated the same way everywhere | High |
| TC-028 | Original value present (data, examples, case evidence) | Review key pages | Manual review | Each key page holds something competitors lack | Medium |
| TC-029 | Spelling and grammar checked | Run a proofreading pass | Grammarly, LanguageTool | No errors on key pages | Low |
| TC-030 | AI-assisted content reviewed and fact-checked | Check editorial workflow | Editorial policy | Human review before publishing | Medium |
Title tags
4
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| TC-031 | Every page has a unique title tag | Filter missing and duplicate titles | Screaming Frog | Unique title on every indexable page | High |
| TC-032 | Title states the page's entity and attribute | Review titles against macro context | Manual review | Title matches the page's main question | High |
| TC-033 | Titles 50 to 60 characters | Filter by length | Screaming Frog | Core titles within range | Low |
| TC-034 | Google is not rewriting titles on key pages | Compare SERP titles with declared titles | Google search | Displayed title matches declared title | Medium |
Meta descriptions
2
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| TC-035 | Unique meta description on key pages | Filter missing and duplicate descriptions | Screaming Frog | Unique on every core page | Low |
| TC-036 | Description reflects the page's order of sections | Compare description with headings | Manual review | Description summarises the page in order | Low |
Headings
5
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| TC-037 | One H1 per page | Filter missing and multiple H1 | Screaming Frog | Exactly one H1 | Medium |
| TC-038 | Heading hierarchy logical (H2 > H3 > H4) | Review heading outline | Screaming Frog, HeadingsMap extension | No skipped levels | Medium |
| TC-039 | Headings phrased as questions where users ask questions | Compare headings with PAA questions | Manual review | Question headings on informational pages | Low |
| TC-040 | Contextual flow from first to last heading | Read headings alone as an outline | Manual review | Outline reads as one connected argument | Medium |
| TC-041 | Headings not used for styling | Check for headings on non-heading text | View Source | Headings only mark sections | Low |
Internal linking
6
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| TC-042 | Every page links to its parent and related nodes | Review inlinks and outlinks per page | Screaming Frog | Links follow the topical map hierarchy | High |
| TC-043 | Supporting pages link to the core section | Check outer-section outlinks | Screaming Frog | Every outer page links to a core page | High |
| TC-044 | Anchor text descriptive and varied | Export anchor text | Screaming Frog (Inlinks) | No 'click here'; same anchor used at most three times per page | Medium |
| TC-045 | Links justified by preceding context | Read the sentence before each link | Manual review | Anchor terms introduced before the link | Low |
| TC-046 | Internal link count per page reasonable | Count outlinks in main content | Screaming Frog | Around 15 or fewer contextual links | Low |
| TC-047 | No internal links set to nofollow | Filter nofollow internal links | Screaming Frog | Zero internal nofollow | Medium |
E-E-A-T
5
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| TC-048 | Named authors with author pages | Check article bylines | Manual review | Author name, bio and credentials on each article | Medium |
| TC-049 | Published and updated dates visible | Check article templates | Manual review | Both dates shown and match schema | Medium |
| TC-050 | Sources cited for claims and statistics | Check outbound citations | Manual review | Authoritative sources linked | Medium |
| TC-051 | Editorial policy published | Check for policy page | Manual review | Policy linked from footer | Low |
| TC-052 | Contact details and business identity visible | Check contact and About pages | Manual review | Name, email and business details present | Medium |
Freshness
3
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| TC-053 | Key pages reviewed on a schedule | Check last updated dates | Screaming Frog custom extraction, CMS | Core pages reviewed within 12 months | Medium |
| TC-054 | Outdated facts, prices and years updated | Scan for stale years and figures | Screaming Frog custom search | No outdated years or figures | Medium |
| TC-055 | Declining pages identified | Compare clicks year on year by page | Search Console | Declining pages listed for refresh | Medium |
Competitor SERPs
Who ranks above you, and what do their pages hold?
Rankings are relative. A page fails not because it is weak but because other pages answer the query more completely, and the results page shows exactly how.
Search intent
4
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CS-001 | Dominant intent identified for each priority query | Read the top 10 results | Google search (incognito, target location) | Intent labelled: informational, commercial, transactional, navigational | Critical |
| CS-002 | Page format matches the format ranking | Compare your page type with ranking page types | Manual review | Same format as the majority of top results | High |
| CS-003 | Content angle matches what ranks | Compare angles (beginner, comparison, list, guide) | Manual review | Angle aligned with the SERP | Medium |
| CS-004 | Mixed-intent SERPs handled | Identify SERPs with split intent | Manual review | Page serves the larger intent share | Medium |
SERP features
6
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CS-005 | Featured snippet holders identified | Record who holds snippets for priority queries | Semrush, Ahrefs, manual search | Snippet opportunities listed | Medium |
| CS-006 | Snippet-ready answers written | Check for 40 to 50 word answers under question headings | Manual review | Concise answer under each target question | Medium |
| CS-007 | People Also Ask questions answered on page | Compare PAA with page headings | AlsoAsked, manual review | Relevant PAA questions covered | Medium |
| CS-008 | AI Overview presence recorded for priority queries | Search priority queries and note AI Overviews | Google search | Queries with AI Overviews flagged | Medium |
| CS-009 | Image and video pack opportunities identified | Check SERPs for image and video results | Google search | Media created where packs appear | Low |
| CS-010 | Local pack presence recorded where relevant | Check local queries | Google search, local rank tracker | Local pack status known | Medium |
Competitor content
6
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CS-011 | True search competitors identified | List domains ranking across your priority queries | Semrush, Ahrefs competitor reports | Top 5 search competitors named | High |
| CS-012 | Competitor topical coverage compared | Crawl competitor sitemaps and map to your clusters | Screaming Frog, sitemap export | Coverage gaps against each competitor listed | High |
| CS-013 | Entities and attributes in ranking pages extracted | Read top 3 pages per priority query | Manual review, NLP tools | Missing entities listed per page | High |
| CS-014 | Content depth compared | Compare sections, word count and media | Manual review, Screaming Frog | Depth gap documented | Medium |
| CS-015 | Competitor publishing pace measured | Count new pages per month from sitemaps | Sitemap lastmod, Ahrefs | Publishing pace known | Low |
| CS-016 | Queries competitors rank for and you do not | Run a keyword gap | Semrush, Ahrefs keyword gap | Gap list added to the topical map | High |
Authority and backlinks
6
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CS-017 | Referring domains compared with competitors | Compare referring domain counts | Ahrefs, Semrush, Majestic | Authority gap quantified | Medium |
| CS-018 | Link profile quality reviewed | Sample referring domains for relevance and spam | Ahrefs | No large share of spam or irrelevant links | Medium |
| CS-019 | Toxic or manipulative links assessed | Review suspicious patterns | Ahrefs, Search Console Links report | Disavow only where a manual action or clear risk exists | Low |
| CS-020 | Pages with the most backlinks return 200 | Check status of top linked pages | Ahrefs Best by links, Screaming Frog | Linked pages live or redirected | High |
| CS-021 | Unlinked brand mentions found | Search brand mentions without links | Ahrefs Content Explorer, Google Alerts | Mentions logged for outreach | Low |
| CS-022 | Competitor link sources reviewed | Run a link intersect | Ahrefs Link Intersect | Relevant link opportunities listed | Low |
Local search
4
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| CS-023 | Google Business Profile claimed and verified | Check profile ownership | Google Business Profile | Verified, correct primary category | High |
| CS-024 | NAP consistent across the web | Compare name, address and phone on key citations | BrightLocal, manual search | Identical NAP everywhere | Medium |
| CS-025 | Location pages exist for each served area | Check location pages | Manual review | Unique page per location with local detail | Medium |
| CS-026 | Reviews monitored and answered | Check review count and responses | Google Business Profile | Recent reviews answered | Low |
AI visibility
Do AI assistants name your brand or a competitor?
A growing share of buyers read an answer instead of clicking a result. If an assistant names three companies in your category and none is yours, rankings alone will not fix it.
AI assistant mentions
7
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| AI-001 | Category questions tested in ChatGPT | Ask 10 category questions a buyer would ask | ChatGPT | Brand mentions and cited sources recorded | High |
| AI-002 | Category questions tested in Gemini | Ask the same 10 questions | Gemini | Brand mentions and cited sources recorded | High |
| AI-003 | Category questions tested in Perplexity | Ask the same 10 questions | Perplexity | Brand mentions and cited sources recorded | High |
| AI-004 | AI Overviews checked for priority queries | Search priority queries in Google | Google search | Cited sources in each AI Overview recorded | High |
| AI-005 | Competitors cited instead of you listed | Compile brands named across all assistants | Spreadsheet | Competitor citation frequency known | High |
| AI-006 | Facts stated about your brand are accurate | Ask assistants to describe your business | ChatGPT, Gemini, Perplexity | No wrong prices, services, locations or dates | High |
| AI-007 | Baseline saved for re-testing | Save prompts, answers and dates | Spreadsheet | Same prompts re-run quarterly | Medium |
Entity consistency
4
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| AI-008 | Brand name identical across all profiles | Compare name on site, social, directories | Manual search | One exact brand name everywhere | Medium |
| AI-009 | Business description consistent across profiles | Compare About text on key profiles | Manual review | Same core description of what the business does | Medium |
| AI-010 | sameAs links connect official profiles | Check Organization schema sameAs | Schema Markup Validator | All official profiles listed | Medium |
| AI-011 | Founder and key people linked to the brand | Check Person schema and profile links | Schema Markup Validator, LinkedIn | People connected to the Organization entity | Low |
Knowledge graph
3
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| AI-012 | Brand appears in Google's Knowledge Graph | Search brand name for a knowledge panel | Google search, Knowledge Graph Search API | Knowledge panel or KG entity present | Medium |
| AI-013 | Wikidata entry exists and is accurate | Search Wikidata for the brand | Wikidata | Entry with correct statements and official website | Low |
| AI-014 | Listed in relevant industry directories | Check key directories and associations | Manual search | Present in authoritative directories for the sector | Low |
Extractability
5
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| AI-015 | Answers stated in self-contained sentences | Read key answers out of context | Manual review | Each answer makes sense when quoted alone | High |
| AI-016 | Entities named rather than referred to by pronoun | Scan key paragraphs | Manual review | Subject named in each key sentence | Medium |
| AI-017 | Tables and lists used for comparisons and steps | Review comparison and process content | Manual review | Structured formats where data is structured | Medium |
| AI-018 | Statistics carry sources and dates | Check figures on key pages | Manual review | Every statistic sourced and dated | Medium |
| AI-019 | Author and publish date visible on content | Check templates | Manual review | Both visible on every article | Medium |
AI crawler access
3
| ID | Check | How to check | Tool | Pass criteria | Severity |
|---|---|---|---|---|---|
| AI-020 | AI crawlers can reach content you want cited | Check robots.txt and firewall rules for AI user agents | robots.txt, CDN or firewall settings | Allowed for pages meant to be cited | High |
| AI-021 | Key content not dependent on JavaScript to render | Fetch pages without JavaScript | curl, text-only browser | Main content present in raw HTML | High |
| AI-022 | llms.txt considered | Decide whether to publish an llms.txt file | Manual review | Decision documented | Low |
How to use the audit checklist
The spreadsheet tracks progress as you work and separates the problems that block everything else from the ones that can wait. Use one copy per site.
Work through the layers in order
Start with crawling and indexing. A coverage gap matters little on a page a search engine cannot reach, so the layers are sequenced by what depends on what.
Mark each check
Set each check to Pass, Fail or N/A. For every Fail, record how many pages it affects, what you found, who owns the fix and a target date.
Work the fix-first list
The Fix-first sheet collects every Critical and High problem, Critical first. That list is the plan; the rest is the backlog.
What a checklist cannot do for you
The checklist finds problems. Three things decide whether finding them changes anything, and none of them fit in a spreadsheet.
-
Ranking the findings
An audit that returns 40 problems is a list nobody acts on until someone decides which three matter most. Severity gives you a starting order; your own context decides the rest.
-
Judging coverage against demand
Layer two asks which questions your subject requires. Answering it means building the query network first, which our SEO audit service does as part of the work.
-
Access to tools and data
Search Console access covers most of layer one. A crawler covers structure, and the paid tools matter mainly for layer three. The checklist names which tool each check needs, and which are free.
-
Time to run it properly
218 checks is a working week for someone who has run audits before, and longer the first time. Skimming it produces a list of symptoms rather than a diagnosis.