SEO Audit
Production-grade SEO audit framework with an 85-point checklist across 8 dimensions, severity-weighted scoring, automated diagnostic workflows, and prioritized remediation plans. Covers technical SEO, on-page optimization, content quality, competitive positioning, and migration readiness.
Table of Contents
Operating Modes
Mode 1: Full Site Audit
Comprehensive audit across all 8 dimensions. Use for initial assessment or annual reviews.
Mode 2: Focused Audit
Single-dimension deep dive. Use when the problem area is already identified (e.g., "our Core Web Vitals are failing" or "we have indexation issues").
Mode 3: Pre-Migration Audit
Checklist for planned URL changes, platform switches, or redesigns. Establishes baseline and creates the redirect mapping framework.
Mode 4: Traffic Drop Diagnosis
Emergency diagnostic when organic traffic drops. Follows the traffic drop decision tree to isolate the cause.
Initial Assessment
Required Context
| Question |
Why It Matters |
| What type of site? (SaaS, e-commerce, blog, local business) |
Determines which audit dimensions to weight |
| What is the primary SEO goal? |
Focuses the audit on business-relevant outcomes |
| What is the current organic traffic baseline? |
Establishes the benchmark for measuring improvement |
| Any recent changes? (migration, redesign, content update, algorithm update) |
Identifies potential cause of current issues |
| Do you have Google Search Console access? |
Essential for indexation and performance data |
| Who are 3 organic competitors? |
For competitive gap analysis |
Scope Definition
| Scope |
Pages to Audit |
Recommended When |
| Full site |
All indexed pages + sample of non-indexed |
Annual audit, new client onboarding |
| Section audit |
One directory or content type |
Known problem area |
| Top pages |
Top 50 by traffic + top 50 by impressions |
Quick wins identification |
| New pages |
Pages published in last 90 days |
Content quality check |
The 85-Point Audit Checklist
Dimension 1: Crawlability (12 points)
| # |
Check |
Severity |
Pass Criteria |
| 1.1 |
robots.txt accessible and valid |
Critical |
200 response, no syntax errors |
| 1.2 |
Important pages not blocked by robots.txt |
Critical |
No disallow rules for key pages |
| 1.3 |
XML sitemap exists and is valid |
High |
Submitted in GSC, < 50K URLs per file |
| 1.4 |
Sitemap reflects actual site structure |
High |
No 404s, no redirects, no noindex pages in sitemap |
| 1.5 |
Crawl depth < 4 clicks from homepage |
Medium |
95%+ of pages within 3 clicks |
| 1.6 |
No infinite crawl traps |
Critical |
No parameter-based infinite loops |
| 1.7 |
Internal links use crawlable HTML |
High |
No JavaScript-only navigation |
| 1.8 |
Pagination uses rel=next/prev or load-more |
Medium |
Paginated content is crawlable |
| 1.9 |
No orphan pages (indexed but no internal links) |
High |
0 orphan pages in indexed set |
| 1.10 |
Crawl budget not wasted on low-value pages |
Medium |
< 10% crawl budget on utility pages |
| 1.11 |
Server response time < 500ms |
High |
TTFB < 500ms for 95% of pages |
| 1.12 |
No 5xx errors in crawl |
Critical |
0% server errors |
Dimension 2: Indexation (10 points)
| # |
Check |
Severity |
Pass Criteria |
| 2.1 |
Target pages are indexed |
Critical |
> 95% of target pages in Google index |
| 2.2 |
No duplicate content issues |
High |
No duplicate titles, no near-duplicate content |
| 2.3 |
Canonical tags implemented correctly |
High |
Self-referencing on unique pages, cross-domain where needed |
| 2.4 |
No conflicting signals (canonical vs noindex vs sitemap) |
Critical |
No page that is both noindex and in sitemap |
| 2.5 |
Hreflang tags correct (if multilingual) |
High |
Valid hreflang with return tags |
| 2.6 |
No index bloat (unnecessary pages indexed) |
Medium |
Utility pages not indexed |
| 2.7 |
Thin content pages identified |
High |
No pages with < 200 words of unique content |
| 2.8 |
Parameter handling configured |
Medium |
URL parameters handled in GSC or via canonical |
| 2.9 |
JavaScript-rendered content indexable |
High |
Key content visible in cached/rendered version |
| 2.10 |
New pages getting indexed within 7 days |
Medium |
Using IndexNow or manual submission |
Dimension 3: Core Web Vitals (10 points)
| # |
Check |
Severity |
Pass Criteria |
| 3.1 |
LCP < 2.5s |
High |
75th percentile of page loads |
| 3.2 |
INP < 200ms |
High |
75th percentile of interactions |
| 3.3 |
CLS < 0.1 |
High |
75th percentile of page loads |
| 3.4 |
Mobile CWV passing |
Critical |
Mobile scores meeting thresholds |
| 3.5 |
Desktop CWV passing |
Medium |
Desktop scores meeting thresholds |
| 3.6 |
No render-blocking resources |
Medium |
CSS/JS delivery optimized |
| 3.7 |
Images optimized (WebP/AVIF, lazy loading) |
Medium |
All above-fold images preloaded |
| 3.8 |
Font loading optimized |
Low |
No FOUT/FOIT, font-display: swap |
| 3.9 |
Third-party script impact measured |
Medium |
No third-party scripts adding > 500ms |
| 3.10 |
HTTPS with no mixed content |
Critical |
All resources served over HTTPS |
Dimension 4: On-Page SEO (15 points)
| # |
Check |
Severity |
Pass Criteria |
| 4.1 |
Unique title tags on every page |
Critical |
No duplicates, < 60 chars |
| 4.2 |
Title includes primary keyword |
High |
Keyword in first 60 chars |
| 4.3 |
Unique meta descriptions |
High |
No duplicates, < 155 chars, includes keyword |
| 4.4 |
H1 tag present and unique per page |
High |
One H1 per page with primary keyword |
| 4.5 |
Heading hierarchy logical (H1 > H2 > H3) |
Medium |
No skipped levels |
| 4.6 |
Internal links with descriptive anchor text |
High |
No "click here" or naked URLs |
| 4.7 |
Images have alt text |
Medium |
Descriptive alt text on all meaningful images |
| 4.8 |
URL structure is clean and descriptive |
Medium |
No IDs, parameters, or excessive depth |
| 4.9 |
Primary keyword in first 100 words |
Medium |
Natural inclusion in opening |
| 4.10 |
Content matches search intent |
Critical |
Page type matches what Google ranks for query |
| 4.11 |
No keyword cannibalization |
High |
No two pages targeting the same primary keyword |
| 4.12 |
Open Graph and Twitter Card tags |
Low |
Social sharing metadata present |
| 4.13 |
Structured data implemented |
Medium |
Relevant schema types present |
| 4.14 |
Internal links to relevant pages |
High |
3-5 contextual internal links per content page |
| 4.15 |
Breadcrumbs present |
Medium |
Functional breadcrumbs with schema |
Dimension 5: Content Quality (12 points)
| # |
Check |
Severity |
Pass Criteria |
| 5.1 |
Content provides unique value |
Critical |
Not available elsewhere in same form |
| 5.2 |
Content depth matches intent |
High |
Comprehensive coverage of the topic |
| 5.3 |
Content freshness appropriate |
Medium |
Updated within last 12 months for evergreen |
| 5.4 |
No AI-generated content markers |
High |
No generic filler, overused phrases, or em-dash patterns |
| 5.5 |
E-E-A-T signals present |
High |
Author attribution, credentials, experience evidence |
| 5.6 |
Content readability appropriate |
Medium |
Matches target audience reading level |
| 5.7 |
No thin content pages |
High |
All pages > 300 words of unique content |
| 5.8 |
No content duplication across pages |
High |
Jaccard similarity < 50% between any two pages |
| 5.9 |
Content supports conversion goal |
Medium |
Clear CTA aligned with page intent |
| 5.10 |
Visual content present |
Medium |
Images, charts, or videos enhance understanding |
| 5.11 |
Content organized with subheadings |
Medium |
Scannable structure with clear sections |
| 5.12 |
External references and citations |
Low |
Links to authoritative sources where relevant |
Dimension 6: Technical Infrastructure (10 points)
| # |
Check |
Severity |
Pass Criteria |
| 6.1 |
HTTPS properly configured |
Critical |
Valid certificate, no mixed content |
| 6.2 |
Proper redirects (301 not 302) |
High |
Permanent redirects for permanent moves |
| 6.3 |
No redirect chains (> 2 hops) |
Medium |
Direct redirect from origin to destination |
| 6.4 |
No broken internal links (404s) |
High |
0 broken internal links |
| 6.5 |
No broken external links |
Low |
< 5% broken outbound links |
| 6.6 |
Mobile-responsive design |
Critical |
Passes Google's mobile-friendly test |
| 6.7 |
Proper 404 page |
Low |
Custom 404 with navigation and search |
| 6.8 |
Server uptime > 99.9% |
Critical |
Monitoring in place |
| 6.9 |
CDN configured for global audience |
Medium |
If international traffic > 20% |
| 6.10 |
Security headers present |
Low |
HSTS, CSP, X-Frame-Options |
Dimension 7: Off-Page Signals (8 points)
| # |
Check |
Severity |
Pass Criteria |
| 7.1 |
Backlink profile health |
High |
No toxic link patterns |
| 7.2 |
Referring domain diversity |
Medium |
> 50 unique referring domains |
| 7.3 |
Anchor text distribution natural |
Medium |
< 30% exact-match anchors |
| 7.4 |
No manual actions in GSC |
Critical |
Clean manual actions report |
| 7.5 |
Google Business Profile (if local) |
High |
Claimed, verified, complete |
| 7.6 |
Social profiles linked |
Low |
Active profiles on major platforms |
| 7.7 |
Brand mentions without links |
Low |
Unlinked mentions as link opportunities |
| 7.8 |
Competitor link gap identified |
Medium |
Top competitors' link sources mapped |
Dimension 8: Analytics and Tracking (8 points)
| # |
Check |
Severity |
Pass Criteria |
| 8.1 |
Google Search Console verified |
Critical |
All properties verified |
| 8.2 |
GA4 properly configured |
High |
Events tracking, no duplicate tags |
| 8.3 |
Conversion tracking in place |
High |
Key conversions tracked |
| 8.4 |
GSC and GA4 linked |
Medium |
Data flowing between tools |
| 8.5 |
Bing Webmaster Tools configured |
Low |
Verified and sitemap submitted |
| 8.6 |
Search Console coverage report clean |
High |
No unexpected errors |
| 8.7 |
Core Web Vitals field data available |
Medium |
Enough traffic for CrUX data |
| 8.8 |
UTM parameter strategy |
Low |
Consistent campaign tracking |
Severity-Weighted Scoring
Scoring Formula
Total Score = Sum of (Dimension Weight x Dimension Pass Rate)
Dimension Pass Rate = (Passed Checks x Severity Multiplier) / (Total Checks x Severity Multiplier)
Severity Multipliers:
Critical = 4x
High = 3x
Medium = 2x
Low = 1x
Overall Health Grades
| Score |
Grade |
Assessment |
| 90-100 |
A |
Excellent -- focus on competitive edge |
| 80-89 |
B |
Good -- fix remaining high-priority items |
| 70-79 |
C |
Fair -- significant improvements available |
| 60-69 |
D |
Poor -- critical issues blocking performance |
| < 60 |
F |
Failing -- foundational problems require immediate attention |
Core Web Vitals Deep Dive
LCP Optimization Priority Stack
| Cause |
Detection |
Fix |
Impact |
| Slow server response |
TTFB > 600ms |
CDN, server upgrade, caching |
High |
| Render-blocking CSS/JS |
PageSpeed Insights flags |
Inline critical CSS, defer JS |
High |
| Large hero image |
LCP element is an image > 500KB |
WebP/AVIF, responsive sizes, preload |
High |
| Client-side rendering |
LCP requires JS execution |
SSR or prerendering |
Medium |
| Web font blocking |
FOUT delays LCP text |
font-display: swap, preload fonts |
Medium |
INP Optimization Priority Stack
| Cause |
Detection |
Fix |
Impact |
| Long JavaScript tasks |
Chrome DevTools Performance tab |
Break into smaller tasks, use requestIdleCallback |
High |
| Heavy event handlers |
Slow click/scroll responses |
Debounce, optimize handler code |
High |
| Main thread blocking |
Third-party scripts |
Defer or lazy-load third-party JS |
Medium |
| Layout thrashing |
Forced reflows on interaction |
Batch DOM reads/writes |
Medium |
CLS Optimization Priority Stack
| Cause |
Detection |
Fix |
Impact |
| Images without dimensions |
CLS in PageSpeed Insights |
Add width/height attributes |
High |
| Dynamic content injection |
Ads, embeds loading late |
Reserve space with CSS aspect-ratio |
High |
| Web fonts causing reflow |
Text shifts when font loads |
font-display: optional or swap |
Medium |
| Late-loading CSS |
Styles applied after render |
Inline critical CSS |
Medium |
Crawl and Indexation Analysis
Indexation Gap Analysis
Compare these three data sets to find gaps:
Set A: Pages in XML sitemap (your intended index)
Set B: Pages indexed in Google (site: query + GSC Coverage)
Set C: Pages receiving organic traffic (GSC Performance)
A - B = Submitted but not indexed (quality or crawl issue)
B - A = Indexed but not in sitemap (orphan or forgotten pages)
B - C = Indexed but receiving zero traffic (rank 100+ or deindexed from results)
Traffic Drop Decision Tree
Traffic dropped →
├── Sitewide drop?
│ ├── Yes → Check for manual action in GSC
│ │ Check for algorithm update (timeline match?)
│ │ Check for robots.txt or noindex changes
│ │ Check server uptime/5xx errors
│ └── No (specific pages/sections) →
│ ├── Check for cannibalization (new page stealing from old)
│ ├── Check for content freshness (competitor updated, you didn't)
│ ├── Check for lost backlinks to those pages
│ └── Check for SERP feature changes (new featured snippet, AI overview)
└── Gradual decline vs sudden drop?
├── Sudden → Technical issue or algorithm update
└── Gradual → Content decay, competitive pressure, or authority erosion
On-Page SEO Analysis
Keyword Cannibalization Detection
Two or more pages targeting the same keyword compete with each other. Detection method:
- Export all pages + their primary keyword from GSC (queries with most impressions per page)
- Group by keyword -- any keyword assigned to 2+ pages is cannibalized
- Check which page ranks higher for each cannibalized keyword
- Action: Consolidate (merge into one page), differentiate (change one page's target), or canonical (point one to the other)
Intent Match Scoring
For each target keyword, verify that your page type matches what Google actually ranks:
| Google Ranks |
Your Page Type |
Match? |
Action |
| Listicles |
Single product page |
No |
Create a listicle targeting this keyword |
| How-to guides |
Blog opinion piece |
No |
Restructure as how-to |
| Comparison tables |
Feature page |
Partial |
Add comparison elements |
| Videos |
Text-only page |
No |
Add video or target a different keyword |
Content Quality Assessment
AI Content Detection Signals
Watch for these patterns that signal low-quality AI-generated content:
| Signal |
Example |
Fix |
| Excessive em dashes |
"The tool -- which is powerful -- delivers results" |
Use commas or periods |
| Filler hedging |
"It's important to note that..." |
Delete and get to the point |
| Generic superlatives |
"This groundbreaking, cutting-edge solution" |
Use specific, evidence-based language |
| Perfect paragraph symmetry |
Every section has exactly 3 paragraphs of 4 sentences |
Vary structure naturally |
| No first-person experience |
Zero personal anecdotes or experience markers |
Add genuine experience signals |
| Overused transitions |
"Furthermore", "Moreover", "Additionally" at every paragraph |
Vary connectors or remove them |
E-E-A-T Scoring
| Signal |
Weight |
Check |
| Author byline with credentials |
High |
Named author with bio and expertise |
| Author page with sameAs links |
High |
Links to LinkedIn, publications |
| Original research or data |
High |
First-party data, surveys, experiments |
| Experience evidence |
High |
Screenshots, photos, personal narrative |
| Citations to authoritative sources |
Medium |
Links to primary sources |
| Publication date and update date |
Medium |
Visible and accurate |
| About page with team credentials |
Medium |
Company expertise established |
| External reviews and mentions |
Low |
Third-party validation |
Competitive Gap Analysis
Framework
For each of your top 3 competitors, compare:
| Dimension |
Your Site |
Competitor 1 |
Competitor 2 |
Competitor 3 |
| Domain Rating |
|
|
|
|
| Indexed pages |
|
|
|
|
| Organic keywords (top 100) |
|
|
|
|
| Estimated organic traffic |
|
|
|
|
| Content publishing frequency |
|
|
|
|
| Avg content depth (word count) |
|
|
|
|
| Referring domains |
|
|
|
|
| Top-performing content types |
|
|
|
|
Keyword Gap Priority Matrix
| Gap Type |
Description |
Priority |
| Uncontested |
Keyword with volume, no competitor ranks |
Highest |
| Weak competition |
You could realistically rank page 1 |
High |
| Content gap |
Competitor has content, you don't |
Medium |
| Quality gap |
Both have content, theirs ranks better |
Medium |
| Authority gap |
Competitor's DR advantage is the barrier |
Lower (long-term) |
Migration Audit Checklist
Pre-Migration (2-4 weeks before)
During Migration
Post-Migration (2-8 weeks after)
Prioritized Remediation Plan
Priority Framework
Every finding gets classified:
| Priority |
Criteria |
Timeline |
| P0 Emergency |
Blocking indexation or causing active ranking loss |
Fix today |
| P1 Critical |
Major negative impact on rankings or traffic |
Fix this week |
| P2 High |
Significant improvement potential |
Fix this month |
| P3 Medium |
Moderate improvement, standard best practice |
Fix this quarter |
| P4 Low |
Minor improvement or nice-to-have |
Backlog |
Remediation Plan Template
| # |
Finding |
Dimension |
Severity |
Current State |
Recommended Fix |
Expected Impact |
Effort |
| 1 |
|
|
|
|
|
|
|
| 2 |
|
|
|
|
|
|
|
Output Artifacts
| Artifact |
Format |
Description |
| Executive Summary |
3-5 bullet points |
Overall grade, top issues, quick wins |
| Full Audit Report |
85-point checklist |
Pass/fail per check with evidence |
| Severity Scorecard |
Weighted score table |
Per-dimension scores and overall grade |
| Prioritized Fix List |
Ranked table |
Every finding with severity, fix, effort, impact |
| Keyword Cannibalization Map |
Table |
Pages competing for same keywords with resolution action |
| Competitive Gap Report |
Comparison matrix |
Your site vs. 3 competitors across 8 dimensions |
| Migration Checklist |
Checkbox list |
Pre/during/post migration tasks |
Related Skills
- programmatic-seo -- Use when audit reveals keyword gap clusters that could be addressed with template-based page generation at scale.
- schema-markup -- Use when audit reveals missing or broken structured data opportunities.
- site-architecture -- Use when audit uncovers structural issues (orphan pages, deep nesting, poor internal linking) requiring architectural redesign.
- content-creator -- Use when audit reveals content quality issues requiring editorial improvement.
- competitor-alternatives -- Use when competitive gap analysis reveals positioning opportunities for comparison content.