11 August 2026. Commissioned by Aga after the App Store delete rate looked alarming. Run by the growth fleet, then blocked twice — once by the growth Skeptic and once by the Data Verification Officer — and rewritten against both. Ten of the first draft's claims did not survive, including four of my own — the last being my own "Android build defect" theory, killed by Google's own crash data. Those corrections are kept visible below rather than quietly fixed.
1. The 52.7% "delete rate" is not a delete rate. It is 29 delete events ÷ 55 install events over the same six days. A delete logged on 28 Jul can belong to an install from May. It does not mean half our installs get deleted, and it is roughly the expected shape for a paywalled fitness app.
2. The alarming number was the wrong platform. Blended, the funnel says 74% of people who finish onboarding start a workout. Split: iOS 99.7%, Android 41.1%. And the paywall converts 18.0% on iOS against 7.5% on Android. iOS is already performing at the level the first draft proposed as a target. The problem is Android.
3. Apple Search Ads is SOLVED — cost is no longer unknowable. AGA-153 closed the
same day; the OAuth chain was proven live. Apple's own numbers, 90d: $407.32 spend (~$136/mo), 163
tap-installs, $2.50 each. Only three campaigns run and all are Branded, at ~$1.19/install.
The five paused ones were the non-branded experiment: $230.45 for 15 installs (~$15 each) — already
off. 🔴 CAC/ROAS still unpublished: the old "$18.98/install" was revenue, not cost, and its
denominator does not match Apple's.
4. And we now know where Android breaks — it is sign-in, and it is not a crash. Play vitals say
0.00% crash rate; holding geography constant to buyer countries says it is not the cheap-geo wave either.
What is left: iOS logs in 98.8% of onboarders, Android 68.0%, and
social_login_attempted fires 103× on iOS and 0× on Android.
5. None of this should jump the queue. The whole app funnel produces ~50 trial starts per 28 days. A best-case Android fix is worth roughly $150–250/mo, arriving in weeks through App Store review. The web quiz sold 15 subscriptions for $1,298 in the first eleven days of August. Against a $6,136/mo gap with 79 days left, the app rail is a second-priority lane.
Recorded in full because each one nearly shipped to Aga as fact.
| Claim | Verdict | The truth |
|---|---|---|
| "No Apple Search Ads credential exists anywhere in the repo" | REFUTED | APPLE_ADS_PRIVATE_KEY_B64 is in .env.local. The blocker is the un-uploaded public key. |
| "ASA revenue was measured once" | REFUTED | Measured at least four times, four different answers, none reconciled. |
| "$30.56 revenue per install — the highest of any paid source" | CORRECTED | That was the best of ten ASA campaigns, seven of which returned $0.00. Channel-level: $18.98/install. |
| "ASA 27 installs → $200 = $7.41/install" | REFUTED | A units error. 7.4% is a conversion rate (install→purchase), not dollars. Struck entirely. |
| "333 impressions/day — a thin pipeline" | CORRECTED | 665/day. The discovery report covers 3 days, not the installs block's 6. Exactly double. |
| "1.75% install conversion" | NOT COMPUTABLE | It divided a 2-day download count by a 3-day impression count. A rate across two windows is not a rate. |
| "Per-platform split is unavailable" | REFUTED | It was one extra GA4 dimension. Pulled live; it is the most important table on this page. |
| "Android paid installs never converted" | CORRECTED | 0.05% — 2 purchases from 4,236 installs, $480.06 over 90 days. Terrible, but not zero. |
| "An Android BUILD defect — crash, failed asset load, broken transition" | REFUTED | Play vitals: 0.00% crash rate, 0.10% ANR, 25 Jul–9 Aug. Not a crash. Re-diagnosed to sign-in (§2b). |
| "Play revenue rose while installs collapsed" | REFUTED | Window mismatch. Over Apr→Jul installs rose 473→5,221. They fell only in August. |
The pattern in all nine: a number was read without its window, its denominator, or its selection. That is what the verification laws exist to catch, and they caught it here.
Same GA4 pull, same 28 days, one extra dimension. CHECKED — property 177471782, pulled 11 Aug 2026.
| Step (unique users) | 🍎 iOS | 🤖 Android | Blended (what we used to see) |
|---|---|---|---|
| Onboarding started | 361 | 271 | 640 |
| Onboarding completed | 318 (88.1%) | 241 (88.9%) | 564 (88%) |
| First workout started | 317 (99.7%) | 99 (41.1%) | 416 (74%) |
| Workout completed | 256 (80.8%) | 64 (64.6%) | 320 |
| Pricing page seen | 228 | 134 | 362 |
| Trial started | 41 (18.0%) | 10 (7.5%) | 50 (13.8%) |
The first draft of this page called it "an Android build defect — a crash, a failed asset load, a broken transition." That was a guess, and the data killed it. Both obvious explanations were tested before anything was blamed.
com.themovementathlete.app, 25 Jul–9 Aug:
crash rate 0.00% on every one of 16 days; ANR 0.00% on fifteen days and 1.61% on one (6 Aug),
mean 0.10%. The app is not falling over.
| Buyer countries only | onboarding done | signed in | first workout | workout ÷ onboarding |
|---|---|---|---|---|
| 🍎 iOS | 242 | 239 (98.8%) | 269 | 111.2% |
| 🤖 Android | 125 | 85 (68.0%) | 57 | 45.6% |
social_login_attempted fires 103 times on iOS and ZERO times on
Android across 28 days — while Android alone emits signed_in (18) and signed_up
(6), which iOS never fires. The two platforms are not running the same auth.
| Event, 28d unique users | 🍎 iOS | 🤖 Android |
|---|---|---|
AppOnboarding_completed | 318 | 241 (0.76× — normal, tracks the population) |
login / signed_in_app | 296 | 149 (0.50×) |
social_login_attempted | 103 | 0 |
workout_started | 317 | 99 (0.31×) |
NIC-100 — and it is a question, not a bug hunt.
workout_started just isn't wired on Android, and
the 41.1% is a measurement artefact." It is wired. Aga said so, and GA4 — which is Firebase for
the app streams — confirms it: workout_started fires on 28 of 28 days on Android
(260 event-instances from 99 unique users). A dead event does not fire every single day for a month.social_login_attempted, which returns
no Android row at all — a structural zero, not a sampling gap.
🪤 One trap worth recording, because it nearly
produced a wrong number here: adding date to a GA4 request makes totalUsers
per-row, so summing the rows counts a person once per active day. It inflated this very event from the true
iOS 317 / Android 99 to a nonsense 1,256 / 260. Ask without date for unique users; add it
only to answer "on how many days did this fire?".
purchase event fires on initiation). Read the split as a strong directional signal about
platform difference — which it unambiguously is — not as a cohort conversion rate.
CHECKED App Store Connect. 🔴 Three different windows live in this data and conflating them is how the first draft went wrong:
| Block | Window | Figures |
|---|---|---|
| Installs & deletes | 26–31 Jul (6d) | 55 installs (9.2/day) · 29 deletes (4.8/day) · net +26 |
| Store discovery | 29–31 Jul (3d) | 1,996 impressions · 92 page views (4.61%) · 665/day |
| First-time downloads | 31 Jul–1 Aug (2d) | 35 downloads · 94.3% from search · 74.3% no page view |
87.3% of installs come from App Store search — but Apple's "App Store search" bucket contains both organic search and Apple Search Ads placements. It cannot separate paid from organic, so it must never be quoted as an organic figure.
74.3% install without ever opening the product page. That makes the search-result mini-listing — icon, title, subtitle, rating, first screenshot — the actual conversion surface. The product page, the description and the preview video only ever touch the other quarter.
87.3% of iOS installs come from App Store search and 74.3% install without ever opening the product page. That makes the keyword field and subtitle the conversion surface. So I read what is actually live App Store Connect API, 11 Aug:
| Version | 100-character keyword field |
|---|---|
| 1.70.71 LIVE NOW |
ab,butt,beachbody,tracker,gym,exercise,diet,planner,trainer,buttock,calisthenics,ladder,routine,diet |
| 1.70.72 WRITTEN, NOT SUBMITTED |
bodyweight,workout,plan,progression,home,beginner,strength,mobility,pull,push,handstand,planche,core |
diet appears twice and Apple
ignores the duplicate. calisthenics is already indexed free from the subtitle
"Calisthenics & Gymnastics" — 13 characters spent on a word we already own. butt and
buttock are both there and neither is what we sell. beachbody is a competitor's brand.
Exactly one term describes the product.
NIC-102). Cost: £0.
If we want to go one better, a skill-intent set drops the generic
terms for the ones buyers actually search:
bodyweight,pullup,pushup,handstand,muscleup,planche,lever,dips,mobility,strength,progression
— 92/100 characters, no duplicates, nothing already free from the name or subtitle. Optional; shipping 1.70.72
is the win.
AGA-153 is CLOSED and the chain was proven live, not claimed
11 Aug 2026appleid.apple.com/auth/oauth2/token (200) →
/api/v5/acls → /api/v5/reports/campaigns. org 3090590,
The Movement Athlete LTD, USD. Shipped: tools/finance/asa_pull.py
(--days / --write / --selfcheck) → data_asa_spend.json,
registered in estate_selfcheck as asa-spend.
Every "NOT KNOWABLE — ASA spend" statement elsewhere in this estate is now superseded.
This is the platform's own truth and it outranks AppsFlyer, RevenueCat and every doc.
| Metric | Value | Note |
|---|---|---|
| Spend | $407.32 | ≈ $136/mo — a small line, not a channel bet |
| Impressions | 24,737 | |
| Taps | 545 | 2.2% tap-through |
| Tap-installs | 163 | $2.50 each — the honest cost per install |
| View-installs | 300 | 🔴 weak attribution — Apple crediting an install to an ad someone saw. Never blend it in silently. |
| Campaign | Status | Spend | Tap-installs | Cost each |
|---|---|---|---|---|
| Branded – US – SR | RUNNING | $89.14 | 70 | $1.27 |
| Branded – EU | RUNNING | $73.12 | 66 | $1.11 |
| Branded – UK | RUNNING | $14.61 | 12 | $1.22 |
| Total running | $176.87 | 148 | ~$1.19 | |
| — the five paused ones, already off — | ||||
| Competitive – Branded – US – SR | PAUSED | $78.16 | 7 | $11.17 |
| Non-Branded – US – SR | PAUSED | $65.57 | 3 | $21.86 |
| Competitive – Non-Branded – US – SR | PAUSED | $43.08 | 0 | — |
| Non-Direct Competitive – Demand Gen – US | PAUSED | $27.83 | 3 | $9.28 |
| Competitors_MC_CA-EU | PAUSED | $15.81 | 2 | $7.91 |
| Total paused | $230.45 | 15 | ~$15 | |
asa-spend selfcheck exists to catch. It fails loudly on a revoked grant rather than quietly
reporting zeros.
CHECKED Google Play Console, package com.themovementathlete.app.
| Period | Device installs | From countries that never bought |
|---|---|---|
| Jan–May 2026 (organic baseline) | 417–522/mo | 33.9–48.6% |
| Jun 2026 | 4,109 | 69.0% |
| Jul 2026 | 5,221 | 67.2% |
| Aug 2026 (partial, 11 days) | 48 | 29.2% — healthiest in the whole series |
The Jun–Jul spike was the paid install wave into low-ARPU geographies — July was 33.2% India, 17.5% South Africa, 10.9% Pakistan, 10.3% Peru. It converted at 0.05%: 2 purchases from 4,236 installs, $480.06 over 90 days.
A. ✅ DONE — Apple Search Ads is instrumented. Key uploaded, OAuth proven, puller shipped and selfchecked. ASA now reports its own spend daily. What remains is not more spend: it is a denominator-matched revenue join before anyone quotes a CAC. closed 11 Aug
B. iOS title, subtitle and keyword field. 87.3% of installs come from search and 74.3% never open the product page, so these three fields are the conversion surface. £0, no app release. FLEET drafts
C. Pull closed-month Play installs on 1 Sep and settle the Android organic question with a complete month instead of a partial one. FLEET — scheduled
D. Answer the Android sign-in question. Not a bug hunt any more — crash and audience are both ruled
out, and the break is localised to sign-in (68.0% vs 98.8% in the same countries, with
social_login_attempted at zero on Android). One question: does the Android build offer Google /
social sign-in? Nic — 2 minutes
E. Show the product before the paywall on Android. A free app signup gets setup questions, an example workout, then a price — it never sees the assessment, the placement or the skill tree it is being asked to pay for. Worth ~$150–250/mo at best MODELLED, weakly testable (blended metric, no A/B split, App Store review lag, promo confounds). Do not promise a measurable result.
Every figure on this page traces to a platform's own report, pulled
11 Aug 2026: iOS store → App Store Connect via tools/aso/aso_daily.py · Android store → Play
Console via tools/finance/play_install_reports.py · in-app funnel and the platform split → GA4
property 177471782 via tools/app-analytics/app_funnel_by_platform.py · app revenue →
data_app_proceeds.json (NET, both stores) · ASA spend → Apple Search Ads Campaign Management API v5 via tools/finance/asa_pull.py
(platform own truth) · ASA attribution → AppsFlyer partners_report/v5 and RevenueCat · MRR → canonical_facts.json.
Known-unknowns, stated rather than filled in: ASA CAC and ROAS (cost is now CHECKED; the revenue join is not denominator-matched yet) · the Android organic-vs-paid split (impossible from Play) · any cohort delete rate on iOS · a true sequenced funnel per platform · the April 2026 Play figure of £100.00, which the source file itself contradicts and which is marked UNVERIFIED.
Gates run: growth Skeptic (BLOCK → corrections applied) · Data Verification Officer (BLOCK → corrections applied) · company timeline (DECOMPOSE FIRST — the 2–12 Jul $297 lifetime sale sits inside the 90-day ASA window and the Jun–Jul Android months).