If you open a new personal Google Play developer account, you cannot ship to production until you have run a closed test with at least 12 testers opted in for 14 continuous days.
Now the part that makes it genuinely difficult: there is no screen anywhere that tells you where you stand. Not the roster. Not the count. Not whether somebody quietly opted out on day nine — which, if they did, effectively restarts your clock.
You are being measured against a number you cannot see, for two weeks, and the failure mode is discovering on day fourteen that you were at eleven the whole time.
pithy add testers runs that process.
What it gives you
A cohort with a target and a window. A roster you invite by email from your own domain. A one-tap confirmation link that needs no account — because asking a favor from twelve people is hard enough without also asking them to sign up for something.
And a fourteen-day clock replayed from your own event log, so a correction is a recomputation rather than an overwrite. Fix a mistake in the roster and the timeline re-derives; you are not patching a running total that has already drifted.
The clock is honest about what it is
This is the part I would want to read before trusting any tool in this space.
Pithy’s count is an estimate, derived from your own invite records. Google’s count is the authoritative one, and no API exposes it — not the roster, not the number, not a tester quietly opting out.
So rather than presenting a confident figure and hoping:
- Every figure derived from it is named
estimated. - The response carries that sentence as a required field — not an optional note somebody might drop, but part of the shape.
- Nothing here claims to read the console.
Making “we cannot know this” a required field in the response is the design choice I like most here. It means no downstream screen can accidentally present the estimate as fact, because the caveat travels with the number.
What it can see that nobody else can
Here is the compensation for not being able to read the count, and it is better than the count.
Resolve each tester to their user through auth, and you learn who has actually opened the app.
That changes the shape of the problem entirely. Opt-in status is invisible to you; activity is not. A tester who has been dark for eight days shows up on day eight — while you can still send a friendly message — rather than on day fourteen when the count finally fails to move.
You cannot see the scoreboard. You can see who stopped playing.
The daily Workflow
A daily Cloudflare Workflow does three things.
It advances state. It chases whoever needs chasing, under a mandatory per-tester cooldown — because the fastest way to lose a volunteer tester is to email them every day, and a nudge system without a floor on frequency will do exactly that.
And it writes one snapshot per cohort per day. That last one is not bookkeeping. Activity cannot be reconstructed after the fact the way an event log can — if you did not record who was active on Tuesday, Tuesday is gone. The daily snapshot is what makes the trend chartable at all, and the trend is the thing that tells you on day eight rather than day fourteen.
It works from the CLI
Every nudge ships default copy, so this runs with no dashboard at all.
A control-plane caller may override the words — as plain text and never as markup. The reason is that those words go out over your own DKIM signature, from your own domain. What gets sent in your name is not a place to accept arbitrary markup from an API call.
Why this is in a backend kit
Because it is a real, specific, time-boxed obstacle between a solo developer and shipping, it takes a fortnight to fail, and the tooling to survive it does not exist anywhere.
It is also the clearest example of what the kit is for. Nothing here is technically hard. It is a roster, a clock, an email and a daily job — every piece of which was already in the catalog. What makes it worth having is that somebody sat down with the actual rule and built for its actual failure mode, which is losing a tester on day nine and not finding out.