Insights · Process

How to run a UA teardown on your own app: the checklist I use

By Ahmed KhojaApp user acquisition

You can audit your own app's paid UA in an afternoon. Break blended cost out by channel first, then walk every live campaign at ad level with 7 day and 30 day windows side by side, verify the cost column matches each campaign's objective, and tag your confidence on every call. This is the exact weekly checklist I run.

I run paid user acquisition for a GCC fintech app, and this teardown is not a quarterly ceremony. It is my Thursday. Most audits inspect the ads. A useful one interrogates the decisions, because the expensive mistakes in an ad account are almost never bad ads. They are good-looking numbers read the wrong way.

What is a UA teardown, and why run it weekly?

A UA teardown is a structured pass over every live campaign that ends in decisions: kill, keep, scale or hold, each with a reason and a confidence tag attached. Weekly matters because ad accounts drift in days, not quarters. An algorithm can quietly deprioritise a working ad, or a "winner" can saturate, long before a monthly review notices.

A report tells you what happened. A teardown ends with what you will change on Monday.

The cadence I run: pull the MMP by-channel report first for the volume baseline, then walk each channel campaign by campaign at ad level, then the experimental campaigns last, then write the decisions down. The order matters, and the next sections explain why.

Where do you start: the blend or the channels?

Start with the blend, but only to break it. Pull your MMP's by-channel report, compute the blended cost per result, then immediately split it per channel and per OS. A blended figure hides a cheap channel, a mid channel and an expensive one, and every later kill, keep or scale call depends on knowing which is which.

On the account I run, the spread between the cheapest and the most expensive channel was roughly 3x for the same registration in the same market. The blend showed none of it. Until you have the by-channel view open, you are not auditing, you are admiring an average. This is also where most wasted budget hides, which I covered in why GCC apps waste paid media budget.

What are the pre-flight checks before any kill or keep call?

Three checks before every single call: both the 7 day and 30 day windows on screen, the cost-per-result column matched to the campaign's actual objective, and an explicit confidence tag on the decision. They take about a minute per ad and they catch the majority of expensive mistakes, including several of my own.

Both windows, always. The 30 day view smooths, the 7 day view shows direction, and they regularly disagree. On the account I run, a creative family that looked dead on its 30 day numbers had quietly recovered to within range on 7 day. Killing on the long window alone would have binned a comeback. The reverse trap, keeping a decayed ad because its old glory props up the 30 day average, is just as common.

Cost column matches objective. Judge install campaigns on cost per install, in-app event campaigns on cost per event, purchase-optimised campaigns on cost per conversion. Judging an in-app action campaign by CPI hides the actual KPI and flatters the wrong ads. More on choosing the objective itself in app install vs event-optimised campaigns.

Tag your confidence. Every decision gets one of three tags:

TagWhat it meansWhat you do
HighMaths and rules agree, verifiable on screenAct now
MediumData plus judgment, some edge-case doubtAct, note the doubt, revisit next week
BorderlineCould genuinely go either wayDo not act alone. Second opinion, or wait a week

How do you know the algorithm has already decided?

When an ad is drawing under 5% of its campaign's spend, is 4 or more weeks old, and the low spend is the algorithm's allocation rather than your budget cap, the algorithm has decided. Kill cleanly. Even when the ad's own cost per result still looks acceptable, allocation is the verdict.

I learned to trust this the hard way. An ad on the account I run had a perfectly acceptable 30 day cost per result, and the algorithm had still throttled its recent spend to almost nothing. The per-ad number said keep. The allocation said the algorithm had seen something in the auction data that I could not. There is no learning left to preserve at that point, only a slot being wasted.

How do you spot saturation before you scale?

Check frequency before every scale decision, and watch it alongside cost. The saturation signature is unmistakable once you know it: frequency climbing with each budget increase while cost per result rises at the same time. Past that point, new budget buys repeat impressions and more expensive auctions, not new users.

This one cost real money before it taught me. On the account I run, steady weekly budget increases into a small-market campaign looked sensible for a few weeks, then cost per result more than doubled while frequency kept climbing. A percentage-per-week increase is a lever, not a law. It works only while a campaign has frequency headroom.

The fix, when you have overrun it: pull budget back to the last efficient level, hold it there for two to three weeks without touching it, and refresh the creative. To grow past the ceiling, expand the audience or the creative pool. More budget is the one lever that cannot help.

Why should you ignore the last few days of any cost chart?

Because conversion reporting lags spend. The last 2-3 days of any cost chart are systematically inflated: spend books immediately, conversions trickle in for days afterwards. React to the endpoint and you will "fix" a problem that resolves itself by next week, usually by pausing something that was fine.

On iOS the effect is worse, because SKAdNetwork and AdAttributionKit postbacks arrive on Apple's delayed schedule, not yours. When the endpoint of a chart alarms you, note it, and check it again at the next teardown before acting. The full iOS timing story is in SKAdNetwork explained for GCC app marketers.

The full teardown checklist

Run this top to bottom, once a week, same day each week:

  1. Pull the MMP by-channel report, 7 day and 30 day, split by OS. This is your volume and cost baseline.
  2. Compute the blend, then break it. Flag every channel above the blended average.
  3. Walk each channel at ad level, one campaign at a time, in a fixed order so nothing gets skipped.
  4. For every candidate call, verify the cost-per-result column matches the campaign objective.
  5. Read both windows before deciding. Disagreement between 7 day and 30 day is information, not noise.
  6. Check the algorithm's allocation: any ad under 5% of campaign spend and 4 or more weeks old is a kill candidate regardless of its own CPA.
  7. Check frequency and recent budget history before any scale call. Rising frequency plus rising cost means saturated: pull back and refresh creative instead.
  8. Discount the last 2-3 days of every cost chart for reporting lag.
  9. Tag every decision High, Medium or Borderline. Borderline calls get a second opinion or a week's patience.
  10. Write the decisions down with their reasons, and open next week's teardown by checking what last week's calls actually did.

FAQ

How often should I audit my app's user acquisition?

Walk every live campaign at ad level weekly, and do a deeper structural review, objectives, channel mix, attribution setup, roughly quarterly. Weekly is the cadence that catches algorithm deprioritisation and creative fatigue while they are cheap. Quarterly-only auditing means every problem is months old when you find it.

How long does a weekly UA teardown take?

A couple of hours once the routine is set: the MMP pull and blend break first, then the ad-level walk in a fixed channel order, then documentation. The first run takes longer because you are building the fixed order and the baseline. Speed comes from repetition, not from skipping steps.

What data do I need before starting?

An MMP report (Adjust, AppsFlyer or similar) broken out by channel and OS for the baseline, plus ad-level access to each ad platform with 7 day and 30 day windows visible. No spreadsheet gymnastics required. If you have no MMP, you can still walk the platforms, but cross-channel comparisons will be self-reports.

Should I judge campaigns on 7 day or 30 day data?

Both, every time, and treat disagreement as the signal. The 30 day window smooths out noise but hides recent recoveries and recent decay. The 7 day window shows direction but overreacts to small samples. An ad weak on 30 day and improving on 7 day is a different decision from the reverse.

When should I kill an ad that still has an acceptable CPA?

When the algorithm has deprioritised it: under 5% of campaign spend, 4 or more weeks old, low spend driven by allocation rather than your caps. The algorithm sees auction-level data you cannot, and its allocation overrides the per-ad average. Kill cleanly and reuse the slot for a fresh variant.

Can I run a UA teardown without an MMP?

Partially. The ad-level walk, the window checks, the frequency checks and the algorithm-allocation checks all work inside each platform. What you lose is step one: a trustworthy by-channel comparison, because each platform grades its own homework. Even a modest app benefits from an MMP for that single reason.

Want a second pair of eyes on the teardown? I run a free App Growth Review: a short, no-pitch look at your live campaigns, your attribution setup, and where the budget is leaking.

Get a free App Growth Review

Related reading: app install vs event-optimised campaigns, SKAdNetwork explained for GCC app marketers and LTV by channel: why blended CAC lies to you.

About the author — Ahmed Khoja is an app user-acquisition consultant with 10+ years in performance marketing, running paid growth for GCC fintech, marketplace and consumer apps across Meta, Google App campaigns, TikTok and Apple Search Ads, with a focus on MMP-based measurement and attribution.
Get a free App Growth Review