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-competitor-gap-analysis`, `seo-ai-search-share-of-voice`) into one site-level plan with sequencing, owners, and success metrics. Distinct from `seo-keyword-cluster` (keyword architecture for one topic), `seo-content-brief` ...
Scanned 5/27/2026
Install via CLI
openskills install seranking/seo-skills---
name: seo-plan
description: 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-competitor-gap-analysis`, `seo-ai-search-share-of-voice`) into one site-level plan with sequencing, owners, and success metrics. Distinct from `seo-keyword-cluster` (keyword architecture for one topic), `seo-content-brief` (one article), and `seo-keyword-niche` (longtail content tier). Use when the user asks for an "SEO plan", "SEO strategy", "SEO roadmap", "90-day plan", "quarterly SEO plan", "site SEO strategy", or "where do we focus next".
---
> Example output: [examples/seo-plan-wix-com-20260514/PLAN.md](../../examples/seo-plan-wix-com-20260514/PLAN.md)
# 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-firecrawl` available 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
0. **Google data availability check (advisory, not blocking)**
- Run `python3 scripts/google_auth.py --check --json`. If `tier >= 0`, the downstream specialist skills (technical-audit, page, content-audit, drift) will enrich their outputs with real Google field data — and `seo-plan` ingests those richer outputs in step 4. The plan itself doesn't dispatch `seo-google` directly; 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-plan` doesn't run `seo-google` itself (transferring friction to a single command is theirs' anti-pattern we critiqued in `EVAL_RESULT_v2.md`); it surfaces the option so the user can opt in or out before specialist skills run. See `skills/seo-google/references/cross-skill-integration.md` § "seo-plan" for the full rationale.
1. **Detect business type** `DATA_getDomainOverviewWorldwide`, plus a Firecrawl `scrape` of 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).
2. **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.
3. **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).
4. **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.md` rollup, `GAPS.md`, `REPORT.md`, `PROFILE.md` respectively).
- **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 from `seo-competitor-gap-analysis` / `DATA_getDomainKeywords`, so it must run after the gap-analysis batch completes.
- Each specialist runs its own `DATA_getCreditBalance` preflight and surfaces cost before proceeding (their existing behaviour — `seo-plan` does 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.
- **4e. If user answers `N` (or anything else — default `N`):** 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.
5. **Score the four pillars**
- **Technical health** (0–100): from `seo-technical-audit` severity-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.
6. **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-local` skill 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.
7. **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-page` verdicts.
- **Phase 2 (weeks 5–8): Build.** Content tier from `seo-keyword-cluster` (1 pillar + 3–7 spokes), schema fixes from `seo-schema`, comparison page from `seo-competitor-pages` if competitive frame supports it.
- **Phase 3 (weeks 9–12): Compound + measure.** AI Search readiness pass via `seo-geo` on top pages, backlink-gap outreach starter from `seo-backlink-gap`, second drift comparison via `seo-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.
8. **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.
9. **Sequencing + dependencies**
- Build a dependency map: e.g., "rewrite cluster A pillar" depends on "fix `noindex` on /blog templates" depends on "run `seo-technical-audit`."
- Surface the critical path. Anything off the critical path is moveable; anything on it blocks the phase.
10. **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:
```markdown
# 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 explicit `y`), `seo-plan` falls 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 `y` path) is the convenience option.** When the user wants a finished plan in one session and is comfortable with the displayed credit estimate, the `y` path 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_getCreditBalance` at its first step and surfaces cost before consuming credits — `seo-plan` does not bypass that gate. If a specialist aborts on its preflight (insufficient credits, user declines its inner cost prompt), `seo-plan` surfaces 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 a `seo-local` skill 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 compare` against 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.
No comments yet. Be the first to comment!