# Programmatic SEO: How to Scale Pages Without the Spam

> Programmatic SEO builds thousands of pages from one template and a dataset: how it works, what Google's spam policies target, and what AI answers cite.

- Published: 2026-11-13
- Updated: 2026-11-13
- Author: Samy BEN SADOK
- Canonical: https://geotoolbox.ai/blog/programmatic-seo

---

Programmatic SEO publishes thousands of pages from one template and one dataset, one page for every variation of a search such as "USD to EUR" or "apartments in Austin". It works when each page carries data the searcher needs. It fails when only the keyword changes.

Google's scaled content abuse policy targets that second kind, however the pages were written. Do AI answers cite template pages at all? We checked 300 Google AI Overview answers and ran 12 templated prompts: in our sample, data questions often landed on template pages, while integration how-tos split with the app makers' help pages.

## What Is Programmatic SEO?

**Programmatic SEO** (pSEO) is the practice of publishing many search pages from one template and a structured dataset, one page per row. Each page targets one variation of a repeatable query, such as "[app] + [app] integration" or "apartments in [city]".

How does programmatic SEO work? Nitin Manchanda breaks it into three parts:

- **A query pattern:** a head term plus modifiers that people search in many combinations, each with its own small volume
- **A dataset:** the rows that make each page different, such as exchange rates, listings, prices or the triggers two apps share
- **A template:** the page layout that turns one row into one answer

A script or CMS import then publishes every row as its own landing page on your website.

[Manchanda's guide in Search Engine Journal](https://www.searchenginejournal.com/good-vs-bad-pseo-learnings-from-a-decade-of-building-scalable-content-engines/594204/), published November 10, 2026, calls programmatic SEO "a way of publishing, not a kind of content."

<table>
  <thead>
    <tr><th></th><th>Programmatic SEO</th><th>Traditional SEO pages</th></tr>
  </thead>
  <tbody>
    <tr><td><strong>Unit of work</strong></td><td>One template and one dataset</td><td>One page at a time, written manually</td></tr>
    <tr><td><strong>Target</strong></td><td>Hundreds or thousands of long-tail variations of one pattern</td><td>A head term or a cluster of related queries</td></tr>
    <tr><td><strong>What makes a page unique</strong></td><td>The row of data behind it</td><td>The writing, research and examples</td></tr>
    <tr><td><strong>Main risk</strong></td><td>Thin content and duplicate content at scale</td><td>Slow output and coverage gaps</td></tr>
    <tr><td><strong>Where you measure</strong></td><td>By template (the whole page set)</td><td>By page</td></tr>
  </tbody>
</table>

The trade-off sits in the rows on uniqueness and risk: a template multiplies whatever it contains, good data or empty filler, across every URL at once.

## Programmatic SEO Examples and the Data Behind Them

These programmatic SEO examples share one trait: each page carries data the searcher came for.

<table>
  <thead>
    <tr><th>Site</th><th>Query pattern</th><th>What changes on each page</th></tr>
  </thead>
  <tbody>
    <tr><td><strong>Zapier</strong></td><td>"[app] [app] integration"</td><td>The triggers, actions and ready-made workflows for that pair of apps</td></tr>
    <tr><td><strong>Wise</strong></td><td>"[currency] to [currency]"</td><td>The pair's mid-market rate and its rate history</td></tr>
    <tr><td><strong>Zillow</strong></td><td>"homes for sale in [city]", "[city] apartments"</td><td>Live listings, prices and filters for that place</td></tr>
    <tr><td><strong>Zumper</strong></td><td>"average rent in [city]"</td><td>That city's median rent, its change over a year and the number of available rentals</td></tr>
  </tbody>
</table>

Zapier publishes a page for each app and each pair of apps it connects, with the triggers, actions and ready-made workflows for that exact pair.

<figure>
  ![Zapier's Google Sheets and Slack integration page with numbered callouts on the Apps, Google Sheets, Slack breadcrumb, the headline naming both apps, the trigger and action pickers, and a row of ready-made workflow cards for both apps.](/blog/programmatic-seo/zapier-google-sheets-slack-integration-page.png)
  <figcaption className="mt-3 text-center text-sm text-gray-500">A template page for one app pair: Zapier, Google Sheets + Slack. Logged out, US connection, captured November 13, 2026.</figcaption>
</figure>

Software companies run the same play with the integration pages we cover in [SaaS SEO](https://geotoolbox.ai/blog/saas-seo).

Wise runs a converter page for each currency pair, and each one carries that pair's live mid-market rate and its rate history.

<figure>
  ![Wise's US dollars to euros converter page with callouts on the headline naming both currencies, the mid-market rate of 1 USD = 0.9068 EUR, a one-month rate chart, and time-range buttons from 48 hours to 5 years.](/blog/programmatic-seo/wise-usd-to-eur-currency-converter-page.png)
  <figcaption className="mt-3 text-center text-sm text-gray-500">One page per currency pair: Wise, USD to EUR. Logged out, US connection, captured November 13, 2026.</figcaption>
</figure>

Zillow builds a listings page for each city and filter, so a search for homes under $400,000 in Austin lands on a page filled with live listings.

<figure>
  ![Zillow page titled Homes for Sale Under 400K in Austin TX showing 1,791 results, For sale and Up to $400K filters, a map and listing cards with prices, beds, baths and addresses.](/blog/programmatic-seo/zillow-austin-homes-under-400k-page.png)
  <figcaption className="mt-3 text-center text-sm text-gray-500">A city and price-filter page: Zillow, Austin homes under $400,000. Logged out, captured November 13, 2026 on a non-US connection; the listings are Zillow's US data.</figcaption>
</figure>

In our test below, AI answers also cited the same kind of page from Redfin, Realtor.com, Apartments.com and Trading Economics.

If your pages would differ only by the keyword in the title, you have a keyword list and nothing to build on.

## Does Programmatic SEO Still Work? Google's Rules on Scaled Content and Doorways

It can, within two rules. Google does not penalize programmatic SEO as a method; its spam policies target what templates are often used for.

[Google's spam policies](https://developers.google.com/search/docs/essentials/spam-policies) define **scaled content abuse** as "when many pages are generated for the primary purpose of manipulating search rankings and not helping users", typically "large amounts of unoriginal content that provides little to no value to users, no matter how it's created." Google added the policy on [March 5, 2024](https://developers.google.com/search/blog/2024/03/core-update-spam-policies).

The same page defines **doorway abuse** as pages "created to rank for specific, similar search queries" that "lead users to intermediate pages that aren't as useful as the final destination." Three examples from the two lists read like programmatic SEO mistakes:

- "Having multiple domain names or pages targeted at specific regions or cities that funnel users to one page"
- "Creating substantially similar pages that are closer to search results than a clearly defined, browseable hierarchy"
- "Using generative AI tools or other similar tools to generate many pages without adding value for users"

Google applies the same rule to its AI features. On creating separate content for every variation of how people search, its [guide to optimizing for generative AI features](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide) says "doing so primarily to manipulate rankings or generative AI responses in Google Search violates Google's scaled content abuse spam policy." It also calls the approach "an ineffective long-term strategy".

Enforcement keeps coming. The [Google Search Status Dashboard](https://status.search.google.com/products/rGHU1u87FJnkP6W2GwMi/history) lists spam updates in March, June, August and September 2026, and a November 2026 core update.

### The Test That Separates a Template from a Doorway

The spam policies never mention programmatic SEO by name. They describe pages built to rank that give a reader nothing new. These questions catch that before Google does:

1. **When the row changes, what else changes?** On a currency page, the rate, the chart and the history all move. On a doorway, only the city name does.
2. **Where did each number come from, and when?** A page whose facts trace to a maintained dataset passes. Figures a language model guessed, with no source and no date, fail.
3. **Does each page serve its own intent?** Two rows whose modifiers mean the same search, such as "CRM for dentists" and "CRM for dental practices", are one page. Danny Sullivan's test, as SEJ reports it, is whether the intent was "'I'm going to get that traffic' and not 'some user actually expected it'".

In a [reply quoted by Search Engine Roundtable](https://www.seroundtable.com/google-lose-faith-42032.html) about a site that, as he read it, iterated through combinations of domain names, technologies and attributes, Google's John Mueller wrote that "programmatic SEO like this often leads to a site that's either spam, borderline spam, or low quality" and that Google's "systems have possibly lost faith in your site providing good value to users based on the old pages."

### When Programmatic SEO Is the Wrong Choice

Skip it, or keep it small, in these cases:

- **No row adds data, a tool or a comparison readers can't already find.** The pages would be rewrites of one paragraph.
- **Your modifiers don't change the intent.** Synonyms and spelling variants belong on one page.
- **The pattern yields a few dozen pages.** Writing them by hand usually costs less.
- **The data would come from scraping other sites and add little.** Google's scaled content examples include "Scraping feeds, search results, or other content to generate many pages" where little value is added.

## Do AI Answers Cite Programmatic Pages? Our Test

Often, when the question asks for data a template holds. Integration how-to questions split between template pages and the app makers' help pages.

### How We Ran It

At geotoolbox we ran two US, English-language checks on November 13, 2026.

**Most-searched keywords.** From the DataForSEO LLM Mentions database of Google AI Overview answers, we pulled, for each of Zapier, Wise and Zillow, the 100 highest-volume keywords whose answer cited that site, last seen between August 3 and November 6, 2026 (Zillow from September 2). Many are spelling variants of one search: the 100 answers cite 39, 43 and 94 distinct pages from the three sites.

We sorted those pages into template pages (integration, currency-pair, bank-code and listing pages) and articles, with URL patterns set before the pull. We corrected them twice afterwards: Zillow's state-, county- and ZIP-level listing pages had slipped through, and converter, routing-number and lender-directory index pages are not per-row pages. Zillow moved from 46 to 69 of 100, Wise from 54 to 45.

**Long-tail templated prompts.** We wrote 12 prompts a template page should answer, split evenly across integrations, currency and bank codes, and real estate. None named a template site such as Zapier, Wise or Zillow (integration prompts had to name both apps). Each ended with "Cite sources." and ran once in ChatGPT (web search forced on), Perplexity's Sonar API and Google AI Mode. A page counted only if the engine cited it in the answer. "Template page" here means any site's page set built from one pattern.

### What We Found

Zapier's template pages never appeared among the most-searched keywords citing Zapier. All 103 Zapier citations went to blog posts on broad topics such as "cloud storage services", searches an app-pair page cannot answer. Wise's per-row pages (currency pairs, routing and transit numbers, one per-currency page) were cited in 45 of 100 answers, and Zillow's listing and location pages in 69.

Across the 12 templated prompts, 73 of the 104 citations went to template pages, and 34 of the 36 answers cited at least one.

<figure>
  ![Bar chart of our test. Most-searched keywords in Google AI Overviews: answers citing a template page, Zapier 0 of 100 with all 103 citations going to blog posts, Wise 45 of 100, Zillow 69 of 100 (46 under our first URL patterns). Long-tail templated prompts in ChatGPT, Perplexity and Google AI Mode: citations going to template pages, integrations 16 of 39 (app makers' help pages and blogs another 16), currency and bank codes 23 of 27, real estate by city 34 of 38.](/blog/programmatic-seo/ai-answers-template-page-citations-test.png)
  <figcaption className="mt-3 text-center text-sm text-gray-500">Our test, US: 300 Google AI Overview answers from the DataForSEO LLM Mentions database (last seen August 3 to November 6, 2026) and 104 citations in 36 answers to 12 templated prompts (November 13, 2026).</figcaption>
</figure>

Data questions drew template pages most: 23 of 27 citations for currency and bank codes, 34 of 38 for real estate. Integration prompts split: 16 of 39 citations went to integration or marketplace pages, 16 to the app makers' own help pages and blogs (10 of them Calendly's, all on one prompt) and 7 to other how-to articles.

Asked for the SWIFT code of JPMorgan Chase in New York, Google AI Mode cited one Wise SWIFT-code page, part of a large set built from the same template.

<figure>
  ![Google AI Mode answer to What is the SWIFT code for JPMorgan Chase Bank in New York? giving CHASUS33XXX, the bank name and its 270 Park Avenue address, with an inline Wise citation and a single source card for a Wise page titled CHASUS33XXX BIC / Swift Code.](/blog/programmatic-seo/google-ai-mode-cites-wise-swift-code-page.png)
  <figcaption className="mt-3 text-center text-sm text-gray-500">Google AI Mode, logged out, US connection (Google located it in Houston, Texas), captured November 13, 2026. The only source shown is a Wise SWIFT-code page.</figcaption>
</figure>

### What Makes a Template Page Citable

Twelve prompts run once cannot isolate causes, but where a prompt asked for a rate, a code, a listing or a market figure, template pages took most citations. An app maker's own integration page is a template page too: Calendly's Salesforce page counted among the 16, and Calendly's Salesforce help articles took 9 more citations.

<figure>
  ![Calendly's Salesforce integration page with callouts on the Calendly + Salesforce headline, a Developed by Calendly label, a View help articles link and the Overview text describing how bookings create Salesforce leads, contacts or opportunities.](/blog/programmatic-seo/calendly-salesforce-integration-page.png)
  <figcaption className="mt-3 text-center text-sm text-gray-500">Calendly + Salesforce: an app maker's integration page, one per partner app, linked to its help articles. Logged out, captured November 13, 2026 on a non-US connection.</figcaption>
</figure>

Zapier's broad keywords went to its articles, so keep building [topical authority](https://geotoolbox.ai/blog/topical-authority) around your page sets. Check crawler access too: a robots.txt block for an AI bot stops that bot's crawler, while Google's AI features rely on Googlebot and some assistants fetch pages on a user's request (our guide to [AI crawlers](https://geotoolbox.ai/blog/ai-crawlers) lists which).

## How to Build a Programmatic SEO Project, Step by Step

In a programmatic SEO strategy, data and quality gates come before scale: every row passes a completeness check before it can become a page, and only a pilot batch goes live first.

<figure>
  ![Diagram of a programmatic SEO build: query pattern, dataset, a completeness check marked gate 1, template, and a pilot batch of 25 to 50 pages marked gate 2, followed by the outcomes: scale the set in stages, or improve, return 410 or merge pages before publishing more.](/blog/programmatic-seo/programmatic-seo-pipeline-with-quality-gates.png)
  <figcaption className="mt-3 text-center text-sm text-gray-500">Quality gates before a page set scales. Pilot size and the completeness rule follow Nitin Manchanda's guide in Search Engine Journal.</figcaption>
</figure>

### 1. Find a Pattern with Real Demand

Start from a head term and the keyword modifiers people attach to it: "[app] + [app] integration", "[tool A] vs [tool B]", "[product] for [industry]". Run keyword research on a sample of combinations to confirm they carry search volume.

Then check that each modifier changes the search intent; modifiers that mean the same search belong on one page. In [B2B SEO](https://geotoolbox.ai/blog/b2b-seo), a "[service] for [industry]" pattern holds up only when each industry page carries its own specs and proof.

### 2. Source Data That Differs on Every Page

Your own product data, partner feeds, licensed public datasets, APIs and user-generated content such as reviews all work. Set a minimum before anything ships. [Manchanda's checklist](https://www.searchenginejournal.com/good-vs-bad-pseo-learnings-from-a-decade-of-building-scalable-content-engines/594204/) puts it plainly: "Define the minimum data completeness for a row to generate a page, and enforce it in code."

Name an owner and a refresh schedule for every field that changes, or the whole page set goes stale at once. Zumper's rent page for each city is built from the same template, but the median rent, its change and the number of available rentals come from that city's own listings, and the page shows when they were last updated.

<figure>
  ![Zumper page titled Average rent in Denver, CO, last updated on November 13, 2026, showing a median rent of $1,875 a month, down 1% from the previous year, and 1,917 available rentals.](/blog/programmatic-seo/zumper-denver-rent-research-page.png)
  <figcaption className="mt-3 text-center text-sm text-gray-500">The same template for every city, filled with that city's numbers and a freshness date: Zumper, Denver. Logged out, captured November 13, 2026 on a non-US connection.</figcaption>
</figure>

### 3. Design the Template Around the Data

Split the page template into fixed parts (layout, method notes, navigation) and variable parts filled from the row. Show where each figure came from and when it was last updated. Let titles and meta descriptions vary with the data, and generate the page's JSON-LD structured data from the same row (see [schema markup for AI](https://geotoolbox.ai/blog/schema-markup-for-ai)).

### 4. Pick Programmatic SEO Tools That Fit Your Team

Small teams run on a spreadsheet or Airtable base feeding Webflow or WordPress through an import plugin. Larger ones generate pages from a database in a framework such as Next.js.

If AI drafts the connecting text, Google's [guidance on generative AI content](https://developers.google.com/search/docs/fundamentals/using-gen-ai-content) applies: "focus on accuracy, quality, and relevance, especially when automatically generating the content." Have the model describe your data, and check what it writes.

### 5. Launch a Pilot Batch

Publish 25 to 50 pages first. Manchanda calls publishing 10,000 pages before you know the index rate "the most common failure in this discipline" and suggests reading about ten pages end to end at launch.

### 6. Link It Into the Site

Plan the internal linking: give each page set a hub page, breadcrumbs and links between related rows (nearby cities, other pairs for the same app). Pages reachable only through the sitemap get crawled and indexed less reliably. Answer related sub-questions on the page that owns them, as we explain in our guide to [query fan-out](https://geotoolbox.ai/blog/query-fan-out).

## Getting Thousands of Pages Indexed

Publishing a page set does not get it indexed. In Search Console's [page indexing report](https://support.google.com/webmasters/answer/7440203), programmatic pages tend to pile up in two statuses:

- **Discovered - currently not indexed:** Google found the URL but has not crawled it yet. Google's help page says it typically wanted to crawl it, but doing so "was expected to overload the site".
- **Crawled - currently not indexed:** Google fetched the page and chose not to index it. Google calls this common, but when a large share of one template lands here, check whether its pages look too much alike.

Crawl budget, one of the crawl topics in our [technical SEO](https://geotoolbox.ai/blog/technical-seo) guide, matters mostly at scale. [Google's crawl budget guide](https://developers.google.com/crawling/docs/crawl-budget) is written for sites with 1 million or more pages that change about weekly, 10,000 or more that change daily, or a large share of URLs stuck in Discovered - currently not indexed.

These fixes address the common causes on page sets:

1. **Return 404 or 410 for rows that will never have data** instead of a "no results" page with a 200 status. The crawl budget guide warns that such soft 404 pages "will continue to be crawled, and waste your budget", and it advises against noindex for pages you don't want crawled. A page that is empty for now can stay if it still shows useful figures.
2. **Split the XML sitemap by template**, so the indexed count per page set is visible (see our guide to [XML sitemaps](https://geotoolbox.ai/blog/xml-sitemap))
3. **Consolidate true duplicates** with [canonical tags](https://geotoolbox.ai/blog/canonical-tags), such as a filter variant that returns the same set as another URL. A filter page with its own result set, like Zillow's homes under $400,000, can stay indexable.
4. **Check the rendered HTML** on JavaScript frameworks, where a missing title or a wrong status code can pass for a content problem ([JavaScript SEO](https://geotoolbox.ai/blog/javascript-seo) covers the checks)

## Measure by Template, and What to Do When Traffic Drops

Judge a page set as a whole: use Search Console's page indexing report for the share of a template's URLs that are indexed, and the performance report, filtered with a page regex such as `/integrations/`, for impressions, organic clicks and ranking. Track the conversions those pages drive in your analytics.

Search Console's [generative AI performance reports](https://developers.google.com/search/blog/2026/06/gen-ai-performance-reports), launched on June 3, 2026 and rolled out to all websites by August 31, 2026, show how often your URLs appear in AI Overviews and AI Mode. Group those URLs by template too.

Set a kill rule before launch. Manchanda's reads: "If a set share of a page set earns no impressions, including in AI features, within a set window, prune or merge it." Choose the share and the window before you publish, and confirm the pages are indexed before you prune.

When a page set loses traffic after an update, open the Manual Actions report first. A [manual action](https://support.google.com/webmasters/answer/9044175) lists the affected URL patterns, or the whole site, and needs a fix plus a reconsideration request; an algorithmic drop needs diagnosis, the fix and time. Then match the fix to the page:

<table>
  <thead>
    <tr><th>Situation</th><th>Action</th><th>Why</th></tr>
  </thead>
  <tbody>
    <tr><td>Page has useful data but thin presentation</td><td>Improve it: add the missing fields, sources and dates</td><td>The data earns the page its place</td></tr>
    <tr><td>Row has no data and no prospect of any</td><td>Return 410 (or 404)</td><td>Tells Google the page is gone, so it drops out of the index</td></tr>
    <tr><td>Page duplicates a stronger page in the set</td><td>301 redirect to that page, or merge them</td><td>One URL per intent</td></tr>
    <tr><td>Page helps visitors on the site but has no search demand</td><td>Keep it, add noindex</td><td>Stays useful in navigation, out of the index; at large scale, block not-yet-indexed paths in robots.txt instead</td></tr>
    <tr><td>Most of the set is near-duplicate</td><td>Stop publishing, cut back to pages you would defend one by one</td><td>Google's systems can judge the whole site, not only the weak pages</td></tr>
  </tbody>
</table>

Recovery is slow. In the same reply, Mueller wrote that "resolving this tends to take time & significant effort to show the value."

## Start with One Template

Choose the one query pattern where your data is the best answer anywhere, ship a small pilot, and read the pages yourself before you publish more.

Then check that crawlers can reach them. The free geotoolbox [robots.txt Tester](https://geotoolbox.ai/tools/robots-txt-tester) tests any URL against a site's robots.txt with Google's matching rules, so you can confirm a template path such as `/integrations/` is open before you scale it.

## Sources

- Spam policies for Google web search - Google Search Central, updated August 28, 2026 - `developers.google.com/search/docs/essentials/spam-policies`
- What web creators should know about our March 2024 core update and new spam policies - Google Search Central Blog, March 5, 2024 - `developers.google.com/search/blog/2024/03/core-update-spam-policies`
- Google's Guide to Optimizing for Generative AI Features on Google Search - Google Search Central, updated July 10, 2026 - `developers.google.com/search/docs/fundamentals/ai-optimization-guide`
- History for Ranking - Google Search Status Dashboard, accessed November 13, 2026 - `status.search.google.com/products/rGHU1u87FJnkP6W2GwMi/history`
- Google Can Lose Faith In Sites Based On Low Value Programmatic SEO Pages - Search Engine Roundtable, September 7, 2026 - `seroundtable.com/google-lose-faith-42032.html`
- Good vs. Bad pSEO: Learnings From A Decade Of Building Scalable Content Engines - Search Engine Journal (Nitin Manchanda), November 10, 2026 - `searchenginejournal.com/good-vs-bad-pseo-learnings-from-a-decade-of-building-scalable-content-engines/594204/`
- Page indexing report - Search Console Help - `support.google.com/webmasters/answer/7440203`
- Crawl Budget Management - Google Crawling Infrastructure, updated July 22, 2026 - `developers.google.com/crawling/docs/crawl-budget`
- Google Search's Guidance on Generative AI Content on Your Website - Google Search Central, updated October 1, 2026 - `developers.google.com/search/docs/fundamentals/using-gen-ai-content`
- Introducing Search Generative AI performance reports in Search Console - Google Search Central Blog, June 3, 2026 - `developers.google.com/search/blog/2026/06/gen-ai-performance-reports`
- Manual actions report - Search Console Help - `support.google.com/webmasters/answer/9044175`
- Our test data: DataForSEO LLM Mentions (Google AI Overview answers, US, last seen August 3 to November 6, 2026) and 12 prompts in ChatGPT, Perplexity Sonar and Google AI Mode, November 13, 2026
