Category

The Business Reality

Unvarnished notes about distribution, policy, payment risk, and the gap between build and business.

All posts

53
Concept diagram: impressions +50%, installs +21%, revenue -23%
The Business Reality4 min read

I grew impressions 50% and revenue fell 23%

Six weeks, fifteen more apps, half again as many impressions. Putting two measurements side by side showed installs up and money down — and disproved the diagnosis I had made last time.

#reality-check#analytics#distribution#first-principles
Left: an app-level per-page yield table where the #2 app looks healthy at 0.57. Right: the same app split by URL shape, where the five pages of the shape I wanted to expand earn zero and all traffic arrives through two completely different paths
The Business Reality6 min read

I almost shipped 25 pages into a URL shape that was earning zero

I measured per-page search yield across 27 apps to pick where to expand. I got a #1 and a #2, and I had already planned 25 new pages for the #2. Then I drilled one level down, into URL shape, and found that the five existing pages of exactly that shape were earning nothing. The app average was alive. The slot I wanted to fill was dead.

#measurement#seo#naver#reality-check
Left: the 150 threshold came from all-source sessions, while the measured ceiling for search sessions among comparable tools is 39. Right: four measurements laid out with pages and per-page yield split into two groups, with the new threshold of 20 sitting between them
The Business Reality7 min read

The Pass Bar I Set Came From a Different Metric

I rewrote a new product's gate twice. The first version was a bar my best-performing app couldn't clear. The second compared the wrong unit — a number measured across all traffic sources, used as a search-only threshold. I fixed both while the observation was still zero, so it isn't post-hoc bar moving. It is still twice wrong.

#gates#preregistration#measurement#reality-check
Two-panel diagram. Left contrasts the live policy document, which describes a conversational AI app and declares that health data is not collected, against the actual app which stores a symptom catalog and reads sleep and heart rate before sending them to a server. Right lists four pre-submission checks that compare the policy against the code.
The Business Reality3 min read

My Privacy Policy Described a Different App

A health app was rejected from the store. I opened the live policy URL and found another app's document — one that declared it does not collect health data. Health data is the entire reason this app exists.

#policy#privacy#google-play#distribution
Two-panel diagram. Left: what happened in four hours — product from scratch, list of 100, 111 emails sent. Right: next-day reply classification — 3 hard bounces, 15 ticket auto-replies, 5 human replies (3 of them negative), 77 no response, 0 sample requests. A note below says most recipient addresses were support, contact, or info aliases.
The Business Reality7 min read

I Sent 111 Cold Emails in Four Hours — the Next Day, Sample Requests Came to Zero

I built the product, pulled the list, and sent 111 emails in one afternoon. The next day I read every thread: 3 hard bounces, 15 ticket auto-replies, 5 human replies, 0 sample requests. The pre-registered kill criterion was fewer than 10 requests per 100, so this is a FAIL. The more uncomfortable part is what I actually measured — someone else's support queue.

#distribution#reality-check#gates#preregistration
Left: a health-declaration form. Sleep and stress management are checked and the app publishes. Right: the 'Diseases and conditions management' box is checked and an 'Organization account required' stamp lands on the submission.
The Business Reality6 min read

One Checkbox Said I Couldn't Ship That App on a Personal Account

Three health apps got rejected from the store. The reason wasn't the content — it was the account type. Other health apps on the same account went through; the one thing that differed was whether the health declaration touched the Medical section. Resubmitting with an empty declaration got rejected too. The only way out was an organization account, and it carries a cost you can't undo.

#android#google-play#distribution#reality-check
Left: the eleven points the tip raised. Right: two could be closed by editing text, nine needed facts and decisions I did not have.
The Business Reality7 min read

An Anonymous Tip Said My Privacy Policy Was Lying. It Was

An email with no name and no organisation laid out eleven EU regulatory concerns about one of my apps. I checked every quote against the live files — not a character was wrong — and two of the eleven turned out to be false statements my own policy was making. One of them lived inside a consent screen.

#privacy#supabase#reality-check#postmortem
Diagram: on the left, zero cost per call and zero mentions of the word API in the terms, but clause 14.6 forbids third-party sharing, so an upside of 50 to 300 dollars a month sits against ad-account termination. On the right, swapping the source to government open data with an unrestricted license ships the same product in a day.
The Business Reality6 min read

The API Was Free. One Clause Killed the Product

I ruled out three fast-follow categories with public numbers, then read the terms of the data source my remaining candidate depended on. Calls were free and the numbers were accurate, but a single clause forbidding sharing acquired information with third parties made the whole product illegal.

#reality-check#first-principles#gotchas#distribution
Left panel shows pipeline status: 34 bots, 30 healthy, 1 late, 0 stopped, all green. Right panel shows the outcomes over the same period: 0 revenue, 26 YouTube subscribers, 40 search clicks, 0 external game visits
The Business Reality7 min read

All 34 Bots Were Green — One of Them Wasn't Even on the Board

I built a dashboard that judges bots by their artifacts, not exit codes, then ran a mid-check. All 33 healthy. Then I diffed it against the actual launchd job list and found a working bot that had no row at all. And what all 34 produced outside: 0 revenue, 26 subscribers, 40 clicks.

#monitoring#first-principles#reality-check#automation-pipeline
Left panel: what I told the customer - one entry per day, by design, saving again replaces it, not a setting I can change, this app isn't right for you. Right panel: what the code did - the form initialises every symptom to zero and upserts over the day's unique row, so a morning hot_flash 3 and sleep 4 became hot_flash 0 and sleep 3, while the streak stayed green
The Business Reality8 min read

I Told Her It Was By Design. It Was Data Loss.

I answered a refund request with "one entry per day is by design." Then I opened the code. It wasn't design, it was a bug: the check-in screen always opens blank, so an evening save wrote zeros over what she logged that morning. The streak stayed green the whole time.

#support#data-loss#postgres#reality-check
Concept diagram: on the left the comfortable hypothesis that the crawler was blocked, on the right the measured reality of 472 characters of body text and 29,625 views producing 29 sessions
The Business Reality6 min read

I Almost Blamed the Crawler for My Ad Rejection

AdSense rejected my site for low-value content. I was sure my CDN had blocked the reviewer's crawler — it had actually happened once before. When I checked, the crawlers were getting through fine, and my app pages had 472 characters of body text.

#monetization#adsense#reality-check#first-principles
Concept diagram: on the left, conclusions read straight off the dashboard; on the right, the data that appeared once the collection limits were raised
The Business Reality6 min read

My report only kept the top 10 rows, and I concluded there was no demand

I audited search traffic from first principles and caught the same error twice in one day. The long tail wasn't missing — my collector only held 10 rows. One app didn't own 73% of traffic — only 6 apps were instrumented. Neither flipped by digging deeper into the data, but by doubting the collection limit.

#reality-check#analytics#first-principles#seo
Concept diagram: days needed to detect a +30% lift. Revenue-top apps land at 299 and 280 days, past the 30-day line; only the 538/day zero-revenue app is inside it at 9 days.
The Business Reality5 min read

I designed an experiment; it was statistically impossible

The plan was to attach new creative assets to my top-revenue apps and compare the funnel before and after. I ran the power calculation before executing — and these apps couldn't detect the effect in any realistic window. The app that measures the effect and the app that gets the effect had to be different apps.

#app-store#statistics#ab-testing#reality-check
Concept diagram: the top 6 apps by impressions eat 53% of inventory but earn $0. A rank-19 app makes 81% of revenue. 52% of installs go to apps with nothing to sell.
The Business Reality5 min read

My top-impression app earned zero

I tuned ASO across 40+ apps for months, on the assumption that more impressions mean more revenue. The first time I pulled real money and cross-checked it, impression rank and revenue rank were inversely correlated. The lever wasn't traffic — it was revenue per install.

#app-store#aso#revenue#reality-check
Concept diagram: 53K total views is vanity, top post is only 1.5K
The Business Reality3 min read

53K Threads views, and not a single hit post

Threads told me I'd crossed 50K views. I opened Insights to find the hit. My top original post: 1.5K views. The other 94% wasn't my content — it was impressions borrowed from someone else's viral thread.

#analytics#distribution#reality-check#social