The Business Reality4 min read

63% of my app traffic came from the channel I wasn't investing in

I poured six months into YouTube Shorts. When I finally measured app traffic by source, YouTube was 13% and Threads — which I'd barely touched — was 63%. And the measurement tool already existed; my grep silently lied and I nearly rebuilt the whole thing.

#first-principles#analytics#reality-check#traffic#automation
Concept diagram: left shows the YouTube I invested in at 13% of app traffic, right shows the barely-touched Threads at 63%
The channel I invested in most brought the fewest — and I couldn't see it until I measured.

Six YouTube Shorts channels, a vertical-video render pipeline, weekly token reauths, channel phone verifications. I poured six months into this to bring people to the apps. And I had never once measured, by source, which channel actually drove app visits.

A question first. Do you know, in numbers, which channel actually drives your traffic — or do you believe "the one I invested in most must be working best"? I believed. I was wrong.

The dashboards measured activity, not traffic

All my dashboards measured activity: views, posts shipped, followers. Nobody measured "does this view turn into an app visit." The apps had a GA4 tag (gtag) that was sending data — but no code was reading it. Telemetry that only sends and nobody reads: piling up silently into the void.

So I set out to build a source-by-source traffic reader. And I tripped twice.

grep lied to me

First, to check whether GA4-reading code already existed, I ran:

grep -rlE "runReport|analyticsdata" . --include=*.py

Result: nothing. "No reader — I'll write one." I wrote the whole script, and even prepped an OAuth consent for GA4 access.

But this command didn't find nothing — it never ran. In zsh, the *.py in --include=*.py tries to glob-expand first, finds no match, and dies with no matches found; grep itself never executed. On screen it just looked like empty results. I failed to distinguish an empty result from a dead command.

Digging through my notes, the answer was already there. Another dashboard was already reading GA4, and the token was already issued. I nearly (1) built a duplicate reader and (2) re-did an unnecessary OAuth consent while a valid token sat right there.

Let me stop and ask. What would you do? When grep returns empty, do you say "doesn't exist" and build anew, or check the exit code first? When a search tool shows "not found" and "didn't run" as the same screen, the former is a fact but the latter is a lie.

So what were the real numbers

The reader reused the existing credentials and ran immediately. Last 28 days, all app traffic:

sessions by source (175 total)
  Threads          110   (63%)
  Direct            25   (14%)
  Facebook          14   ( 8%)
  YouTube Shorts    22   (13%)
  Instagram          4   ( 2%)
 
by app
  ddi               128   (73%)
  the other 6 apps   47   (27%)

Six months of YouTube: 13%. The barely-touched Threads (one text bot): 63%. And of thirty-four apps, one (ddi) took 73%.

Digging into the YouTube side hurt more. The Japanese Shorts channel has 14,000 views — and generated twenty-two app sessions. Almost everything leaked on the path from Shorts → profile link → app. The reach (views) was there; the traffic conversion was near zero. The numbers said plainly what I'd refused to see: views are activity, not traffic.

The honest part

This is not a success story. Six sessions a day is small in absolute terms. No channel is a big winner yet. But the relative signal is clear: Threads ≫ YouTube, ddi ≫ the rest. Ignore the relative signal because the absolute is small, and you'll pour another six months into a 13% channel.

And YouTube isn't worthless — brand awareness (people later Googling the name and coming in) can be built there. It's just that on the single axis of direct app traffic it's 13%, and that one fact was invisible until I measured it.

The bottleneck wasn't shipping more content; it was concentrating on the channel and app that work. Before measuring, "make more" felt like the answer. After measuring, "move to where it already works" was.

Three things to check on your own traffic right now:

  1. Have you ever split app traffic by source, or are you only watching views and followers (activity)?
  2. Is there telemetry you only send and never built the reading side for? (Adding gtag ≠ seeing the data.)
  3. When a search tool returns "no results," did you check the exit code to tell an empty result from a dead command?

I wrote up the wiring — telemetry attached but unread — separately, and the same views-vs-outcome trap is in the Threads 53k-views post. Another case of a tool quietly lying is in the diagnostic that hid the bug.

Do one thing now. Pull your app's traffic by source once. The odds that the channel you invested in most isn't #1 are higher than you'd think.

Related