Shipping an app is not the same as finishing it. The last mile is full of doors with unfamiliar handles: a menu that moved, a two-week waiting period, and a payment key that works everywhere except the one place that matters. None of it is the app's idea. All of it is the product.

indie-devshippingapp-storepaymentslittle-story

It worked on my phone for months

LittleStory has been running on my phone since spring. A photo, four seconds of my voice, one sentence — and out comes an illustrated bedtime story my daughter asks for again the next night. In my head it was finished. In Google Play's head it was not released, and those turned out to be two very different things.

The gap isn't the code. The gap is a dozen small doors with unfamiliar handles, and every one of them is somebody else's documentation, written for a version of the console that stopped existing before I arrived.

The door that moved while I wasn't looking

Every guide still tells you to open Settings, then API access, and link your Google Cloud project. That menu item is gone. The new console hands out permissions under Users and Permissions instead: you create a service account in the Cloud console, invite its email into Play, and tick two boxes — view financial data, manage orders and subscriptions.

Then there is the waiting. A new developer account cannot publish to production until it has run a closed test: at least twelve testers, at least fourteen days. I had a finished app and a calendar that said not yet. Twelve strangers with Google accounts, and two weeks of doing nothing useful, is a strange thing to call a release.

The key that only worked on my desk

This is the one that actually cost me an evening. The payment key started with test_. It worked perfectly in Expo Go and in my dev build. I shipped the same build to Play, installed it, tapped buy — and nothing happened. No error, no crash. The button just sat there.

A test key is a sandbox key. It is only valid inside the development environment; anything Google Play installs, even a closed test, needs the production key without the prefix. The app looked identical either way, which is exactly why it is easy to miss. The one screen you cannot test from your desk is the one where money changes hands.

A story that fails at eight is not a story

None of this is about the app's idea. It is about the last mile, and the last mile is part of the product. If LittleStory's bedtime button does nothing at eight o'clock, my daughter does not experience a configuration problem. She experiences no story.

So I have stopped treating the store console as paperwork that happens after the build. The day it cannot take a payment is the day it is not finished — no matter how many nights it has already worked on my phone.

← Back to all posts