onsite-seo-audit
Onsite SEO Audit Skill
A structured, opinionated process for auditing the on-page and technical SEO of SaaS websites. Designed for intermediate SEO users — assumes basic familiarity with SEO concepts but not deep technical expertise.
What This Skill Produces
Depending on what the user needs, output one or more of:
- Chat summary — prioritized findings with clear next steps
- Audit spreadsheet (.xlsx) — issue log with severity scores and owner assignments
- Recommendations report (.docx or .pdf) — executive-ready with context and rationale
- Page briefs — rewrite templates for underperforming pages
Ask the user upfront which output(s) they need if not specified.
Inputs to Request
Before starting, identify what data is available. Ask the user to provide as many of these as possible:
| Input | What it enables |
|---|---|
| Website URL | Live crawl checks, page sampling |
| Screaming Frog / Sitebulb crawl export (.csv) | Technical + on-page analysis at scale |
| Google Search Console export | Impressions, CTR, ranking positions |
| GA4 export | Organic traffic, bounce rate, engagement |
| List of target pages or URLs | Focused page-level audit |
| Competitor URLs | Benchmark comparisons |
If the user has none of these, proceed with a manual URL-based review using web_search and web_fetch to inspect pages directly.
Audit Framework
Run through all six modules. Flag issues with severity: Critical / High / Medium / Low.
Module 1: Crawlability & Indexability
- Is the sitemap present and submitted? (
/sitemap.xml) - Is
robots.txtblocking important pages? - Are there noindex tags on pages that should rank?
- Are canonical tags correct and consistent?
- Are there redirect chains (3xx loops, unnecessary hops)?
- Are paginated pages handled correctly?
Module 2: Site Architecture & URL Structure
- Are URLs short, descriptive, and keyword-relevant?
- Is the folder/category structure logical and shallow (ideally ≤3 clicks from homepage)?
- Are there duplicate URLs (trailing slashes, www vs non-www, http vs https)?
- Is there a clear hierarchy for the blog, features, and landing pages?
Module 3: On-Page Elements
For a sample of key pages (homepage, top 5 landing pages, top 3 blog posts):
- Title tags: Unique, 50–60 characters, primary keyword near the front
- Meta descriptions: Unique, 120–155 characters, includes CTA or value prop
- H1: One per page, matches search intent, includes primary keyword
- H2/H3 structure: Logical, keyword-rich subheadings
- Image alt text: Descriptive, not keyword-stuffed
- Internal links: Key pages linked from relevant content; no orphan pages
Module 4: Content Quality
- Does the content match the search intent (informational / navigational / commercial / transactional)?
- Is there thin content (< 300 words on pages meant to rank)?
- Is there duplicate or near-duplicate content across pages?
- Is the content up to date? Are there stale dates, outdated product references, or broken examples?
Module 4a: Keyword Cannibalization Analysis
When a Screaming Frog or GSC CSV is provided, run a full cannibalization check. This is one of the most common and damaging issues on SaaS sites with growing content libraries.
Detecting Cannibalization
From a Screaming Frog export, look for:
- Pages sharing identical or near-identical H1s or title tags
- Pages in the same subfolder with heavily overlapping body copy keywords
- Multiple pages targeting the same root keyword with only modifier variation (e.g.
/blog/rank-trackingand/features/rank-tracking)
From a GSC export (Queries + Pages report), look for:
- The same query driving impressions to 2+ different URLs
- A query where Google is routing traffic to a page that clearly wasn't designed for it (e.g. a blog post ranking for a keyword the features page should own)
- Queries with split impressions across multiple pages — a strong signal Google is confused about which page to serve
Cannibalization Decision Framework
For each cannibalizing pair, determine:
-
What is the SERP intent for this keyword? Check the live SERP (use web_search). What content type dominates?
- Informational (blog posts, guides, how-tos)?
- Commercial / Navigational (product pages, feature pages, comparison pages)?
- Transactional (free trial, pricing, sign-up)?
-
Which page matches that intent? The page whose content type matches the dominant SERP format is the correct one to optimize. Google often surfaces the wrong page when both exist — this is the root of the problem.
-
Which page has more authority? Check internal link count pointing to each page, backlinks if data is available, and existing GSC position/impressions.
-
Recommend one of four resolutions:
| Resolution | When to use |
|---|---|
| Consolidate — merge the weaker page into the stronger, redirect the URL | Near-identical content, no clear differentiation possible |
| Differentiate — rewrite both pages so they target distinct intents | Pages serve different audiences or funnel stages |
| Canonicalize — point the weaker page to the stronger as canonical | Duplicate content, both URLs need to stay live (e.g. campaign pages) |
| Restructure — turn one page into a section of the other (e.g. H2 block instead of standalone page) | One page is thin enough to absorb without losing value |
Making Cannibalized Pages Unique
When recommending differentiation (keeping both pages), always specify:
- Page A (canonical/optimized page): Intended keyword, intent type, content angle, what makes it distinct
- Page B (differentiated page): Revised target keyword, revised intent, new angle, what content to remove or change to stop competing
Common SaaS differentiation patterns:
- Feature page targets commercial intent ("rank tracking software") → Blog post pivots to informational intent ("how rank tracking works")
- Landing page targets bottom-of-funnel ("best X for agencies") → Blog post targets top-of-funnel ("what is X")
- Comparison page targets consideration intent ("X vs Y") → Product page focuses on unique features without mentioning competitors
Cannibalization Output Format
Produce a dedicated cannibalization table (include in spreadsheet output):
| Keyword | URL 1 | URL 2 | SERP Intent | Correct Page | Resolution | Differentiation Notes |
|---|
Flag cannibalization severity:
- Critical: Core money pages competing (features page vs. pricing page vs. homepage)
- High: Commercial landing pages competing with blog content
- Medium: Blog posts competing with each other
Module 4b: Keyword Stuffing Detection
Keyword stuffing actively harms rankings and user experience. Flag it wherever found.
Signs of keyword stuffing to check:
- Primary keyword appears in title tag, H1, first paragraph, multiple H2s, meta description, AND image alt text on the same page — when it feels forced rather than natural
- Exact-match keyword repeated unnaturally in body copy (e.g. "rank tracking rank tracker rank tracking software" within the same paragraph)
- Footer or sidebar blocks stuffed with keyword-rich links
- Alt text that describes keywords rather than the image (e.g.
alt="rank tracker SEO tool rank tracking") - Invisible or near-invisible text (white text on white background — rare but worth flagging)
Recommended keyword density guidance:
- Primary keyword: 1–2% of total word count is a healthy ceiling; flag anything that feels repetitive on a read-through
- Related/semantic terms (LSI keywords): should appear naturally — they support topical relevance without stuffing
- The test: read the content aloud. If it sounds unnatural, it's over-optimized.
Remediation advice to give:
- Replace exact-match repetitions with natural synonyms and semantic variants
- Rewrite title/H1/meta to each serve a distinct purpose (title = SERP click, H1 = page topic, meta = value prop)
- Use heading variations rather than repeating the exact keyword in every H2
Module 4c: Striking Distance Keywords
When GSC data is available, identify keywords in striking distance — queries where a small optimization push could move the page from the bottom of page 1 or page 2 into strong ranking positions.
Definition: Striking distance = keywords ranking in positions 4–20.
Why it matters: These pages already have relevance signals with Google. Optimizing them requires far less effort than building authority for new keywords from scratch.
How to identify striking distance opportunities
From the GSC Queries export, filter for:
- Impressions > 50 (enough search volume to be worth targeting)
- Average position between 4 and 20
- CTR below the expected average for that position (signals the title/meta isn't compelling enough)
Sort by impressions descending — highest-volume striking distance keywords first.
What to do with striking distance keywords
For each identified keyword, check the ranking page and recommend:
- If the keyword is in striking distance but not in the title tag → add it (naturally)
- If it's in the title but CTR is low → rewrite the title tag for higher click-through (add power words, numbers, or a clearer value prop)
- If the page ranks for the keyword but it's not the focus → check for cannibalization (see Module 4a) — another page may be diluting the signal
- If the page has thin content for this keyword → expand with a relevant H2 section targeting the query
- If internal links don't include the keyword as anchor text → update internal links to reinforce the signal
Striking Distance Output Format
Produce a prioritized table (include in spreadsheet):
| Keyword | Current Position | Impressions | CTR | Ranking URL | Issue | Recommended Action |
|---|
Flag the top 10 striking distance opportunities as Quick Wins — these are the highest-ROI items in the entire audit for sites with existing GSC data.
Module 5: Core Web Vitals & Page Experience
Use PageSpeed Insights (https://pagespeed.web.dev) or user-provided data:
- LCP (Largest Contentful Paint): Target < 2.5s
- INP (Interaction to Next Paint): Target < 200ms
- CLS (Cumulative Layout Shift): Target < 0.1
- Is the site mobile-friendly?
- Are there render-blocking resources?
Module 6: Internal Linking & Authority Distribution
- Are high-priority pages receiving internal links from relevant content?
- Are there orphan pages (no internal links pointing to them)?
- Is anchor text descriptive and varied (not just "click here" or "learn more")?
- Is PageRank being passed to conversion-critical pages (pricing, demo, trial)?
Scoring & Prioritization
After completing the modules, produce a prioritized issue log:
| Priority | Criteria | Examples |
|---|---|---|
| Critical | Blocks indexing or destroys ranking | noindex on key pages, broken canonical, robots.txt blocking CSS/JS, core money pages cannibalizing each other |
| High | Directly harms rankings or CTR | Missing/duplicate title tags, no H1, thin content on core pages, commercial landing pages cannibalizing blog content, keyword stuffing on key pages |
| Medium | Leaves ranking potential on the table | Weak internal linking, blog-vs-blog cannibalization, slow LCP, striking distance keywords not optimized |
| Low | Polish and best practice | Image alt text gaps, meta description length, minor redirect hops, light keyword over-repetition |
Output Formats
Chat Summary (always produce this first)
## SEO Audit Summary — [Site Name]
Audited: [date]
### 🔴 Critical Issues ([n])
- [Issue] — [Page/Section] — [Why it matters] — [Fix]
### 🟠 High Priority ([n])
- ...
### 🟡 Medium Priority ([n])
- ...
### 🟢 Quick Wins ([n])
- ...
### Recommended Next Steps
1. [Most impactful action]
2. ...
Spreadsheet (.xlsx)
Produce a multi-tab workbook with:
- Issues log:
Issue | Module | Affected URL(s) | Severity | Effort | Owner | Status | Notes - Cannibalization:
Keyword | URL 1 | URL 2 | SERP Intent | Correct Page | Resolution | Differentiation Notes - Striking Distance:
Keyword | Current Position | Impressions | CTR | Ranking URL | Issue | Recommended Action
Use the xlsx skill to generate this. Read /mnt/skills/public/xlsx/SKILL.md before creating.
Report (.docx or .pdf)
Structure:
- Executive Summary (3–5 bullet findings)
- Audit Scope & Methodology
- Findings by Module (prose + evidence)
- Prioritized Recommendations Table
- 30-Day Action Plan
Use the docx skill. Read /mnt/skills/public/docx/SKILL.md before creating.
Page Briefs
For each underperforming page, produce:
- Target keyword(s) and search intent
- Recommended title tag + meta description
- H1 and suggested H2 structure
- Content gaps to address
- Internal linking recommendations
SaaS-Specific Watch Points
These issues appear frequently in SaaS SEO and deserve extra attention:
- Feature pages vs. use-case pages: Many SaaS sites only have feature pages but miss high-intent use-case or job-to-be-done queries ("tool for X", "how to do Y")
- Integration pages: Often thin or auto-generated — check if they have unique, indexable content
- Changelog / release notes: Frequently unintentionally indexed and creating thin content
- App subdomain vs. main domain: Login/app pages sometimes leak into the index
- Pricing page optimization: Often under-optimized for commercial intent keywords
- Trial/demo CTAs: Track whether SEO landing pages funnel correctly to conversion
Notes for Intermediate Teams
- Start with Critical and High issues — don't get distracted by polish before fixing fundamentals
- Focus effort on the 20% of pages driving 80% of organic traffic
- Internal linking is often the highest-ROI quick win for sites with existing content
- Document all changes with before/after screenshots for reporting