Open two programmatic pages from the same site side by side: “accountants in Deira” and “accountants in Jumeirah”. If the only differences are the area name in the heading and three listings at the bottom, Google sees what you see: one page, repeated. A good programmatic template makes page 2 and page 2,000 genuinely different because the data underneath them is different, and it hides whatever the data cannot support.
The short answer: a programmatic page template avoids thin content when every visible block is driven by data specific to that page, the opening answer is generated from that data, sections without enough data are hidden rather than padded, and pages that cannot meet a minimum data threshold are not indexed at all. Add internal links that form a real hierarchy, structured data that matches what is on the page, and an editorial layer for your most valuable pages, then test sample pages for similarity before you scale.
What is a programmatic page template?
A programmatic page template is a reusable page layout that pulls data from a database to create many pages, each targeting a different combination such as a location, product, integration or comparison.
The template defines the structure: headings, blocks, tables, links and schema. The dataset fills it. The quality of a programmatic site therefore depends on two things: how much genuinely different data each page receives, and how the template behaves when that data is missing. For the strategy around programmatic projects, including which businesses they suit, see our hub guide to programmatic SEO in 2026.
What makes a programmatic page thin?
A programmatic page is thin when most of its visible content is identical across pages, when the parts that change are only names or keywords, or when key sections are empty or filled with placeholder text.
| Thin page signal | What it looks like | Why it is a problem |
|---|---|---|
| Keyword swapping | Same paragraphs with the city or product name changed | Google’s spam policies list pages with little value beyond keywords as scaled content abuse |
| Empty sections | “No listings found” or blank tables on an indexable page | Pages that look like errors can be reported as soft 404s |
| Boilerplate dominance | Header, footer and generic copy outweigh the unique data | The unique part is too small to justify a separate page |
| Scraped or stitched content | Text copied or combined from other sites | Listed by Google as scaled content abuse when it adds little value |
| Doorway patterns | Many city pages that all lead to the same offer | Google’s doorway abuse policy covers pages targeting regions that funnel users to the same place |
Sources: Google spam policies; Google Search Central on soft 404 errors, which notes that Search Console reports a soft 404 when content suggests an error, such as a blank page or an error message.
What should every programmatic page template include?
Every programmatic template should include a unique title and heading, an answer block generated from the page’s data, data blocks, decision help, navigation links, trust signals and a clear next step.

| Block | Purpose | Filled from | Show when |
|---|---|---|---|
| Title and H1 | Match the exact search pattern | Combination name | Always |
| Answer block | Answer the query in one or two sentences | Calculated from the page’s data | Data meets the minimum threshold |
| Update date | Show freshness | Last data refresh | Always |
| Data blocks | Show the unique information | Listings, records, prices, attributes | Each block has enough rows |
| Decision help | Help the reader choose | Comparisons, ranges, pros and cons from data | Comparison data exists |
| Editorial notes | Add expertise | Human written notes | Top value pages |
| Navigation | Build hierarchy and discovery | Parent, sibling and child pages | Always |
| Sources and method | Explain where data comes from | Static plus data source fields | Always |
| Next step | Turn visits into action | Enquiry, booking, listing search, sign up | Always |
How do you write an answer block that changes on every page?
Write the answer block as a sentence pattern filled with values calculated from the page’s own data, with alternative patterns for different data situations, so the opening text is genuinely different on each page.
Example patterns for a property rental page:
Pattern A (enough listings):
"[Bedrooms] bedroom apartments in [Community] were listed for rent at
AED [low] to AED [high] a year across [count] listings this month,
[up/down] [change]% on last quarter."
Pattern B (few listings, nearby data available):
"Only [count] [bedrooms] bedroom apartments in [Community] are listed
right now. Nearby [Nearby community] has [nearby count] listings from
AED [nearby low] a year."
Pattern C (seasonal or trend data available):
"Rents for [bedrooms] bedroom apartments in [Community] are typically
highest in [month] and lowest in [month], based on [years] years of listings."
Rules for answer blocks: calculate every number from the page’s own data, choose the pattern based on data conditions rather than at random, and never generate an answer when the data cannot support it.
Which data blocks create unique value on programmatic pages?
The data blocks that create unique value are the ones a searcher would otherwise have to compile themselves: live inventory, price ranges, comparisons, trends, specifications and verified reviews.
| Page type | High value data blocks | Low value blocks to avoid |
|---|---|---|
| Location and service | Providers with ratings, price ranges, availability, response times | Generic description of the service repeated on every city |
| Property or listings | Live listings, rent or price ranges, trend over time, community facts | Long area history copied from encyclopaedias |
| SaaS integration | Supported triggers and actions, setup steps, limits, use cases | Partner’s own marketing description |
| Comparison | Feature, pricing and fit differences in a table, verdict by use case | Two separate product descriptions placed side by side |
| Data lookup | Current figure, range, change over time, breakdown, source | Unsourced single numbers |
How do you use conditional logic to avoid empty or repeated sections?
Use conditional logic so each block appears only when its data meets a minimum threshold, and so the template switches to a different layout when data is sparse, instead of printing empty tables or generic filler.
if listings >= 5:
show answer block (Pattern A), listings table, price range chart
elif listings >= 1 and nearby_listings >= 5:
show answer block (Pattern B), listings, nearby alternatives
else:
do not index; link to parent area page
if reviews >= 3:
show reviews block
if months_of_history >= 12:
show trend chart
if editorial_note exists:
show expert note
Set thresholds from your own data before launch. A page with one listing and no nearby alternatives is rarely worth indexing; a page with one rare listing in a high demand area may be, if it links to useful alternatives.
What should happen when a programmatic page has too little data?
When a programmatic page has too little data, either do not create it, return a 404, merge it into a broader parent page, or keep it for users with a noindex tag, depending on demand and how much data exists.

| Data situation | Search demand | Recommended handling |
|---|---|---|
| Enough data | Any meaningful demand | Index with the full template |
| Some data | Low demand | Keep for site users if helpful, but noindex |
| Little data | Real demand | Show nearest alternatives or merge into the parent page |
| No data | Any | Do not create the URL, or return 404 if it existed |
For crawl efficiency, Google recommends returning 404 or 410 for permanently removed pages and blocking unimportant URLs with robots.txt rather than relying on noindex, because noindexed pages are still requested (Google Search Central). Plan which combinations generate URLs at all, not just which are indexed.
How do you add editorial value to programmatic pages at scale?
Add editorial value in tiers: hand written notes for the highest value pages, reviewed data driven summaries for the middle tier, and clean, data only pages for the long tail.
| Tier | Share of pages (typical) | Editorial treatment |
|---|---|---|
| Tier 1: highest demand and value | Small top slice | Expert written introduction, local or product insights, FAQs, photos |
| Tier 2: steady demand | Middle group | Data driven summary reviewed by a person; selected expert notes |
| Tier 3: long tail | Remainder | Data blocks and answer block only, indexed only if thresholds are met |
Google’s helpful content guidance asks whether content provides original information, research or analysis and adds substantial value compared with other pages in search results (Google Search Central). Tier 1 pages are where that bar is easiest to clear and where it matters most commercially.
Can AI write the copy for programmatic page templates?
Yes, AI can draft programmatic copy, provided it writes from your real data, a person checks accuracy on a sample, and the output adds value rather than rephrasing the same text across pages.
- Google says appropriate use of AI or automation is not against its guidelines, but using it to generate content primarily to manipulate rankings is (Google Search Central).
- Google’s spam policies list “using generative AI tools or other similar tools to generate many pages without adding value for users” as an example of scaled content abuse (Google spam policies).
- Give the model the page’s data as input and ask it to summarise, compare or explain it; do not ask it to write generic text about a place or product.
- Review a random sample from every batch for factual accuracy before publishing.
How should programmatic templates handle titles, meta descriptions and headings?
Programmatic titles, meta descriptions and headings should follow the exact search pattern, include one data point that differs per page where possible, and use more than one pattern so pages do not all read the same.
| Element | Pattern example | Rule |
|---|---|---|
| Title tag | [Bedrooms] Bed Apartments for Rent in [Community] | From AED [low] | Lead with the searched phrase; add a data point; keep under about 60 characters |
| Meta description | [count] [bedrooms] bed apartments for rent in [Community], from AED [low] a year. Compare prices, view listings and see nearby options. | Include a number and a reason to click; 140 to 160 characters |
| H1 | [Bedrooms] Bedroom Apartments for Rent in [Community] | Match the main query |
| H2s | Rent prices in [Community]; Nearby alternatives to [Community]; What to know about renting in [Community] | Each H2 answers one sub question; hide H2s whose section is hidden |
How should internal links work in programmatic templates?
Internal links in programmatic templates should create a browsable hierarchy: every page links up to its parent, across to close siblings and down to children, so both users and crawlers can reach every indexable page.
- Breadcrumbs: Home, then city, then area, then the page.
- Parent link: every page links to its category or area hub.
- Sibling links: five to ten closely related pages, such as nearby areas or similar integrations, chosen by data rather than at random.
- Child links: hubs link to the most important child pages, not to every combination.
- Only link to indexable pages: do not waste links on noindexed or thin combinations.
Google’s doorway abuse policy specifically mentions sites without a clear, navigable hierarchy that offer many near identical pages like a list of search results (Google spam policies). Good linking is part of what distinguishes a programmatic site from a doorway network.
Which structured data fits programmatic templates?
Use the structured data type that matches what the page actually shows, such as ItemList for listing pages, Product for product pages, LocalBusiness for business profiles and BreadcrumbList on every page, and make sure the markup matches the visible content.
| Page type | Schema types | Watch out for |
|---|---|---|
| Listings or search result style pages | ItemList, BreadcrumbList | Only list items that are visible on the page |
| Single business or provider | LocalBusiness (or a more specific type), BreadcrumbList | Address, hours and ratings must match what is shown |
| Product or product variant | Product, Offer, BreadcrumbList | Price and availability must match the page |
| Software or integration page | SoftwareApplication, BreadcrumbList | Do not add ratings unless genuine reviews are shown |
| Data or reference page | Dataset (where appropriate), BreadcrumbList | Describe the data honestly, including its source |
Google’s structured data guidelines require markup to represent the main content of the page and not describe content users cannot see (Google Search Central). Our schema markup examples include ready to adapt code for these types.
How do you test a programmatic template before scaling?
Test a programmatic template by generating a sample of pages across strong, average and weak data cases, measuring how similar they are, reviewing them against Google’s helpful content questions and publishing a small pilot before the full set.
- Generate a test set of 30 to 50 pages: the best, middle and weakest data cases.
- Measure similarity between pairs of pages using their visible text (script below). If two pages in the same pattern are mostly identical, the template needs more data driven content or stricter thresholds.
- Read them as a buyer would. Would you learn something from page 37 that you did not learn from page 2?
- Check edge cases: empty fields, one result, very long names, missing images.
- Pilot 100 to 500 of the strongest pages and watch indexing in Search Console before scaling.
from difflib import SequenceMatcher
def similarity(text_a, text_b):
return SequenceMatcher(None, text_a, text_b).ratio()
# text_a and text_b are the visible body text of two pages
print(round(similarity(text_a, text_b), 2)) # 1.0 means identical
There is no official similarity threshold, so treat the score as a diagnostic, not a pass mark. Use it to compare template versions and to find the pages that are closest to duplicates. Remember that most pages never earn search traffic: Ahrefs found 96.55% of pages in its index get no traffic from Google (Ahrefs), so testing before scaling saves engineering time as well as crawl budget.
What does a good programmatic template look like in practice?
A good programmatic template looks different on every page because the data does. These illustrative examples show the pattern for three common page types.
| Page | Answer block | Key data blocks | Next step |
|---|---|---|---|
| “Accountants in Deira” | Number of firms, typical fees for VAT returns, average rating | Firms with services and ratings, fee ranges, nearby areas | Request quotes from three firms |
| “CRM integration with WhatsApp” | What the integration does, plans that include it, setup time | Supported triggers and actions, setup steps, limits, use cases | Start a trial with the integration enabled |
| “Data analyst salary in Bangalore” | Current median range and change over the past year | Range by experience, by industry, comparison with nearby cities, source | Browse open roles or compare cities |
How Crawl To Click builds programmatic templates
Crawl To Click is an SEO and AI visibility consultancy, and when we work on programmatic projects we design templates from the data outward. We audit what the dataset can genuinely support per combination, define the answer patterns, data blocks and thresholds, decide which combinations become indexable URLs, and specify linking and schema rules for the engineering team. Before anything scales, we test sample pages for similarity and usefulness and run a pilot batch. We have used this approach on property and listing sites, software integration libraries, education and healthcare directories and ecommerce catalogues, and every template ships with a plan for pruning, as described in our guide to content pruning with conversion data. Learn more about our approach.
FAQs on programmatic page templates
How do you avoid thin content in programmatic SEO?
Drive every visible block from data specific to the page, generate the opening answer from that data, hide sections that lack enough data instead of padding them, and do not index pages that fall below a minimum data threshold.
What should a programmatic SEO template include?
A programmatic template should include a unique title and H1, an answer block generated from the page’s data, data blocks such as listings or tables, comparisons or decision help, breadcrumbs and related links, sources, structured data that matches the page and a clear next step.
Should programmatic pages with no data be indexed?
No. Pages with no data should not be created, or should return a 404 if they already exist. Pages with little data but real demand can show nearby alternatives or be merged into a parent page, and low demand pages can be noindexed.
Can I use AI to write programmatic page content?
Yes, if the AI writes from your real data, adds value and is checked by people. Google says appropriate use of AI is not against its guidelines, but generating many pages with AI without adding value counts as scaled content abuse.
How similar can programmatic pages be?
Google publishes no similarity threshold. Pages in the same pattern share layout, but the visible content should differ meaningfully because the data differs. Measure similarity between sample pages and improve the template if pages are close to identical.
What schema should programmatic pages use?
Use the schema type that matches what the page shows, such as ItemList for listing pages, Product for products, LocalBusiness for business profiles and BreadcrumbList on every page, and ensure the markup matches visible content.
Want a second opinion on your programmatic template?
Send us a few sample pages and we will tell you which blocks add value, which look thin and what to fix before you scale. Get a second pair of eyes.
Disclaimer: This article reflects Google documentation and published studies as of the dates stated. Thresholds, tiers and code are illustrative and should be adapted to your data. Examples use imaginary pages.
