programmatic-seo
Use when planning many similar pages from a template and a data set: choosing the pattern, deciding whether the data can carry it, and avoiding the thin-content failure that gets page sets deindexed.
Install
npx skills add https://github.com/fcakyon/claude-codex-settings/tree/main/plugins/seo-skills/skills/programmatic-seo
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install fcakyon-claude-codex-settings@llmmart
git clone https://github.com/fcakyon/claude-codex-settings.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole fcakyon/claude-codex-settings collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
Programmatic SEO
Building pages from a template and a data set works when each page answers a real query with something only your data can say. It fails the same way every time: a template with the variable swapped, published at volume, on queries nobody searches. That is the definition of a doorway page, and Google's spam policies name it.
So the question to settle before any of the mechanics is whether the data is worth a page.
Does the data carry it
Defensibility runs in this order, strongest first:
- Proprietary, because you generated it.
- Product-derived, from how your own users behave.
- User-generated, from your community.
- Licensed, where the license is exclusive.
- Public, which anyone can use and everyone already has.
A set built on public data competes with every other set built on the same public data, so it has to win on presentation, freshness, or aggregation instead. That is possible and it is a much harder brief. Say so rather than shipping 5,000 pages that restate a public API.
Then check demand actually exists: aggregate volume across the pattern, how it splits between head and long tail, and whether the trend is going anywhere. A pattern with 10,000 combinations and no searches for 9,000 of them is a 1,000-page opportunity.
Choosing a pattern
| You have | Consider |
|---|---|
| Proprietary data set | Directory, Profiles |
| A product with integrations | Integrations |
| A design or creative product | Templates, Examples |
| Several distinct audience segments | Personas |
| A local footprint | Locations |
| A utility or calculator | Conversions |
| Deep subject expertise | Glossary, Curation |
| A crowded competitive field | Comparisons |
references/playbooks.md covers the twelve patterns, each with its query shape, what data it needs, and how it usually fails.
Patterns layer, and layering is often where the real opportunity is: "best coworking spaces in Austin" is Curation crossed with Locations.
Making each page worth indexing
- Every page needs something specific to it beyond the substituted variable: a number, a comparison, a list, an image, a genuine answer.
- Write the introduction per page, or generate it from enough fields that no two read alike. A shared paragraph with one word swapped is the tell.
- Vary structure by what the data supports. A page with three data points shouldn't use the layout built for thirty; branch the template instead of padding.
- Give each page a unique title and meta description built from its variables, not one pattern with the variable appended.
- Match the query's intent. A comparison query wants a comparison, not a signup page.
Structure and indexation
- Subfolders, not subdomains, so the pages build authority on the same domain rather than splitting it.
- Hub and spoke: a category page linking to every page in the set, each page linking back, and related pages cross-linking. Otherwise the set is orphaned and only the sitemap points at it.
- Own sitemap for the set, or a sitemap per pattern, so indexing rates per pattern are readable.
- Ship the strongest slice first rather than the whole set. Publish the highest-demand pages, confirm they get indexed and ranked, then expand. A set that goes out all at once gives no signal about which part worked.
- Leave the thinnest variations out entirely. That is better than publishing them and noindexing them later, since crawl spent on pages you didn't want is crawl not spent on pages you did.
Before it ships
Check that each page has unique value and answers its query, that titles and descriptions are unique, that heading structure and schema are in place, that the set is linked from the site rather than only the sitemap, that no page has a conflicting noindex, and that nothing in the set competes with an existing page for the same query.
After launch, watch what fraction of the set gets indexed, which patterns rank, and whether engagement holds up. Thin-content warnings, a drop across the set, or an indexing rate that stalls well below 100% all mean the same thing: cut, don't add.
What this hands off
Programmatic SEO decides the pattern, the data, the URL shape, the template's sections, and the linking. The words inside a template section are copy: hand the content marketer the template, the target query, and the fields available per page.
Sources
- Google Search Central, Spam policies: https://developers.google.com/search/docs/essentials/spam-policies
- Google Search Central, Creating helpful, reliable, people-first content: https://developers.google.com/search/docs/fundamentals/creating-helpful-content
- Google Search Central, Sitemaps overview: https://developers.google.com/search/docs/crawling-indexing/sitemaps/overview
Files (claude-codex-settings)
-
references
-
playbooks.md 5.5 KB
# The twelve playbooks Each entry gives the query shape, the data it needs, and how it usually fails. The failure line matters more than the pattern: every one of these works when the data is real and fails the same way when it isn't. ## 1. Templates Query: "[type] template", "[type] template free". Data: the templates themselves, plus a preview image and the fields describing each. Page: a preview, what it's for, how to use it, and the download or copy action above the fold. Fails when: the template is a thin table nobody would use, or the page makes you sign up to see anything. Search intent here is transactional, so a gate before the preview loses both the ranking and the visitor. ## 2. Curation Query: "best [category]", "top [category] for [use case]". Data: a scored comparison across real options, ideally with your own testing behind it. Page: the criteria, the picks with reasons, and where each one is the wrong choice. Fails when: it lists every option with no opinion, or ranks by affiliate payout. Naming who should not pick your top choice is what makes the rest credible. ## 3. Conversions Query: "[X] to [Y]", "[N] [unit] in [unit]". Data: a conversion rate or formula, ideally live. Page: the answer at the top, then the formula, then common values nearby. Fails when: the answer is below the fold, or the rate is stale. These queries have enormous volume and near-zero patience. ## 4. Comparisons Query: "[X] vs [Y]", "[competitor] alternative". Data: verified feature, pricing, and limit data for both sides, with a date. Page: an honest table, where each option wins, and who should pick the other one. Fails when: the competitor's column is out of date or unfair. A comparison that only your product could win reads that way, and it dates badly the moment the competitor ships. ## 5. Examples Query: "[type] examples", "[type] examples that work". Data: real examples with images and a note on why each is included. Page: the example, what it does well, and what to copy from it. Fails when: it's a gallery with no analysis. The screenshots are the draw; the reason each one is there is the value. ## 6. Locations Query: "[service] in [city]", "[service] near me". Data: something genuinely local per page: real listings, local pricing, local regulation, coverage. Page: local specifics first, then the general information. Fails when: the city name is the only difference. This is the canonical thin-content case and the one Google's doorway-page policy describes most directly. If you cannot say something true about that city, don't make the page. ## 7. Personas Query: "[product category] for [audience]". Data: how the product is actually used by that segment, with real examples. Page: that segment's problem, the workflow that solves it, proof from someone like them. Fails when: it's the homepage with the audience noun swapped. If the screenshots and the objections don't change per persona, the segments aren't distinct enough for separate pages. ## 8. Integrations Query: "[product A] [product B] integration", "connect [A] to [B]". Data: your integration catalog plus what each integration actually does. Page: what the connection enables, setup steps, what syncs and what doesn't. Fails when: it lists integrations you don't have, or every page says "seamlessly connect" with no mechanics. What syncs, in which direction, how often, is the whole reason someone searched. ## 9. Glossary Query: "what is [term]", "[term] meaning". Data: subject expertise and a consistent structure. Page: a direct one-paragraph definition, then why it matters, an example, and related terms. Fails when: definitions are paraphrased from other glossaries. Answer in the first paragraph and add the thing only a practitioner would know. ## 10. Translations Query: existing winning queries, in another language. Data: real translation, not just the interface strings. Page: the source page's value, fully localized. Fails when: only the chrome is translated, or hreflang and canonical are wrong. Read `../../seo-audit/references/international-seo.md` before starting: the technical failure modes here void whole locale clusters silently. ## 11. Directory Query: "[category] tools", "[category] companies". Data: a maintained listing set with enough fields to filter and sort. Page: the filtered list plus what's true of this slice specifically. Fails when: listings go stale or every filter combination becomes a page. Index the combinations with demand; leave the rest to filtering that doesn't generate URLs. ## 12. Profiles Query: "[entity name]", "[entity] [attribute]". Data: a reliable entity data set you can keep current. Page: the facts, sourced, with the update date visible. Fails when: facts are wrong or unattributed. Profile pages about real people and companies carry accuracy obligations well beyond SEO, so cite the source and date every claim. ## Layering Combining two patterns usually beats extending one, because the combined query is more specific and less contested. Curation plus Locations gives "best [category] in [city]". Personas plus Integrations gives "[product] for [audience] with [tool]". The constraint is data: each added dimension multiplies the pages and divides the evidence you have per page, so layer only while each cell still has something real in it. ## Sources - Google Search Central, Spam policies (doorway pages, scaled content abuse): https://developers.google.com/search/docs/essentials/spam-policies - Google Search Central, Creating helpful, reliable, people-first content: https://developers.google.com/search/docs/fundamentals/creating-helpful-content
-
-
SKILL.md 4.9 KB
--- name: programmatic-seo description: "Use when planning many similar pages from a template and a data set: choosing the pattern, deciding whether the data can carry it, and avoiding the thin-content failure that gets page sets deindexed." license: MIT --- # Programmatic SEO Building pages from a template and a data set works when each page answers a real query with something only your data can say. It fails the same way every time: a template with the variable swapped, published at volume, on queries nobody searches. That is the definition of a doorway page, and Google's spam policies name it. So the question to settle before any of the mechanics is whether the data is worth a page. ## Does the data carry it Defensibility runs in this order, strongest first: 1. Proprietary, because you generated it. 2. Product-derived, from how your own users behave. 3. User-generated, from your community. 4. Licensed, where the license is exclusive. 5. Public, which anyone can use and everyone already has. A set built on public data competes with every other set built on the same public data, so it has to win on presentation, freshness, or aggregation instead. That is possible and it is a much harder brief. Say so rather than shipping 5,000 pages that restate a public API. Then check demand actually exists: aggregate volume across the pattern, how it splits between head and long tail, and whether the trend is going anywhere. A pattern with 10,000 combinations and no searches for 9,000 of them is a 1,000-page opportunity. ## Choosing a pattern | You have | Consider | | --- | --- | | Proprietary data set | Directory, Profiles | | A product with integrations | Integrations | | A design or creative product | Templates, Examples | | Several distinct audience segments | Personas | | A local footprint | Locations | | A utility or calculator | Conversions | | Deep subject expertise | Glossary, Curation | | A crowded competitive field | Comparisons | `references/playbooks.md` covers the twelve patterns, each with its query shape, what data it needs, and how it usually fails. Patterns layer, and layering is often where the real opportunity is: "best coworking spaces in Austin" is Curation crossed with Locations. ## Making each page worth indexing - Every page needs something specific to it beyond the substituted variable: a number, a comparison, a list, an image, a genuine answer. - Write the introduction per page, or generate it from enough fields that no two read alike. A shared paragraph with one word swapped is the tell. - Vary structure by what the data supports. A page with three data points shouldn't use the layout built for thirty; branch the template instead of padding. - Give each page a unique title and meta description built from its variables, not one pattern with the variable appended. - Match the query's intent. A comparison query wants a comparison, not a signup page. ## Structure and indexation - Subfolders, not subdomains, so the pages build authority on the same domain rather than splitting it. - Hub and spoke: a category page linking to every page in the set, each page linking back, and related pages cross-linking. Otherwise the set is orphaned and only the sitemap points at it. - Own sitemap for the set, or a sitemap per pattern, so indexing rates per pattern are readable. - Ship the strongest slice first rather than the whole set. Publish the highest-demand pages, confirm they get indexed and ranked, then expand. A set that goes out all at once gives no signal about which part worked. - Leave the thinnest variations out entirely. That is better than publishing them and noindexing them later, since crawl spent on pages you didn't want is crawl not spent on pages you did. ## Before it ships Check that each page has unique value and answers its query, that titles and descriptions are unique, that heading structure and schema are in place, that the set is linked from the site rather than only the sitemap, that no page has a conflicting noindex, and that nothing in the set competes with an existing page for the same query. After launch, watch what fraction of the set gets indexed, which patterns rank, and whether engagement holds up. Thin-content warnings, a drop across the set, or an indexing rate that stalls well below 100% all mean the same thing: cut, don't add. ## What this hands off Programmatic SEO decides the pattern, the data, the URL shape, the template's sections, and the linking. The words inside a template section are copy: hand the content marketer the template, the target query, and the fields available per page. ## Sources - Google Search Central, Spam policies: https://developers.google.com/search/docs/essentials/spam-policies - Google Search Central, Creating helpful, reliable, people-first content: https://developers.google.com/search/docs/fundamentals/creating-helpful-content - Google Search Central, Sitemaps overview: https://developers.google.com/search/docs/crawling-indexing/sitemaps/overview
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.