seo-plan
Build a phased SEO roadmap for a domain — quarter-by-quarter, tied to the site's competitive position, content gaps, technical debt, and AI Search readiness. Synthesises the outputs of multiple skills (`seo-technical-audit`, `seo-content-audit`, `seo-keyword-cluster`, `seo-compet
What it does
SEO Plan
Produce a phased SEO roadmap for a domain. Output is a single PLAN.md plus per-phase deliverable folders, each phase scoped to a quarter (or a 90-day sprint), each with explicit goals, work items, owners, and metrics. The plan is grounded in the site's actual competitive position — not a generic checklist.
This is the "what should we work on next quarter" skill. It does not replace specialist skills — it composes them, then sequences their outputs.
Prerequisites
- SE Ranking MCP server connected.
seo-firecrawlavailable for site mapping and head metadata (optional but recommended).- User provides:
- Target domain.
- Optionally: target country (default
us), business type (saas / ecommerce / local / publisher / agency / b2b — auto-detected from the domain if not supplied), planning horizon (default 90 days, options: 30 / 90 / 180 / 365). - Optionally: known constraints (engineering capacity, content budget, no JS-render changes allowed, etc.).
Process
-
Google data availability check (advisory, not blocking)
- Run
python3 scripts/google_auth.py --check --json. Iftier >= 0, the downstream specialist skills (technical-audit, page, content-audit, drift) will enrich their outputs with real Google field data — andseo-planingests those richer outputs in step 4. The plan itself doesn't dispatchseo-googledirectly; it prints a one-line notice so the user knows the option is on the table:
> Google APIs detected (tier {n}, available: {comma-list}). Downstream specialist > skills (seo-technical-audit, seo-page, seo-content-audit, seo-drift) will enrich > their outputs with real CrUX / GSC / GA4 / URL Inspection data automatically.- If creds are missing, the plan continues with SE Ranking-only data and prints:
> Google APIs not configured. To enrich downstream phases with real CWV / GSC / > GA4 / indexation data, run `bash extensions/google/install.sh`. Plan continues > with SE Ranking data only.- This is the lightest possible auto-spawn —
seo-plandoesn't runseo-googleitself (transferring friction to a single command is theirs' anti-pattern we critiqued inEVAL_RESULT_v2.md); it surfaces the option so the user can opt in or out before specialist skills run. Seeskills/seo-google/references/cross-skill-integration.md§ "seo-plan" for the full rationale.
- Run
-
Detect business type
DATA_getDomainOverviewWorldwide, plus a Firecrawlscrapeof the homepage if available- Inspect title, H1, JSON-LD types, primary nav patterns.
- Classify as one of:
saas,ecommerce,local,publisher,agency,b2b-services,marketplace. If ambiguous, ask the user once. - Business type drives template selection (see step 6).
-
Domain baseline
DATA_getDomainOverviewWorldwide,DATA_getDomainOverviewHistory,DATA_getDomainAuthority,DATA_getBacklinksSummary- Capture: organic keywords, organic traffic estimate, DA, backlink profile health, top countries, traffic trend over the last 12 months.
- This sets the "where you are now" anchor.
-
Competitive frame
DATA_getDomainCompetitors- Pull top 5–10 organic competitors.
- For each: organic keywords, traffic share, DA, top topical clusters they own.
- Identifies who the user is actually competing with on the SERP (often different from who they think).
-
Pull specialist inputs — confirm-then-dispatch pattern
- 4a. Detect existing outputs. In the current working directory, look for any folder matching the patterns below dated within the last 30 days (treat folders older than 30 days as stale and re-list them as missing):
seo-technical-audit-*seo-content-audit-*seo-competitor-gap-analysis-*seo-ai-search-share-of-voice-*seo-backlinks-profile-*
- For each present folder, ingest its primary deliverable (
TECH-AUDIT.md,VERDICT.mdrollup,GAPS.md,REPORT.md,PROFILE.mdrespectively). - 4b. Build the missing list. For each prerequisite that did not have a fresh output, look up its credit-cost figure from the specialist's own SKILL.md (read those when forming the prompt — figures may drift):
seo-technical-audit→ varies by page count for a fresh audit; ~6 Firecrawl credits for the modern-signals step. Cite "varies; check page count" if no recent audit cached.seo-content-audit→ ~10–15 SE Ranking credits + 1 Firecrawl credit per audited URL (default cap 50; for the seo-plan top-10-pages scope, expect ~10–15 SE Ranking + ~10 Firecrawl).seo-competitor-gap-analysis→ ~30–80 credits for 10 seeds.seo-ai-search-share-of-voice→ ~10–20 credits (leaderboard + ~20 prompts × N domains).seo-backlinks-profile→ ~25–40 SE Ranking credits.
- 4c. Print the confirmation prompt (single block, exactly this shape, with the missing-list filtered to only what is actually missing):
To produce a defensible plan, seo-plan needs outputs from N specialists not yet run for {domain}: - seo-technical-audit (~{N} credits) - seo-content-audit (~{N} credits) - seo-competitor-gap-analysis (~{N} credits) - seo-ai-search-share-of-voice (~{N} credits) - seo-backlinks-profile (~{N} credits) Total estimated cost: ~{N} credits. Run them now in this session? (y/N — default N preserves the existing v2.6 behavior of asking the user to run them manually first)- 4d. If user answers
y: dispatch each missing specialist in this order, ingesting each primary deliverable as it completes:- Parallel batch (independent):
seo-technical-audit,seo-competitor-gap-analysis,seo-ai-search-share-of-voice,seo-backlinks-profile. - Sequential after the batch:
seo-content-audit— its top-10-pages scope depends on knowing the top traffic pages fromseo-competitor-gap-analysis/DATA_getDomainKeywords, so it must run after the gap-analysis batch completes. - Each specialist runs its own
DATA_getCreditBalancepreflight and surfaces cost before proceeding (their existing behaviour —seo-plandoes not bypass it). If any specialist aborts on a credit-balance check, surface that abort to the user and let them decide whether to top up or skip. - After every dispatch, ingest the new folder the same way step 4a does.
- Parallel batch (independent):
- 4e. If user answers
N(or anything else — defaultN): fall through to the existing v2.6 behaviour — the plan opens with Phase 0: Discovery, and running each missing specialist becomes the first sprint's work. This preserves the user's control over credit spend in environments where the specialists should be scheduled or batched separately.
- 4a. Detect existing outputs. In the current working directory, look for any folder matching the patterns below dated within the last 30 days (treat folders older than 30 days as stale and re-list them as missing):
-
Score the four pillars
- Technical health (0–100): from
seo-technical-auditseverity-weighted issue count. - Content quality (0–100): average E-E-A-T+CITE score across audited pages.
- Topical authority (0–100): cluster coverage relative to top 3 competitors.
- AI Search readiness (0–100): citation share vs SoV competitors.
- The lowest pillar becomes the lead theme for the first phase.
- Technical health (0–100): from
-
Apply business-type template (templates differ — pick one and parameterise)
- saas → product-led pillars + integration pages + comparison/alternatives + JTBD content.
- ecommerce → category page hygiene + product schema + faceted-nav indexation rules + review aggregation.
- local → GBP optimisation + location pages + citation cleanup (note: we don't have a
seo-localskill yet — flag this as a manual sub-step or external). - publisher → topical clusters + author E-E-A-T + freshness cadence + AI-Search citations.
- agency → service pages + case studies + comparison content + lead-gen LP (use
seo-agency-landing-page). - b2b-services → industry-specific landing pages + thought-leadership clusters + decision-stage content.
- Template provides default work-item categories; the lowest-pillar score from step 5 weights them.
-
Phase the plan — three phases over the planning horizon, each with goals, work items, owners, metrics
- Phase 1 (weeks 1–4 of horizon): Foundations. Technical fixes that unblock everything else, baseline drift snapshot, 1–2 quick-win content refreshes from
seo-pageverdicts. - Phase 2 (weeks 5–8): Build. Content tier from
seo-keyword-cluster(1 pillar + 3–7 spokes), schema fixes fromseo-schema, comparison page fromseo-competitor-pagesif competitive frame supports it. - Phase 3 (weeks 9–12): Compound + measure. AI Search readiness pass via
seo-geoon top pages, backlink-gap outreach starter fromseo-backlink-gap, second drift comparison viaseo-drift compare, retro + adjust. - For longer horizons (180/365 days), repeat phases 2+3 with refreshed inputs and a quarterly retro.
- Each work item is tagged with the skill that produces it:
seo-content-brief,seo-schema,seo-page, etc.
- Phase 1 (weeks 1–4 of horizon): Foundations. Technical fixes that unblock everything else, baseline drift snapshot, 1–2 quick-win content refreshes from
-
Pick metrics
- Lagging (quarterly): organic traffic, organic keywords ranking top-10, organic conversions.
- Leading (weekly/monthly): technical-issue count, pages with E-E-A-T verdict ≥ 70, AI Search citation count, referring-domain count.
- One leading + one lagging per phase. Tie each metric to a current value (from step 2) and a phase-end target. Targets must be defensible — call out base rates.
-
Sequencing + dependencies
- Build a dependency map: e.g., "rewrite cluster A pillar" depends on "fix
noindexon /blog templates" depends on "runseo-technical-audit." - Surface the critical path. Anything off the critical path is moveable; anything on it blocks the phase.
- Build a dependency map: e.g., "rewrite cluster A pillar" depends on "fix
-
Synthesise
PLAN.md
Output format
Folder seo-plan-{domain-slug}-{YYYYMMDD}/:
seo-plan-{domain-slug}-{YYYYMMDD}/
├── PLAN.md (synthesis — primary deliverable; inlines 01-baseline, 02-competitive-frame, 07-dependencies, 08-metrics as sections)
├── 04-phase-1-foundations.md (load-bearing — owners share single phase files in standups)
├── 05-phase-2-build.md (load-bearing — owners share single phase files)
├── 06-phase-3-compound.md (load-bearing — owners share single phase files)
└── evidence/
├── 01-baseline.md (where you are now — raw data inlined into PLAN.md)
├── 02-competitive-frame.md (who you're actually competing with — raw data inlined into PLAN.md)
├── 03-pillar-scores.md (technical / content / topical / AI Search — scoring math)
├── 07-dependencies-and-critical-path.md (dependency map — inlined as PLAN.md section)
└── 08-metrics.md (metric tables — inlined as PLAN.md section)
Top-level: PLAN.md + the three phase files (04/05/06). Owners share single phase files in standups, so phase files stay top-level rather than collapsing into PLAN.md. The verbatim-duplicate sections (baseline, competitive frame, dependencies, metrics) are inlined into PLAN.md but the raw step files are preserved in evidence/ along with the pillar-scoring math.
PLAN.md follows this shape:
# SEO Plan: {domain}
> Plan dated {YYYY-MM-DD} · Horizon: {n} days · Business type: {type} · Country: {country}
## Where you are
- Organic keywords: {n} (trend: {↑↓→ over 12mo})
- Organic traffic estimate: {n}/mo
- Domain authority: {n}
- Referring domains: {n}
- Pillar scores: Technical {n}/100 · Content {n}/100 · Topical {n}/100 · AI Search {n}/100
## Lead theme
{The lowest pillar from step 5, plus a one-line "why this is the constraint."}
## Top 5 competitors
| Domain | DA | Organic kw | Top cluster they own |
|---|---|---|---|
| {comp} | {n} | {n} | {cluster} |
## Phase 1 — Foundations (weeks 1–4)
**Goal:** {1-line outcome, e.g. "remove technical debt blocking content investment"}
| # | Work item | Skill / source | Owner | Effort | Phase-end metric |
|---|---|---|---|---|---|
| 1.1 | {item} | `seo-technical-audit` follow-up | {role} | {S/M/L} | {metric} |
| 1.2 | ... | | | | |
**Phase exit criteria:** {what must be true to declare Phase 1 done}
## Phase 2 — Build (weeks 5–8)
{same shape}
## Phase 3 — Compound + measure (weeks 9–12)
{same shape}
## Critical path
{Ordered list of work items that block subsequent phases. Anything not on this list is moveable.}
## Metrics
| Metric | Type | Current | Phase 1 target | Phase 2 target | Phase 3 target |
|---|---|---|---|---|---|
| Organic traffic | Lagging | {n} | {n} | {n} | {n} |
| Pages with E-E-A-T ≥ 70 | Leading | {n} | {n} | {n} | {n} |
| Technical issue count | Leading | {n} | {n} | {n} | {n} |
| AI Search citation count | Leading | {n} | {n} | {n} | {n} |
| Referring domains | Leading | {n} | {n} | {n} | {n} |
## Constraints / caveats
{User-supplied constraints, plus anything the data flags — e.g., "DA gap to top competitor is 25 points; expect 6+ months for keyword parity."}
## Recommended next step
Run Phase 1 work items. After week 4, run `seo-drift compare` against the baseline captured today, then adjust Phase 2 scope.
Tips
- Default is "no auto-dispatch." The confirm prompt in step 4c defaults to
N. If the user just hits Enter (or answers anything other than an explicity),seo-planfalls through to the v2.6 Phase-0 behaviour and lists the missing specialists as the first sprint's work. This preserves user control over credit spend — important when the user is on a tight SE Ranking budget or wants to schedule specialists separately. - Auto-dispatch (the
ypath) is the convenience option. When the user wants a finished plan in one session and is comfortable with the displayed credit estimate, theypath runs the missing specialists in the optimal parallel-then-sequential order described in step 4d, ingests their outputs, and proceeds straight into pillar scoring (step 5). No silent re-execution: every dispatch is gated by the single confirmation in step 4c. - Auto-dispatch respects each specialist's own credit-balance preflight. Each specialist already calls
DATA_getCreditBalanceat its first step and surfaces cost before consuming credits —seo-plandoes not bypass that gate. If a specialist aborts on its preflight (insufficient credits, user declines its inner cost prompt),seo-plansurfaces the abort and lets the user choose to top up, skip that specialist (and let it remain a Phase-0 work item), or cancel the rest of the dispatch. - Auto-detect business type cheaply. Homepage
<title>, schema@type, and top-nav anchors are usually enough. Ask the user only when truly ambiguous. - The lead theme is the lowest pillar score. Don't pick the pillar the user is most excited about — pick the one the data says is the constraint. Surface this gap explicitly if they conflict.
- Three phases, even for 30-day horizons. Compress, don't drop. A 30-day plan is foundations (weeks 1–2), build (weeks 2–3), measure (week 4). The structure forces sequencing discipline.
- Targets must be defensible. Don't write "double organic traffic in Q1." Tie each target to a base rate from competitor data or category benchmarks. If the math doesn't support a target, say so and lower it.
- Critical path is the deliverable. Most teams can do something; few know what's blocking what. Surface the dependency chain — that's where this skill earns its keep.
- Local SEO is a known gap. If business type is
local, flag that we don't have aseo-localskill yet and recommend manual GBP audit as a Phase 0 item. Don't pretend coverage we don't have. - Don't generate work items the team can't execute. If the user said "no JS-render changes allowed," drop those items even if they're high-leverage. A plan that won't ship is worse than a smaller plan that does.
- Update cadence. A 90-day plan should be re-run at the 90-day mark with
seo-drift compareagainst the original baseline as input. Drift output rewrites the "Where you are" section; everything downstream updates from there.
Works well with
- Predecessors:
seo-technical-audit,seo-content-audit,seo-competitor-gap-analysis,seo-ai-search-share-of-voice,seo-backlinks-profile— produce inputs.seo-drift baseline— captures the snapshot the plan measures progress against.
- Successors:
seo-keyword-cluster— when Phase 2 calls for a content tier.seo-content-brief— for each spoke article in Phase 2.seo-schema— for structured-data work items.seo-competitor-pages— when comparison content is on the plan.seo-drift compare— at end of phase to measure progress.seo-page— for individual URL keep/refresh/consolidate/kill calls in Phase 1.
Capabilities
Install
Quality
deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 9 github stars · SKILL.md body (16,789 chars)