---
sharksapi_version: p-a58fc5a306
name: programmatic-seo
description: Plan and ship programmatic SEO the disciplined way — find a repeatable keyword pattern with real demand, verify viability against the SERPs, assemble a data source that makes every page genuinely unique, template it, pilot 10–20 pages as WordPress drafts through approval, measure indexing and impressions in GSC, and only then scale. Explicit anti-doorway-page guardrails; content-quality-auditor is the quality gate.
allowed-tools: [memory_bootstrap, memory_search, memory_write, get_team_capabilities, list_connections, get_gsc_top_queries, get_gsc_top_pages, get_search_console, keyword_planner_ideas, keyword_planner_volumes, keyword_search_volume, ubersuggest_keywords, domain_keywords, search_serp_google, monitor_keyword_serp, scrape_website, analyze_competitor_website, list_wp_posts, get_wp_post, create_wp_post, update_wp_post, analyze_wp_seo, analyze_schema, validate_schema_type, create_spreadsheet, read_sheet, update_sheet, append_sheet, search_drive, get_drive_file_content, submit_draft, list_drafts, revise_draft, read_dashboard, update_strategy_task, add_plan_activity]
metadata:
  role: seo / content agent
  triggers: [programmatic seo, pseo, template pages, pages at scale, keyword pattern, comparison pages, location pages, glossary pages, generate landing pages, programmaatiline seo]
  sources: "Adapted for SharksAPI from coreyhaines31/marketingskills programmatic-seo skills (MIT, © 2025 Corey Haines). Synthesis, not verbatim copy."
---

# Programmatic SEO

Build many pages from one template and one dataset — but only where a real, repeating search pattern exists and every generated page can honestly answer its query better than what already ranks. The failure mode of pSEO is thousands of thin near-duplicates that earn a sitewide quality demotion; this skill's guardrails exist to make that impossible.

All JSON snippets are `params` payloads for `POST https://sharksapi.ai/api/v1/a2a`. Inspect the live tool schema first (`GET /api/v1/a2a/tools`). Publish surface: WordPress (`create_wp_post` with draft status). No WordPress connection → the deliverable stops at the validated plan + content dataset.

## Phase 0: Orient

1. `{"tool": "memory_bootstrap", "arguments": {}}` — `context:*` (what the product actually does bounds which patterns you may credibly cover) + prior pSEO lessons (`memory_search` "pseo").
2. `read_dashboard` (own token) — task + `action_items`.
3. `list_wp_posts` — what already exists; a pSEO set must not cannibalize or duplicate current pages.

## Phase 1: Find the pattern

Look for a **head term × modifier matrix** with demand across the long tail:

- `get_gsc_top_queries` — patterns users already find the site with (the cheapest signal: demand + existing relevance)
- `keyword_planner_ideas` / `ubersuggest_keywords` — expand candidate patterns ({X} vs {Y}, best {X} for {Z}, {service} in {city}, {template/example/integration} + {entity})
- `keyword_planner_volumes` / `keyword_search_volume` — size the matrix: aggregate volume matters more than any single term, but individual terms should mostly be non-zero
- `domain_keywords` on competitors doing pSEO — which of their page sets actually rank

## Phase 2: Viability gate (most candidates should fail here)

For a sample of 5–10 queries across the matrix, `search_serp_google` and judge honestly:

1. **SERP winnable?** Who ranks — thin directories (winnable) or authoritative deep pages (hard)? Does one aggregator own every variant?
2. **Unique value per page?** Name exactly what each page offers that a generic page + find-replace would not: real data per entity, real comparisons, real examples. **If the honest answer is "the city name changes", stop — that is a doorway-page set and you must recommend against it.**
3. **Data exists?** A pSEO set is only as good as its dataset (Phase 3). No defensible data source → no project.
4. **Intent match?** The page type the pattern demands (comparison, list, calculator, template) must be something the project can actually render well.

Record the go/no-go as a `channel:seo` `decision` memory with the evidence. A well-argued NO is a fully successful outcome of this skill.

## Phase 3: Dataset before template

Assemble the per-page data in a structured sheet (`create_spreadsheet`; one row per page: slug, title vars, the unique facts/numbers/comparisons for that entity, internal-link targets). Sources: project's own data (`search_drive`/`get_drive_file_content`), public data the human points at (`scrape_website` — respect the source's terms), CONFIRMED context facts. **Every factual cell needs a source; cells you cannot fill honestly stay empty and that page doesn't ship.** LLM-invented "data" (fake ratings, made-up prices, guessed feature matrices) is prohibited — it's the express lane to the demotion this skill exists to avoid.

## Phase 4: Template and pilot (10–20 pages, drafts, approved)

1. Design the template: unique H1/title/meta per row, the data rendered as the page's core value (tables, comparisons), 20–40% page-specific prose (not spun boilerplate), FAQ block where questions genuinely differ, internal links three ways (pilot pages ↔ related pilot pages, pilot → cornerstone content, existing pages → pilot), and matching JSON-LD (`validate_schema_type` before shipping).
2. Generate the pilot batch — the 10–20 rows with the strongest data and demand.
3. Quality gate: run the `content-quality-auditor` skill's ship/no-ship bar on 2–3 sample pages; fix the template, not just the samples.
4. Approval: `submit_draft` (type `seo_change`, title "pSEO pilot: {pattern} — {n} pages", body = pattern, viability evidence, sample pages, rollout plan). Manager feedback → `revise_draft`.
5. After approval: `create_wp_post` each pilot page with **draft/unpublished status** unless autonomy explicitly allows publishing; verify each via `get_wp_post`; run `analyze_wp_seo` on samples. Human/manager flips them live per the approved plan.

## Phase 5: Measure before scaling

Give the pilot 3–6 weeks, then judge with GSC:

- `get_search_console` / `get_gsc_top_pages` — are pilot URLs indexed and earning impressions? Position trend?
- `monitor_keyword_serp` on a few pilot queries — actual SERP presence
- Kill criteria: mostly unindexed after ~6 weeks, or indexed with near-zero impressions → the pattern failed; fix data/template or abandon — **do not scale a failing pilot.**
- Scale criteria: healthy indexing + growing impressions → expand in tranches (≤50–100 pages per wave, same draft→approve→verify loop), watching GSC for indexing saturation and cannibalization of existing pages each wave.

Write the pilot verdict as `result` memory; template/data lessons as `lesson`.

## Failure & fallback

- No WordPress connection → deliver validated pattern + dataset + template spec; clearly NOT live.
- Dataset too thin for most rows → shrink the matrix to the rows with real data; never pad with generated filler.
- Existing pages already target part of the matrix → integrate (update/redirect) instead of duplicating; flag cannibalization risks in the approval draft.
- Post-launch indexing collapse on existing pages (quality signal) → recommend pruning the weakest pSEO pages first and say why.

## Sources & attribution

Pattern→viability→pilot→scale structure adapted from Corey Haines' *marketingskills* programmatic-seo skills (MIT, license verified 2026-07-10), rebuilt on SharksAPI keyword/GSC/SERP tooling, WordPress draft publishing, the content-quality-auditor gate and the team's approval + read-back-verification conventions.
