howtodistribute
← Back to the index

How Glassdoor got its users

UNFAIR EDGEProgrammatic SEOgiantb2cno ads
Visit glassdoor.com

One page per company, filled by employees in exchange for access to everyone else's. The contribution wall was the mechanic.

Confirmed. The team said it publicly, or the signals leave no room for doubt.

Can you run this?
UNFAIR EDGE

It worked because of something they already had, or a window that has closed. Copying it will not reproduce it.

The edge you do not have: A stock of employee reviews banked before LinkedIn moved into the space

Your time
Years
Your money
A lot, six figures and up
First signal
18 months
Upside
  • A traffic base that does not collapse when you stop publishing
  • Acquisition that owes nothing to any social platform
Price of entry
  • 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. 1

    Do not go looking for a company list. Glassdoor's Write Review flow carries an "Add a new Employer" option that asks the contributor for website, HQ location, employer type and headcount, then mints a permanent employer ID (Glassdoor's own is E100431, visible in /Salary/Glassdoor-Salaries-E100431.htm and in its robots.txt). Build that same escape hatch: whoever has something to say about a missing entity creates the row, so your list grows while you sleep.

    done whenCan a stranger create a brand new entity in your product without you touching anything? If rows only appear when you add them by hand, you have a catalogue, not a page factory.

  2. 2

    Never ship one page per entity. The same employer ID renders in separate top level directories, cross linked as tabs: /Reviews/, /Salary/, /Interview/, /Benefits/, /Jobs/, /Overview/Working-at-. Compare /Salary/Glassdoor-Salaries-E100431.htm with /Jobs/Glassdoor-Jobs-E100431.htm. Titles are rebuilt from the live table, shaped "How Much Does {Company} Pay in {Year}? ({N} Salaries)", so each submission rewrites the title. One record, one URL per question.

    done whenTake your single best entity and write down every distinct thing someone might want to know about it. If all of them land on one URL, you are running one page where five could stand.

  3. 3

    Add a second field and put it in the slug. Live URL: /Interview/EY-Senior-Software-Engineer-Interview-Questions-EI_IE2784.0,2_KO3,27.htm. The number pairs are character offsets into the slug, the first marking the company span, KO marking the job title span. The city variant swaps in IL and IC: /Salaries/chicago-il-pricing-salary-SRCH_IL.0,10_IC1128808_KO11,18.htm. Readable to a human, parseable by your router, no lookup table.

    done whenRead one of your generated URLs out loud. Can you tell which part is the entity and which is the second field, and could your router split it without querying the database?

  4. 4

    Copy the give to get wall, and copy where it stops. Reviews, salaries, interviews and benefits open only after the visitor posts a contribution of their own; Jobs and Community stay reachable with a plain account. The page still ranks on what it holds, and the stranger who lands reads the top of it before being asked to add a row. Pick now which of your sections stays free forever and which one charges in data.

    done whenOpen one gated page in a logged out window. Is there enough visible above the wall that a stranger, and a crawler, can tell what question the page answers before being asked to contribute?

  5. 5

    Budget for the junk your template mints. A live listing sits at /Salaries/miami-made-up-job-title-salary-SRCH_IL.0,5_IM558_KO6,23.htm, because the salary template fires on any keyword string somebody typed. Glassdoor's robots.txt is the cleanup: it blocks /Explore/browse-companies and nearly all pagination (/Reviews/*_P*.htm, /Interview/*_IP*.htm) while allowing only /Salaries/*_IP2 through _IP5. Write those rules the day you ship the template.

    done whenSort Search Console by impressions ascending. If the bottom of the list is combinations nobody searched and your data barely fills, the template is minting rows faster than the data arrives.

The product itself

read from glassdoor.com, live

Découvrez l’entreprise qui vous mérite

Run this against your own product

In your chat

Carries the play above, and is written to tell you no when this channel is out of reach for you.

In your editor

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

Acquired by Recruit Holdings

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.