Three reports, one number
Most mornings start the same way. You open three tabs. The first is whatever holds your survey results — usually a spreadsheet, sometimes a dashboard your data team bolted together. The second is the Meta reporting UI. The third is your MMP. Each one tells you how much revenue a channel drove yesterday, and each one tells you a different number. Then you spend the next twenty minutes deciding which lie to repeat in standup.
This is the triangulation ritual, and nobody teaches it because nobody admits to doing it. But if you run growth on a mobile app, you do it. The job is not picking the right report. The job is understanding the specific direction each report is wrong in, so the blend you carry into the meeting is less wrong than any single source.
Each number is wrong in its own direction
Start with the platform number. Meta, and every other self-attributing ad network, reports revenue it has an incentive to claim. View-through is the obvious culprit: a user who saw an ad, never tapped it, and installed three days later off a podcast mention gets booked as a Meta conversion if the impression falls inside the attribution window. The platform is not lying in the legal sense. It is reporting against its own window with its own click-and-view logic, and that logic over-claims. When two platforms both claim the same install, the sum of platform-reported revenue can exceed your actual revenue. That should end the argument about whether platform numbers are ground truth.
The MMP number is wrong in the opposite direction, and more honestly. Your MMP attributes last-click. That is a defensible rule — it is deterministic, it is auditable, it is the same rule applied to everyone. But last-click only sees channels that end in a click it can observe. Paid social, paid search, an attributed deep link: fine. The problem is the channels that do not end in a trackable tap. An influencer says the app name in a video. A podcast host reads it mid-episode. A friend mentions it at dinner. The journey for all three ends the same way: the user types your brand into the App Store search bar, or taps a Google result, or opens the store directly. Last-click books that as organic search, App Store browse, or direct. The influencer who actually drove it gets nothing. The MMP is not over-claiming; it is structurally blind to any channel whose call to action is “go look us up.”
Then the survey number. You ask installs how they heard about you, you take the percentage who said “podcast,” and you multiply it against revenue. This is the only signal in the room that can see the dark channels — the ones that leave no click for the MMP and no impression match for the platform. That is why, after enough mornings, you end up trusting it most. It is also the number people abuse the worst.
Why the survey wins, and what’s broken about how you use it
The survey wins because it asks the one entity that actually knows: the person who installed. It is self-reported attribution, and for influencer, podcast, CTV, and word-of-mouth, it is frequently the only attribution that will ever exist. No postback is coming for those channels. There is no deterministic record to recover. The user’s memory is the record.
But the way most teams use it is broken in two ways, and both are fixable.
First, the raw percentage is not the answer. If 40% of respondents say “podcast,” that is 40% of the people who chose to respond — not 40% of installs. Response rates are not uniform across channels. Someone who heard you on a show they love is more motivated to tell you so than someone who tapped a retargeting ad out of boredom. Multiplying a raw response percentage against total revenue bakes that bias straight into the number you present. The honest move is response-rate-aware: model the non-responders instead of pretending they answer like the responders did.
Second, and this is the structural problem, the survey lives in a spreadsheet disconnected from your install-level data. The percentage floats free. You cannot ask whether the people who said “podcast” actually had higher thirty-day retention. You cannot check whether “TikTok” responders skew toward a worse payer cohort that makes the channel look better by volume than it deserves. You have a channel mix on one side and an install table on the other, and nothing joins them. So the one signal that sees the dark channels gets stranded as a pie chart, useful for a slide and useless for a decision.
The join you actually want
The fix is not a fourth report. Three is already too many. The fix is to stop treating the survey answer as an aggregate and start treating it as a field on the install.
What you want is a row-level join: this install, this user, said “podcast” — sitting next to that user’s MMP last-click attribution, their platform exposure, their retention, their revenue. Once the answer is a column on the install record, the triangulation stops being a morning argument and becomes a query. The platform over-claim, the MMP blind spot, the survey response bias — you can see all three against the same set of users instead of reconciling three aggregates that were computed on three different populations.
Caliper’s approach is to capture the HDYHAU response at the install level and hand it back joined to the install record, so the survey answer lands in the same tables as the rest of your attribution data rather than in a spreadsheet beside them. The triangulation does not go away. But it becomes something you can compute instead of something you guess at before standup.
Caliper is in early access — we're onboarding our first cohort.
Get access