All Articles
A review asks for a refund. Your answer changes depending on the store
On iOS you cannot refund a purchase as the developer. On Google Play you can, from Play Console, and it cannot be undone. Here is how I word each reply, and how I stopped forgetting to revoke access afterwards.
Two Balances, Not One: Reading Rork's Build Credits and Cloud Credits Apart
Rork keeps two separate balances. Here is how to tell which one a charge came from, why one prompt can cost more than one credit, why a Cloud balance that never moves may mean your AI is not running at all, and what changes once real users start spending it for you.
A Share Button Is Not a Social Media Capability. A Feed Makes 13+ Your Floor
The App Store age rating questionnaire now asks whether your app has social media capabilities, and answers become required in September 2026. Here is where Apple drew the line, why the under-13 escape hatch obliges you to read age ranges, and how that looks in an Expo app.
Your Blended eCPM Dropped and Revenue Went Up: Splitting the Change Into Country Mix and Rate
Blended eCPM is a weighted average, not a price. Here is how I split a month-over-month change into a country-mix effect and a rate effect that reconcile exactly to the total, plus what to check before you cut a low-eCPM country.
My Second App From the Same Codebase Ships With a Distinct-Value Manifest
Google Play has drawn a clearer line around low-value apps. Here is how I decide where the distinct value of a sibling app lives, and the small script I run before every submission to check that the two apps have actually diverged.
After the Google Play deadline: which dormant Android apps to raise, and which to leave at 35
Apps you have stopped updating are governed by a different bar than apps you still ship. Here is how to inventory effective targetSdk across your builds and decide which apps to raise, hold, or retire.
I Split Rork and Claude Code by Who Owns the Build Environment
How to decide between Rork and a terminal coding agent using data from your own repository instead of impressions of generated code. Includes a script that counts which layer your maintenance work lands in, and a check that catches native settings silently disappearing on regeneration.
August 31 Means Something Different Depending on Whether You Plan to Ship an Update
Two separate conditions land on Google Play's August 31 date: API 36 to submit an update, and API 35 to stay discoverable to new users. Here is how I sorted six apps, and who actually gets the extension form.
Four Countries, Not the World: Checking Which of My Six Apps the September 30 Deadline Actually Touches
Android developer verification goes live on September 30, 2026 in Brazil, Indonesia, Singapore, and Thailand. Here's how to decide from your own install data whether that date is urgent for you, and what actually blocks indie developers.
When Bumping Push to Three a Day Cut Next-Week Returns — Field Notes on Measuring Notification Frequency by D7 Retention and Opt-Out Rate
The assumption that heavier push means more returns was quietly eroding my D7 retention. These are field notes on re-measuring notification frequency by install-cohort D7 and opt-out rate, and walking from three a day back to one.
Handing Over an App — What an App Store Transfer Carries, and What You Rebuild
A practical look at App Store Connect app transfers when selling or moving an app: the eligibility criteria, what carries over (ratings, subscribers, iCloud data), what you rebuild (TestFlight, APNs, merchant IDs), and the three places users actually feel the change.
Sunsetting an App Well — Designing the Path from Update Freeze to Full Shutdown
What to do with an app whose revenue no longer covers its server bill. A three-stage decision table, a CDN-based sunset flag with TypeScript implementation, a data export path, and the practical order for winding down auto-renewable subscriptions.