--- version: "1.0.0" evaluation: programmatic agent: claude-code model: claude-sonnet-4-6 snapshot: python312-uv origin: url: "https://skills.sh/coreyhaines31/marketingskills/seo-audit" source_host: "skills.sh" source_title: "SEO Audit" imported_at: "2026-05-01T00:00:00Z" imported_by: "skill-to-runbook-converter@1.0.0" attribution: collection_or_org: "marketingskills" skill_name: "seo-audit" confidence: "high" secrets: {} --- # SEO Audit — Agent Runbook ## Objective You are an expert in search engine optimization. Your goal is to identify SEO issues and provide actionable recommendations to improve organic search performance. This runbook guides the agent through a systematic, prioritized SEO audit covering crawlability, technical foundations, on-page optimization, content quality, and authority signals. The audit adapts to the site type (SaaS, e-commerce, blog, multilingual, local) and produces a structured report with evidence-backed findings and a prioritized action plan. Use this runbook whenever the user mentions "SEO audit," "technical SEO," "why am I not ranking," "page speed," "core web vitals," "crawl errors," "indexing issues," or any vague request like "my SEO is bad." --- ## REQUIRED OUTPUT FILES (MANDATORY) **You MUST write all of the following files to `/app/results`. The task is NOT complete until every file exists and is non-empty. No exceptions.** | File | Description | |------|-------------| | `/app/results/seo_audit_report.md` | Full SEO audit report with all findings and prioritized action plan | | `/app/results/technical_findings.json` | Structured technical SEO findings (issue, impact, evidence, fix, priority) | | `/app/results/onpage_findings.json` | Structured on-page SEO findings | | `/app/results/content_findings.json` | Structured content quality findings | | `/app/results/summary.md` | Executive summary with top 3–5 priority issues and quick wins | | `/app/results/validation_report.json` | Structured validation results with stages, results, and `overall_passed` | If you finish your analysis but have not written all files, go back and write them before stopping. --- ## Parameters | Parameter | Default | Description | |-----------|---------|-------------| | Results directory | `/app/results` | Output directory for all results | | Site URL | *(required)* | The root URL of the site to audit (e.g. `https://example.com`) | | Audit scope | `full` | `full` for technical + on-page + content, or `technical`, `on-page`, `content` for focused audits | | Site type | *(inferred)* | `saas`, `ecommerce`, `blog`, `multilingual`, `local` — drives common-issues checklist | | Search Console access | `false` | Whether the user has granted Search Console access | | Competitor URLs | *(optional)* | Comma-separated list of top organic competitors | --- ## Dependencies | Dependency | Type | Required | Description | |------------|------|----------|-------------| | `curl` / `web_fetch` | CLI / tool | Yes | Fetch page HTML for technical analysis (note: cannot detect JS-injected schema) | | Google Search Console | External service | Recommended | Coverage, Core Web Vitals, and indexation data | | Google PageSpeed Insights | External service | Yes | Core Web Vitals and speed diagnostics | | Rich Results Test | External service | Yes | Schema validation (renders JavaScript — use instead of curl) | | Screaming Frog | External tool | Optional | Full crawl for large sites; renders JavaScript for schema detection | | Ahrefs / Semrush | External tool | Optional | Backlink profile and competitor analysis | --- ## Step 1: Environment Setup ```bash # Verify required inputs SITE_URL="${SITE_URL:-}" if [ -z "$SITE_URL" ]; then echo "ERROR: SITE_URL parameter is required" exit 1 fi # Confirm site is reachable HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" --max-time 15 "$SITE_URL") if [ "$HTTP_STATUS" != "200" ] && [ "$HTTP_STATUS" != "301" ] && [ "$HTTP_STATUS" != "302" ]; then echo "WARNING: $SITE_URL returned HTTP $HTTP_STATUS — proceed with caution" fi # Create output directory mkdir -p /app/results echo "Auditing: $SITE_URL" echo "HTTP status: $HTTP_STATUS" ``` **Check for product marketing context first:** If `.agents/product-marketing-context.md` exists (or `.claude/product-marketing-context.md` in older setups), read it before asking questions. Use that context and only ask for information not already covered or specific to this task. Before proceeding, gather: 1. **Site Context** - What type of site? (SaaS, e-commerce, blog, etc.) - What is the primary business goal for SEO? - What keywords/topics are priorities? 2. **Current State** - Any known issues or concerns? - Current organic traffic level? - Recent changes or migrations? 3. **Scope** - Full site audit or specific pages? - Technical + on-page, or one focus area? - Access to Google Search Console / analytics? --- ## Step 2: Technical SEO Audit Work through the technical checklist in priority order. For each finding, record: issue, impact (High/Medium/Low), evidence, fix, and priority (1–5). ### Schema Markup Detection Limitation > **`web_fetch` and `curl` cannot reliably detect structured data / schema markup.** > > Many CMS plugins (AIOSEO, Yoast, RankMath) inject JSON-LD via client-side JavaScript — it won't appear in static HTML or `web_fetch` output (which strips `