On-Page SEO Audit — Phase 3
Executive Summary
On-page SEO is the highest-leverage, lowest-cost ranking lever available. Title tag + meta optimization alone can improve CTR by 20–35% within 30 days (GSC data 2024). In 2025, on-page signals have a dual role: traditional ranking AND AI Overview citation probability. Pages without direct standalone answers and FAQPage schema rarely appear in AIO. Always compare against the top-ranking competitor's on-page patterns.
Tools for This Phase
| Tool |
Purpose |
Cost |
| Screaming Frog |
Bulk audit: titles, meta, H1s, word counts, duplicate detection |
Free/Paid |
| Google Search Console |
Page-level impressions, CTR, position — identify rewrite priorities |
Free |
| Surfer SEO |
Content Score vs. top competitors — target 70+ cluster, 80+ pillar |
Paid |
| Clearscope |
Content grade vs. top 10 competitors — target A- pillar, B+ cluster |
Paid |
| Ahrefs |
Organic keywords per page, SERP features per URL |
Paid |
| SEMrush |
On-page checker — compare vs. top 10 ranking pages |
Paid |
| Google Rich Results Test |
FAQPage schema validation, structured data presence |
Free |
| Chrome DevTools → Sources |
Verify rendered HTML (JS-rendered content vs. raw HTML) |
Free |
| site_crawler.py |
Word counts, title/meta data per page CSV |
Free (local) |
Step 1: Read Project Context
Read {AUDIT_DIR}/intake-data.md — business name, URL, services, location.
Read {AUDIT_DIR}/technical-findings.md — page indexation status, canonical issues.
Read {AUDIT_DIR}/competitor-profiles.md — competitor on-page patterns, title formats, schema usage.
Read {DATA_DIR}/crawl/ — crawler output for bulk title/meta analysis.
Priority Page Inventory
Audit in this order (highest business impact first):
- Homepage
- Primary service page(s) — one per core service
- Location/service-area pages
- Top-performing blog posts (by GSC impressions — filter top 10)
- Contact page
- About page (E-E-A-T critical)
Section 1: Title Tags
Character Limits (2025)
- Optimal: 50–60 characters (displays fully in desktop SERPs)
- Mobile SERP: 50–55 characters
- Maximum before truncation: 60 characters (580px pixel width)
- Google rewrites if: Title doesn't match page content or is < 10 characters
Per-Page Checklist
For each key page, verify:
Optimal title formats:
| Page Type |
Format |
Example |
| Service page |
[Service] in [City] | [Brand] |
Emergency Plumber in Chicago | Acme Plumbing |
| Homepage |
[Brand] — [Service] in [City, State] |
Acme Plumbing — Plumber in Chicago, IL |
| Blog post |
[Question/Keyword] [Year] — [Brand] |
How to Fix a Leaky Faucet 2025 — Acme Plumbing |
| Location page |
[Service] in [City, ST] | [Brand] |
Drain Cleaning in Evanston, IL | Acme |
AI Overviews Title Optimization
Titles that appear in AIO tend to:
- Directly match conversational query intent
- Include "How", "What", "Best", or specific quantifiers
- Signal definitive authority: "Complete Guide", "Expert Guide", "[Year] Guide"
Competitor Title Comparison
| Page |
Client Title |
Competitor #1 Title |
Gap |
| Homepage |
|
|
|
| Primary service |
|
|
|
| Location page |
|
|
|
Section 2: Meta Descriptions
Character limits: 150–160 characters (desktop) | 130–145 characters (mobile)
If Google rewrites 90%+ of meta descriptions: Page content doesn't match intent — rewrite lead paragraph first.
Per-page checklist:
Section 3: Header Tag Hierarchy (H1–H6)
Per-page checks:
AIO-optimized header pattern (2025):
H1: [Primary Keyword in City] — [Benefit]
H2: What Is [Service]? ← AIO extraction target
H2: How Much Does [Service] Cost in [City]? ← AIO + featured snippet
H3: Factors Affecting [Service] Cost
H2: Our [Service] Process ← HowTo schema opportunity
H2: Frequently Asked Questions ← FAQPage schema target
H3: [Question 1]?
H3: [Question 2]?
Section 4: Content Optimization
Keyword Density & Distribution
- Primary keyword in first 100 words: ✅/❌
- Natural density: 1–2% (not stuffed, not absent)
- LSI/NLP entities used (not just exact match): ✅/❌
- Synonyms and related variants included: ✅/❌
Word Count Benchmarks (2025 HCS Standards)
| Page Type | Minimum | Competitive Target | Red Flag |
|-----------|---------|-------------------|---------|-
| Homepage | 600 words | 800–1,200 | < 400 |
| Service page | 800 words | 1,200–2,000 | < 500 |
| Location page | 600 words | 900–1,500 | < 400 |
| Pillar blog | 2,500 words | 3,500–5,000 | < 1,200 |
| Cluster blog | 1,200 words | 1,500–2,500 | < 600 |
| FAQ answer | 150 words | 250–400 | < 50 |
Search Intent Satisfaction
| Intent |
Content Required |
Conversion Rate |
| Informational |
Comprehensive guide, all related questions answered |
1–3% |
| Commercial |
Service description, pricing signals, reviews, comparison |
3–8% |
| Transactional |
Clear path to contact/book, click-to-call, urgency |
8–20% |
| Navigational |
Gets user to destination immediately |
Brand intent |
Competitor comparison (Surfer/Clearscope):
| Page |
Client Word Count |
Surfer Score |
Comp #1 Words |
Comp #1 Score |
Gap |
| Homepage |
|
|
|
|
|
| [Service] page |
|
|
|
|
|
Content Freshness
- Date visible on time-sensitive pages (updated YYYY)? ✅/❌
- Statistics current (< 2 years old)? ✅/❌
- Seasonal pages updated for current year? ✅/❌
- 2025 context: ChatGPT cites content updated within 30 days at 76.4% rate — freshness = AIO signal.
Section 5: E-E-A-T On-Page Signals
E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) — Google's quality framework, critical since HCS integration into core algorithm (March 2024).
Experience Signals (NEW "first E" since Dec 2022)
- Real photos of team doing actual work? ✅/❌
- Case studies with before/after + specific outcomes? ✅/❌
- Project galleries with client permission? ✅/❌
- Video content showing expertise in action? ✅/❌
- Real project examples with specifics (location, problem, solution, outcome)? ✅/❌
Expertise Signals
- Author name + bio on all blog posts? ✅/❌
- Author page with credentials at
/about/[name]? ✅/❌
- Certifications, licenses, professional memberships stated? ✅/❌
- Years of experience stated with specific projects? ✅/❌
Authoritativeness
- External links to authoritative sources (not competitors)? ✅/❌
- Industry data cited with sources + dates? ✅/❌
- Awards or recognition mentioned with links? ✅/❌
Trustworthiness
- About page with real team photos + bios? ✅/❌
- Physical address in footer and Contact page? ✅/❌
- Privacy policy + terms of service linked from footer? ✅/❌
- SSL/HTTPS on all pages? ✅/❌
- Third-party review platform links (Google, BBB, Yelp)? ✅/❌
Section 6: Internal Linking
Hub-and-Spoke Architecture Check
- Pillar service pages link to all related subtopic pages? ✅/❌
- Subtopic pages link back to pillar? ✅/❌
- Blog posts link to relevant service pages (conversion bridge)? ✅/❌
- Service pages link to related blog content (depth signal)? ✅/❌
Internal Link Metrics (from Screaming Frog)
| Check |
Target |
Client |
| Orphan pages (0 internal links) |
0 |
|
| Pages requiring > 3 clicks from homepage |
0 |
|
| Max internal links per page |
< 100 |
|
| Homepage internal links |
25–75 |
|
Anchor Text Quality
- Descriptive, keyword-inclusive anchors (not "click here")? ✅/❌
- Varied anchor text (not same anchor for all links to same page)? ✅/❌
- Primary keyword anchor to primary service page? ✅/❌
Section 7: Image SEO
| Check |
Target |
Impact |
| Alt text: descriptive, 5–15 words, keyword-inclusive |
All images |
AIO image citation + accessibility |
| Alt text max length |
150 characters |
Screen reader UX |
Filename: descriptive (not IMG_1234.jpg) |
All images |
Image search ranking |
| Format: WebP or AVIF |
All non-hero images |
Page speed |
Dimensions width/height specified |
All images |
CLS prevention |
loading="lazy" on below-fold images |
All below-fold |
LCP improvement |
| Geo-tagged EXIF data |
Location-relevant images |
Local SEO signal |
| Image in XML sitemap |
Significant images |
Image search visibility |
Section 8: AI Overviews Optimization (2025 Critical)
Pages cited in AIO score 4× the impressions of position 1 organic when AIO appears. AIO appears for 20–35% of local service queries (SparkToro 2025).
AIO citation requirements — checklist per page:
Test: Search target keyword → does AIO appear? Is client cited? If competitor cited but not client → content gap in answer structure.
Section 9: Page Experience Signals
- Core Web Vitals all "Good" (from Phase 10)? ✅/❌
- No intrusive interstitials blocking content on mobile? ✅/❌
- No aggressive ads above fold? ✅/❌
- Safe browsing clean (no malware)? ✅/❌
- Mobile-friendly (Google Mobile-Friendly Test passing)? ✅/❌
- No horizontal scrolling on mobile (375px viewport)? ✅/❌
Section 10: CTAs
| Check |
High-Intent Pages |
Blog Posts |
| At least 1 CTA per page |
Required |
Required |
| CTA above fold on mobile |
Required |
Optional |
Click-to-call <a href="tel:..."> |
Required |
Recommended |
| Service-specific CTA (not generic "Contact Us") |
Required |
N/A |
| CTA visual contrast (color + size) |
Required |
Required |
| Multiple CTAs on long pages (top/mid/bottom) |
Required |
Recommended |
| Sticky CTA header/bar on mobile |
High priority |
Optional |
Scoring
| Category |
Weight |
Score |
| Title tags (uniqueness, optimization, length) |
15% |
/15 |
| Meta descriptions (uniqueness, CTR optimization) |
10% |
/10 |
| Header hierarchy (H1 uniqueness, keyword use, AIO structure) |
10% |
/10 |
| Content depth + intent satisfaction vs. competitors |
20% |
/20 |
| E-E-A-T signals (all 4 components) |
20% |
/20 |
| Internal linking (hub-and-spoke, orphans, anchor text) |
10% |
/10 |
| Image SEO (alt text, format, dimensions) |
5% |
/5 |
| AI Overviews optimization (FAQPage, direct answers) |
10% |
/10 |
Veto: > 50% of service pages missing FAQPage schema → maximum AI visibility score capped at 40/100.
Output
Write complete findings to {AUDIT_DIR}/onpage-findings.md with YAML frontmatter:
---
skill: audit/onpage-seo
phase: 3
date: [YYYY-MM-DD]
business: [Business Name]
url: [URL]
score: [X/100]
pages_audited: [X]
title_issues: [X]
missing_faqpage: [X]
eeat_score: [X/20]
aio_citations: [X]
---
Include:
- Score X/100 with per-category breakdown
- Page-by-page title + meta audit table (all priority pages)
- H1 issues table (duplicates, missing, non-optimized)
- Content depth comparison (client vs. top 3 competitors, Surfer scores)
- E-E-A-T assessment across all 4 dimensions
- Internal linking audit (orphans, hub-and-spoke gaps)
- Image SEO issues table
- AIO readiness checklist (per key page)
- CTAs audit with conversion improvement estimates
- Priority matrix (all issues, Impact × Feasibility scored)
- 30/90-day on-page improvement plan with effort estimates
Output files:
{AUDIT_DIR}/onpage-findings.md — on-page audit findings with score
{REPORTS_DIR}/phase-3-onpage-seo.pdf — auto-generated PDF after phase completes
Key consumers:
research/content-gaps — reads for content quality gaps to address
strategy/ux-cro-audit — reads for CTA gaps and conversion opportunities
cross-cutting/serp-trust-auditor — Ranking Signals (R) dimension
ai-visibility/ai-seo — AIO readiness signals feed AI audit
On-Page SEO Priority Action Table
Issue Priority by Type
| Issue Type |
Impact |
Feasibility |
Priority |
Avg Effort |
Expected Lift |
| Missing FAQPage schema on service pages |
5 |
5 |
25 |
30 min/page |
3.2× AIO citation rate |
| Title tag missing primary keyword |
4 |
5 |
20 |
5 min/page |
+5–15% CTR |
| Missing or duplicate H1 |
4 |
5 |
20 |
5 min/page |
Crawl clarity |
| Meta description too long (>155 chars) or missing |
3 |
5 |
15 |
5 min/page |
+3–8% CTR |
| Thin page content (<500 words on service page) |
5 |
3 |
15 |
4–8 hrs/page |
Rankings lift |
| Missing HowTo schema on process pages |
4 |
4 |
16 |
30 min/page |
Featured snippet + AIO |
| Internal links: orphaned pages (<3 inbound links) |
4 |
5 |
20 |
15 min/page |
PageRank distribution |
| Image alt text missing |
3 |
5 |
15 |
30 min (bulk) |
Accessibility + image search |
| Keyword cannibalization (2+ pages targeting same keyword) |
4 |
4 |
16 |
1–2 hrs |
Consolidates ranking power |
Numbered Action Plan
Immediate (Week 1, No Dev Required)
- Add FAQPage schema to all service pages — highest ROI action: 3.2× AIO citation rate, 30 min/page, no developer needed via JSON-LD script block. Effort: 30 min/page. Priority: 25.
- Fix title tags — ensure primary keyword in first 50 characters; title length 50–60 characters; unique per page. Use Screaming Frog to batch-identify. Effort: 5 min/page. Priority: 20.
- Fix duplicate or missing H1s — each page must have exactly one H1. Check with Screaming Frog → filter "Missing H1" and "Multiple H1". Effort: 5 min/page. Priority: 20.
- Optimize meta descriptions — 120–155 characters, includes primary keyword, has a CTA ("Call us today", "Get a free quote"). Missing meta = Google auto-generates (usually suboptimal). Effort: 5 min/page. Priority: 15.
- Fix orphaned pages — run site_crawler.py → identify pages with <3 inbound internal links → add contextual links from related pages (not navigation). Effort: 15 min/page. Priority: 20.
Short-Term (Week 2–4, Content + Developer)
- Add HowTo schema to process pages — "How to [service]" pages without HowTo schema miss featured snippet + AIO opportunities. Effort: 30 min/page. Priority: 16.
- Expand thin content — service pages <800 words: expand with: local pricing context, process steps, FAQs, local testimonials, before/after. Target Surfer Score ≥70. Effort: 2–4 hrs/page. Priority: 15.
- Resolve keyword cannibalization — 2+ pages targeting same keyword: pick the stronger one (more links, better CTR), 301 redirect the weaker, consolidate content. Effort: 1–2 hrs per pair. Priority: 16.
- Add bulk image alt text — use Screaming Frog to export all images missing alt text → add descriptive alt text (keyword-included where relevant, descriptive always). Effort: 30 min bulk. Priority: 15.
- Audit and fix duplicate title tags — Screaming Frog → filter Duplicate Title Tags → rewrite each to be unique and keyword-specific. Effort: 5 min/page. Priority: 20.
1---2name: onpage-seo3description: Onpage Seo4---56# On-Page SEO Audit — Phase 378## Executive Summary910On-page SEO is the highest-leverage, lowest-cost ranking lever available. Title tag + meta optimization alone can improve CTR by 20–35% within 30 days (GSC data 2024). In 2025, on-page signals have a dual role: traditional ranking AND AI Overview citation probability. Pages without direct standalone answers and FAQPage schema rarely appear in AIO. Always compare against the top-ranking competitor's on-page patterns.1112---1314## Tools for This Phase1516| Tool | Purpose | Cost |17|------|---------|------|18| **Screaming Frog** | Bulk audit: titles, meta, H1s, word counts, duplicate detection | Free/Paid |19| **Google Search Console** | Page-level impressions, CTR, position — identify rewrite priorities | Free |20| **Surfer SEO** | Content Score vs. top competitors — target 70+ cluster, 80+ pillar | Paid |21| **Clearscope** | Content grade vs. top 10 competitors — target A- pillar, B+ cluster | Paid |22| **Ahrefs** | Organic keywords per page, SERP features per URL | Paid |23| **SEMrush** | On-page checker — compare vs. top 10 ranking pages | Paid |24| **Google Rich Results Test** | FAQPage schema validation, structured data presence | Free |25| **Chrome DevTools → Sources** | Verify rendered HTML (JS-rendered content vs. raw HTML) | Free |26| **site_crawler.py** | Word counts, title/meta data per page CSV | Free (local) |2728---2930## Step 1: Read Project Context3132Read `{AUDIT_DIR}/intake-data.md` — business name, URL, services, location.33Read `{AUDIT_DIR}/technical-findings.md` — page indexation status, canonical issues.34Read `{AUDIT_DIR}/competitor-profiles.md` — competitor on-page patterns, title formats, schema usage.35Read `{DATA_DIR}/crawl/` — crawler output for bulk title/meta analysis.3637---3839## Priority Page Inventory4041Audit in this order (highest business impact first):421. Homepage432. Primary service page(s) — one per core service443. Location/service-area pages454. Top-performing blog posts (by GSC impressions — filter top 10)465. Contact page476. About page (E-E-A-T critical)4849---5051## Section 1: Title Tags5253### Character Limits (2025)54- **Optimal:** 50–60 characters (displays fully in desktop SERPs)55- **Mobile SERP:** 50–55 characters56- **Maximum before truncation:** 60 characters (580px pixel width)57- **Google rewrites if:** Title doesn't match page content or is < 10 characters5859### Per-Page Checklist60For each key page, verify:61- [ ] Unique across the entire site? (Screaming Frog → Title → duplicates)62- [ ] Primary keyword in first 5 words?63- [ ] 50–60 characters?64- [ ] Location included for all service/location pages?65- [ ] Brand name at end (after ` | ` or ` — `)?66- [ ] Contains action word, number, or value prop for CTR?67- [ ] No keyword stuffing (same keyword repeated)?6869**Optimal title formats:**70| Page Type | Format | Example |71|-----------|--------|---------|72| Service page | `[Service] in [City] \| [Brand]` | `Emergency Plumber in Chicago \| Acme Plumbing` |73| Homepage | `[Brand] — [Service] in [City, State]` | `Acme Plumbing — Plumber in Chicago, IL` |74| Blog post | `[Question/Keyword] [Year] — [Brand]` | `How to Fix a Leaky Faucet 2025 — Acme Plumbing` |75| Location page | `[Service] in [City, ST] \| [Brand]` | `Drain Cleaning in Evanston, IL \| Acme` |7677### AI Overviews Title Optimization78Titles that appear in AIO tend to:79- Directly match conversational query intent80- Include "How", "What", "Best", or specific quantifiers81- Signal definitive authority: "Complete Guide", "Expert Guide", "[Year] Guide"8283### Competitor Title Comparison84| Page | Client Title | Competitor #1 Title | Gap |85|------|-------------|--------------------|----|86| Homepage | | | |87| Primary service | | | |88| Location page | | | |8990---9192## Section 2: Meta Descriptions9394**Character limits:** 150–160 characters (desktop) | 130–145 characters (mobile)95**If Google rewrites 90%+ of meta descriptions:** Page content doesn't match intent — rewrite lead paragraph first.9697Per-page checklist:98- [ ] Unique across site? (Screaming Frog → Meta Description → duplicates)99- [ ] 150–160 characters?100- [ ] Contains primary keyword + location (local pages)?101- [ ] Clear value proposition (WHY click this result)?102- [ ] CTA: "Call today", "Get a free quote", "Book online"?103- [ ] Phone number on high-conversion service pages?104- [ ] No passive language ("We provide..." → "Get same-day service...")?105106---107108## Section 3: Header Tag Hierarchy (H1–H6)109110Per-page checks:111- [ ] Exactly ONE H1 per page? (Screaming Frog → H1 → filter "Multiple H1")112- [ ] H1 contains primary keyword?113- [ ] H1 is unique across the site?114- [ ] Logical hierarchy — no level skipping (H1 → H2 → H3, NOT H1 → H3)?115- [ ] H2s structure main sections with secondary keywords?116- [ ] H3s for subtopics under H2s?117- [ ] Headers descriptive, not generic ("Our Services" → "Plumbing Services in Chicago")?118- [ ] Question-format H2s/H3s for AIO citation potential?119120**AIO-optimized header pattern (2025):**121```122H1: [Primary Keyword in City] — [Benefit]123 H2: What Is [Service]? ← AIO extraction target124 H2: How Much Does [Service] Cost in [City]? ← AIO + featured snippet125 H3: Factors Affecting [Service] Cost126 H2: Our [Service] Process ← HowTo schema opportunity127 H2: Frequently Asked Questions ← FAQPage schema target128 H3: [Question 1]?129 H3: [Question 2]?130```131132---133134## Section 4: Content Optimization135136### Keyword Density & Distribution137- Primary keyword in first 100 words: ✅/❌138- Natural density: 1–2% (not stuffed, not absent)139- LSI/NLP entities used (not just exact match): ✅/❌140- Synonyms and related variants included: ✅/❌141142### Word Count Benchmarks (2025 HCS Standards)143| Page Type | Minimum | Competitive Target | Red Flag |144|-----------|---------|-------------------|---------|-145| Homepage | 600 words | 800–1,200 | < 400 |146| Service page | 800 words | 1,200–2,000 | < 500 |147| Location page | 600 words | 900–1,500 | < 400 |148| Pillar blog | 2,500 words | 3,500–5,000 | < 1,200 |149| Cluster blog | 1,200 words | 1,500–2,500 | < 600 |150| FAQ answer | 150 words | 250–400 | < 50 |151152### Search Intent Satisfaction153| Intent | Content Required | Conversion Rate |154|--------|----------------|----------------|155| Informational | Comprehensive guide, all related questions answered | 1–3% |156| Commercial | Service description, pricing signals, reviews, comparison | 3–8% |157| Transactional | Clear path to contact/book, click-to-call, urgency | 8–20% |158| Navigational | Gets user to destination immediately | Brand intent |159160**Competitor comparison (Surfer/Clearscope):**161| Page | Client Word Count | Surfer Score | Comp #1 Words | Comp #1 Score | Gap |162|------|-----------------|------------|--------------|---------------|-----|163| Homepage | | | | | |164| [Service] page | | | | | |165166### Content Freshness167- Date visible on time-sensitive pages (updated YYYY)? ✅/❌168- Statistics current (< 2 years old)? ✅/❌169- Seasonal pages updated for current year? ✅/❌170- **2025 context:** ChatGPT cites content updated within 30 days at 76.4% rate — freshness = AIO signal.171172---173174## Section 5: E-E-A-T On-Page Signals175176**E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness)** — Google's quality framework, critical since HCS integration into core algorithm (March 2024).177178### Experience Signals (NEW "first E" since Dec 2022)179- Real photos of team doing actual work? ✅/❌180- Case studies with before/after + specific outcomes? ✅/❌181- Project galleries with client permission? ✅/❌182- Video content showing expertise in action? ✅/❌183- Real project examples with specifics (location, problem, solution, outcome)? ✅/❌184185### Expertise Signals186- Author name + bio on all blog posts? ✅/❌187- Author page with credentials at `/about/[name]`? ✅/❌188- Certifications, licenses, professional memberships stated? ✅/❌189- Years of experience stated with specific projects? ✅/❌190191### Authoritativeness192- External links to authoritative sources (not competitors)? ✅/❌193- Industry data cited with sources + dates? ✅/❌194- Awards or recognition mentioned with links? ✅/❌195196### Trustworthiness197- About page with real team photos + bios? ✅/❌198- Physical address in footer and Contact page? ✅/❌199- Privacy policy + terms of service linked from footer? ✅/❌200- SSL/HTTPS on all pages? ✅/❌201- Third-party review platform links (Google, BBB, Yelp)? ✅/❌202203---204205## Section 6: Internal Linking206207### Hub-and-Spoke Architecture Check208- Pillar service pages link to all related subtopic pages? ✅/❌209- Subtopic pages link back to pillar? ✅/❌210- Blog posts link to relevant service pages (conversion bridge)? ✅/❌211- Service pages link to related blog content (depth signal)? ✅/❌212213### Internal Link Metrics (from Screaming Frog)214| Check | Target | Client |215|-------|--------|--------|216| Orphan pages (0 internal links) | 0 | |217| Pages requiring > 3 clicks from homepage | 0 | |218| Max internal links per page | < 100 | |219| Homepage internal links | 25–75 | |220221### Anchor Text Quality222- Descriptive, keyword-inclusive anchors (not "click here")? ✅/❌223- Varied anchor text (not same anchor for all links to same page)? ✅/❌224- Primary keyword anchor to primary service page? ✅/❌225226---227228## Section 7: Image SEO229230| Check | Target | Impact |231|-------|--------|--------|232| Alt text: descriptive, 5–15 words, keyword-inclusive | All images | AIO image citation + accessibility |233| Alt text max length | 150 characters | Screen reader UX |234| Filename: descriptive (not `IMG_1234.jpg`) | All images | Image search ranking |235| Format: WebP or AVIF | All non-hero images | Page speed |236| Dimensions `width`/`height` specified | All images | CLS prevention |237| `loading="lazy"` on below-fold images | All below-fold | LCP improvement |238| Geo-tagged EXIF data | Location-relevant images | Local SEO signal |239| Image in XML sitemap | Significant images | Image search visibility |240241---242243## Section 8: AI Overviews Optimization (2025 Critical)244245Pages cited in AIO score 4× the impressions of position 1 organic when AIO appears. AIO appears for 20–35% of local service queries (SparkToro 2025).246247**AIO citation requirements — checklist per page:**248- [ ] Direct, standalone answer in first 40–50 words (no preamble)?249- [ ] Question-format H2/H3 headers matching common voice/conversational queries?250- [ ] Definitions: "A [service] is..." format in first paragraph?251- [ ] Specific data points (costs, timelines, measurements) stated precisely?252- [ ] Numbered step-by-step processes (HowTo schema opportunity)?253- [ ] Structured comparisons using tables?254- [ ] FAQPage schema with 5+ questions on service pages?255- [ ] Content updated within last 30 days (freshness = AIO citation bias)?256- [ ] Business rated ≥ 4.3 stars (review signal for local AIO)?257258**Test:** Search target keyword → does AIO appear? Is client cited? If competitor cited but not client → content gap in answer structure.259260---261262## Section 9: Page Experience Signals263264- Core Web Vitals all "Good" (from Phase 10)? ✅/❌265- No intrusive interstitials blocking content on mobile? ✅/❌266- No aggressive ads above fold? ✅/❌267- Safe browsing clean (no malware)? ✅/❌268- Mobile-friendly (Google Mobile-Friendly Test passing)? ✅/❌269- No horizontal scrolling on mobile (375px viewport)? ✅/❌270271---272273## Section 10: CTAs274275| Check | High-Intent Pages | Blog Posts |276|-------|------------------|------------|277| At least 1 CTA per page | Required | Required |278| CTA above fold on mobile | Required | Optional |279| Click-to-call `<a href="tel:...">` | Required | Recommended |280| Service-specific CTA (not generic "Contact Us") | Required | N/A |281| CTA visual contrast (color + size) | Required | Required |282| Multiple CTAs on long pages (top/mid/bottom) | Required | Recommended |283| Sticky CTA header/bar on mobile | High priority | Optional |284285---286287## Scoring288289| Category | Weight | Score |290|----------|--------|-------|291| Title tags (uniqueness, optimization, length) | 15% | /15 |292| Meta descriptions (uniqueness, CTR optimization) | 10% | /10 |293| Header hierarchy (H1 uniqueness, keyword use, AIO structure) | 10% | /10 |294| Content depth + intent satisfaction vs. competitors | 20% | /20 |295| E-E-A-T signals (all 4 components) | 20% | /20 |296| Internal linking (hub-and-spoke, orphans, anchor text) | 10% | /10 |297| Image SEO (alt text, format, dimensions) | 5% | /5 |298| AI Overviews optimization (FAQPage, direct answers) | 10% | /10 |299300**Veto:** > 50% of service pages missing FAQPage schema → maximum AI visibility score capped at 40/100.301302---303304## Output305306Write complete findings to `{AUDIT_DIR}/onpage-findings.md` with YAML frontmatter:307308```yaml309---310skill: audit/onpage-seo311phase: 3312date: [YYYY-MM-DD]313business: [Business Name]314url: [URL]315score: [X/100]316pages_audited: [X]317title_issues: [X]318missing_faqpage: [X]319eeat_score: [X/20]320aio_citations: [X]321---322```323324Include:325- Score X/100 with per-category breakdown326- Page-by-page title + meta audit table (all priority pages)327- H1 issues table (duplicates, missing, non-optimized)328- Content depth comparison (client vs. top 3 competitors, Surfer scores)329- E-E-A-T assessment across all 4 dimensions330- Internal linking audit (orphans, hub-and-spoke gaps)331- Image SEO issues table332- AIO readiness checklist (per key page)333- CTAs audit with conversion improvement estimates334- Priority matrix (all issues, Impact × Feasibility scored)335- 30/90-day on-page improvement plan with effort estimates336337**Output files:**338- `{AUDIT_DIR}/onpage-findings.md` — on-page audit findings with score339- `{REPORTS_DIR}/phase-3-onpage-seo.pdf` — auto-generated PDF after phase completes340341**Key consumers:**342- `research/content-gaps` — reads for content quality gaps to address343- `strategy/ux-cro-audit` — reads for CTA gaps and conversion opportunities344- `cross-cutting/serp-trust-auditor` — Ranking Signals (R) dimension345- `ai-visibility/ai-seo` — AIO readiness signals feed AI audit346347---348349## On-Page SEO Priority Action Table350351### Issue Priority by Type352353| Issue Type | Impact | Feasibility | Priority | Avg Effort | Expected Lift |354|-----------|--------|-------------|----------|-----------|--------------|355| Missing FAQPage schema on service pages | 5 | 5 | 25 | 30 min/page | 3.2× AIO citation rate |356| Title tag missing primary keyword | 4 | 5 | 20 | 5 min/page | +5–15% CTR |357| Missing or duplicate H1 | 4 | 5 | 20 | 5 min/page | Crawl clarity |358| Meta description too long (>155 chars) or missing | 3 | 5 | 15 | 5 min/page | +3–8% CTR |359| Thin page content (<500 words on service page) | 5 | 3 | 15 | 4–8 hrs/page | Rankings lift |360| Missing HowTo schema on process pages | 4 | 4 | 16 | 30 min/page | Featured snippet + AIO |361| Internal links: orphaned pages (<3 inbound links) | 4 | 5 | 20 | 15 min/page | PageRank distribution |362| Image alt text missing | 3 | 5 | 15 | 30 min (bulk) | Accessibility + image search |363| Keyword cannibalization (2+ pages targeting same keyword) | 4 | 4 | 16 | 1–2 hrs | Consolidates ranking power |364365### Numbered Action Plan366367#### Immediate (Week 1, No Dev Required)3681. **Add FAQPage schema to all service pages** — highest ROI action: 3.2× AIO citation rate, 30 min/page, no developer needed via JSON-LD script block. Effort: 30 min/page. Priority: 25.3692. **Fix title tags** — ensure primary keyword in first 50 characters; title length 50–60 characters; unique per page. Use Screaming Frog to batch-identify. Effort: 5 min/page. Priority: 20.3703. **Fix duplicate or missing H1s** — each page must have exactly one H1. Check with Screaming Frog → filter "Missing H1" and "Multiple H1". Effort: 5 min/page. Priority: 20.3714. **Optimize meta descriptions** — 120–155 characters, includes primary keyword, has a CTA ("Call us today", "Get a free quote"). Missing meta = Google auto-generates (usually suboptimal). Effort: 5 min/page. Priority: 15.3725. **Fix orphaned pages** — run site_crawler.py → identify pages with <3 inbound internal links → add contextual links from related pages (not navigation). Effort: 15 min/page. Priority: 20.373374#### Short-Term (Week 2–4, Content + Developer)3756. **Add HowTo schema to process pages** — "How to [service]" pages without HowTo schema miss featured snippet + AIO opportunities. Effort: 30 min/page. Priority: 16.3767. **Expand thin content** — service pages <800 words: expand with: local pricing context, process steps, FAQs, local testimonials, before/after. Target Surfer Score ≥70. Effort: 2–4 hrs/page. Priority: 15.3778. **Resolve keyword cannibalization** — 2+ pages targeting same keyword: pick the stronger one (more links, better CTR), 301 redirect the weaker, consolidate content. Effort: 1–2 hrs per pair. Priority: 16.3789. **Add bulk image alt text** — use Screaming Frog to export all images missing alt text → add descriptive alt text (keyword-included where relevant, descriptive always). Effort: 30 min bulk. Priority: 15.37910. **Audit and fix duplicate title tags** — Screaming Frog → filter Duplicate Title Tags → rewrite each to be unique and keyword-specific. Effort: 5 min/page. Priority: 20.