Levels.fyi gets about 148K visits a month from Google in the US, and it wins them with a pay page for every company, job and city people ask about.
Levels.fyi is a site where tech workers share what they're paid. It turns those numbers into pages, like one for what Google pays its coders.
We ran it through our whole SEO toolkit. We found what makes those pages win, and old addresses that may be wasting their links.
Here are 9 lessons you can copy, plus the part you can't.
Build a page for every pay question
We started with our Organic Traffic Checker. It estimates a site's organic traffic, meaning the people who find it on Google without ads.
That's about 148K visits a month in the US. The homepage gets about 15% of them, mostly from people typing "levels fyi".
Now look at the rest of the list. Most of the other pages answer one pay question, like what a coder earns or what Google pays.
The next biggest page is the one for software engineers, or coders. It gets about 7.6K visits and ranks 2nd for "salary software engineer".
The page gives you the answer first: the middle pay, then the low and high ends. Then it lets you narrow it down by company.
Each company gets the same treatment. Here's the page for coders at Google.
It ranks 2nd for "google software engineer". A page for coders in New York ranks 1st for "software engineer salaries".
So the site isn't one big page about pay. It's a page for each mix of company, job and city.
This is programmatic SEO, which means building many pages from one template and a table of data. Wise, which we studied too, also builds pages from mixes of data.
Docker Hub, which we studied too, gives every product its own page in the same way.
The Traffic tab of our Website Audit shows the picture for the whole world.
Worldwide, it's about 270K search visits a month. The US sends just over half, and India sends about 1 in 6.
So build a page for each question your data can answer, and give it a plain name. Then see which ones earn you visits with our Organic Traffic Checker.
Match the words people search
The Keywords tab of our audit lists the searches a site ranks for, its spot in Google and the visits each one sends.
"Software engineer salary" is searched about 33K times a month, and Levels.fyi ranks 1st. It also ranks 1st for "h1b salary", the pay for people on a US work visa.
Those pages use the exact words people type. The page is called "Software Engineer Salary", and so is the search.
Then there's a surprise. A guide to New York's boroughs ranks 3rd for "nyc boroughs", a search that has nothing to do with pay.
It's a side project called "a living atlas of New York". It brings in readers who'd never search for a salary.
NerdWallet, which we studied too, is another site that wins searches about money.
Our Domain Overview shows how many searches that adds up to.
Levels.fyi ranks for about 233K searches. Its traffic value, what those visits would cost as Google ads, is about $198K a month.
But its average spot is 40, on page 4 of Google. And it lost about 63K keywords while it gained about 14K.
So use the words your readers type in your page names, and find them with our Keyword Research tool. Then watch the ones you're losing in our Rank Tracker.
Give each page just one address
Look back at the warning above the keyword rows. It flags keyword cannibalization, when your own pages compete for the same search.
4 searches each land on 2 Levels.fyi pages. One of them is "levels fyi" itself.
The full list shows you why. The homepage ranks at its plain address.
It also ranks at a second address that ends in /index.html.
That's one page with 2 addresses. Google may treat them as 2 pages and split the credit between them.
The fix is a 301 redirect, a rule that sends people and Google from one address to another for good. Send /index.html to the homepage, and the split goes away.
Levels.fyi gets this right in another spot. Our free browser extension shows you how.
Open any page, click the seotools.pro icon, and a panel opens beside it with SEO checks. We opened the Google page with a country code on the end of its address.
The extension flags it as "not indexable", which sounds bad. But it's on purpose.
The page carries a canonical tag, a line of code that tells Google which address is the main one. Here, it points to the plain address.
So every country version passes its credit to one page. That's how you handle filters and options without making copies.
So give every page just one address. Check each page's canonical with our free browser extension, and redirect any copies you find.
Point old addresses at new pages
Old addresses matter for one more reason, and that's links. A backlink is a link from another website to yours, and Google treats each one a bit like a vote of trust.
The Backlinks tab of our audit shows the same data as our Backlink Analyzer.
Levels.fyi has about 176K links from about 12.9K referring domains, meaning websites that link to it. Its Domain Authority, our 0 to 100 score for link strength, is 86.
That's strong, but only 44% of those links are dofollow, meaning they pass trust. The rest carry a tag that asks Google not to count them.
Now look at the bottom of the most linked list. You'll see an address in an old style, /company/Google/salaries/Software-Engineer.
Today's page lives at /companies/google/salaries/software-engineer. Yet the old one still has about 716 sites linking to it.
The audit's data shows the same for /comp.html, with about 735 sites. Both look like addresses from before a redesign.
Each of those sites once linked to a real page. If the old address doesn't send you on with a 301 redirect, that trust goes nowhere.
If you run a big site full of lists, like Meetup or Eventbrite, which we studied too, check this each time you redesign.
So list your old address styles, and redirect each one to the page that replaced it. Then see which old addresses still get links in our Backlink Analyzer.
Hundreds of sites still link to Levels.fyi addresses from an older design. We find the old addresses on your site that still earn links, then point each one at the page that replaced it.
- We list every old address that still gets links
- We send each one to the right new page with a 301 redirect
- We fix copies of the same page, like /index.html
- SEO and GEO, so AI answers can quote you too
Put the answer in your title
Once you rank, your title has to win the click. The extension's Overview tab shows you the title and description of a page.
The Google page's title is "Google Software Engineer Salary | $215K-$1.86M+ | Levels.fyi". It shows you the answer in the results before you even click.
That's smart. Someone checking Google pay sees a real number and wants the details.
The description is the short summary Google may show under your title. This one runs 362 characters, when Google shows about 160.
Now compare the main page for coders.
Its title is just "Software Engineer Salary", 24 characters long. It scores 76, lower than the Google page's 80.
The Issues tab flags both. The title could add a pay range, the way the Google page does.
The audit found copies too. The same description, "Helping people make better career decisions", sits on 3 pages.
When pages share a description, you can't tell them apart in the results. Each page needs its own.
So put the answer in your title, like a pay range or a price. Then write a short, unique description for each page with our Meta Tag Generator.
Mark up each page in code
Structured data is code that tells Google what a page is. The extension's Structured tab looks for it.
The Google page has 3 blocks of it, and all are valid. One is a special type for the pay in one job at one firm.
The page can also get rich results. These are extras, like a trail of links or a list of questions, that Google can add to your listing.
The job page does the same with an Occupation type. Each template gets code that fits it.
The Content tab shows you what's missing.
There's no author and no date in the code. Yet the page says "Last updated" right on it, so Google has to guess.
The reading score is 0, because long lists of company names read like one giant sentence. That's fine for a list, but a short intro would help you.
More and more people ask AI tools what a job pays. So we checked which AI tools may read Levels.fyi.
The rules live in robots.txt, a file that tells crawlers what they may read. A crawler is a program that visits pages the way Google does.
Levels.fyi blocks 9 of the 10 AI crawlers the extension checks. Only PerplexityBot gets in.
Yet it also has an llms.txt file, a short guide that explains a site to AI tools. And its pages push its own AI tools that serve live pay data.
That looks like a choice. Keep the data for its own AI tools, and don't hand it to anyone else's.
Decide your own rules with our robots.txt generator. Then check whether AI tools mention you with our AI Visibility Checker.
So add code that says what each page is, who wrote it and when it changed. Our Schema Markup Generator writes it for you.
Know your real rivals
Some pay searches go to other sites. The audit's Competitors tab shows you who.
The top rival, 6figr.com, is another pay site. It shares about 28K searches with Levels.fyi.
It also ranks for about 48K searches that Levels.fyi doesn't. That "missing" column is a ready-made to-do list.
You can see each search a rival wins, and decide whether you need a page for it. A site named for work visa data, h1bdata.info, shares about 5.6K searches too.
So check who shares your searches with our Competitor Analysis, then go through the ones you're missing.
Audit your page templates
The extension checks one page at a time. Our Website Audit checks hundreds at once, so you can spot the problems that repeat.
It checked 249 pages, and Levels.fyi scored 80 out of 100. The report rates that as good.
The Issues tab sorts the problems by how much they matter to you.
The top 2 errors are files that load from other sites. Scripts on 18 pages and style files on 17 are broken or get sent somewhere else.
Those come from a few shared templates, like the pages about job perks. Fix the template, and every page built on it gets better.
Next comes the sitemap, the file that lists a site's pages for Google. It lists 6 pages that point Google to a different main address.
The Technical SEO tab shows which pages Google may list.
About 231 of the 249 pages can be listed by Google. That's 93%, which is great.
But 185 of those pages are missing from the sitemap. So Google has to find them through links alone.
You don't have to work out what to fix first. The audit's AI tab writes the plan: a short summary, each problem with how to fix it, and a 90-day to-do list.
For Levels.fyi, the first job is a broken page for its pay talks service. The plan says to bring it back or redirect it.
That's the same lesson as the old addresses. Dead ends waste the links and visits that reach them.
So check the templates your pages share: the scripts, the titles, the descriptions and the sitemap. Run our Website Audit, fix one template, and hundreds of pages get better at once.
Fix slow taps on phones
The Performance tab of the audit shows Core Web Vitals. These are Google's 3 checks of how fast a page loads, how fast it reacts and whether it stays still, taken from real people's phones and computers.
Levels.fyi passes 5 of the 6 checks. Its pages load fast and stay still, on phones and on computers.
The one miss is how fast phones react. About 69% of phone visits see the page respond quickly to a tap, so about 1 in 3 wait.
Pay pages are full of filters, tables and charts. Each tap on a filter runs code, and on a slow phone that adds up.
On the homepage, the audit points to code that isn't squeezed down. It also says the main content loads slowly in a lab test.
So test your busiest pages on a phone, and trim the code behind each filter. Our Site Speed tool shows what slows each page down.
Most of Levels.fyi's top pages each answer one pay question. Our Organic Traffic Checker shows your monthly visits, your trend and the pages that earn them, so you know which ones to build more of.
- The same report that measured Levels.fyi
- Your top pages and the search behind each one
- Run it on any rival's domain too
What you cannot copy
First, the part you can't copy: the data. Real people share their pay, and the Google page alone draws on about 24K entries for coders.
That's what other sites link to, and what people search for by name. The domain dates back to 2016, so it's had years to build that trust.
Now a few honest notes on the numbers.
Correct the snapshot date to one before publication, or update the publish date. The 148K figure counts US searches only, and the 270K figure counts the whole world.
All of these are estimates. Nobody outside Levels.fyi can count its real visits, so tools guess them from rankings and how often people search.
Tools count links in their own ways too. Our extension shows about 227K backlinks and the audit shows about 176K, so we quoted the audit.
Our screenshots show pay in a local currency, not US dollars, because of the site's money switch when we took them. The page titles quote US dollars.
On the real pages, you can pick your own.
We opened 2 pages with a country code in the address. That's why the extension calls them "not indexable", and it's the canonical tag doing its job.
Our crawl checked 249 pages, a small sample of a very big site. So we used it to find problems that repeat, not to count every error.
The one number to take away
41%.
That's the share of Levels.fyi's search visits that come from people typing its name, in the searches we sampled.
The rest come from people asking a pay question, like what Google pays a coder. A page built for that exact question answers them.
That's the lesson for any site that sits on data. Each question your data can answer can be its own page.
What could your data answer? Check which of your pages already win, the way Google would.
You can run every one of these checks on your own site, and on your rivals', and see the same numbers for yourself.
Frequently asked questions
How many pages should I build from one template?
Build as many as you have real data for. A page with a name and no numbers adds little, so start with the mixes people search for most.
How do I stop thin pages from hurting my site?
Set a minimum, like enough entries to show a fair average, before a page goes live. Keep pages under that line out of Google with a noindex tag until they fill up.
Should every filter get its own address?
Only the ones people search for, like a city or a level. For the rest, use a canonical tag that points to the main page.
How do I find old addresses that still get links?
Look at your most linked pages in a backlink tool, and spot any address style you no longer use. Then open each one to see where it lands.
Is a 301 redirect better than a canonical tag?
Use a redirect when the old page shouldn't exist any more. Use a canonical tag when both versions need to stay, like a filtered view.
Should I put prices or pay ranges in my titles?
Yes, if the number is real and you keep it up to date. A stale number in a title can cost you trust and clicks.
Should I block AI crawlers like Levels.fyi does?
It depends on how you make money. If your data is what you sell, blocking can make sense, but if you want AI answers to name you, let them in.
How often should I audit a site built from templates?
Once a month is a good start. Run it again after any change to a template, since one change hits every page built on it.