SEO SKILL
Programmatic SEO planner
Plan pages at scale from templates and data without building a thin-content farm: twelve playbooks, a data-defensibility ladder, and a pre-launch checklist.
No key, no account needed
Claude Code
Cursor
CodexWindsurfany agent that reads SKILL.md
npx skills add addition-labs/skills --skill programmatic-seo
Run this in a terminal inside your project folder. Claude Code, Cursor and Codex then read the skill from where it lands.
- Step 01Open a terminal in your project folder
- Step 02Paste the command and press Enter
- Step 03Pick the agents to install to
- Step 04Ask the agent for the job; it reads the skill
programmatic-seoaddition-labs/skillsMIT licencev2.0.0updated 2026-09-05
The skill asks the three questions most pSEO projects skip: what repeating search pattern exists, what data you own, and who ranks for the pattern today. Then it picks one of twelve playbooks (templates, curation, conversions, comparisons, examples, locations, personas, integrations, glossary, translations, directory, profiles).
Its best idea is the data hierarchy: proprietary beats product-derived beats user-generated beats licensed beats public. A page set built on public data is the weakest kind, and the skill says so before you build it.
It is short, 1,070 words, with the detailed playbooks in a reference file. Expect a strategy document and a page template, not code.
When to use it
The phrases that trigger it
Say any of these and an agent that has the skill installed will usually load it; you can also call it by name. The phrases are the skill’s own, from its description.
- programmatic SEO
- template pages
- pages at scale
- directory pages
- location pages
- comparison pages
- integration pages
- pSEO
- generate 100 pages
What’s inside
The playbook, section by section
Six core principles
Unique value per page, proprietary data wins, subfolders not subdomains, genuine intent match, quality over quantity, and the four Google penalties to avoid.
Twelve playbooks with a chooser
A table that maps what you have (proprietary data, integrations, a creative product, a multi-segment audience, a local presence) to the playbook that fits.
Implementation in five steps
Keyword pattern research, data requirements, template design with conditional content, hub-and-spoke linking, and an indexation strategy that noindexes thin variations.
Pre-launch and post-launch checklists
Content, technical, linking and indexation checks; then indexation rate, rankings, traffic and manual-action monitoring.
Reference files the agent loads on demand
One file in the skill folder, read only when an instruction calls for it.
playbooks.md- The twelve playbooks in full: what each needs, the URL and template pattern, and worked examples.
See it in action
One real run, in full
The request on the left went to the skill as installed. On the right is everything it returned, unedited; scroll inside the box to read it all.
We run addition-labs.com, an SEO and ads agency for ecommerce and B2B brands. We already publish 16 calculator tools under /tools (CPM, CTR, ROAS, CAC and so on). We are considering a programmatic set of '<metric> benchmark by industry' pages built from those tools. Assess whether that is a sound programmatic SEO play for us, pick the playbook, and give the page template. We have no proprietary benchmark data yet; say what that changes.
Programmatic SEO assessment: "[metric] benchmark by industry" pages for addition-labs.com
Verdict up front
As specified, this is not a sound programmatic play for you today. "[metric] benchmark by industry" is a stats play, and the skill's own playbook matrix gates stats pages on proprietary data. You have none. Without it every page would be a republication of the same three or four public datasets that already sit on page one, and the SERP is full of sites doing exactly that with 2026 dates on them.
What is sound: the same metric × industry grid, built on the asset you actually own, which is the calculators. Playbook: Conversions (the skill maps "tool or utility product" to Conversions) layered with Personas (you already publish 12 industry pages under /industries). Each page targets the "good [metric] for [industry]" intent, but the unique value is a pre-framed calculator plus a sourced, attributed interpretation, not a benchmark number you did not measure. The benchmark table itself waits until you have tier 1 or tier 2 data.
Details, the data question, and the template follow.
1. Initial assessment
Context checked
- No product-marketing context file exists (
.agents/product-marketing.md,.claude/product-marketing.md,product-marketing-context.md). Assessment is built from the request plus the live site. - Live site (fetched 2026-09-11): sitemap lists 168 URLs: 82 under /resources, 39 /services, 17 /tools, 15 /industries, 6 /case-studies, 5 /shopify, plus pricing, contact, about, home.
- /tools holds 16 tools: 13 metric calculators (AOV, ARR, break-even ROAS, CAC, conversion rate, cost per lead, CPA, CPC, CPM, CRO ROI, CTR, LTV, ROAS) and 3 generators (hreflang, llms.txt, schema). Only the 13 calculators are candidates for a metric × industry set.
- /industries already carries the industry axis: ecommerce (beauty, fashion, fitness, food-beverage, home-furniture, jewelry, pet, supplements, wine-alcohol) and B2B (cro, manufacturing, saas). That is 12 leaf pages, so the natural grid is 13 metrics × 12 industries = 156 pages, or 300 to 450 if a platform axis (Google / Meta / Amazon) is added.
- Tool pages are already well built: the ROAS page carries FAQPage and WebApplication JSON-LD, a methodology section, worked examples, and a FAQ. Two facts on it matter for this decision:
- Its own answer to "What is a good ROAS?" is: *"The one that clears your break-even, which is set by your margin rather than by an industry figure."* A benchmark-by-industry set would argue against your own tool page.
- Its answer to "Is my data sent anywhere?" is: *"No. Everything is worked out in your browser, with no account and nothing uploaded."* So the calculators cannot become a benchmark data source without changing a promise you make on every tool page.
Business context (from the request)
- Product: SEO and ads agency for ecommerce and B2B brands.
- Audience: founders and marketers at those brands, arriving via a metric question.
- Conversion goal for these pages: not stated. Assumed: tool use, then an audit or call request. Confirm (see open questions).
Opportunity assessment
- Search pattern: "[metric] benchmark(s) by industry", "average [metric] by industry", "what is a good [metric] for [industry]", "[platform] [metric] benchmarks [year]".
- Demand: confirmed to exist for ROAS and CPM by the SERPs below. Not measured for the other 11 metrics (no keyword-volume tool was available in this run). AOV, ARR, LTV and CRO-ROI "benchmark by industry" demand is unverified and may be thin; do not build those cells until volume is checked.
- Head vs tail: the head terms (ROAS, CPM, CTR, CPC, CAC) are where the volume and the competition both sit. Industry-level tails ("roas benchmark supplements") are where a smaller site can rank, but they are also where a page most easily becomes a swapped-variable template.
Competitive landscape (two live searches, one page fetched)
Query "ROAS benchmark by industry 2026" returned, in order: superscale.ai, webfx.com, shopify.com, segwise.ai, hawky.ai, rule1.ai, get-ryze.ai, adamigo.ai. Query "CPM benchmark by industry Meta ads" returned: triplewhale.com, emarketer.com, lebesgue.io, adlibrary.com, sovran.ai, get-ryze.ai, adamigo.ai.
What that tells you:
- The data owners are on page one: Triple Whale (first-party dataset across its brands), eMarketer, Lebesgue, Shopify. You cannot out-source them without a source of your own.
- The republishers are already there in numbers. I fetched the #1 result for the ROAS query (superscale.ai). It is explicitly republished data: its methodology section names Varos (via WhatConverts, April 2025), Triple Whale (two datasets, 2025), Focus Digital, WebFX and ChannelSight. No first-party data, no interactive element, a static 28-industry table, "Updated July 23, 2026". That is the page you would be building 156 copies of, and it is the ceiling for a republisher, not the floor.
- One competitor is already running your exact play programmatically: sovran.ai has a
/benchmarks/[platform]-[metric]-by-industrypath. The pattern is taken; the only way in is a different value proposition. - The public numbers disagree with each other. The search summaries for the same query quoted Google Ads median ROAS as 3.31x from one source and about 3.5x from another, and Meta all-industry CPM as $14.19 and $13.48 from different sources. Any page that republishes inherits that disagreement and cannot resolve it. A page with its own data can.
Data defensibility (skill hierarchy)
| Tier | Source | Available to you today |
|---|---|---|
| 1 Proprietary | You measured it | No |
| 2 Product-derived | From your users / accounts | Partly: your managed client accounts (5 published case studies, an unknown number of active accounts). Small n, needs consent and anonymisation. The calculators are NOT a source (browser-only promise). |
| 3 User-generated | Community | No |
| 4 Licensed | Exclusive access | No |
| 5 Public | Varos, Triple Whale, WordStream, eMarketer | Yes, and it is the weakest tier, and every competitor has it |
2. What "no proprietary data yet" changes
- The playbook. Stats/benchmark is off the table as the primary play. The primary becomes Conversions (calculator per metric, pre-framed per industry) with a Personas layer. The benchmark table is a later addition to the same pages, not a separate set.
- The claim on the page. "Benchmark" implies you measured it. Until you have, the page says "publicly reported range" with the source named inline and the source's date visible, and the page's own contribution is the break-even and margin reading for that industry through your calculator. This also keeps the page consistent with your ROAS FAQ instead of contradicting it.
- The page count. Do not launch 156. Launch the cells you can make genuinely different (industry-specific margin structure, a worked example that is actually that industry's numbers, an internal link to a case study in that industry where one exists). Cells with nothing industry-specific to say stay unbuilt or noindexed. The skill's rule applies literally here: 100 good pages beat 156 thin ones.
- Honest empties. Where no reliable public figure exists for a metric × industry cell, the page shows that ("no published figure we would stand behind for this industry; use your own margin in the calculator") rather than a number. Never fill a cell to complete the table.
- The data programme becomes the roadmap, not an afterthought. Two possible tier-2 sources, both decisions for you:
- Client accounts (with written consent, anonymised, aggregated, n disclosed on the page). With a handful of accounts per industry this is "what we see across N accounts", not a benchmark, and it must be labelled that way. It is still more defensible than a Varos repost because nobody else has it.
- The calculators, only if you change the "nothing uploaded" promise to an explicit, opt-in "share this calculation anonymously" control. That is a product and trust decision, not an SEO one. I do not recommend changing the promise silently.
- Indexation. Separate sitemap for the set, noindex on every page until it passes the uniqueness gate below, and a pilot before the grid.
3. Strategy document
Opportunity analysis (summary)
- Pattern: metric × industry (× platform later). Grid ceiling 156 (13 × 12).
- Demand: confirmed for ROAS and CPM; unverified for the rest. Volume check is prerequisite #1.
- Competition: data owners plus a crowded republisher tier plus one programmatic competitor already on the pattern. Winnable only in the industry tail and only with a value the republishers cannot copy (working calculator pre-framed per industry, and later your own account data).
- Authority: your site's authority was not stated and was not measured in this run. It decides whether the head terms are reachable at all. Answer question 4 below before budgeting.
- Fit: strong. You already own the tool hub, the industry hub, and case studies; the set stitches three existing assets together instead of creating a fourth.
Implementation plan
Phase 0: validate (before building anything)
- Pull volume and current top-10 for every "[metric] benchmark by industry", "average [metric] [industry]", "good [metric] for [industry]" variant across the 13 metrics. Drop metrics with no measurable demand.
- Decide the platform axis: one page per metric × industry with platforms as sections (recommended, avoids cannibalisation), not one page per platform.
- Decide the conversion goal per page and the CTA (audit request is the natural one for an agency).
- Decide on the data programme (client-account consent, or not).
Phase 1: pilot (weeks 1 to 4)
- Build ROAS × 3 industries where you have the strongest industry-specific material and ideally a case study: candidates are supplements, fashion, saas, because all three have industry pages already.
- Ship under the tool as parent:
/tools/roas-calculator/supplements/etc. (see template). - Index only these. Measure indexation, impressions, rankings for 6 to 8 weeks.
Phase 2: extend on evidence (weeks 8 to 16)
- If the pilot indexes and earns impressions: extend to the metrics that passed Phase 0 (likely ROAS, CPM, CPC, CTR, CAC, CPL, conversion rate, AOV) across the industries where you can meet the uniqueness gate.
- Each new cell passes the gate before it is indexed.
Phase 3: add the data (ongoing)
- Once the client-account aggregate exists for an industry, add a "what we see across N accounts" block to those pages, with n and the date range printed. This is the point at which the pages stop being republications and become a benchmark set in the real sense. Refresh quarterly with the date visible.
Content guidelines
Uniqueness gate (a page is not indexed until all five hold):
- An industry-specific margin range with a named source (or your own account data), used as the calculator's default.
- A worked example whose inputs are plausible for that industry and are explained, not a swapped variable.
- At least three sentences of interpretation that would be false if pasted into another industry's page (different cost structure, buying cycle, return rate, platform mix).
- A link to the matching /industries page and, where one exists, a case study in that industry.
- A visible "sources and date" block. Every external figure carries its source inline.
Rules:
- Never state a figure you cannot attribute. A missing figure is shown as missing.
- Do not use the word "benchmark" for republished ranges in H1 or title; use it once you have your own data. Until then: "good ROAS for supplement brands", "ROAS ranges reported for supplements".
- Keep the page's position consistent with the tool page: the number that matters is the reader's break-even, and the calculator is the way to get it.
- No platform-per-page splits; one page per metric × industry, platforms as sections.
- Update cadence: whenever a cited source publishes a new year, and at least every six months. Show the date.
- Cannibalisation guard: the industry page must not target "[metric] benchmark"; the tool hub must not target "[metric] [industry]". Each page owns one pattern.
4. Page template
URL structure
Subfolder, under the tool as the hub (skill principle 3: subfolders, not subdomains):
/tools/[metric-slug]/[industry-slug]/
/tools/roas-calculator/supplements/
/tools/cpm-calculator/saas/
Hub and spoke: hub = /tools/[metric]/ (exists), spokes = the industry pages under it, cross-links between spokes of the same metric and between the same industry across metrics. Breadcrumb: Tools › ROAS Calculator › Supplements.
Title and meta templates
Title: What is a good [METRIC] for [INDUSTRY] brands? | [METRIC] calculator | Addition
(≤ 60 chars where possible; drop "| Addition" first if long)
Meta: [METRIC] ranges reported for [INDUSTRY] in [YEAR], with sources, and a calculator
that turns your margin into a break-even [METRIC]. Free, runs in your browser.
H1: What is a good [METRIC] for [INDUSTRY] brands?
Once tier-2 data exists, title variant: [METRIC] benchmarks for [INDUSTRY] ([YEAR]): what we see across [N] accounts.
Content outline
- H1 + one-paragraph unique intro: the industry's cost structure in two sentences (why this industry's number differs), then the page's position: the range below is context, your break-even is the answer.
- Calculator (the existing tool, embedded, with industry defaults pre-filled and a visible "defaults from [source]" note). The user can overwrite every field.
- H2: [METRIC] ranges reported for [INDUSTRY]: a short table, one row per platform (Google, Meta, Amazon where relevant), columns: reported range, source, source date. Empty cells shown as "no reliable published figure". No cell is ever filled to complete the table.
- H2: What we see across [N] [INDUSTRY] accounts (only when tier-2 data exists; omitted entirely until then, never a placeholder).
- H2: Why [INDUSTRY] runs [higher/lower/wider] than the all-industry figure: margin, AOV, repeat rate, return rate, buying cycle, platform mix. Must be specific to the industry.
- H2: Worked example: one plausible [INDUSTRY] scenario through the calculator, showing break-even vs reported range and the reading.
- H2: What to do if you are below / above the range (three short, executable moves each; agency-appropriate, no hedging).
- H2: Related: links to the same metric in adjacent industries, the same industry in adjacent metrics, the /industries/[industry] page, the case study if any.
- H2: FAQ (4 to 6 questions, industry-specific, answers reused in FAQPage schema).
- Sources and date block.
- CTA: one, low pressure, matching the site's existing tool-page CTA.
Schema markup
WebApplication(already on tool pages; reuse with the page-specific name and URL).FAQPagefor the FAQ block (already on tool pages; reuse pattern).BreadcrumbList(Tools › [Metric] › [Industry]).Datasetonly for the "what we see across N accounts" block, and only once that data exists; never mark republished third-party figures as your dataset.- No
AggregateRating, noReview.
Internal linking
- Tool hub links to every indexed spoke (a "By industry" section on
/tools/[metric]/). /industries/[industry]links to every indexed metric spoke for that industry (a "Numbers for [industry]" section).- Spoke to spoke as in outline §8.
- Separate
sitemap-tools-industries.xml; noindex any spoke that fails the gate.
5. Quality checks
Pre-launch (per page): unique value present per the five-point gate · answers the "good [metric] for [industry]" intent · unique title and meta · heading structure as above · schema valid · speed same as the tool page · linked from hub and industry page · in the set's sitemap · no conflicting noindex once approved.
Post-launch: indexation rate of the set, impressions and average position per cell, calculator interaction rate, CTA rate. Watch for: cells that index but earn no impressions (retire or merge), ranking drops on the parent tool page (cannibalisation), any Search Console thin-content or manual action.
Common mistakes this plan is guarding against: swapped-variable pages (gate #3) · cannibalising the tool hubs and the industry pages (one pattern per page) · over-generation (grid ceiling 156, launched only on evidence) · poor data quality (attributed figures, visible dates, no filled cells) · pages for Google not users (the calculator is the value, the table is context).
6. Open questions (needed to finalise, from the skill's task-specific list)
- Keyword patterns: which of the 13 metrics have measurable demand for the industry variant? Only ROAS and CPM are confirmed here.
- Data: will you seek client consent to aggregate account data? Will you keep the "nothing uploaded" promise on the tools?
- Page count: is 156 the intended ceiling, or do you want a platform axis (which multiplies it and multiplies the cannibalisation risk)?
- Site authority: current domain strength and existing rankings for "[metric] calculator" terms. This decides whether head terms are in reach or the play is tail-only.
- Who ranks: the two SERPs above cover ROAS and CPM only; the other 11 metrics need the same check.
- Technical stack: how /tools pages are generated today, and whether the calculator can be embedded with per-page defaults without duplicating code.
Sources consulted in this run
- https://addition-labs.com/tools, https://addition-labs.com/sitemap.xml, https://addition-labs.com/tools/roas-calculator (fetched 2026-09-11)
- Web search "ROAS benchmark by industry 2026": superscale.ai, webfx.com, shopify.com, segwise.ai, hawky.ai, rule1.ai, get-ryze.ai, adamigo.ai
- Web search "CPM benchmark by industry Meta ads": triplewhale.com, emarketer.com, lebesgue.io, adlibrary.com, sovran.ai, get-ryze.ai, adamigo.ai
- Page fetched and read for structure and data provenance: superscale.ai (above). The specific figures quoted in §1 are as reported in those search summaries and that page; none were measured by me.
What this run could not do
It had no keyword search volume for the 13 metric patterns (no keyword tool), no site authority or rankings, no technical stack, conversion goal or intended page count; those are left as its open questions. No benchmark figure was produced; the few numbers quoted are attributed to the search summaries and the fetched page.
Method behind it
Where we would differ, and why
Our B2B SEO strategy guide shows where templated pages fit in a topical map and where they cannibalise it. The skill decides whether to build; the guide decides what the set may not compete with.
The skill says "better 100 great pages than 10,000 thin ones" and then offers a locations playbook. For a services business with no per-city data, that playbook produces exactly the thin set it warns against; we would not run it without a real local signal per page.

SKILL.md
The file the agent reads
Written by Corey Haines and published under the MIT licence. Read the full file (1,070 words) on GitHub, at the commit we reviewed: coreyhaines31/marketingskills/skills/programmatic-seo/SKILL.md. The reference files are in the same folder.
Questions
Questions people ask before installing
Does it generate the pages?
No. It produces the strategy and a page template with URL, title and meta patterns, a content outline and schema. You or your CMS build the pages.
Is it safe against Google’s scaled-content policy?
Its principles match the policy: unique value per page, no doorway pages, noindex for thin variations. Whether a given set is safe depends on the data behind it, which is why the skill asks about data first.
Which agents run it?
Any that reads the Agent Skills format: Claude Code, Cursor, Codex, Windsurf. Install with `npx skills add` and it lands in the right folder for each.



