---
name: programmatic-seo
description: Plan and build SEO pages at scale from templates plus data: location, comparison, integration, template, and directory pages. Use when the user says "programmatic SEO", "pSEO", "generate 100 pages", "location pages", or "[keyword] + [city] pages". Not for the claude-seo pipeline implementation of pSEO: use claude-seo-programmatic. Not for auditing existing pages: use seo-audit. Not for site-wide URL and linking design: use site-architecture.
license: MIT
metadata:
  author: TechTide AI (Alex Cinovoj)
  provenance: rewritten from patterns in an open SaaS marketing skills pack (MIT)
  category: SEO & AEO
---

# Programmatic SEO

Pages at scale only work when every page earns its ranking individually. A hundred great pages beat ten thousand thin ones; thin templated pages at scale invite the exact penalty you are trying to outrun.

## Workflow

1. **Load context and assess.** Read `.agents/product-marketing.md` if present. Confirm: the product, the conversion goal for these pages, the repeating search pattern, roughly how many combinations exist, and who ranks for these terms today. If incumbents are strong brands with rich pages, be honest about whether you can compete.
2. **Pick the playbook** from the pattern table. Layer playbooks where natural ("best [category] in [city]").

| Playbook | Pattern | You need |
|---|---|---|
| Templates | "[type] template" | Design/creative assets |
| Curation | "best [category]" | Expertise, evaluation criteria |
| Conversions | "[X] to [Y]" | A working utility |
| Comparisons | "[X] vs [Y]" | Competitor knowledge |
| Examples | "[type] examples" | A real gallery |
| Locations | "[service] in [location]" | Local data or presence |
| Personas | "[product] for [audience]" | Segment-specific value |
| Integrations | "[A] [B] integration" | Actual integrations |
| Glossary | "what is [term]" | Domain expertise |
| Directory | "[category] tools" | Structured dataset |
| Profiles | "[entity name]" | Entity data |

3. **Secure the data.** Data defensibility ranks: proprietary (you created it), product-derived (from your users), user-generated (your community), licensed, public. Public data alone means anyone can clone your entire play in a weekend. Define how the data updates, stale data kills these pages.
4. **Design the template for uniqueness.** Header targeting the keyword, an intro that varies by data (not just swapped variables), data-driven sections, conditional blocks that render only when the data supports them, page-specific insight, related-page links, intent-matched CTA. Unique title and meta description per page.
5. **Build the linking architecture.** Hub and spoke: category hub pages link to every spoke, spokes cross-link to related spokes, breadcrumbs with structured data. No orphans: every page reachable from the main site and listed in a sitemap. Use subfolders, never subdomains: `site.com/templates/resume/` consolidates authority, `templates.site.com` splits it.
6. **Control indexation.** Prioritize high-volume patterns first. Noindex variations too thin to stand alone rather than deleting the utility. Separate sitemaps per page type so you can watch indexation rates per pattern.
7. **Monitor after launch.** Indexation rate, rankings, engagement, conversions. Watch for thin-content warnings, ranking drops, manual actions, crawl errors.

## Verification

Take five generated pages for adjacent entities and diff them. Expect meaningful content differences beyond the swapped variable: different data values, different conditional sections, different insights. If the diff is only the entity name and numbers, the template is a thin-content generator: add data-driven sections and conditionals before generating the full set.

Then pick three target queries and read the page against the search intent. Expect the page to actually answer what the searcher wants. If it exists for Google rather than the user, rework it.

## Good vs Bad

**Bad:** 3,000 "[service] in [city]" pages, identical copy with the city name swapped, no local data, all indexed on day one.

**Good:** 150 city pages, each with local pricing data, provider counts, neighborhood-level detail from a proprietary dataset, conditional sections that only render where data exists, hub pages per state, rolled out in tranches while watching indexation.

## Completion checklist

- [ ] Search pattern validated: real volume, realistic competition
- [ ] Data source named with its defensibility tier and update plan
- [ ] Five-page diff test passed
- [ ] Unique titles and metas, schema markup, acceptable page speed
- [ ] Hub-and-spoke linking, zero orphans, sitemap(s) submitted
- [ ] Thin variations noindexed
- [ ] Post-launch monitoring in place

Any box unchecked: not done. Fix or say so.

## Footguns

- **Keyword cannibalization.** Multiple generated pages targeting the same query split and sink rankings. Fix: one page per intent, consolidate or noindex overlaps.
- **Over-generation.** Pages for combinations nobody searches waste crawl budget and dilute quality signals. Fix: generate only where demand data exists, tranche the rollout.
- **Rotten data.** Outdated prices and dead entities destroy trust and rankings. Fix: refresh pipeline with a schedule, timestamp visible on the page.
- **UX afterthought.** Pages built for crawlers convert nobody. Fix: real utility on every page, intent-matched CTA, judge each page as a landing page.
