How Levels.fyi got its users
One page per company and per level, fed by anonymous submissions. Data nobody else publishes attracts backlinks on its own.
Confirmed. The team said it publicly, or the signals leave no room for doubt.
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
Your entity list is not companies, it is each employer's internal level ladder. Levels.fyi slugs the rungs themselves: /companies/google/salaries/software-engineer/levels/l4, plus /citi/.../levels/c12, /telus/.../levels/l1, /disney/salaries/project-manager/levels/associate-project-manager. Those labels sit in nobody's public database. Start where they started: one HTML table mapping five ladders side by side, hand-typed from job posts and people you already know.
done whenWrite out five rung labels used inside real employers in your niche. If you cannot fill them from job posts or people you know, your entity list is not yet the thing nobody else publishes.
- 2
The unit is one offer. Fields: employer, job family, level, location, years of experience, base, stock, bonus, exactly what the table on /companies/google/salaries/software-engineer/levels/l4 renders back. The /verified/ tier accepts an offer letter or pay statement, and states in writing that employee names are never released and figures are shifted within a close margin. Short form, explicit anonymity, proof optional.
done whenTime your own submit form. If it asks more than employer, level, location, years and the three pay numbers, or the anonymity promise is not printed on the form itself, the first hundred rows never arrive.
- 3
One template, four axes: /companies/{employer}/salaries/{job-family}, then /levels/{rung} or /title/{specialisation}, then /locations/{place}. Fetch levels.fyi/sitemap.xml today: five children, and the companies one splits into 80 chunk files capped at 5,000 URLs, grouped by depth (chunk 40 is all employer x family, chunk 79 all family x title x location). Ship the shallow axis first, add depth only where rows exist.
done whenCount your rows before you generate. If adding a /locations/ axis would produce more URLs than you have submissions, you are shipping empty cells at a scale a crawler will notice.
- 4
Publish the thin cell anyway. levels.fyi/companies/01tech/salaries shows two job titles and still stands, because the page names its own gap and asks the visitor whose title is missing to add their salary. Every blank rung is a question addressed to the one person who can answer it. Add /companies/{employer}/benefits as a second axis needing no numbers, carrying the prompt 'Work Here? Claim Your Company'.
done whenOpen your thinnest page as a stranger. Does it name what is missing and ask this exact visitor for it, or does it just say no data available?
- 5
Once a year, re-cut the same table into one static page. levels.fyi/2025/ runs sections titled 'Top Pay by Level' and 'Top Paying Locations for SWEs'. Pair it with /leaderboard/, one page ranking employers by median comp, filterable by job family, rung and metro. Both are queries you already run, so the marginal cost is a chart, and they are what gets linked instead of a per-employer page.
done whenCheck that your yearly report is a query you already run. If it needs fresh research, it is a side project, not a re-cut of the database.
The product itself
read from levels.fyi, live“Levels.fyi | Salaries & Tools to Level Up Your Career”
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
Tiny team, the reference on tech salaries
What else they ran
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.