Programmatic SEO: when it works and when it is spam
·4 min read
Programmatic SEO is building hundreds or thousands of pages from one template and a structured dataset, each page targeting its own long-tail query. It works when every page carries data a searcher actually wants and can't get from the next page over. It fails, and can earn a spam action, when the only thing that changes between pages is the keyword. Ship it in small batches and watch how many pages Google indexes before you scale.
What is programmatic SEO?
Programmatic SEO is a way to produce pages, not a ranking trick. You pick a query pattern with many variants, such as "[tool] integrations with [app]" or "[currency] to [currency] exchange rate", join a database to a template and publish one URL per row.
The examples that work share one trait. The data is the product. A currency page shows a live rate and a chart. An integrations page lists what the integration actually syncs.
That is the test I use before anyone writes a line of template code. Pick five rows at random and write down what a searcher learns on each page that the other four don't tell them. If the answer is "the city name", stop.
Programmatic SEO vs scaled content abuse
Google does not ban programmatic pages. It bans pages made to manipulate rankings without helping users. Its spam policies define scaled content abuse as generating many pages mainly to manipulate rankings, with unoriginal content of little value, "no matter how it's created". Hand-written, templated or AI-written makes no difference.
Its examples read like a list of lazy programmatic projects:
- Using generative AI to produce many pages without adding value for users.
- Scraping feeds or search results and rewording them through synonyms or translation.
- Stitching content from different pages together without adding anything.
- Pages full of search keywords that make little sense to a reader.
The same page covers doorway abuse, which includes city pages that funnel users to one page. That describes the classic "plumber in [every suburb]" build almost word for word.
| Programmatic SEO that works | Scaled content abuse | |
|---|---|---|
| What changes per page | Prices, specs, listings, stats, reviews | The keyword and a few swapped nouns |
| Data source | Your own product data, licensed or first-party datasets | Scraped or rewritten text |
| Index rate after launch | Most pages indexed | Large share left out |
The template quality bar
A good template makes the unique data the main content, not a widget beside 600 words of boilerplate. Check each template against this list.
- Unique data above the fold. The first screen shows the row-specific facts, not an intro paragraph shared by every page.
- A data minimum. Set a floor, such as three listings or a full spec table, and don't publish rows below it.
- Shared copy kept short. Boilerplate that repeats across thousands of URLs makes them look like duplicates. Move it to one explainer page and link to it.
- A real canonical. Each page points to itself. Filter and sort variants point to the main version. Our canonical tag guide covers the rules.
- Server-rendered content. If the data loads client-side, crawlers that skip JavaScript see the template shell only.
- Internal links by hierarchy. Category hubs link to child pages so every page is reachable, and each URL appears in your XML sitemap.
Roll out programmatic pages in batches
Publish a small batch, measure the index rate, then decide whether to scale. Launch 50,000 URLs on day one with a weak template and Google learns that about the whole set at once.
A rollout that has worked for me:
- Publish 100 to 500 pages from your strongest rows, the ones with the most data.
- Submit them in a dedicated sitemap so Search Console reports their status as a group.
- Wait a few weeks. Check how many are indexed and whether any get impressions.
- Fix the template if the index rate is low. Then publish the next, larger batch.
- Prune rows that never earn an impression. Fewer good pages beat many ignored ones.
The batch sizes are illustrative. An established site can go bigger, a new domain smaller.
Watch for "Crawled, currently not indexed"
This status tells you a template is not good enough. Google fetched the pages and chose to leave them out. On a programmatic batch it shows up in bulk, which points to the template rather than any single page. Our post on crawled, currently not indexed walks through the causes.
Pages under discovered, currently not indexed have not been fetched yet. That is a crawl priority problem, often from weak internal links.
Rule out technical causes before blaming quality. A template bug that ships a stray noindex or points every canonical at the hub looks like a quality problem in the report.
Check a sample of template pages for indexing problems
Our Indexing and Canonical Checker checks one URL per run, so pick a handful of pages from each template and run each one. It reads the HTTP status, the robots.txt rules for Google and Bing crawlers, meta robots and X-Robots-Tag directives, and the canonical tag. It loads the canonical target to see whether that page is indexable and whether it points somewhere else, and it compares HTML and HTTP header canonicals. It also reads snippet controls such as nosnippet and max-snippet. The result names the signal that blocks the page and the exact tag or header to change.
It costs 8 credits per run. It does not render JavaScript and it cannot see Search Console, so it can't confirm whether Google has indexed a URL. Use it to rule out the technical blockers, then let the index report tell you about quality.