Programmatic SEO Results: 748 Pages, 13 Clicks, 90 Days

The pitch for programmatic SEO is arithmetic, and the arithmetic is seductive. 1 template, 1 spreadsheet of cities, and a few hours of build time turn into hundreds of pages that each catch a little search demand. Even a trickle per page adds up when there are 700 of them.
So here is what happened when one of my own sites ran that play at full scale, measured over 90 days of Search Console data rather than argued from first principles.
748 published pages. 13 clicks.
The interesting part isn’t the failure. It’s which half of the theory was wrong.
What got built
An agency site I own carries 7 service templates crossed against a long list of Indian cities: SEO company, digital marketing agency, web design company, web development company, WordPress development company, and 2 smaller sets. Each page is a real page, not a doorway. Service description, local framing, an intake form, internal links back to the parent hub.
748 of them are published.
The reasoning at the time was ordinary and, I still think, defensible. Someone in Vadodara searching for an SEO company is a better lead than someone reading a blog post about title tags. The service is genuinely delivered remotely, so the city framing isn’t a lie. And the marginal cost of page 400 is close to zero once the template exists.
Every one of those sentences is true. The conclusion still didn’t hold.
The Programmatic SEO Numbers
Same domain, same 90-day Search Console window, and the same property. The comparison changes only whether the URL came from the programmatic template set.
| Measure | Programmatic pages | Everything else |
|---|---|---|
| Published pages | 748 | 433 |
| Pages drawing any impression | 319 | 433 |
| Impression coverage | 42.6% | 100% in the comparison set |
| Pages with zero impressions | 429 (57.4%) | 0 in the comparison set |
| Impressions | 3,679 | 315,372 |
| Clicks | 13 | 1,409 |
| Click-through rate | 0.35% | 0.45% |
| Average position | 25.7 | 19.7 |
| Clicks per published page | 0.017 | 3.254 |
The non-programmatic set produced 108 times as many clicks in total and about 187 times as many clicks per published page. Those derived ratios do not prove that every programmatic project fails. They show what this template, domain, query class, and 90-day window produced.

The number that actually explains it
Clicks were never the interesting column. This one is.
Of 748 published pages, 319 drew a single impression or more across 90 days. The other 429 drew none at all. Not a low ranking. Not a bad click-through rate. Zero appearances in a search result, for 57% of everything built.
Those pages exist. They render, they are internally linked, they are in the sitemap. Google will fetch them if asked. It simply never had a reason to show them to anyone.
That reframes the whole exercise. The story is not that 748 pages competed and lost. It’s that most of them never entered the competition, and the ones that did entered it in the wrong half of the field.
Why position 25.7 is the entire story
The 319 pages that did surface averaged position 25.7, against 19.7 for the rest of the site. Both are bad. Only one of them is bad in an interesting way.
Positions in the 20s and 30s are not the bottom of page 1. They are page 3 and beyond, a region where measured click-through sits low enough to be indistinguishable from noise. A page there is not underperforming. It is invisible with extra steps.
The best programmatic page in the set pulled 300 impressions at position 30.8 and converted exactly 0 of them.
So the template did its job. It produced pages that were relevant enough to be indexed and matched to queries. What it could not produce was any reason for Google to prefer this page over the 25 results already ahead of it, most of them belonging to agencies that actually operate in that city.
What would have had to be true
This is the part worth taking away, because it generalizes past this one site.
Programmatic SEO is a multiplier, not a generator. It multiplies whatever authority and differentiation the domain already has across a lot of URLs. Multiply a strong signal and you get a lot of ranking pages. Multiply something close to zero and you get 748 copies of close to zero.
For the play to work, at least 1 of these has to be true, and none of them were:
- The domain already outranks competitors on the head term. If the site can’t rank for the service nationally, the city variants inherit nothing to build on.
- Each page carries information nobody else has. Local pricing, real client work in that city, regional availability, something a competitor can’t copy from the same public sources.
- The query has thin competition. City plus service is one of the most contested commercial patterns in existence, defended by businesses with local addresses, reviews, and map presence.
- There’s a genuine local entity behind it. A verified business profile and physical presence change what Google is willing to rank for a city query.
Miss all 4 and the template is producing pages that are, from a search engine’s point of view, indistinguishable from every other agency’s city page. The differentiator has to exist before the multiplication, not after.
What the same effort would have bought
The comparison sits inside the same table above, which is what makes it usable rather than hypothetical.
433 non-template pages produced 1,409 clicks. Most of that came from a handful of them. On this site 3 posts account for roughly 70% of all search clicks, and none of them are commercial pages: they answer specific questions that people actually type, in an area where the site had something particular to say.
That is the uncomfortable trade. The pages that attract the audience and the pages that sell to the audience are usually not the same pages, and building 748 of the second kind does not conjure the first.
A dozen genuinely differentiated pages would have beaten 748 templated ones here. Not because 12 is a magic number, but because the constraint was never page count.
When the play does work
None of this makes programmatic SEO a bad technique. It makes it a technique with an entry requirement, and the requirement is about the query, not the page.
The pattern works when the template answers a question that has real demand and no incumbent worth beating. That usually means one of 3 shapes:
- A data set nobody has assembled. Pages built on numbers, specifications, schedules, or comparisons you hold and competitors would have to compile by hand. The page is the only place the answer exists in that form.
- Long-tail combinations too numerous to write manually. Product variant against use case, tool against integration, format conversions. Each query is small, the incumbents are usually forum threads, and the aggregate is worth having.
- A category where you are already the ranking answer. If the head term is yours, the variants inherit something real, and the multiplier finally has a number above zero to work on.
City plus commercial service is the opposite of all 3. High demand, entrenched local incumbents, and nothing on the page a competitor couldn’t reproduce in an afternoon.
Demand without defensibility is the trap. The queries looked valuable, and that was exactly the problem: valuable queries already have owners.
The pilot that costs a weekend
The expensive part of this mistake was not the building. It was building all of it before measuring any of it.
A pilot answers the question for the price of a weekend, and the metric to watch is not clicks or rankings. It is the share of pages that get seen at all.
- Publish 20 pages from the template, chosen across the range rather than the 20 easiest.
- Leave them alone for a full quarter. Indexing and initial placement both take longer than feels reasonable.
- Then pull Search Console filtered to that path and count pages with 1 or more impressions.
If most of the 20 drew impressions, the template is finding demand and scaling is a real decision. If more than half drew nothing, scaling multiplies silence, and 700 more pages will not change the ratio.
On this site the ratio was 43%, and it would have read the same at 20 pages as it did at 748. The whole experiment was legible from a sample that cost almost nothing.
Where this evidence stops
Worth being precise about what this does and doesn’t establish.
It’s 1 site, 1 vertical, 1 country, and 1 quarter of data. Agency services in Indian cities is a specific and unusually crowded market, and a programmatic set aimed at long-tail informational queries, product variants, or a genuinely underserved data niche is a different experiment with different odds.
The domain’s overall authority is modest, which is precisely the condition that makes the multiplier argument fail. A site that already ranks well nationally would likely see a different result, and that is the whole point rather than a caveat against it.
The pages also haven’t been pruned or consolidated, so this measures the build as shipped, not the ceiling after cleanup. My expectation is that consolidation improves the rest of the site more than it rescues these pages, and that is a testable claim I’d rather state than hedge.
What it does establish, cleanly, is that page volume alone moved nothing at this authority level. 748 attempts is a large enough sample to stop wondering.
Questions people ask next
It works when the template answers a query with real demand and no strong incumbent. It fails when it multiplies a domain that has no authority or differentiation to multiply, which is what produced 13 clicks from 748 pages here.
About 20, chosen across the range rather than the 20 easiest. Leave them a full quarter, then count how many drew at least 1 impression. If more than half drew none, scaling multiplies silence.
They offered nothing a search engine needed. The pages were indexable and internally linked, but for city plus service queries the results were already filled by businesses with local addresses, reviews and map presence.
No. Programmatic describes how a page is produced, thin describes what it offers. A generated page carrying data nobody else has is not thin. A hand-written page repeating public information is, whatever produced it.
Not automatically. Pages drawing zero impressions cost little directly, and the more useful question is whether they dilute internal linking and crawl attention. Consolidate them into stronger pages before deleting outright.
Count the pages that got seen
The seductive arithmetic has a missing term. It counts pages built and assumes impressions follow, when the actual sequence runs the other way: a page earns impressions because something about it deserves them, and only then does volume start compounding.
Build 748 pages with nothing to distinguish them and the multiplication runs on a number too small to matter. That is not a programmatic SEO problem. It’s an arithmetic one, and it was visible before a single page shipped.
If you are weighing this play, the honest test is cheap. Publish 20 pages from the template, wait a quarter, and count how many drew a single impression. The strategic case for programmatic SEO and the tooling that makes it fast are both real. Neither supplies the differentiator, and the differentiator is the only part that was ever scarce.
Check the impression count before you scale. Not the page count.
Tell Google you want more of this.
Add Gatilab as a preferred sourceOne tap, and this site shows up more often in your own Top Stories, AI Overviews and AI Mode. Remove it any time.