App Tracking Without Illusions: GA4, UTM, MMP, and SKAdNetwork in Mobile Campaign Attribution π±
A comprehensive guide to mobile app attribution. Learn why app installations break traditional tracking, how GA4 differs from an MMP, and how to master iOS SKAdNetwork and AdAttributionKit.
In digital marketing, we have grown accustomed to a relatively simple and linear user journey β like a straight flight through empty space:
ad click β landing page view β conversion
All campaign parameters travel effortlessly in the URL query string, the browser retains cookies, and the analytics script seamlessly logs the session and attributes the conversion.
However, in mobile app install campaigns, this straight path collides with the massive gravity of the app stores.
Why the Install Step is an Attribution "Black Hole"
In the mobile app universe, your app is the center of the solar system, and ad networks (like Meta or Google) are distant planets. The user journey (our space probe) looks very different:
ad click on planet "Meta" β entering the gravitational pull of the App Store β download β installation β landing (first launch) β conversion in the center (App)
When a user clicks an app install ad, they leave their familiar orbit and enter the isolated sandbox of the app store. At the time of installation, the newly downloaded app has no access to URL query parameters, browser cookies, or the user's flight history. All source data disappears beyond the event horizon.
The install step is a black hole that physically breaks the traditional tracking chain and swallows the data.
Web Journey (Straight Flight)
- User clicks an ad (with UTM parameters)
- Lands directly on the target website
- Analytics script logs the session
- Conversion happens on-site (full data)
App Journey (Black Hole)
- User clicks an ad in orbit
- Pulled into App Store / Google Play gravity
- App is downloaded and installed (Data disappears beyond the horizon!)
- User launches the app in the center
- In-app conversion happens (disconnected from source)
Google Analytics 4 (GA4) is exceptionally good at tracking user behavior once they are inside the app. However, it cannot automatically link that first app launch back to an ad click on an external advertising network. For that, a dedicated attribution architecture is required.
1. Two Different Questions: Product Analytics vs Attribution
When evaluating mobile apps, we must separate two entirely different analytical problems.
π Key takeaway: These two systems do not compete β they complete the solar system map. GA4 studies the sun, while MMP navigates the orbital traffic.
Marketing Attribution
Where did they come from?Key question: Which ad, campaign, or network led to the install and conversion?
Focuses on marketing efficiency and ROAS. Connects the broken ad link to the install and deduplicates conversions across channels.
π‘ Key takeaway: These two systems do not compete β they play complementary roles and should run in parallel.
2. How GA4 Works in Mobile Apps
The Firebase SDK automatically tracks standard technical events and allows you to define custom product events, such as:
first_open(the first time the app is launched β the app equivalent of an install),- onboarding completion and account sign-ups,
- subscription trial starts and in-app purchases.
first_open vs Install
It is critical to remember that:
store download β install reported by network β first_open in GA4
A user can download an app from the store but never actually open it. In this case, the ad network will report an install, but GA4 will never log a first_open event.
By default, without advanced configuration, GA4 will attribute the acquisition source of most new users as (direct) / (none) or organic. The campaign details simply get lost in the transition through the app store. While Google allows you to manually populate this data by sending a campaign_details event shortly after install, doing so requires additional technical integrations.
3. UTM vs MMP β Why They Are Not the Same
A common misconception is that UTM query parameters in ad links can replace a full MMP integration.
A UTM parameter is merely a static label describing a click source. An MMP is an active attribution engine.
When a user clicks a link with UTM parameters and the app is already installed, a deep link (or App Link/Universal Link) opens it directly. The app reads the UTM parameters and passes them to GA4 β tracking works perfectly.
The issue arises with new installs. The presence of UTM parameters in the ad link does not mean they will magically survive the journey through App Store or Google Play and arrive in the app.
Google Analytics 4 (GA4)
Product & Behavioral Analytics: What does the user do inside the app? How does the onboarding flow perform? Where do they drop off?
- Tracks product events (screen_view, sign_up, add_to_cart)
- Cohort analysis and user retention metrics
- Firebase integration and raw data export to BigQuery
- Limited out-of-the-box attribution for paid channels
Mobile Measurement Partner (MMP)
Marketing Attribution: Where did the user come from? Which specific ad drove the install? Who gets the conversion credit?
- Attributes installs to specific ad networks
- Deduplicates conversions in multi-channel environments
- Sends real-time conversion postbacks to ad networks
- Handles Apple ATT, SKAN, and deferred deep linking on iOS
How MMP Attribution Works
The MMP SDK integrates directly with mobile operating systems and ad networks (Meta, Google, TikTok). When a user clicks an ad, the MMP logs the click (and the device identifier). Once the app is installed and launched, the MMP SDK gathers available device signals and queries its server. The system performs matching (either deterministic via Google Play Install Referrer, or probabilistic) to attribute the install, and instantly sends a postback to the winning ad network.
π Technical Deep Dive: How the Google Play Install Referrer API Works β
On Android, Google Play provides a secure API that allows apps to query the store for install details. Upon first launch, the SDK (MMP or Firebase) binds to the local Google Play service using an AIDL (Android Interface Definition Language) interface.
The API response contains details such as:
{
"install_referrer": "utm_source=facebook&utm_medium=paid_social&utm_campaign=summer_sale&fbclid=...",
"referrer_click_timestamp_seconds": 1783856200,
"install_begin_timestamp_seconds": 1783856240,
"google_play_instant_enabled": false
}
This allows the SDK to link the install to a specific click by verifying the exact timestamp discrepancy between the ad click and the download initiation.
4. iOS, ATT, and SKAdNetwork / AdAttributionKit
While Android attribution is relatively straightforward, iOS became a battlefield after Apple introduced App Tracking Transparency (ATT).
Users must opt-in to tracking. If they select "Ask App not to Track" (which over 60% of users do), the app loses access to the IDFA identifier and is barred from using fingerprinting. To address this, Apple built SKAdNetwork (SKAN), now evolving into AdAttributionKit, as a privacy-preserving attribution framework.
How SKAdNetwork Operates
Apple acts as the attribution referee:
- The user clicks an ad digitally signed by the ad network.
- Apple records this click at the iOS system level.
- After the app is installed and opened, iOS determines if it qualifies for attribution.
- Instead of sharing user data, Apple sends a delayed, anonymous postback directly to the ad network or MMP.
π Technical Deep Dive: Inside a Raw SKAdNetwork Postback β
When Apple decides to dispatch an attribution postback (which happens with a random delay of 24 to 48 hours after install or value update), it executes an HTTP POST request to the registered endpoint (e.g., the MMP server). A raw SKAN 4.0 JSON payload looks like this:
{
"version": "4.0",
"ad-network-id": "v9wttpbfk9.skadnetwork",
"transaction-id": "61a34b22-87ff-4375-9c88-12c83ff111a4",
"campaign-id": "84",
"source-identifier": "1084",
"attribution-signature": "MEYCIQCc3v1qH3...",
"redownload": false,
"source-app-item-id": 123456789,
"fidelity-type": 1,
"coarse-conversion-value": "high",
"postback-sequence-index": 0
}
Note that the postback contains absolutely no device_id or user_id. The coarse-conversion-value ("high") indicates the user completed a high-value action, and the source-identifier field contains up to 4 digits depending on sample sizes (privacy thresholds).
The Mystery of Conversion Values
Since Apple does not report individual user events (e.g., "purchased a $19 item"), post-install activity is measured using Conversion Values. This is a encoded digit (ranging from 0 to 63 in "Fine" mode, or represented as "low", "medium", "high" in "Coarse" mode).
An example conversion value schema:
- 0 = app launched (first_open)
- 5 = user signed up
- 12 = added product to cart
- 40 = completed purchase (low value)
- 60 = premium subscription purchased
Analytics platforms (including Firebase and MMPs) allow you to map these values in their dashboard, while the SDK manages updating the value on-device. Apple transmits the raw value, and the receiving platform decodes it based on your predefined mapping schema.
5. Why Meta Ads, MMP, and GA4 Data Diverge
In a healthy app tracking setup, discrepancies across dashboards are expected. Each platform answers a different question and uses different attribution windows.
| Metric / Feature | Meta Ads Manager | Mobile Measurement Partner (MMP) | Google Analytics 4 (GA4) | Apple SKAN |
|---|---|---|---|---|
| What it reports | Installs attributed to Meta | Deduplicated multi-channel installs | First open events (first_open) | Aggregated postbacks from iOS devices |
| Attribution Model | Click & View-through (Meta-centric) | Cross-channel Last Click | GA4 model (often modeled/data-driven) | Aggregated Apple Attribution |
| User Data | Full (within Meta ecosystem) | Dependent on ATT opt-in (deterministic/probabilistic) | Dependent on user consent & Firebase ID | Complete absence of user-level data |
| Reporting Delay | Real-time / Modeled | Real-time | Real-time (up to 24-48h in standard UI) | Random delay (24-48h for privacy) |
Common Sources of Discrepancies:
- Download vs. Launch: Meta counts an install when a user clicks download in the app store. GA4 only logs the install when the user physically opens the app (
first_open) and the SDK initializes. - Lack of Cross-Channel Deduplication: If a user clicks a TikTok ad, then a Meta ad, and installs the app, both Meta and TikTok will claim 100% credit (total: 2 installs). An MMP deduplicates this and assigns 1 install to the last click.
- Attribution Windows: Different systems default to different windows (e.g., 1-day, 7-day, or 30-day click-through).
6. Designing a Rational App Analytics Architecture
Attempting to find a single tool that does everything is a recipe for failure. A mature mobile marketing technology (MarTech) stack divides responsibilities:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MOBILE ANALYTICS ARCHITECTURE β
βββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β GA4 / Firebase β Product usage, user flows, retention, and LTV β
βββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β MMP (AppsFlyer) β Paid attribution, deduplication, and fraud checks β
βββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β SKAN / AAKit β Privacy-safe iOS tracking and campaign optimizationβ
βββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Warehouse (BQ) β Raw data merging, CRM revenue reconciliation β
βββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββ
Using this architecture, business reporting is clean and actionable:
- Product Dashboard (GA4/CRM): Tracks actual product health (active users, conversion funnels, subscription churn, renewals).
- Acquisition Dashboard (MMP): Measures paid acquisition efficiency (ROAS, blended CAC, network performance).
- Executive Dashboard (DWH): Joins network spend with CRM subscription lifecycles to calculate accurate payback periods.
Firebase SDK Probe
Firebase SDK is installed in the system center (app) for Android and iOS.
Signal Mapping
Unified event taxonomy is defined (onboarding, sign-up, trial, purchase).
Referrer Gravity
Google Play Install Referrer is verified and functioning on Android.
Wormholes
Deep linking and deferred deep linking (Universal Links) are configured.
ATT & SKAN Shields
The iOS ATT consent prompt is active, and the SKAN schema is mapped.
Resource Integration
Subscription payment provider is integrated with the orbiting analytics.
MMP Research Station
MMP is integrated with ad networks (planets), and postbacks are set up.
Expedition Costs
Ad spend ingestion is configured between ad platforms and the MMP.
Event Taxonomy
Unified event taxonomy is defined (onboarding, sign-up, trial, purchase).
Install Referrer API
Google Play Install Referrer is verified and functioning on Android.
Deep Linking
Deep linking and deferred deep linking (Universal Links / App Links) are configured.
ATT & SKAdNetwork
The iOS ATT consent prompt is active, and the SKAN Conversion Value schema is mapped.
Payments Integration
Subscription payment provider (e.g., RevenueCat) is integrated with analytics.
MMP Integration
MMP is integrated with your ad networks, and postbacks for in-app events are set up.
Cost Data Ingestion
Ad spend ingestion is configured between ad platforms and the MMP.
Interactive Attribution Path Map
Below is an interactive map that visually represents the entire user journey and shows what each analytics system sees (GA4, MMP, SKAdNetwork) at every stage. Click a perspective and each node to see the details.
π Want to see a fullscreen simulation of the attribution solar system?
Open the cosmic attribution map β