
A few weeks ago I wrote about spending $5,674 on ads for my iOS app and shutting all of it off because the math never worked. The short version: it cost me about $114 to acquire a paying customer who was worth about $18.
So I bet the whole thing on the two free channels I already had. This post is about the one that compounded: SEO.
The numbers here are pulled straight from Google Search Console and Google Analytics. Nothing rounded up to look good.
From 7 Clicks a Day to 100
Ninety days ago, GainFrame was getting about 7 organic clicks a day from Google. This week it is doing 90 to 108 a day (that's the chart above — clicks in green, impressions behind them).
Over the full 90 days that adds up to 2.16K clicks and 107K impressions, at an average position of 10.4. A year ago this site was basically a privacy policy with a download button. Now the blog is the single biggest thing bringing new people to the app.
The important part isn't the peak. It's the shape. Paid ads gave me a spike I had to keep paying for. This is a line that keeps climbing after I stop touching it, because the posts I wrote in April are still ranking in July.
The Posts That Brought Traffic
Not all content is equal. It wasn't close. The posts pulling real traffic all have the same shape: roundups and comparisons for people who are already shopping.
Here are my top organic pages over the last 28 days:
| Page | Clicks (28d) | CTR | Avg position |
|---|---|---|---|
| "Best AI body fat apps" roundup | 318 | 6.3% | 5.8 |
| "Best body transformation apps" roundup | 166 | 2.3% | 6.5 |
| "AI body editors vs real analysis" comparison | 57 | 2.0% | 10.5 |
| Free body-fat-from-photo tool | 38 | 6.1% | 10.0 |
| "Best free progress photo apps" roundup | 35 | 2.7% | 7.3 |
Every one of them targets someone at the bottom of the funnel. A person Googling "best AI body fat apps" has already decided they want an app like mine. They are comparing options. I just need to be one of the options on the page, honestly described, and some of them click through and download.
That is a completely different reader than someone typing "what is a good body fat percentage." That person wants a number, not an app.
I also stopped being precious about mentioning competitors. My best posts list five or six apps, including ones better than mine at specific things, and put GainFrame in honestly. Trying to pretend the alternatives don't exist just makes the post useless to the person reading it, and Google can tell.
The Posts That Didn't
The flip side: the "helpful, educational" posts I was proud of barely move anyone.
Look at these two pages. They get almost identical impressions. One sends 24 times the traffic of the other.

Two things are killing the informational post. First, it's stuck on page four (position 37), so most of those impressions are people who never scroll far enough to see it. Second, even the ones who do see it don't need to click. The answer is a chart. Google shows it right in the results, or an AI summary reads it out loud, and the reader is done.
That's the trap with purely informational content in 2026. You can "rank" and still get nothing, because the click never happens. So impressions on their own stopped meaning much to me. I started watching clicks instead.
I haven't deleted those posts. They build topical authority and they occasionally get quoted by AI tools, which matters more than it used to. But I stopped writing new ones expecting traffic, and I put my writing time into comparison posts instead.
The Channel I Couldn't Buy
Here's the part I did not see coming. When I broke my website traffic down by source, ChatGPT was sending me more visitors than TikTok.

Over 90 days: Google sent 2,486 sessions, Reddit 711, ChatGPT 580, TikTok 301, Claude 59, with Perplexity and Copilot trailing behind. People are asking ChatGPT "what's the best app to track body fat from a photo," it's naming GainFrame, and they're clicking through.
One honest caveat, because I got tripped up by it. Analytics has a built-in "AI Assistant" channel, and it told me AI sent me 66 sessions. That number is badly wrong — it misses most AI referrers and buckets them as direct or referral. When I looked at the actual source, ChatGPT alone was 580. If you're measuring this, don't trust the pre-built channel. Look at the raw referrer.
The wild thing about this channel is you can't buy it. There's no ad slot inside a ChatGPT answer. The only way in is to write something clear and genuinely useful enough that the model decides to cite you. The same honest comparison posts that rank on Google are what get me quoted by the assistants. (I wrote up how that works separately.)
The Part Where It All Fell Apart
This did not go up in a straight line. You can see the crater in the middle of that first chart.
Right after I killed paid ads and went all-in on organic, both free channels collapsed in the same week. A Google core update hit my blog and my average position slid from around 8 to the high teens and low twenties. At the same time I'm fairly sure I got shadowbanned on TikTok. Clicks fell back to about 5 a day. It felt like I'd quit paid at the exact wrong moment.
I didn't post more. I posted better. I went back through the posts that dropped and rewrote them to actually answer the question in the search, tightened the titles to match how people phrase things, and cut the fluff intros that pushed the answer below the fold. Within about two weeks the rankings recovered, and then they kept going past where they'd been.
The lesson I took: a ranking drop is feedback, not a death sentence. The recovery came from making the pages better for the reader, which is the same thing Google says it wants and, annoyingly, actually seems to mean.
What It Did to the Business
Traffic only matters if it turns into something. Here's the honest state of things, pulled straight from RevenueCat:
- $845 MRR, up from $0 in March — about $10K ARR
- 179 active subscriptions and 29 people on trial, up from 100 subs in mid-May (+79 in about seven weeks)
- $2,460 collected in the last 28 days, from 928 new downloads and about 1,280 active users
- Weekly churn back to 3.5%, after a spike to ~9% during the crater
- Realized LTV per paying customer up to roughly $25–30, from $18 during the paid-ads era

All of that with zero paid spend behind it since mid-May. You can check the live numbers here: RevenueCat verified — GainFrame.
One number I'm deliberately not celebrating yet: trial-to-paid conversion. A few recent cohorts came in well above my ~26% lifetime average, which would be great if it holds. But those cohorts are too young to trust — half the trials haven't resolved yet, so I'll believe it in a couple of weeks, not today. Getting excited about immature cohorts is how you lie to yourself.
It's a small business. But it grew about 30% in the last month on channels I own, and it isn't setting money on fire to do it.
What I'd Do Again
If you're an indie dev staring at a flat traffic graph, here's the compressed version of what worked, in order:
-
Write for people who are already shopping. "Best [category] apps" and "[competitor] vs [competitor]" posts convert. "What is [concept]" posts mostly don't. Bottom-of-funnel first.
-
List your competitors honestly, including the ones that beat you. A useful roundup ranks and gets cited. A thinly-veiled ad for your own app does neither.
-
Watch clicks, not impressions. A page with 4,000 impressions and 13 clicks is not "almost there." It's in the wrong game. Check Search Console for pages with impressions but no clicks and either fix the intent or let them go.
-
Treat a ranking drop as an edit note. When a page falls, rewrite it to answer the query better instead of blasting out new posts. Recovery beats replacement.
-
Measure AI referrers by raw source, not the pre-built channel. ChatGPT and Claude are already a real channel. Your analytics tool is probably hiding most of it.
-
Give it time. The posts doing the most work today were written months ago. Nothing here happened in week one.
It's a small business but it's growing on its own now. Ads stopped the day I stopped paying. The posts I wrote back in April are still working months later — that's the part I didn't expect.
Track your progress with GainFrame
Take or import a gym photo and get an AI body fat estimate, physique score, FFMI, and per-muscle breakdown, plus a Coach that explains what actually changed using your photos, weight, and workouts. Free to start, no account required.
Download GainFrame Free