How to measure what your app ads really add, without an MMP

Measure what your app ads add on top of organic, without an MMP: a baseline from days without ads, on/off tests, geo holdouts and Meta Conversion Lift.

Key takeaways

  • Incrementality is what your ads add on top of what would have happened anyway. Attribution says who touched an ad. Incrementality says what the ad changed.
  • You can measure it without an MMP: learn your app's normal level of new paying customers from days without ads, then count what arrives above it on days with ads.
  • On/off tests and geo holdouts make the comparison cleaner. Meta's Conversion Lift randomizes people, but it needs enough spend.
  • Seasonality, releases, store features and campaigns that never pause can fool every method. Plan around them.
  • Value the extra customers at what they actually pay, after the store's cut, before you compare them with spend.

What incrementality means

Incrementality is the difference your ads make: the customers and revenue you got because the ads ran, minus what you would have had without them. It answers "what did the ad change?", not "who saw an ad before buying?".

Attribution answers the second question. It is the job of an MMP, a mobile measurement partner, and of each ad network's own reporting: tie installs and purchases to ads. It cannot tell you whether those people would have found your app anyway. Meta itself calls incrementality experiments such as its Conversion Lift "the gold standard in measurement" (Meta).

You do not need an MMP to measure incrementality. You need daily spend per network, daily new paying customers, and a fair estimate of what those customers would have been without ads. The ad networks give you the spend. RevenueCat or the stores' own reports give you the customers.

Start with a baseline from days without ads

The simplest method compares days with ads to days without them. Your app's new paying customers on quiet days are its baseline, the level it reaches on its own, and on days with ads anything above the baseline is what the ads added.

  1. Export two daily series. Total ad spend across every network, and new paying customers or trial starts from RevenueCat or the stores, on the same time zone.
  2. Mark the quiet days. A quiet day has no paid spend at all. Skip the day or two after spend stops, because some people install a day or two after they see an ad.
  3. Build the baseline. Average the quiet days by weekday if you have enough of them, since most apps sell more on some weekdays than others.
  4. Subtract. On each day with spend, take the actual count minus that weekday's baseline, and add up the differences.
  5. Value the extra customers. Multiply by what a new paying customer pays you in a year after the store's cut, from your own cohorts.
  6. Compare with spend. Spend divided by the extra customers is your real cost per payer. Their value divided by spend is your incremental return.

Count payers rather than installs if you can. A campaign that buys cheap installs who never pay shows a lift in installs and none in payers. With long trials, use trial starts as the early signal and check payers a trial length later.

A spreadsheet example

In this fictional example, a week of ads added 66 paying customers above the baseline, while Ads Manager reported 90 purchases. The app had one week without ads and then one week with $600 a day of spend, and the first week sets the baseline, matched by weekday.

One quiet week, one week with ads (fictional)
DayWeek 1 payers, no adsWeek 2 spendWeek 2 payersAbove baseline
Mon18$600279
Tue17$600269
Wed19$6002910
Thu18$600279
Fri21$600309
Sat25$6003611
Sun24$600339
Total142$4,20020866

So the ads added about 66 payers for $4,200, or about $64 each. Ads Manager's 90 purchases work out at about $47 each, partly because attribution also credits people who would have paid anyway.

Now value them. If a new payer brings in $70 in the first year after the store's cut, the 66 extra payers are worth $4,620, or 1.10× the spend: just above break-even. Valued on Ads Manager's 90 purchases, the same campaign would look like 1.50×.

In a spreadsheet, the method comes down to three formulas, with one row per day:

Spreadsheetquiet day = no spend today, yesterday or the day before baseline = average payers on quiet days with the same weekday added = payers − baseline, on days with spend

One week of quiet days is a thin baseline. Three or four weeks give a steadier one. As a rule of thumb, if the lift is smaller than the normal day-to-day swing on quiet days, call it no measurable lift rather than a result.

On/off tests

An on/off test creates quiet days on purpose. You pause one network for a set period, or switch it on after a pause, and compare new payers with the weeks around it.

  1. Pick one network and a period. One to two weeks covers every weekday and most trial lengths.
  2. Hold everything else steady. No price changes, releases or new campaigns during the test or the weeks you compare it with.
  3. Compare. Payers during the pause against the weeks before and after, matched by weekday.

The cost is the customers the paused network would have brought. A cheaper variant is a budget step: move one network's budget up or down by a third for a week, and read the change in payers against the change in spend.

Geo holdouts

A geo holdout runs ads in some regions and holds others back, then compares how each group changed. It removes much of the seasonality that fools a before-and-after comparison, because both groups live through the same weeks.

You need revenue by country or region, which RevenueCat and the stores provide, and enough similar markets to split. Pick groups that moved together before the test, run it for at least a few weeks, and compare the change in the test group with the change in the holdout. GeoLift, an open-source R package published on Meta's GitHub, does the matching and the statistics with synthetic control methods (GeoLift). Its documentation says it is not a Meta product (GeoLift docs).

Meta Conversion Lift

Conversion Lift is Meta's own randomized test. Meta divides a campaign's intended audience at random into a test group that can see the ads and a holdout group that cannot, then compares their conversions (Meta).

Randomizing people makes it the cleanest of these methods, but it comes with conditions. It is open to advertisers who meet minimum spend requirements, and Meta recommends a budget of at least $5,000 and a test of at least 28 days (Meta). Your app events must reach Meta, through its SDK or a server integration such as RevenueCat's. And it measures Meta only.

TikTok offers a similar Conversion Lift Study, including for app installs, as a managed service for eligible accounts (TikTok).

Four ways to measure what ads add
MethodWhat it needsWhat it costsBest for
Baseline from quiet daysDaily payers and spend, some days without adsNothing extraA running read of all paid spend
On/off testFreedom to pause or step one networkThe sales the pause gives upOne network's total effect
Geo holdoutRevenue by region, several similar marketsSales in the holdout regionsA network or campaign, with seasonality removed
Meta Conversion LiftSpend above Meta's minimum, app events sent to MetaReach lost to the holdoutMeta campaigns, measured on people

The pitfalls

Every method compares days with ads against an estimate of what would have happened without them, so anything else that moves that estimate fools it. These are the usual culprits.

Seasonality and trends

Demand moves with the calendar: New Year resolutions, holidays, school terms, summer. If your quiet days fell in a slow month and your ads ran in a busy one, the ads get credit for the season. Use recent quiet days, match weekdays and, where you can, use countries without ads as a check. If they rose too, part of the lift is the season.

Always-on campaigns with no quiet days

If ads have run every day for months, there is no recent baseline at all, and quiet days from a year ago describe a different app. Create some variation: pause for a few days, cut the budget by a third for a week, or leave one country without ads.

Launches, releases and store features

A new version, a price change, a paywall test or an App Store feature can lift payers on the same days you raise spend. Write down the date of every change, and leave those days out of the comparison or read them on their own.

Organic halo

Ads also send people to the store who install later through search. A baseline counts that halo as part of the lift, which is right, since the ads caused it, while attribution usually misses it. If you also run Apple Ads, the new name of Apple Search Ads since April 2025 (Apple), it can take credit for searches your other ads created.

The lag between install and payment

With a trial, payers arrive a trial length after the installs that produced them. Compare payers with the spend from a trial length earlier, or use trial starts as the early signal.

When each method fails

No method works everywhere, and each one fails in a way you can spot.

  • A baseline from quiet days fails when there are no recent quiet days, when quiet days and ad days fall in different seasons, or when something else changed at the same time.
  • An on/off test fails when it is shorter than your trial, when another change lands during the test, or when the effect is smaller than the normal daily swing.
  • A geo holdout fails when only one or two countries bring real volume, when people in holdout regions still see the ads, or when a local holiday or store feature hits one group.
  • Conversion Lift fails when spend is below Meta's minimum, when too few events reach Meta, or when you need an answer for more than Meta.

When two methods disagree, trust the one whose assumptions held best during the test, and run another test before you move a large budget.

How INTARC does this

INTARC runs the baseline method every day from read-only keys, with no SDK and no MMP. It learns each app's normal level of new paying customers from days without ads, credits each campaign with the customers above that level on the days it spends, values them at what they actually paid, and says so when there are too few quiet days to tell. You can look around the demo or create an account to run it on your own apps.

Frequently asked questions

Do I need an MMP to measure incrementality?

No. An MMP attributes installs to ads, but incrementality needs a comparison with what would have happened without the ads. Daily spend from the ad networks and daily paying customers from RevenueCat or the stores are enough for a baseline or a holdout test.

How many days without ads do I need?

More is better. A few weeks of quiet days, spread across every weekday and close in time to the days you are measuring, give a usable baseline. A handful of quiet days from long ago does not.

What if my campaigns never stop?

Then there is no baseline to learn from. Pause for a few days, cut the budget by a third for a week, or hold one country back. Any of these creates the variation the comparison needs.

Why is the incremental number usually lower than Ads Manager's?

Attribution credits conversions that follow an ad within the window, including people who would have bought anyway, while incrementality counts only the difference the ads made. It can come out higher when ads drive searches and installs that attribution misses.

Is Meta Conversion Lift better than a geo test?

For Meta campaigns it is cleaner, because it randomizes people rather than regions. A geo test works for any network and does not need events sent to Meta, but it needs several comparable markets.

Ad platform programs and their requirements change often. We checked every linked source on November 9, 2026. Examples use fictional apps and numbers.