Supermartech
Ad Measurement
Measuring Ad Effectiveness Part 4

One install, three winners. The ad industry hired a referee.

Last post, the pizza shop owner hit a wall. A randomized controlled trial (RCT) is the cleanest way to measure what an ad actually did, but in the real ad world, actually running the clean version is hard. An RCT splits users randomly into an ad group and a no-ad group and compares the result. We saw that even inside a single ad platform, there are at least four classic ways RCT breaks in Post 3, "Honestly, even the platform doesn't know your ad's real impact".

But a real advertiser doesn't run on one platform. Three or four platforms is the baseline, and running ten or more at the same time is common. A single user sees ads across multiple platforms before they install, and it happens constantly. You see an ad for a pizza shop in your social feed, you search the shop's name later, you tap a search ad that pops up, you install. Now social and search both had a hand in that one install. The question "which ad gets credit for this install?" is suddenly several times harder than it was on a single-platform setup.

I mentioned at the end of the last post that the industry eventually gave up on finding "the perfect answer" and brought in a shared referee that applies the same rules to everyone. That referee is called the Mobile Measurement Partner (MMP). This post is a bottom-up walk through why the MMP showed up in ad land, what it actually does, and the rules it uses to decide which install belongs to whom.

Open the dashboards, every platform says it's theirs

The pizza shop has a mobile app for takeout orders. The install campaign started working, so this quarter the owner scaled from one platform to four: AppLovin, TikTok, Pinterest, Snapchat. Curious how last week went, she opened each dashboard one by one.

AppLovin dashboard: "We drove 150 installs last week." TikTok dashboard: "142 installs." Pinterest dashboard: "89 installs." Snapchat dashboard: "67 installs."

Add them up and you get 448 installs. Then she opened the Apple App Store and Google Play dashboards and checked total installs for the week. 180.

Sum of platform dashboards (with overlap) 448 AppLovin 150 TikTok 142 Pinterest 89 Snapchat 67 − 268 (double-counted) 180 Actual app installs (store totals) Same install counted ~2.5 times on average

So what happened? Did the platforms lie? Did the owner mis-count? Neither. Each one counted correctly from its own point of view. It's just that when you add them up, the same install gets counted multiple times.

This "same install counted multiple times" thing isn't just her problem. It's how the whole industry runs. If you overlay platform reports with neutral tallies, somewhere between 10 and 20 percent of installs show up as double claims, where two or more platforms counted the same install. One or two out of every ten installs is a duplicate claim between platforms. Advertiser surveys echo the same shape. Branch's 2025 State of App Growth report found that fewer than one in five marketers (18%) said they could confidently point to which platform drove a given install.

This is just how the plumbing is wired.

Why does this double-counting happen in the first place? Each platform only has data about users who saw ads on its own platform. It has no visibility into what other platforms showed that user. Platforms hold their data tight and don't share it. In ad-industry shorthand, each platform's "I only see my side, I can't see outside" bubble is called a walled garden.

The result is this. If a user touched ads on several platforms before installing, every one of those platforms logs "this user saw my ad, so this install is mine." From any single platform's view, the fact that the user saw their ad is a real event. They have no way to know the user also saw ads elsewhere. So the same install ends up getting claimed by multiple platforms.

One quick term. Each time a user sees an ad (a view, or impression) or clicks one, the industry calls that single contact a touchpoint. You'll see this word a lot below.

Say a customer "Alex" installed the pizza shop's app.

  • Monday (touchpoint 1): Alex taps a social feed ad (pizza shop ad)
  • Wednesday (touchpoint 2): Alex taps a search ad (pizza shop ad)
  • Thursday: Alex downloads the pizza shop app

Whose install is this? Both platforms log it as theirs. Each platform only knows about touchpoints inside its own walls. From social's view, "Alex clicked my ad on Monday and installed Thursday." From search's view, "Alex clicked my ad on Wednesday and installed the next day." Neither is wrong. Each is reporting a real touchpoint it actually saw. But from the owner's view, Alex is one person and the install is one event. Sum the platform numbers and that one install got counted twice.

Walled gardens: each one sees only its side Social platform wall Mon, Alex clicks social ad (seen on my platform) "Alex's install is mine!" Search platform wall Wed, Alex clicks search ad (seen on my platform) "Alex's install is mine!" Touchpoints on the other platform are invisible to each one. Owner's view: one Alex, one install, counted twice

Imagine the same thing in a department store. Three sales associates helped the same customer at different moments. Associate A greeted them at the entrance. Associate B walked them through the product. Associate C rang them up. When the customer buys, all three log "I closed this deal" on their own performance report. Nobody lied. Each really did help. But if the store manager stacks the three reports together, the same single sale shows up three times. With no neutral referee saying "whose win is this, really," each associate claims their own.

Department store analogy: 1 customer, 3 reports Associate A Greeted at entrance "I closed it" Associate B Walked through product "I closed it" Associate C Rang them up "I closed it" Store manager Receives 3 reports Actual sale: 1. Reports: 3.

Ad land is exactly this. Each platform logs any install where its own touchpoint was in the picture as its own win. Run three or four platforms, and if you just sum the dashboard numbers, the more a single user crosses multiple platforms' ads, the more the real install count can be inflated by 2 to 3x. On the owner's dashboards, 1 real install can look like 2 or 3 across platforms. Looking at your own numbers alone, you genuinely can't tell who did what.

And so a referee showed up (MMP)

This mess hit the industry in the early 2010s. A few years after the iPhone, Android was scaling fast and app advertising was exploding. Advertisers like the owner couldn't answer two basic questions. One, "I'm running three or four platforms and they all claim my installs, so how many of my installs actually came from ads?" (Total installs are right there on the store dashboard. The question is how the ad-driven slice splits across platforms.) Two, "So which platforms should I spend more on, and which should I spend less on?" Neither question had an answer from the platform dashboards alone. The 448-vs-180 situation above was a daily thing.

To fill that gap, a shared referee showed up. It sits between the platforms, collects touchpoint and install data from all of them, applies the same rules to everyone to strip duplicates, and decides "this install belongs to this ad from this platform."

448 → MMP → 180: the referee strips duplicates Platform dashboards (overlap) Snapchat 67 Pinterest 89 TikTok 142 AppLovin 150 Sum 448 MMP 1. Merge four streams 2. Attribution MMP total 180 matches actual install count Even if the same user touched every platform's ads, the MMP gives the install to exactly one platform. So the sum lines up with the actual install count (180).

The act of deciding which platform's ad gets credit for an install is called attribution. The share each install hands to a given platform ("this install goes to social," "this one goes to search") is called contribution. When I say the referee "makes a ruling" in this post, I mean attribution. (In real operations the split goes further than platform. It gets allocated down to campaign and ad level too. I'll keep it at platform level here to stay readable.)

The businesses that play this referee role are called Mobile Measurement Partners (MMPs). The industry also calls them attribution tools or Mobile Attribution Platforms (MAPs), but the thing they describe is the same. I'll stick with MMP, which is the most common name.

The current market has several MMPs. The incumbent AppsFlyer and the challenger Airbridge show up most often. Players like Adjust and Branch are in the mix too.

I'm not going to argue which MMP is better. (Honestly, I don't know.) The point here is why the category exists. Since the early 2010s, running at least one MMP has become a near-universal baseline for any mobile advertiser running on multiple platforms. Every platform dashboard is inflated from its own point of view, so you can't just believe each one in isolation and run ads sensibly. Both advertisers and platforms needed one number everyone can agree on, and MMPs are the setup that fills that role today.

What the referee actually does (focused on ad measurement)

Here's what the referee actually does in ad measurement, in four steps. MMPs also handle things like deep linking (the feature that sends a user straight to a specific screen inside your app), but that's outside this post.

Step 1. SDK, the in-app reporter

The app developer embeds a small piece of code the MMP provides into the app. It's called an SDK (Software Development Kit). Think of it as a reporter that lives inside the app. When a user opens the app, the SDK reports "the app opened." When the user pays, "payment happened." When the user clears a level, "level complete."

Without an MMP, you'd have to drop one SDK per platform into the app. Ten platforms, ten SDKs. Every time something happens in the app (an install, a payment, a level completion), those ten SDKs each fire the same signal off to their own platform. On top of that, the data each SDK collects only flows back to the platform that owns it. The advertiser ends up with separate numbers from every platform, and even if you tried to brute-force sum those numbers, the cross-platform duplicate problem we just saw stays right there. One MMP SDK that consolidates every platform's data is the industry standard for exactly this reason.

Step 2. Logging ad touchpoints (the man in the middle)

When a user sees an ad, goes to the app store, and installs, the app itself only knows "somebody installed me." The ad they saw isn't passed along. The ad platform doesn't know whether the user it showed the ad to ever installed either. The link between ad touchpoint and install is broken.

The MMP fills that broken link by pre-logging every ad contact to the MMP server the moment it happens. If a user clicks an ad, the link doesn't go straight to the app store, it passes through the MMP server first. In that beat, the MMP logs "this user tapped this platform's ad at this time." From the user's end it just feels like tapping an ad opened the app store, that brief instant. If a user only sees the ad (a view), it works the same way, impression data makes its way to the MMP and gets logged.

Once that record exists, when the user later installs and opens the app, the MMP can reach back and say, "ah, this user is the follow-through from that logged touchpoint."

Step 3. Linking the user who saw the ad outside the app to the user inside the app

When the user installs and does a first launch, the SDK fires. It sends "I just opened for the first time" to the MMP. The MMP takes that signal and looks through recently logged touchpoints to find the ones that match "which ads did this user who just opened the app touch" (how far back "recent" goes is covered later under attribution window). This step is linking the user who saw ads outside the app to the user inside the app.

Linking the outside-the-app ad view to the inside-the-app user usually happens in one of two ways.

One, matching on ADID (Advertising ID). The cleanest method. An ADID is a device-level unique identifier assigned for advertising purposes. On iOS it's IDFA (Identifier for Advertisers), Apple's advertising identifier. On Android it's GAID (Google Advertising ID), Google's version. When a touchpoint happens, the MMP logs this ID. After install, it compares the ID the SDK sends and matches 1-to-1.

Two, fingerprinting. The fallback when no ADID is available. The MMP combines a bunch of signals: IP address (the device's internet-facing address), device type (iPhone 15 vs Galaxy S24), operating system (iOS vs Android), browser, time of touchpoint, and so on, and estimates "the device with this combination is probably the same user." It leans on the fact that this combination is nearly unique per device. The accuracy is better than you might think. The probability that two users have the exact same combination of device characteristics in the exact same time window is pretty low. It doesn't have the certainty of a 1-to-1 ADID match, but it's statistically trustworthy.

The ATT popup that fires right after install on iOS Allow "PizzaShop" to track your activity across other companies' apps and websites? Ask App Not to Track Allow

Step 4. Apply the rule and tell everyone (postback)

If multiple touchpoints match (the user went through three platforms' ads), the MMP decides the winner using its rule. What rules exist, and why the current rule became the industry standard, is the next section. For now, just know "it runs one rule and gives the credit to one platform."

Once the winner is decided, the MMP automatically pings that platform's server with "this install is yours." That ping is called a postback. The platform takes that postback and updates its dashboard and its ad-serving algorithm (the logic the platform uses to decide "which users should see this ad more often").

Example. The platform's algorithm served ads to users A, B, and C. Then a postback comes in saying "A installed." The algorithm then learns A's characteristics (age, interests, etc.) and decides, "when I see users like A, I should serve this ad more." Pile up millions of these postbacks and the platform gradually shifts how it allocates impressions. So every single MMP ruling has real downstream weight on the platform side. If the referee misjudges, the platform's algorithm trains in the wrong direction.

As we saw in Step 1, since most setups use a single MMP SDK that replaces individual platform measurement SDKs, from the platform's view, without the postback, it can't even tell if the user it served an ad to ever installed, paid, or cleared a level. The industry calls these user actions that advertisers care about conversions, and "install" in this post is one example. Inside an app that uses an MMP, the platform has no way to track user behavior directly. So the postback is close to the entire training signal the platform's algorithm has. On top of that, as we touched on earlier, the postback count a platform wins is exactly what gets used as the basis for ad billing. So this is a very important number on the platform side.

How the MMP works (outside app → inside app) Outside the app (1) Ad touchpoint User clicks an ad (or sees it) (2) MMP server logs who touched which ad and when (3) App store User downloads and installs the app install done Inside the app (4) SDK first launch App sends "I opened" signal to the MMP (5) MMP match In-app signal ↔ outside touchpoint pairing (6) Rule picks winner Attribution rule picks 1 platform (7) Postback to winner

What the MMP dashboard shows you

The per-platform install count on the MMP dashboard is the count of installs that won credit under the referee's attribution rule. Even if the same user touched three platforms' ads, the MMP gives that install to exactly one platform in its view. Duplicates are stripped. As we saw, the MMP pulls every in-app install record through its SDK, and every outside-app touchpoint through platform integrations. In ad measurement, the MMP is basically the only one that sees both sides across walled gardens.

So if the owner's actual installs are 180, her MMP dashboard would look like:

  • Social platform A: 75 installs
  • Search platform B: 60 installs
  • Video platform C: 30 installs
  • Messenger platform D: 15 installs
  • (Total: 180, matches the actual install count)

Meanwhile each platform dashboard counts every install with any of its own touchpoints as fully its own, so you get AppLovin 150, TikTok 142, Pinterest 89, Snapchat 67 (sum 448) like we saw. The gap between the MMP number and the platform's own number is usually 10 to 30 percent, and the gap widens the more the platforms target the same user segment (say, young women). Low-overlap campaigns show small gaps, high-overlap campaigns show big ones. That gap is the design, not a bug. The platform side sums every install its touchpoints graced, and the referee merges all that data and applies its attribution rule to produce a neutral de-duplicated count. The two have to differ.

MMP dashboard vs each platform dashboard MMP total (de-duplicated) Assigns to one platform 15 Snap 30 Pin 60 TikTok 75 AppL Sum 180 ✓ Each platform's claim (overlap) Every grazed install counted as mine 180 line 67 Snap 89 Pin 142 TikTok 150 AppL Sum 448 (overlap) Same four platforms (same colors), counted two different ways

The rules the referee uses: last-touch and beyond

How the referee rules on credit is the single most important design choice in ad measurement. Change the rule and the per-platform performance numbers flip. Those numbers are also what platforms get paid on, so changing the rule shakes platform revenue itself. The advertiser side wobbles too. For the same 1 install, a rule that gives everything to "the platform that pulled the user in last" hands the win to one platform, and a rule that gives everything to "the platform that first put the brand in their head" hands it to a completely different one. The whole result flips. From the advertiser's side, "which platform should I spend more on?" flips with the rule.

The default rule MMPs use, last-touch attribution, assigns credit to the platform of the final touchpoint before install.

Say customer "Lia":

  • Monday morning: Lia clicks a social feed ad
  • Monday evening: Lia clicks an ad on a different social platform
  • Tuesday: Lia clicks a search ad
  • Wednesday: Lia downloads the pizza shop app

Under last-touch, the final touchpoint is Tuesday's search ad, so search takes the credit. The social platforms get nothing. Monday's two social touchpoints are still logged inside the MMP, but they don't show up in the counted install numbers. Just a log entry, nothing more.

Lia's touchpoint timeline (last-touch) Social Mon AM ✗ logged only (credit 0) Social Mon PM ✗ logged only (credit 0) Search Tuesday ✓ takes 1 credit (last before install) Install Wednesday install happens Last-touch = the final touchpoint before install takes all the credit Monday's two social touchpoints are logged in the MMP but don't show up in the counts
Attribution window (7-day click default) 7-day click window -10 days -7 days conversion day click ✗ excluded (10 days back) click ✓ Mon AM social click ✓ Mon PM social click ✓ Tue search conv.

Why did last-touch become the default rule? Operationally, it's trivially simple. Sort the matched touchpoints by time, grab the last one. Even at millions of installs, the compute cost stays much lighter than any other rule. And it's intuitive. "The ad the user actually clicked at the end gets the credit." That framing has the least resistance from everyone sitting at the table.

But last-touch isn't the only rule. There are others.

  • First-touch: the first touchpoint takes all the credit. (For Lia, Monday morning's social click takes everything.)
  • Linear: every touchpoint gets equal credit. (For Lia, 1/3 Monday AM social, 1/3 Monday PM social, 1/3 Tuesday search.)
  • Time-decay: touchpoints closer to conversion get bigger weight. (For Lia, Tuesday search gets the max, Monday AM social the min.)
  • Position-based (U-shape): first and last get 40% each, the middle shares the remaining 20%.
  • Data-driven: machine learning looks at which touchpoint combinations historically produced installs and allocates credit automatically. On the web analytics side, Google Analytics 4 uses this as its default.
Same Lia scenario, different rules, different splits Three bars per panel = Lia's three touchpoints. Bar height = credit given to that touchpoint. Mon AM social Mon PM social Tue search (last) Last-touch Last one takes all 0 0 1.0 First-touch First one takes all 1.0 0 0 Linear Three equal shares 1/3 1/3 1/3 Time-decay Closer = bigger 0.1 0.3 0.6 Position-based Big ends, small middle 0.4 0.2 0.4 Data-driven Model learns (example) 0.34 0.19 0.47

Which rule you use flips which platform looks like it "did well." To see why, you need the concept of a funnel. The flow a user walks through, "I need something" to "let me figure out what's good" to "I'll buy this," is called a funnel (shaped like one, hence the name). Which platform sits at the top, middle, or bottom of that funnel decides who wins or loses under any given rule.

It varies by ad, but a rough example: search ads usually get clicked after the user already has a specific intent in their head, like "let me find a pizza place." You have to know what you're searching for to search. So search tends to sit at the bottom of the funnel (right before the decision). Under last-touch, search ends up as the last touchpoint a disproportionate amount of the time, so it harvests a lot of credit.

By contrast, social and video ads often live where a user first learns the pizza shop even exists. Top of the funnel (where interest begins). Under last-touch, these ads are "not the last touchpoint," so they get almost nothing.

Take the same last-touch result and re-score it under first-touch and it flips. Social and video get everything, search gets almost nothing. One rule change, and the advertiser's "where should I spend more?" and the platform's own revenue reconciliation both get rewritten.

Funnel position + rule = who gets credit Last-touch rule Social / Video (awareness) (consideration) Search 1 credit Bottom search takes it (top social gets 0) First-touch rule Social / Video (awareness) (consideration) Search 1 credit Top social takes it (bottom search gets 0) Same campaign, the "winning platform" flips with the rule → advertiser budget reshuffles, platform billing flips too

You might think, "fine, so the advertiser just picks whichever rule favors them and runs with it." Reality doesn't work that way. Rule selection isn't something an advertiser can decide alone. As you've probably noticed, there are plenty of platforms (mostly top-of-funnel ones) that get the short end of last-touch today. But that unfairness is already baked in as the industry standard.

Concretely, as we saw earlier, many platforms bill the advertiser based on the number of postbacks they receive (the installs they won under last-touch). Change the rule and platform revenue changes with it. So last-touch is wired into the industry's payment plumbing in a way you can't just unbolt. The agreed rule across the industry is "use last-touch as the standard and settle on it." An advertiser can run secondary reporting on a different rule (say, data-driven) inside their own stack, but telling a platform "please bill me on a different rule" is effectively a non-starter.

Which rule is "right"? That question itself is where ad measurement always snags. You can't move the industry's payment rule single-handedly, but inside your own ad operations, running secondary rules to get even a little closer to "which platform is actually effective" is something anyone can do. The next post goes into those other rules in detail.

Two limits of the MMP setup

The MMP setup doesn't solve everything. It has real limits. Everyone still runs on it because in ad measurement, there's basically no other neutral aggregator at this scale. Without the referee, you're stuck believing three or four platforms' inflated numbers and summing them. Agreeing on one shared standard beats that.

Two limits worth calling out.

One, if platforms don't share data, the referee can't see. To match installs with touchpoints, platform-side touchpoint data has to flow into the MMP. Even after a partnership is signed, "how much we hand over" stays the platform's call. For a platform, handing MMP the full dataset means exposing user assets outside their walls, so they open up only the slice that's strictly necessary. Especially since ATT, the iOS-side data platforms can share with MMPs has also dropped sharply. The referee can only see what the platforms are willing to hand over.

On top of that, you can't just spin up an MMP from scratch. You have to build data partnerships with every one of the thousands of global and local ad platforms out there, each with its own business incentives, each making its own call on whether to open up a touchpoint-data partnership to you. A new MMP has to go win thousands of platforms over one by one, and each platform's engineering bandwidth and tangled business interests are also on the critical path, so it's not an area where effort guarantees a result. That's why the handful of players already in position have an enormous moat, and basically nobody breaks in. Across the whole world, the number of MMPs with real platform partnerships that let them actually play this role is about half a dozen. It's an oligopoly held by a very small group of players. The wall is high enough that you now see businesses with the "MMP-ish" branding but not the partnerships or integrations to back it up.

Two, attribution is a different question from actual causality.

What the MMP does is attribution. It counts "which ads the user touched before installing" and assigns that one install to one platform under its rule. Under last-touch, "last touchpoint was search, so search gets 1 credit."

Actual causality (incrementality, the question "would the install have happened without that ad?") is a different question. "Did that ad actually create the install, or was it just a user who was going to install anyway, who happened to pass through the ad?" It's the same question we kept hitting in the last three posts of the causal inference series (Post 1, Post 2, Post 3), "what did the ad actually create?"

Here's how they differ. Say Lia hadn't seen the search ad on Tuesday. Would she still have installed the pizza shop app? If she had already seen the Monday social ad and thought "oh, nice," maybe she was going to install anyway. The flip side: if she hadn't seen the Monday social ad, she might not even have known the pizza shop existed, so she wouldn't have searched on Tuesday either (social gave her the "oh, there's a place like that," which is what made the search possible in the first place). In that case, the social ad was the bigger cause. Last-touch doesn't engage with any of that. It just rules "1 credit to search."

Attribution is not actual causality For Lia's 1 install, last-touch and causality return different answers Lia's touchpoint flow Mon social Mon social Tue search install (1) Last-touch MMP ruling (attribution) Last touchpoint was search, so search takes all 1 credit Search platform 100% (Monday's two social touchpoints are logged, credit 0) (2) Actual causality? (nobody knows) If social is what put the shop on her radar and led to search, social may be the bigger cause ? ? ?

Is last-touch's attribution split correct from a causality standpoint? Honestly, we don't fully know. Sometimes the last touchpoint really was the decisive one. Sometimes the Monday social ad was the real cause and the last touchpoint snatched the credit. The thing is, the MMP was never designed to "uncover causality" in the first place. The MMP's job is to unify everyone around a single rule that produces de-duplicated numbers. It splits credit by rule. Whether that credit matches what, in a causal sense, the install actually came from is outside its scope.

The flip question is real too. Just because last-touch grabbed the credit, does that mean the earlier touchpoints really had 0 causal influence? If the Monday social ad is what put the pizza shop on Lia's radar and triggered Tuesday's search, then that social ad definitely had causal influence. But under last-touch, the earlier touchpoints get 0 credit. For earlier touchpoints to always have "0 influence," ad exposure would have to never affect user decisions at all, which would mean ads don't work. Doesn't track. So you can't always treat the platform last-touch names as the "actual cause". "Then what's the right rule?" Nobody knows. Actual causality is hard to measure in the first place. That's the problem we spent all of Posts 1, 2, 3 on in the causal inference series.

The MMP never aimed at "knowing exactly which ad caused what." It picked "everyone splits credit by the same rule, consistently." Operationally, one referee tallying under one unified rule is a lot better than every platform claiming its own number. That's why the industry converged on the MMP setup.

Wrap

RCT is still the cleanest way to measure ad impact. But in ad land, you can't run that cleanest version alone. Even inside a single platform you hit at least four classic traps, as Post 3 walked through. Once you add the fact that a user is seeing ads across multiple platforms at the same time, figuring out "which ad caused what" gets harder still. So the industry pulled in a separate referee (the MMP) that strips duplicates and applies one shared rule to produce a unified number. The referee has its limits, but it's the agreed-upon setup that keeps ad measurement actually running today.

The fact that the industry agreed to run on last-touch doesn't mean last-touch is "right." You can't move the whole industry's rule by yourself, but inside your own stack, running other attribution methods as secondary tools to inch closer to the truth is yours to try. Later posts will go deeper on rule-based alternatives like first-touch, linear, time-decay. And on non-rule-based approaches: data-driven attribution, incrementality, and Marketing Mix Modeling (MMM), a statistical method for estimating how much each marketing activity contributed to revenue. The iOS SKAN world is coming too.

One last thing. The MMP isn't just a player in ad measurement. It also sits at the center of the broader ad tech (ad technology) world, so these companies will keep showing up in other topics. Still, the MMP's core job is ad effect measurement, which is why this post stayed focused on that one seat.