DEV Community

Cover image for We hit 709 MAU, then lost 82% of it to a bug I didn't find for 2 months
vmzavas
vmzavas

Posted on

We hit 709 MAU, then lost 82% of it to a bug I didn't find for 2 months

Built PeerPlay after getting stuck on Google Play's 12-tester/14-day closed testing requirement myself — no existing audience, no easy way to find 12 real people willing to install and actually use an app for two straight weeks. The idea was simple: developers stuck on the exact same wall swap testing with each other instead of paying for it or begging strangers.

It actually worked at first. Active users grew steadily and peaked at 709 in the 30-day window around early June. Then, over the next two months, it fell 82% — down to 126 by late August. I assumed the obvious thing: people tried it, didn't love it, and left. I started writing a "why do people churn" doc.

It wasn't that. It was a bug, and a dumb one in hindsight.

The Discovery tab — the screen most testers land on by default — had a filter that hid any app older than 14 days since it was created in the database. That made sense on day one of building the feature, because campaigns used to be one-shot: 14 days and done. Except campaigns don't work that way anymore — they restart automatically and run indefinitely once live. Nobody updated the Discovery filter when that changed. So every one of my own regularly-active apps, and everyone else's apps older than two weeks, silently disappeared from the tab new testers actually see. The apps weren't gone from the database. They were just invisible to anyone browsing normally.

There was a second bug stacked on top of it that made it worse to diagnose. The developer's own "My Apps" list computed a fake "paused" indicator client-side, but it never actually read the real isPaused field from the database — and that computed value wasn't wired to any UI element anyway. So even the one screen where a developer might have noticed something was wrong showed a completely normal, healthy-looking app with a working Join button. There was no signal anywhere telling me or anyone else that something had broken.

I found both by accident, going through a Firebase analytics export looking for something else entirely, and fixed both the same day. D1 retention is the number I'm watching most closely now, since that's the most sensitive signal for whether the "first session is confusing" problem this caused is actually gone.

The part that still bothers me isn't the bug itself — bugs happen — it's that I'd spent weeks before finding it assuming the problem was the product or the market, when it was a stale filter condition three commits deep that nobody had reason to look at again. I was about to make real strategic decisions (pull back on outreach, reconsider the whole model) based on a growth curve that was actually just a visibility bug wearing a "nobody wants this" costume.

I'm rebuilding from the dip the slow way now — manual outreach on itch.io and dev forums, one developer at a time, instead of assuming the growth curve will take care of itself once the bug is fixed. It's slower, but at least I know exactly why every number moves.

Anyone else had a "growth problem" turn out to be a UI bug quietly hiding your own product from the people who'd have used it? I'd bet this is more common than the postmortems that get written about it suggest — most of what actually gets published is either "we found product-market fit" or "we didn't," and not enough "we had fit and then the app broke without telling anyone."

Top comments (0)