Mobile · Release
Shipping to Both App Stores Without Drama
Writing the app is half the job. Getting it into the App Store and Google Play — and keeping releases boring, frequent, and reversible — is a discipline of its own. Here's the release practice we run across our products and client apps.
Two stores, two cultures
Apple and Google run stores with genuinely different temperaments, and a release process must respect both. Apple reviews are human, stricter, and occasionally opinionated — a rejection for a metadata detail or an unclear subscription screen is normal life, and the first submission of a new app should budget days, not hours. Google's review is faster and more automated, but Android brings its own tax: staged rollouts you must manage, a device landscape you can't fully test, and policy changes that arrive with deadlines.
The practical consequence: treat store requirements as product requirements from day one. Privacy labels, data-safety forms, account-deletion requirements, subscription disclosure rules — teams that discover these at submission time lose weeks; teams that design for them lose nothing.
Releases should be boring
A healthy release is an uneventful one, and uneventfulness is manufactured. The ingredients we consider non-negotiable:
- —CI builds both platforms from a tag — no releases from a developer's laptop, ever; the pipeline is the only path to the stores
- —The automated suite gates the release: unit and widget tests in the pipeline, critical flows on the device farm — red blocks the tag
- —Staged rollouts by default: a release reaches a small percentage of users first, and crash monitoring decides whether it proceeds
- —Remote config and feature flags separate deployment from launch — code ships dark, features turn on when we choose, and can turn off without a store review
- —Store metadata is versioned like code: both languages, both stores, screenshots and texts in the repo, not in someone's head
The escape-hatch principle
Mobile's defining constraint versus the web: you can't instantly take a release back. A bad web deploy is rolled back in minutes; a bad app release lives on users' phones until they update. That asymmetry drives the whole discipline — the staged rollout is the ability to stop the bleeding early, the feature flag is the ability to disable a feature without shipping, and remote configuration is the ability to adjust behaviour while the binary stays put.
This is also why 'we'll fix it in the next release' is a weaker sentence on mobile than anywhere else. The next release is a review cycle away, and some users won't take it for months. The escape hatches have to exist before the incident.
Cadence is a feature
Teams that release rarely, release badly — each release grows large, risky, and frightening, which makes the team release even more rarely. The inverse loop is available to anyone: small frequent releases keep every diff reviewable, every rollback cheap, and every incident small. Our aim across products is a steady cadence where a release is a routine Tuesday event, not a quarterly ceremony with a war room.
That cadence is what clients actually buy when they buy release discipline: the confidence that improvement lands continuously, and that no single release can sink the product.
Takeaways
- ✓Treat store rules as product requirements from day one — discovering them at submission costs weeks.
- ✓No releases from laptops: CI builds from a tag, tests gate the pipeline, the device farm gates the critical flows.
- ✓Deployment isn't launch: feature flags and remote config let code ship dark and features toggle without review cycles.
- ✓Mobile can't roll back — staged rollouts, kill switches, and remote config must exist before the incident.
- ✓Release cadence compounds: small frequent releases keep diffs reviewable, rollbacks cheap, and incidents small.
Building something where this matters?
This is how we work on every project — mobile, web, and AI. If you want a team that reasons this way about your product, let's talk.
Get a free estimate