Programmatic SEO Without the Spam
By David Miles
Programmatic SEO has a bad reputation, and most of it is earned. The tactic — generate hundreds of pages from a template and a dataset — is the same one behind endless doorway spam: "[service] in [city]" pages with the noun swapped and nothing of value underneath. But the tactic isn't the problem. The thinness is. Done with real per-page data, programmatic SEO is one of the highest-leverage plays a solo operator has. Here's the line between the two, and how I stay on the right side of it.
What actually separates useful from spam
Google doesn't penalize pages for being generated from a template — most of the web is. It penalizes pages that exist only to rank and give the visitor nothing they couldn't get elsewhere. The test is simple: if you strip the location or variable out of the page, is there any unique substance left?
A spam page fails that test — remove "Dallas" and it's an empty shell that said nothing specific about Dallas in the first place. A good programmatic page passes it, because the variable pulls in genuinely different data: different numbers, different rules, different answer. The template is just the delivery mechanism for real per-page facts.
The example: a paycheck page for every state
Take-home pay is one of the highest-intent searches in personal finance, and it's inherently local — "paycheck calculator" means something completely different in Texas, which has no state income tax, than in California, which has ten brackets. A single national calculator gets this wrong, and searchers can tell.
So FigureMoney generates a dedicated paycheck page for every U.S. state plus Washington, D.C. — 51 pages in all — from a single 2026 tax dataset. Each page carries that state's real structure: California's ten progressive brackets, Pennsylvania's flat 3.07%, and the nine no-tax states each get a page that correctly explains their take-home reflects only federal tax and FICA. Strip the state out and there's nothing left, which is exactly the point — the state is the content. Add or update a state's numbers in the dataset and its page rebuilds itself.
That's the difference in one sentence: the pages aren't 51 copies of a template with a name swapped in. They're 51 different tax answers that happen to share a layout.
The five rules I follow
Whenever I build a programmatic set — state tax pages, per-material calculators, city-level content — I hold it to the same five rules:
- Every page needs unique data, not unique wording. Spinning the same sentences with a thesaurus is spam. Pulling a genuinely different number, rule, or dataset per page is content. If the only thing that changes is the noun, don't build the page.
- One authoritative dataset, not scraped filler. The whole set is only as trustworthy as its source. FigureMoney's state pages come off one hand-checked 2026 tax file — a single source of truth, so 51 pages can't disagree with each other.
- Real intent per page. Only generate a page where someone is actually searching for that specific variable. "Paycheck in California" has demand; a page for every ZIP code would not. Match the granularity to real queries, not to how many rows your dataset has.
- Quality that survives a manual review. Would this page be worth publishing by hand? If a human editor would be embarrassed by it, the generator shouldn't ship it. Volume is never an excuse for a page you wouldn't stand behind individually.
- Internal links that form a real structure. The state pages link to each other and up to the main calculator, so the set reads as a coherent hub, not 51 orphans. Structure is a quality signal and a crawl path at once.
Why data-driven pages beat hand-built ones here
Someone always asks why not just write 51 pages by hand. Because hand-built pages drift. When the 2026 brackets change, you'd be hunting through 51 files to update them, and you'd miss some — and stale numbers on a money site are worse than no page at all. Driving everything off one dataset means an update happens in one place and propagates everywhere on the next build. Accuracy becomes a property of the system, not a chore you have to remember 51 times.
It's the same "one registry, many pages" pattern behind the calculator suites across my network — the dataset changes, but the discipline doesn't. On RemodelCalculators the same approach drives per-material and code-compliance content; the variable is a building material or a code requirement instead of a state, but the rule holds: each page only ships if the variable pulls in something real.
Where programmatic SEO goes wrong
The failure mode is always the same: chasing coverage past the point where you have real data. It's tempting to generate a page for every combination your spreadsheet allows — every service × every city, every product × every use case — because the generator makes it free. But the moment a page's variable doesn't pull in genuinely distinct substance, you've crossed from useful into thin, and a big batch of thin pages can drag down the pages that are good.
The honest constraint: generate exactly as many pages as you have real data and real demand for, and not one more. If you can't fill a page with something specific and true, that page shouldn't exist.
Why this matters for your business
If your customers' questions vary by a clean variable — location, size, model, material — programmatic SEO lets you cover the whole map with a fraction of the effort, and own long-tail searches your competitors write off one at a time. The catch is that it only works if each page earns its place with real data. Do that, and you get scale without the spam penalty. Skip it, and you get a lot of pages that quietly hurt you.
"Does each page say something true that no other page says?" is the whole test. The rest of the build logs are here.
More from the workshop
I build and operate a portfolio of niche websites and interactive tools — and write the build log behind each one. Browse the rest of the projects and notes.
See the projects →