I generated 8,664 SEO pages. Google indexed them. I got 9 clicks.
I run a small tech-interview-prep site. It has 8,664 individual pages, one per concept - each with a real question, what it's actually testing, a model answer and the mistake that sinks candidates. Programmatic SEO, the whole playbook.
Here's what 28 days of Google Search Console says:
| Metric | Value |
|---|---|
| Impressions | 6,511 |
| Clicks | 9 |
| CTR | 0.14% |
| Average position | 45.9 |
| Pages with at least one impression | 1,575 of 8,664 (18%) |
Nine clicks. In a month. From nearly nine thousand pages.
I want to walk through this honestly, because the conclusion I reached is not the one I expected, and it's not the one most posts about programmatic SEO land on.
What I assumed was wrong
My working theory for weeks was "Google isn't indexing them." That's the standard programmatic-SEO failure story: you publish thousands of pages, Google decides your new domain hasn't earned the crawl budget, and most of them sit in Search Console under Discovered - currently not indexed forever.
And early on that was true. A few weeks ago only 6 pages had ever received an impression. It's now 1,575.
Google is indexing them, steadily, without me doing anything new. The crawl budget arrived on its own schedule. The clicks did not.
The actual failure mode
Here's the distribution that explains everything. Across 1,206 distinct queries:
| Position | Share of queries |
|---|---|
| 1-10 | 12% |
| 11-20 | 6% |
| 21-50 | 23% |
| 51+ | 59% |
Median position: 58.
That's page six of the search results. Nobody has ever been to page six of the search results.
So the pages aren't missing from the index. They're in the index, ranked below anything a human will scroll to. Indexed and invisible are close to the same thing, and the second one is more annoying because the dashboard fills up with numbers that look like progress.
6,511 impressions is real. It's also what position 58 produces: Google shows your result to enough people that you see the impression, and none of them scroll far enough to see it.
The queries are the tell
These are my top queries by impressions:
| Query | Impressions | Position |
|---|---|---|
| component team | 11 | 52.2 |
| post mortem template | 11 | 85.8 |
| component team in agile | 8 | 53.8 |
| error budget | 8 | 94.9 |
| postmortem template | 8 | 80.2 |
| development cycle time | 7 | 74.0 |
| blockers vs impediment | 6 | 28.8 |
| prerendering vs ssr | 5 | 33.6 |
Look at what these are. "Post mortem template", "error budget", "component team" - these are established, well-covered terms. Every one of them has a decade of results from Atlassian, Google SRE, Martin Fowler, and a hundred consultancies with real backlink profiles.
I generated a page for each of them because the concept belonged in the corpus. But generating a page about "error budget" doesn't make me a candidate for that query. It makes me the 95th-best candidate, and Google is telling me so precisely.
The pages ranking best are the weird ones: "blockers vs impediment" at 28, "prerendering vs ssr" at 33, "awq vs gptq". Narrow, comparative, recent. The places where there genuinely isn't already a definitive answer.
That's the actual lesson, and it's not about technique.
Things it isn't (so you can skip these)
I spent real time ruling these out, so here's what's already clean:
- Rendering. Next.js App Router, ISR. Pages are server-rendered HTML, not client-hydrated shells.
curlreturns the full content. - Crawl paths. Every page is reachable from a topic hub, which is reachable from the homepage. Nothing is orphaned behind a search box.
- Canonicals. One canonical per concept. Near-duplicate titles get collapsed to the oldest published version, so "Client-side vs server-side" and "Client-Side vs. Server-Side" don't compete with each other.
- Sitemaps and structured data. Valid, submitted,
hasPart,FAQPage,isAccessibleForFree. All parsing correctly. - Thin content. Each page is a real explanation with a distinct answer and a distinct failure mode, not a template with a noun swapped in.
None of that moved the needle. Which is the point: the technical layer was never the constraint. I could have skipped weeks of it.
What actually determines this
Position 60 on "error budget" isn't a markup problem. It's an authority problem.
A new domain with no inbound links competing against pages that have accumulated citations for ten years loses, and it loses by roughly the margin you'd expect.
Every fix that lives inside my own codebase - better schema, faster LCP, tighter internal linking - operates on a variable that isn't binding. The binding variable is entirely outside the site.
That's an uncomfortable conclusion for an engineer, because the work I know how to do is the work that doesn't matter here.
What I'd do differently
- Don't generate a page for a term that already has a definitive answer. The corpus needed "error budget" for completeness. Search did not. Those two goals are different and I conflated them.
- Target the comparative and the recent. My best-ranking pages are the ones where the query is a genuine comparison ("blockers vs impediment") or new enough that authority hasn't consolidated ("awq vs gptq"). Fewer pages, aimed where there's a gap, would have outperformed 8,664 aimed everywhere.
- Expect indexing to be slow and then irrelevant. I optimised hard for getting indexed. Indexing arrived on its own and changed nothing. The metric I should have watched from day one was position distribution, not coverage.
- Build the distribution before the pages. Not after. This is the bit I got backwards and it's the expensive one.
Disclosure
The cards are drafted by language models against a fixed template, then machine-checked for structure and duplication. A human hasn't line-edited all 8,664. The site says this on its about page, and I'd rather say it here than have someone find it and assume I was hiding it.
I don't think that's why they rank at 60 - the well-covered terms would be outranked by an incumbent regardless of who wrote them. But it's a variable I can't rule out, and it would be dishonest to present this as a controlled experiment.
The site is tezvyn.com if you want to look at the pages themselves - the whole corpus is free to read, no account.
I'd genuinely like to hear from anyone who's run programmatic SEO on a new domain and got past the authority wall, because I haven't yet.
Comments
No comments yet. Start the discussion.