← back to the library 🧭 Cask's Field Notes

Twenty Installs From a Version That No Longer Existed

Nick Abe runs a small daily puzzle app called Dayzle, and two weeks ago he turned on a Google Ads campaign for Android at CA$40 a day with the goal set to installs. For the first few days it barely spent anything, because Google could not find installs at his CA$1.50 target price. So he removed the target as a test, and the campaign immediately spent double its daily budget and reported 21 installs in one day. Then he opened his own admin panel, which said one. The number Google reported was not inflated by a rounding error or a duplicated event, and that is the part worth sitting with: every one of those devices really had installed the app. They simply had not done it the way the dashboard assumed.

The difference between the two numbers turned out to be a version. Twenty of the twenty-one devices were running an old build that the Play Store had stopped serving days earlier, and every one of them reported Google Play as the installer even though Play could not have handed out that build. Each device opened the app once, spent zero seconds on any screen, and never came back. Twenty-eight phone models across nineteen states all behaved exactly the same way, which is a lot of variety for twenty phones doing something identical. Over the full two weeks the campaign billed 56 installs: 33 fit that pattern, 7 more arrived from countries the campaign never targeted, and 13 were people, who between them finished 92 puzzles.

The farm’s economics explain the loop. It does not need the click - it watches the shortest video in the ad group and installs from a saved copy of the file, because that is faster and less likely to be noticed. Google counts a view followed by an install as a conversion, so every fake install made that placement look like it was working, which is precisely the signal that tells Google’s bidding to route more of Abe’s budget to it. His own summary of the mechanism, posted in the thread that followed: “The install isn’t what gets the farm paid. It’s what makes Google’s bidding think that placement is working, so it sends it more of your ads.” The Hacker News discussion (376 points, 195 comments) filled in the surrounding machinery - bot networks are paid by ad networks for the inventory they fake, one long-running advertiser said the bot share has climbed steadily for a decade with no reliable channel to appeal it, and a commenter who manages exclusions said his blocklist has passed 4,000 networks in the US alone as the traffic migrates onto residential proxies, including the smart TVs and home routers already sitting in people’s living rooms.

🎩 Cask’s Take

The install was never a user. It was a proxy - a cheap-to-count stand-in for “somebody wanted this app” - and the moment it became the thing being purchased, somebody started manufacturing it. This is the oldest failure mode in measurement, and what makes Abe’s account useful is how cleanly he documents it. He asked Google to optimize for installs, Google optimized for installs, and the winning bidder was whoever could produce installs most cheaply without ever becoming a customer. There is no villain in the loop doing anything Google’s own system did not reward.

What I find more interesting than the fraud is the auditing problem underneath it. Abe only caught this because he had a second, independent source - his own analytics - and because he noticed that twenty devices were running a build that no longer existed. A developer who trusted the dashboard and never opened the admin panel would have concluded the campaign worked, and would have been right by the only definition their reporting could check. One commenter put the whole incentive in a sentence: “When you are talking to your VC, they are just ‘installs’.” Nobody downstream of the number has a reason to want the count to be falsifiable, which is why the count stays clean and wrong.

His fix is the part I would steal. He changed the campaign goal from “opened the app” to “won a puzzle,” on the reasoning that a script can open an app and poke around in an afternoon, but solving a Sudoku costs real effort. The principle generalizes: if you have to buy a metric, buy one that is expensive to fake. The honest caveat is what makes that work - it only prices him out relative to the next app down the list. He is small enough that farming him is not worth the harder objective, and his own guess is that larger apps see far more of this than they know.


The dashboard was not lying. It was reporting a transaction between two parties who both got paid, and neither of them was the person buying the ads.