For about two years, the backend of Levels.fyi, the site tech workers use to compare salaries and job levels, was a Google Form feeding a Google Sheet. During that stretch the site was serving, by its own engineering blog, "roughly 1-2 million unique users" a month. In August 2021, co-founder Zuhayeer Musa summarized the business side in a Hacker News comment: "Bootstrapped Levels.fyi up until now to $2m run rate. We're 2 founders."
A spreadsheet holding up a two-million-dollar business sounds like a stunt. It was closer to an allocation decision: every hour not spent on infrastructure went into distribution and data, which is where the business actually lived. The order in which Zuhayeer Musa and Zaheer Mohiuddin did things is the copyable part.
A form, a sheet and a cached JSON file
The architecture, described in the company's own post, "How Levels.fyi scaled to millions of users with Google Sheets as a backend," worked like this: salary submissions came in through a Google Form and landed in a Google Sheet. An AWS Lambda function periodically processed the sheet and wrote JSON files to S3, which CloudFront served as cached static assets. The site itself was plain HTML, JavaScript and CSS on S3. In a 2018 Indie Hackers interview, the founders put their annual infrastructure bill at "less than one coffee."
The sheet held over 100,000 salary entries at its peak and survived roughly 24 months in production. No database, no ORM, no migrations, no ops. Wrong for most companies at scale, and exactly right for two people with day jobs testing whether anyone cared.
Distribution meant answering questions on Blind
Levels.fyi started in 2017 because the founders kept seeing the same confusion on Blind, the anonymous forum for tech employees: how does an L5 at Google map to a level at Facebook? The first version answered only that, for three companies: Google, Facebook and Amazon. Then, as they told Exponent: "The next few times a related question came up on Blind, we shared a link to our site. In a matter of days, traffic picked up."
That was the entire launch. No Product Hunt, no ads. They put the answer where the question was already being asked, repeatedly, by exactly their users. Salary data collection came months later, once the leveling tool had an audience contributing willingly. Both founders kept their jobs through the early years; Zaheer was still at Amazon on the AWS team when the site was a year old and already earning.
The money took four years to catch the traffic
The first revenue was incidental: about $5,000 a month in 2018, mostly commissions from a recruiting-referral partnership with Triplebyte, which the founders themselves described as unsteady. The real model arrived when they started selling services on top of the free data rather than the data itself.
Today the salary negotiation service lists a Standard package at $1,250 with a guaranteed minimum increase of $10,000 or your money back, a Premium package at $2,450 with a $15,000 guarantee, and a Leadership package at $5,000 for director-level and above. The site claims over $100 million in compensation negotiated and an average increase around $55,800 for senior engineers. Employers pay separately: promoted job placements at $1,000 to $2,000 a month. The data stays free, and the about page draws the line that keeps the flywheel trusted: "We never accept any form of payment to adjust leveling or salary numbers."
Note the shape: a high-traffic free dataset, monetized by a small number of high-ticket transactions where the value is obvious ($1,250 against a guaranteed $10,000 raise). That pricing works because the free product proves the expertise first. It is the same pattern as a niche site earning through services, at much larger scale.
When the sheet broke, revenue paid for the rebuild
The engineering post is candid about why the spreadsheet era ended: processed JSON files grew to several megabytes, Lambda jobs started hitting timeouts, Google Sheets rate-limited writes, there was no way to run SQL analysis, and scraping got easier than they liked. They migrated to a proper database, later Postgres, and a single Node.js instance now absorbs tens of thousands of requests an hour.
The sequencing is the lesson, and it is the same one behind the boring stack and stretching one Postgres database: they migrated after the business existed, with revenue paying for the work, instead of building for imagined scale in year one.
Copy the order, not the stack
A worked version of their sequence, sized for one person: find a question that keeps recurring in a community you already belong to, the way leveling questions recurred on Blind. Build the smallest page that answers it, storing whatever data you collect in a form and a sheet; spend less than a weekend. Answer the question in that community with your link every time it comes up, which is contribution, not spam, if the page genuinely answers it. Add data collection only when strangers start showing up. Charge for a service that uses the data, not for the data, and price it against the outcome, the way $1,250 reads as cheap against a $10,000 raise.
The honest constraints: this took four years from side project to $2 million run rate, both founders had tech salaries underwriting those years, and a data flywheel only spins while contributions keep arriving, which is why the no-payment-for-edits rule is a business asset and not a slogan. Musa's own framing of what they built is the compact version: "Building an audience with strong engagement is replacing the 'seed' round so to speak."
Discussion
Sign in with Google or just a name. No email link, no password to remember.