Otter Growth
    Advisory
    Notes
    ArticleSep 202611 min read

    How to audit a subscription funnel from public surfaces only

    Growth is an engine and the drop-off can be anywhere in it: ads, store listing, onboarding, paywall, activation. The five things I find most often, why established best practices simply are not being done, and how to read a funnel from public surfaces alone.

    Michael Berliner
    Michael Berliner
    Product growth advisor & operator

    Growth is an engine, and the drop-off can be anywhere in it: the ads, the app store listing, onboarding, the paywall, activation. The job is working out where it is actually happening and where the most opportunity sits, using a best-practice read of each surface plus the quantitative benchmarks underneath it. Most of the time the answer is not clever: established best practices simply are not being done, and the value is getting every surface up to standard. Below are the five things I find most often, then the order I read a funnel in when there is no analytics access at all.

    A founder had been running paid for eleven months. The Meta SDK had never been installed.

    Zero events in 325 days. Cheap clicks, strong CTR, and no way to know whether any of it had produced a single customer.

    That is not an unusual finding. It is the most common one I make, and it is the one that blocks every other finding behind it.

    The five things I find most often

    Ranked by how often we see them multiplied by how much they move conversion.

    1. The funnel is not instrumented end to end, so nobody can say where the leak is

    Without step-level data, every recommendation is a pattern-based expectation rather than a located leak. That is still worth having, and it is a great deal better than nothing, but it is a different claim and the deliverable should say which one it is making.

    We say it out loud in the doc, per stage, in a section called what we could not see. An audit that quietly implies a measurement nobody took is worse than one that names its own evidence limit.

    2. Paid is optimized to the wrong event, so the account buys installs instead of subscribers

    Cheap clicks and cheap installs look like performance right up until you check what they convert into.

    One app changed its optimization event from "trial started" to "trial not cancelled within two hours" and took install-to-subscription from 2.6% to 8.3%, a 183% ROAS gain (AppAgent). That is a plumbing fix, not a creative one, and it is the single highest-leverage change on this list when it applies.

    3. Each surface is optimized alone, so a win on one gets quietly paid for by another

    The classic shape: a front-funnel proxy metric goes up, the money metric goes down, and the team ships on the proxy.

    One app doubled activation and lost trial starts in the same release, because the redesign moved the paywall later and added a freemium gate at the same time. Activation and monetization are one system. Instrument them as one.

    There is a sharper version of this from our own program work. Across a marketplace seller funnel, every test that made the seller path more prominent on a shared surface bought more leads and lost acceptance downstream. Every test that made an existing step clearer raised both, or raised leads at no acceptance cost. Two clean legs on one engagement, settled on matured data. Read that as a hypothesis prior rather than a law: prominence recruits people earlier than trust does, so the marginal lead is lower intent, while clarity converts people who were already committed. A clarity test is the lower-risk bet.

    4. Nobody knows what healthy looks like, so effort cannot be told apart from progress

    A number on its own is not information. It becomes information sitting next to the category bar.

    Activation rate across 500+ products averages 34%, with a median of 25%, and the working criterion for a good activation event is that users who hit it retain at two times the rate of those who do not. That is Lenny Rachitsky and Yuriy Timen, October 2022, from a self-reported survey, so read it as a bar to orient against rather than as a law.

    5. Tests run in the wrong order: visual first, structure last

    Teams start with the easiest change, which is also the one with the lowest win rate.

    Adapty's 2026 experiment win rates by test type: localization 62.3%, pricing and trial structure 59.6%, plan count and duration 58.7%, and visual and copy 34.6%. These are LTV win rates across thousands of experiments, and Adapty estimates pricing experiments deliver up to 80% uplift against up to 30% for visual.

    The order most teams run is the exact inverse of that table.

    And when there is no analytics access at all

    I have been running abbreviated versions of this from public surfaces only. No account access. No dashboards. The store listing, the signup flow, and whatever pricing shows up before the wall.

    You would be surprised how far that gets you.

    The reason it works is not that public surfaces contain hidden data. It is that a funnel is a sequence of decisions, and each surface shows you which decisions were made deliberately and which ones were inherited. That is diagnosable from the outside, and it is usually where the leak is.

    The order is the method

    Reading these four stages in a different order produces a different, worse answer.

    Start at the paywall and everything upstream looks like context for a conversion problem. Start at the ads and you spend the whole engagement arguing about attribution. Start at the store listing, which costs the least and commits you to nothing, and each stage narrows what the next one could mean.

    The read order for auditing a subscription funnel from public surfaces PUBLIC SURFACES ONLY, NO ACCOUNT ACCESS Read it in this order or every stage looks like the problem
    <circle cx="70" cy="110" r="20" fill="hsl(var(--card))" stroke="hsl(var(--chart-1))" stroke-width="2"/>
    <text x="70" y="116" text-anchor="middle" font-size="15" font-weight="800" fill="hsl(var(--foreground))">1</text>
    <text x="112" y="104" font-size="14" font-weight="800" fill="hsl(var(--foreground))">Store listing</text>
    <text x="112" y="126" font-size="11.5" fill="hsl(var(--muted-foreground))">Cheapest signal about who they think the user is.</text>
    <text x="112" y="144" font-size="11.5" fill="hsl(var(--muted-foreground))">Positioning and a dead merchandising slot, same place.</text>
    
    <circle cx="70" cy="233" r="20" fill="hsl(var(--card))" stroke="hsl(var(--chart-1))" stroke-width="2"/>
    <text x="70" y="239" text-anchor="middle" font-size="15" font-weight="800" fill="hsl(var(--foreground))">2</text>
    <text x="112" y="227" font-size="14" font-weight="800" fill="hsl(var(--foreground))">Onboarding</text>
    <text x="112" y="249" font-size="11.5" fill="hsl(var(--muted-foreground))">Does value land before the ask, and does anything</text>
    <text x="112" y="267" font-size="11.5" fill="hsl(var(--muted-foreground))">durable get captured from people who do not convert.</text>
    
    <circle cx="70" cy="356" r="20" fill="hsl(var(--card))" stroke="hsl(var(--chart-1))" stroke-width="2"/>
    <text x="70" y="362" text-anchor="middle" font-size="15" font-weight="800" fill="hsl(var(--foreground))">3</text>
    <text x="112" y="350" font-size="14" font-weight="800" fill="hsl(var(--foreground))">Paywall</text>
    <text x="112" y="372" font-size="11.5" fill="hsl(var(--muted-foreground))">Placement, plan ladder, trial clarity, defaults.</text>
    <text x="112" y="390" font-size="11.5" fill="hsl(var(--muted-foreground))">Most of what is wrong here is framing, which is cheap.</text>
    
    <circle cx="70" cy="479" r="20" fill="hsl(var(--card))" stroke="hsl(var(--chart-2))" stroke-width="2"/>
    <text x="70" y="485" text-anchor="middle" font-size="15" font-weight="800" fill="hsl(var(--foreground))">4</text>
    <text x="112" y="473" font-size="14" font-weight="800" fill="hsl(var(--foreground))">Paid ads, readiness only</text>
    <text x="112" y="495" font-size="11.5" fill="hsl(var(--muted-foreground))">Are campaigns bidding and reporting to the subscribe</text>
    <text x="112" y="513" font-size="11.5" fill="hsl(var(--muted-foreground))">event or to the install. Most expensive one to get wrong.</text>
    
    Four stages, cheapest signal first. Each one narrows what the next can mean.

    Store listing first

    Not because it matters most. Because it is the cheapest signal about who they think their user is.

    Two things tell you almost everything. If the title defers the job to the subtitle, the team has not settled what the product is for, and that indecision is usually visible again in onboarding and again on the paywall. And if the "What's New" field is generic bug-fix copy on a monthly release cadence, that is a dead merchandising slot: a surface the store gives you for free, in front of people already considering the install, filled with nothing.

    Those are a positioning tell and a wasted slot sitting in the same place, which is why this is stage one. Five minutes, no access, and it frames every question you ask afterward.

    Then onboarding

    The question is not whether it is slick. It is whether value lands before the ask, and whether anything durable gets captured from the people who do not convert.

    Walk it as a customer. Note where each ask sits: account creation, payment, push permission, and where the first real moment of value lands relative to all of them. If an ask lands first, the user is paying a cost against a benefit they have only been promised.

    The second half of that question is the one nobody puts on the board. A beautiful onboarding that collects no identifier from free users means the lifecycle motion has no channel to work with later. Everyone who leaves is gone permanently, not because they disliked the product but because there is no way to reach them. That leak does not show up in a conversion dashboard, because the people it costs you were never counted.

    Then the paywall

    Placement, plan ladder, trial clarity, and what sits near the purchase button.

    Most of what is wrong here is framing and default rather than price. Which is good news. Framing is cheap, it does not touch margin, and it can usually ship in a sprint.

    The specific things I look at: what the plan toggle loads on, whether the annual price is expressed in a unit the user can evaluate quickly, whether the billing date is visible anywhere on the screen, and whether the paywall is placed where the audience still exists. Those four cover most of the gap I find, and none of them require a redesign.

    Paid ads last, and only for readiness

    You cannot judge ad performance from outside. What you can usually tell is whether the account is set up to buy the right thing.

    The question is whether campaigns are bidding and reporting to the subscribe event or to the install. That single distinction is the difference between buying subscribers and buying cheap installs, and it is the most expensive thing on this list to get wrong, because a misconfigured optimization event does not fail loudly. It succeeds at the wrong goal, on budget, for months.

    Everything else about the ads waits for data. This one does not, and it changes what the data would even mean.

    What the numbers add when they arrive

    A week of the app's own numbers will confirm where the leak sits, and it usually re-ranks the fixes rather than replacing them.

    That re-ranking is the part worth waiting for. The public read tells you which stages have unexamined decisions in them. The data tells you which of those stages is carrying the most traffic, and a small problem in a high-traffic stage beats a large problem in a stage almost nobody reaches.

    What the data rarely does is add a fifth stage nobody saw. The leaks are visible from outside. The order of the work is what the numbers decide.

    What a full growth audit actually hands you

    Since this is what I do, here is the shape of it rather than a pitch.

    The body is capped at one to two pages and everything else goes in the appendix. Our goal, a two-to-three sentence read, a rating, "do these now" numbered and grouped by surface, the numbers that matter with one number per metric, and what we could not see, naming the evidence limit per stage.

    The appendix carries the full stage evaluation table with a row per stage, per-stage detail with enough to actually execute, the rest of the backlog, the benchmark table in full form with percentile spreads, publisher, year and read-as caveats intact, and comparables.

    Stages by default are paid ads, store listing, onboarding and paywall. Activation and retention only when scoped.

    The minimal-input version runs from public surfaces alone: vertical, store URL, pricing model, and three benchmark-profile fields. It is a first-class deliverable rather than a fallback, and it states its evidence limit per stage rather than hiding it. That last part is the whole difference between an audit and a guess with a logo on it.

    The takeaway

    Growth is an engine and the drop-off can be anywhere in it. Most of the time the answer is not clever: the established best practices are simply not being done, and the value is getting every surface up to standard.

    You do not need to wait a quarter for a data pull to know where to look. Open the store listing, walk the signup flow as a customer, screenshot the paywall, and ask one question about the ad account.

    Then go get a week of numbers to rank what you found. Diagnosis first, prioritization second, and only the second one needs access.

    Common questions

    Can you audit a growth funnel without analytics access?

    Yes, for the diagnosis. The store listing, the onboarding flow, and the paywall are all public, and together they show which decisions in the funnel were made deliberately and which were inherited. That identifies where the leaks are. What you cannot do from outside is rank them, because ranking depends on how much traffic each stage carries, which is what a week of the app's own numbers gives you.

    What order should you audit a subscription funnel in?

    Store listing, onboarding, paywall, then paid ads. The listing is the cheapest signal about who the team thinks the user is and it frames everything after it. Onboarding shows whether value lands before the ask. The paywall shows framing and defaults. Ads come last and only to check whether campaigns optimize to the subscribe event rather than the install, since actual ad performance is not readable from outside.

    What is the most common leak in a subscription app funnel?

    Onboarding that captures no durable identifier from users who do not convert. It is invisible in conversion reporting, because the people it costs you were never counted as a loss, and it quietly removes the possibility of any lifecycle or win-back motion later. The most expensive leak is different: campaigns optimizing to installs rather than subscriptions, which fails silently and on budget.

    Working on this?

    We help consumer apps and products reach their next phase of growth.

    Growth notes, in your inbox

    New writing on subscription growth and product-led strategy when I have something worth saying. No spam.

    Otter Growth AdvisoryProduct growth for consumer apps and products