DEV Community

Devil Scrapes
Devil Scrapes

Posted on

The top-earning product on Indie Hackers reports $10,000,000,000,000,000 a month

Quick answer: Sort Indie Hackers products by highest revenue and the number at the top is $10,000,000,000,000,000 per month — ten quadrillion dollars, roughly a hundred thousand times world GDP. It is not a parsing bug. The site serves that string verbatim, because revenue on Indie Hackers is self-reported and never audited. If you scrape this data, the single most important thing you can do is tell your users that.

We assumed our parser was broken

We built a scraper for the Indie Hackers product directory — it's a genuinely useful dataset if you're researching bootstrapped SaaS, hunting acquisition targets, or tracking a niche. The first rows came back like this:

LabGPT        $10,000,000,000,000,000 / month
Audjust AI    $900,000,000 / month
Ailoitte      $567,890,678 / month
Groupon       $498,400,000 / month
Enter fullscreen mode Exit fullscreen mode

Groupon's actual revenue is roughly $40M a month. So the fourth row alone was off by an order of magnitude, and the first row was off by… well, by Graham's number, give or take.

The obvious diagnosis is a parser bug: a misplaced decimal, a thousands separator eaten, two fields concatenated. We went to check before shipping.

The parser was fine

One request to the live page, and the raw markup says:

product-card__revenue-number > $10,000,000,000,000,000
Enter fullscreen mode Exit fullscreen mode

Verbatim. The scraper was faithfully reporting exactly what the site serves. 567,890,678 is someone typing digits on a keyboard. $10 followed by fifteen zeroes is a joke, and a pretty good one.

This is worth internalising as a scraping lesson, because the reflex cuts the wrong way. An implausible value is not, by itself, evidence of a parsing bug. Sometimes the source is implausible. The only way to know is to look at the bytes the server actually sent, and the check costs one request.

The mirror-image mistake is worse and more common: "sanitising" the outlier. Had we silently dropped rows above some sanity threshold, or clamped them, we'd have shipped a dataset that quietly disagrees with its own source and is impossible to reconcile.

Self-reported means self-reported

Indie Hackers asks founders to enter their revenue. It does not verify it, and it has no way to. That single fact governs how the whole dataset should be read:

  • The top of a highest-revenue sort is the least trustworthy part of it, because that sort is precisely an ordering by "who typed the biggest number."
  • A product with no revenue figure is not a product earning zero. It is a product that didn't say. Those must be null, never 0 — collapsing the two invents data.
  • The dataset is still genuinely useful. The long tail — the $1k, $5k, $30k/month products — is where the real signal lives, and it is the part people actually research.

What we did about it

Nothing to the data. We report what the source reports, and we put the caveat everywhere the user will look: in the field table, in a dedicated limitations section, and in the FAQ. A scraper's job is to be faithful to its source; the honesty obligation is discharged in the documentation, not by quietly editing the numbers.

The one thing we did enforce is the null distinction above — "didn't report" and "reported zero" are different facts and never collapse into each other.


💸 Indie Hackers Products Scraper turns the product directory into typed rows — slug, name, tagline, logo, self-reported monthly revenue and the category it matched — across any categories you name. $5.00 per 1,000 results, and you only pay for rows that land.

FAQ

Is Indie Hackers revenue data accurate?
It is self-reported by founders and never audited by Indie Hackers or by us. Treat it as a signal, not a financial statement — and treat the very top of a highest-revenue sort as noise.

Why does a product show null revenue instead of 0?
Because it did not report a figure. A product that says nothing and a product earning nothing are different facts, and merging them would invent data that isn't there.

Is the $10 quadrillion figure a scraping error?
No. The site serves that exact string in its product-card__revenue-number node. We checked the raw response specifically because we assumed our parser was wrong.

Can I filter out the joke entries?
Yes — every row carries the raw figure, so you can apply whatever plausibility threshold suits your research. We deliberately don't pick one for you, because any threshold we chose would be a silent editorial decision baked into your dataset.

Top comments (0)