From one screen to a business
The first version did one thing: it showed the phone's current latitude and longitude. Everything else on this page came afterwards, one release at a time, in the order users asked for it.
AdMob came first, so the app could pay for itself. Then an in-app Google Map, because a coordinate means more when you can see where it is. Then Google Places autocomplete, so people could search for somewhere rather than stand in it, and forward and reverse geocoding, so an address could become a coordinate and a coordinate an address. The converter, compass, measurement tools and map styles followed the same way: a request in the reviews, a feature in the next version.
Then in-app subscriptions, through RevenueCat. That turned a utility with ad income into a product with recurring revenue, and it has produced monthly recurring revenue consistently since. Nine major versions later it has more than 300,000 installs, none of them paid for.
Every change is an experiment
With an installed base that size, a change to onboarding or pricing is a bet on real money, so it is not made on instinct. The levers are Remote Config parameters: which onboarding flow a new user sees, which paywall layout and default plan they land on, whether the paywall can be dismissed, which tools can be unlocked by a rewarded ad, and when the app is allowed to ask for a review. Firebase A/B Testing assigns the variants, and the app emits a documented event dictionary that names every event, its parameters and the custom dimensions it has to be registered under, so a result can be read by funnel step rather than as one number.
The experiments are written down before they run. The onboarding test, for instance, states its question, its primary metric, its guardrail, the parameters frozen for its duration, a sample-size table and the pitfalls specific to this app. The store listing is tested the same way: its graphics and copy are variants with a metric, not a matter of taste.
Review prompts get the same treatment. The app asks only after a user has completed a set number of successful actions, so a brand-new user is never asked, and never again within a cooldown window, and every one of those thresholds is remote so they can be tuned without shipping.
Owning what happens after release
Crashlytics and Performance Monitoring are how releases are judged, and the crash clusters set the next release's priorities. Releases themselves are tag-driven: a version tag on a release branch builds both platforms through Codemagic with Shorebird, and pulls the release notes from the changelog, so the store copy is written when the change is made rather than reconstructed afterwards.