How BenchLM got its users
One 380-model list expanded into 72,019 pairwise compare pages, so almost any "model X vs model Y" search lands on a page that already exists.
Read from signals. Consistent with what is publicly observable, but nobody confirmed it. Check before you quote it.
You could start this on Monday. No budget, no audience, no permission needed.
- A traffic base that does not collapse when you stop publishing
- Acquisition that owes nothing to any social platform
- A proprietary or painful-to-assemble data source
- A template with a reason to exist page by page
- 6 to 12 months before it compounds
Programmatic SEO in 2026
Still alive, but the bar has moved. Thin pages get deindexed, so you need real data on every single page.
Everything on this channel →The play
5 steps, in the order they ran them.
- 1
Pick the entity list your category already argues about, the way benchlm picked its tracked models, then compute n x (n-1) / 2. That number is your page ceiling before you write a single word.
done whenYou can name your list and its size out loud, and the pairwise count clears a few thousand. If it does not, this play costs more than the pages are worth.
- 2
Build one compare template that renders a verdict, a price table and a scored table, and make it print "Not measured" when data is missing. Benchlm's moshi-7b vs ultravox-v0-7 page ships the full template with empty rows and states the public evidence has no shared benchmark rather than inventing one.
done whenA pair picked at random from the bottom of your list renders a complete page with honest gaps, and you would not wince if a buyer landed on it first.
- 3
Point the template at a public data source you can re-pull on a schedule, the way benchlm links out to benchmark repos on GitHub and to Hugging Face, so adding an entity to the list generates its own pages instead of creating writing work.
done whenAdding one entity to your source file produces its full set of new pages on the next build, with zero manual writing.
- 4
Add the surfaces the pairwise grid misses: /alternatives/{competitor} pages aimed at the tools your buyers already use, /best/{use-case} pages, and free calculators as separate entry points. Benchlm runs 14 alternatives pages, including nested ones like /alternatives/claude/coding, and 10 tools.
done whenSearch Console shows impressions on queries containing a competitor's brand name or a use case phrase, not only on your own entity names.
- 5
Fix the soft-404 before scaling. Benchlm returns HTTP 200 on /zzz-not-a-real-page-12345, so any typo or stale link reads as a real page to a crawler. Return a real 404, and put Dataset and DataDownload JSON-LD on the templates the way the homepage does so the numbers are quotable by machines.
done whenA made-up URL on your domain returns 404, and one of your compare pages validates as Dataset in a structured data test.
Run this against your own product
Carries the play above, and is written to tell you no when this channel is out of reach for you.
The same twelve channels as an agent skill. It reads your repository and eliminates what you cannot run. Open source, MIT.
curl -o ~/.claude/skills/howtodistribute/SKILL.md https://howtodistribute.com/skill.md
How big it got
73,149 URLs in the sitemaps, 72,019 of them /compare/{model-a}-vs-{model-b} pages. The /advertise page self-reports 509.4K pageviews for the four weeks ending July 25 2026 and 58.3K Google clicks for the 28 days ending July 6 2026.
What else they ran
Nothing else identified. One channel carried it.
They ran the same play
Want this verdict on your product?
Describe it. You get back the channel I would run in your place, the 30-day plan, and the number at which you stop.