Programmatic SEO: Building 23 000 pages of BOFU Content

No Comments
Programmatic seo: building 23 000 pages of bofu content

AI Summary

Programmatic SEO builds pages by joining a structured dataset to a template, and a BOFU (bottom of funnel) programmatic set targets buying stage queries such as alternatives, vs, pricing and integrations. Publishing tens of thousands of URLs is the easy half: the hard half is making each cell of the matrix worth indexing, and proving it before you ship the next batch.

  • The URL matrix is your ceiling, not your plan. Cells without real data should never become pages.
  • Every page needs a uniqueness budget: strip the shared shell and something substantive must remain.
  • Ship in cohorts with one sitemap file each, so index rate is measurable per batch.
  • Crawled, currently not indexed at scale is not a crawl problem, it is a value per page verdict.
Diagram of a programmatic bofu page pipeline: an entity table multiplied by query patterns creates the url matrix, a template uniqueness budget filters it, and cohorts ship against index rate gates in search console.
Programmatic SEO is a factory plus a gate: the matrix sets the ceiling, the uniqueness budget and index rate decide what actually ships.

This case study documents a successful organic growth strategy, demonstrating how strategic SEO implementation drives measurable business results. The approach provides actionable insights for practitioners facing similar challenges.

Challenge and Context

Every successful SEO initiative begins with understanding the starting position and objectives. This case study reveals the initial challenges, competitive landscape, and business goals that shaped the strategy. Understanding context helps practitioners assess applicability to their own situations.

Strategic Approach

The methodology employed combined technical optimization, content strategy, and authority building in a coordinated approach. Key decisions around prioritization, resource allocation, and tactical execution provide a template for similar initiatives. The strategy balanced quick wins with sustainable long-term growth.

Implementation Details

Moving from strategy to execution required specific technical implementations, content creation processes, and measurement frameworks. This case study documents the practical steps taken, tools used, and workflows developed. These implementation details help practitioners translate strategy into action.

Results and Analysis

The outcomes demonstrate the effectiveness of the approach through measurable metrics: traffic growth, ranking improvements, and business impact. Analysis of what worked best and what could have been done differently provides learning value beyond the raw results.

This case study contributes to the evidence base for effective SEO strategy, helping practitioners learn from documented successes.

What BOFU actually means in a programmatic set

Most programmatic SEO advice is written about top of funnel inventory: definitions, location pages, "what is X" coverage. Those pages are easy to generate and easy to justify, and they convert poorly. A bottom of funnel programmatic set inverts that. It targets queries where the searcher has already decided they are buying something and is now choosing between options.

The practical difference is that a BOFU page has a much smaller addressable keyword universe and a much higher value per visit. Nobody searches tool A vs tool B casually. That changes every design decision downstream: you can afford far more effort per page, you cannot afford a thin template, and you are competing against review sites and the competitor's own comparison page rather than against Wikipedia.

PatternSearcher stateData the page must carryMain risk
{competitor} alternativesActively leaving a productHonest reasons to switch, migration path, feature deltasReads as a sales page and gets outranked by neutral lists
{a} vs {b}Shortlist of two, ready to decideSide by side attributes, pricing model, a stated verdictCombinatorial blowup; most pairs have no search demand
best {category} for {segment}Category decided, vendor openSegment specific criteria, not a reordered generic listNear duplicate pages across segments
{product} pricingBudget qualificationCurrent tiers, what changes the bill, total cost driversGoes stale fast and the vendor page usually wins
{product} integration with {tool}Blocked on a hard requirementWhat the integration does, limits, setup stepsLow volume per page, only works at scale

The matrix is a ceiling, not a plan

Multiply 1,200 entities by 20 query patterns and you get 24,000 URL slots. That arithmetic is the single most dangerous moment in a programmatic project, because it feels like a plan. It is not. It is the maximum number of pages you could build if every cell had real data behind it, and in practice most cells do not.

Before a cell becomes a URL it should pass three filters. Demand: is anybody searching this combination, even at low volume? Data: do you hold enough fields to say something specific, or would the page be the template with two nouns swapped? Defensibility: can you say something the incumbent result does not already say better? Cells that fail any of the three should stay unbuilt. A 4,000 page set where every page passes will comprehensively outperform a 24,000 page set where most do not, and it will not drag the rest of the domain down with it.

The uniqueness budget

The test that matters is blunt: mentally delete the header, nav, footer and boilerplate from a generated page. What is left? If the answer is a headline, two swapped nouns and a call to action, the page is a duplicate of its siblings in every way that counts, whatever the word count says.

Three layers keep a template above that line:

  • A unique data block. Real fields per entity: attributes, limits, pricing structure, supported platforms. This is the part a competitor cannot copy without rebuilding your dataset, and it is the reason the page deserves to exist.
  • Unique generated copy that is derived, not decorated. Text computed from the data ("A bills per seat while B bills per usage, so A gets cheaper above roughly 40 users") is genuinely different per page. Spun synonyms are not.
  • A human judgement layer on the pages that matter. Your top few hundred cells by demand should get a real verdict written by somebody who knows the space. Leave the long tail template driven.

If the pages end up too similar despite this, the symptom shows up as Duplicate without user selected canonical in Search Console rather than as a ranking drop. Our duplicate content guide covers how Google picks a canonical when it disagrees with yours, which is exactly what happens to weak programmatic sets.

Ship in cohorts and gate on index rate

Publishing 23,000 URLs in one release gives you a single undifferentiated signal: either it worked or it did not, with no way to learn. Cohorts fix that.

  1. Order the matrix by expected value: demand times data completeness.
  2. Release the first 500 to 1,000 URLs. Put them in their own sitemap file, for example /sitemap-bofu-cohort-01.xml, referenced from your sitemap index.
  3. Wait for the crawl to work through them, then read Search Console > Indexing > Sitemaps and open that cohort's file. The submitted versus indexed count for that one file is your index rate for that batch.
  4. Set a gate before you look, for example 70% indexed. Hit it, ship the next cohort. Miss it, fix value per page before adding more.

Remember the format limits when you segment: a single sitemap file holds at most 50,000 URLs and 50MB uncompressed, and a sitemap index can reference 50,000 files. Cohort sized files sit far inside those limits and give you per batch reporting for free. The XML sitemaps reference covers index files and the lastmod handling that keeps recrawls efficient.

Reading the index verdict

Three states in Indexing > Pages tell you almost everything about a programmatic launch, and they mean different things:

StateWhat happenedWhat it usually means at scaleResponse
Discovered, currently not indexedGoogle knows the URL but has not fetched itYou added URLs faster than the site earns crawlStop publishing, improve internal linking to the cohort, wait
Crawled, currently not indexedFetched, evaluated, not keptA value judgement on the page, not a technical faultRaise data density and unique copy, or delete the cell
Duplicate without user selected canonicalFolded into a sibling pageCells differ too little; the template dominatesMerge the cells, or make them genuinely different
Alternate page with proper canonical tagCorrectly consolidated by your own canonicalWorking as designed, for example a-vs-b and b-vs-aNothing, this is the desired state for mirrored pairs

That last row deserves attention in BOFU sets specifically. Comparison pages create mirrored duplicates by construction: /compare/a-vs-b and /compare/b-vs-a are the same page. Pick one canonical direction, usually alphabetical, generate only that URL, and redirect the mirror. Doing it with canonicals instead of redirects still burns crawl on pages you never intended to publish. See the canonical tags reference for how the signal is treated when it conflicts with other hints.

Internal linking is what makes the set crawlable

A sitemap gets URLs discovered. Internal links get them crawled with any priority and are the only thing that passes authority to the leaf pages. Programmatic sets fail here more often than anywhere else, because generated pages are typically orphaned: reachable from the sitemap, and from nothing else.

Build the hub layer deliberately. A category index that lists every comparison in that category, cross links between related cells (from a-vs-b to a-alternatives), and a link from the relevant product page into the comparison set. Keep the leaf pages within roughly three clicks of the home page. Our internal linking guide covers click depth and link distribution in detail.

Maintenance is the part nobody budgets for

A BOFU set is a claim about the current state of other people's products, and those change constantly. Pricing moves, features ship, companies get acquired. A comparison page that is 18 months stale is worse than no page: it damages trust with exactly the buyers you were targeting, and competitors will point at it.

Budget for a refresh cycle from day one. Store a data_verified_at timestamp per entity, surface it on the page, and alert when a record ages past your threshold. Prune aggressively too: cells that have produced no impressions after two full quarters are candidates for consolidation into a parent page, not for another rewrite.

FAQ

Is programmatic SEO against Google's guidelines?

Generating pages from a database is not itself a violation. What Google acts against is scaled content produced primarily to manipulate rankings without adding value. The dividing line is whether each page does a real job for a real searcher. A comparison page built on genuine data serves a purpose; the same template with two nouns swapped and no substance does not.

How many programmatic pages should I publish at once?

Ship in cohorts of roughly 500 to 1,000 URLs rather than the whole set. Give each cohort its own sitemap file so you can read the index rate for that batch, and set a gate before the next release. This turns one all or nothing bet into a series of measurable ones.

Why are my programmatic pages stuck on "Crawled, currently not indexed"?

At scale that state is a value judgement, not a technical fault. Google fetched the page, evaluated it and decided the index is not better for having it. The fix is more genuine differentiation per page: real data fields, derived copy, a stated verdict. Resubmitting the same pages will not change the outcome.

Should I build every combination in the matrix?

No. The matrix is the ceiling, not the plan. Filter every cell on three things: whether anyone searches it, whether you hold enough data to say something specific, and whether you can beat what already ranks. A smaller set where every page passes those filters outperforms a bloated one and avoids dragging the rest of the domain down.

How do I stop comparison pages duplicating each other?

Mirrored pairs are the classic case: a page for A versus B and another for B versus A are the same content. Pick one canonical direction, generate only that URL, and redirect the reverse rather than publishing it with a canonical tag. That keeps crawl focused on pages you actually intended to exist.

How often do BOFU programmatic pages need updating?

More often than most teams plan for, because the pages describe products that change. Store a verification timestamp per record, show it on the page, and set an alert when data ages past your threshold. Stale pricing and missing features on a comparison page cost trust with the highest intent audience you have.

Source: https://crisp.chat/en/blog/programmatic-seo/

Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.

About SEO ProCheck

Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.

Work With Me

Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.

Subscribe to our newsletter!

More from our blog