SEO Audit Intake — Phase 0
Executive Summary
Phase 0 is the foundation of the entire 21-phase audit. The quality of intake data directly determines audit accuracy. Every subsequent phase reads {AUDIT_DIR}/intake-data.md — incomplete intake = cascading errors across all phases. In 2025–2026, intake has expanded beyond basic data collection: AI search now accounts for an estimated 25–40% of zero-click query resolution (Semrush 2025), meaning business goals must explicitly address AI Overviews, ChatGPT, Perplexity, and Gemini visibility — not just traditional organic rankings. GBP signals are confirmed as the #1 local ranking factor (Whitespark 2024), making GBP URL and review count collection at intake critical for Phase 11 benchmarks. Competitor landscape snapshot at intake saves 2–3 hours later by pre-populating Phase 1.
2025–2026 intake benchmarks:
- Average intake completion: 10–15 min (prepared client); 20–30 min (requires competitor research)
- TTFB threshold: <800ms Good; >1,800ms Critical — flag for Phase 10 immediately
- Minimum competitors to collect: 3 (local pack top-3); ideal 5 (3 local + 2 organic)
- GSC access impact: phases 6 (keyword gaps), 7 (topical gaps), 20 (penalty check) all degraded without GSC — flag clearly
- Domain age <6 months: automatically flag Phase 12 backlinks as "authority building" priority, not penalty recovery
- AI search context (2025): businesses without GBP presence, review velocity, or E-E-A-T content are excluded from AIO local pack citations
Numbered Action Plan:
Immediate (First 15 Minutes)
- Present intake form — collect items 1–6 (required) before any other work. Missing even one required field = defer audit start. Effort: 5–10 min.
- Run URL validation —
python3 scripts/check_url.py --url [URL] --full. Captures HTTP status, SSL validity, redirect chain, TTFB, basic on-page signals (H1, title). Effort: 2 min. Flag if TTFB >800ms, SSL error, or 4xx/5xx. - Create project directory —
python3 scripts/setup_project.py --name "..." --url "..." --location "...". Sets all path variables used by all 21 phases. Effort: 1 min. Priority: 25 (5×5). - Auto-identify competitors — if item 7 skipped: run 3-search protocol (service+city; best+service+city; service+city+reviews) → extract top-3 local pack + top-2 organic non-directories. Effort: 10–15 min.
- Collect competitor intelligence — for each competitor: name, URL, GBP URL, star rating, review count, approximate DR from Ahrefs/Moz free check. Effort: 5 min (3–5 competitors).
Short-Term (Before Launching Phase 1)
- Run initial business intelligence checks —
site:[domain]indexed count; branded search Knowledge Panel check; BuiltWith.com for CMS detection. Effort: 5 min. Priority: 15 (3×5). - Pre-flag issues for downstream phases — note any flags in intake-data.md: TTFB, no Knowledge Panel, Wix/Squarespace CMS, domain <6 months, no GBP. Each flag fast-tracks a finding in the relevant phase. Effort: 5 min.
- Confirm GSC/GA4 access status — GSC access unlocks accurate data in 5+ phases. If unavailable, note: Ahrefs/Semrush estimates will substitute (with lower confidence). Effort: 2 min.
- Check for immediate penalty signals — quick scan:
site:[domain]count dramatically lower than expected? Any manual actions visible in GSC? Rank for branded name? Flag for Phase 20. Effort: 3 min. - Write and confirm intake-data.md — write complete file to
{AUDIT_DIR}/intake-data.mdwith YAML frontmatter. Display confirmation summary. Launch Phase 1. Effort: 5 min.
Tools for This Phase
| Tool | Purpose | Cost | |------|---------|------| | python3 scripts/setup_project.py | Create project directory + project.json | Free (local) | | python3 scripts/check_url.py --full | Validate URL: HTTP status, SSL, redirect chain, TTFB | Free (local) | | Google Search | Identify competitors if not provided | Free | | Google Maps | Find GBP listing URL, star rating, review count | Free | | Semrush / Ahrefs | Quick traffic estimate + domain rating for competitors | Paid | | BuiltWith | CMS detection, hosting stack, tech stack | Free |
Step 1: Present the Intake Form
When an audit is triggered, present this structured form:
==============================================
LOCAL BUSINESS SEO AUDIT — INTAKE FORM
==============================================
1. Business Name: [Required]
2. Website URL: [Required — full URL with https://]
3. Target Location(s): [Required — City, State, Country. All service areas.]
4. Primary Services: [Required — list all services offered]
5. Business Category: [Required — primary industry/niche]
6. Business Goals: [Select one or more:]
• Increase local visibility & foot traffic
• Generate more leads/calls/form submissions
• Outrank specific competitors
• Expand to new service areas
• Improve online reputation & reviews
• Dominate AI search (AI Overviews, ChatGPT, Perplexity, Gemini)
• Build topical authority
• Improve conversion rate
• Launch/optimize Google Business Profile
• Recover from traffic drop or penalty
• Other: [specify]
7. Competitors: [3-5 competitors — URLs preferred. Skip → auto-research.]
8. GBP URL: [Optional — Google Business Profile link]
9. Social Media URLs: [Optional — Facebook, Instagram, LinkedIn, YouTube, TikTok]
10. Analytics Access: [Optional — GA4 + GSC available? Critical for Phase 6 keyword data]
11. Previous SEO Work: [Optional — agency/in-house history, any known penalties?]
12. Budget Range: [Optional — helps calibrate effort estimates throughout audit]
Intake Rules:
- Items 1–6 required. Do NOT begin audit without them.
- Item 7: If skipped, auto-research and identify top 3–5 competitors. Never ask twice.
- Items 8–12 optional. Note which are missing in output file but proceed without blocking.
- GSC access (item 10): Critical for Phase 6 keyword gaps — flag if unavailable; estimate traffic from Ahrefs/Semrush instead.
Step 2: Validate URL Accessibility
Once URL is provided, run validation:
python3 scripts/check_url.py --url [WEBSITE_URL] --full
Interpret results — thresholds:
| HTTP Status | Action | |------------|--------| | 200 | Accessible — proceed | | 301/302 | Note redirect destination; use final URL for all phases | | 403/429 | May block crawlers — note for Phase 2 Technical SEO | | 4xx/5xx | Alert user, confirm URL — DO NOT proceed until accessible | | SSL error | Flag as CRITICAL — add to Phase 2 Technical findings immediately |
TTFB benchmarks:
- < 800ms → Good
- 800ms–1.8s → Needs improvement (flag for Phase 10 Speed audit)
- > 1.8s → Critical speed issue (flag immediately in intake notes)
Additional checks during URL validation:
- Missing title tag → flag as immediate on-page issue
- Missing H1 → flag for Phase 3 On-Page SEO
- No HTTPS redirect (HTTP accessible) → Critical Technical flag
Step 3: Create Project Directory
IMMEDIATELY after collecting required fields, create the project directory:
python3 scripts/setup_project.py \
--name "[Business Name]" \
--url "[Website URL]" \
--location "[City, State]" \
--json
This creates:
projects/[business-slug]/
project.json ← Business metadata (name, URL, location, slug, created date)
audit/ ← All 21 phase finding .md files
reports/ ← All HTML + PDF reports
data/crawl/ ← site_crawler.py output (CSV + JSON)
data/serp/ ← SERP snapshot data
data/scores/ ← LOCAL-IMPACT + SERP-TRUST YAML scoring data
Set these variables for all subsequent phases:
PROJECT_SLUG = [returned by script — e.g., acme-plumbing-chicago]
PROJECT_DIR = projects/[slug]
AUDIT_DIR = projects/[slug]/audit
REPORTS_DIR = projects/[slug]/reports
DATA_DIR = projects/[slug]/data
Slug generation rules:
- Business