Mobile gaming has the most complex attribution requirements of any app category. Revenue comes from two sources (in-app purchases and ad monetization), user behavior varies wildly between casual and hardcore players, and marketing spend can reach millions per month. Getting attribution right determines whether you scale profitably or burn through budget on low-quality users.
This guide covers attribution strategies specific to mobile games. For subscription app attribution, see attribution for subscription apps. For attribution fraud, see attribution fraud: detection and prevention guide.
Gaming Revenue Models
Mobile games monetize differently from other apps, and attribution must account for both revenue streams:
In-App Purchases (IAP)
Direct purchases of virtual goods, currency, battle passes, and premium content:
| Event | Example | Attribution Impact |
|---|---|---|
| First purchase | $4.99 gem pack | Conversion event |
| Whale purchase | $99.99 mega bundle | High-value event |
| Recurring purchase | $9.99 monthly battle pass | Subscription-like |
| Impulse purchase | $0.99 extra life | Low-value but frequent |
Ad Revenue
Revenue from ads shown to players (interstitials, rewarded video, banners):
// Track ad revenue per user for attribution
function trackAdRevenue(userId: string, adEvent: AdEvent) {
analytics.track('ad_revenue', {
userId,
adNetwork: adEvent.network,
adType: adEvent.type, // 'rewarded', 'interstitial', 'banner'
revenue: adEvent.revenue,
currency: 'USD',
placement: adEvent.placement
});
}
Blended Revenue
For ROAS calculations, combine IAP and ad revenue:
Total User Revenue = IAP Revenue + Ad Revenue
Blended ROAS = Total User Revenue / Ad Spend
A user who never makes an in-app purchase but watches 50 rewarded video ads per day can still be profitable.
Key Attribution Events for Games
Install and Early Engagement
| Event | When to Track | Why It Matters |
|---|---|---|
| Install | First app open | Base attribution event |
| Tutorial complete | After tutorial | Engagement quality signal |
| Level 5 reached | Early gameplay | Retention predictor |
| First session > 10 min | During first session | Engaged user signal |
Monetization Events
| Event | When to Track | Why It Matters |
|---|---|---|
| First IAP | Any purchase | Conversion to payer |
| IAP amount tiers | $1-5, $5-20, $20-50, $50+ | Revenue quality segmentation |
| Ad impression | Each ad view | Ad revenue tracking |
| Rewarded video complete | Player opts into ad | Engaged ad viewer |
| Subscription start | Battle pass / VIP purchase | Recurring revenue |
Retention Events
| Event | When to Track | Why It Matters |
|---|---|---|
| Day 1 return | 24 hours after install | D1 retention |
| Day 7 return | 7 days after install | D7 retention |
| Day 30 return | 30 days after install | D30 retention |
| Daily active | Each day the user plays | DAU tracking |
ROAS Calculation
Time-Windowed ROAS
Gaming ROAS is calculated at multiple time windows because revenue accumulates over time:
| Channel | D0 ROAS | D7 ROAS | D30 ROAS | D90 ROAS | D365 ROAS |
|---|---|---|---|---|---|
| 5% | 25% | 55% | 85% | 120% | |
| Google UAC | 8% | 30% | 60% | 90% | 130% |
| TikTok | 3% | 18% | 40% | 65% | 90% |
| Unity Ads | 10% | 35% | 65% | 95% | 140% |
A channel is profitable when ROAS exceeds 100%. In this example, Facebook and Google UAC reach profitability between D30 and D90, while TikTok never reaches 100% (unprofitable for this game).
Predictive ROAS (pROAS)
Since it takes months to know actual ROAS, predictive models estimate future revenue based on early behavior:
def predict_ltv(user_features):
"""
Predict 365-day LTV from early user behavior.
Features: D1 retention, D3 sessions, first_purchase_day, tutorial_time
"""
features = [
user_features['d1_retained'], # 0 or 1
user_features['d3_sessions'], # count
user_features['first_purchase_day'], # day number or -1
user_features['tutorial_time_sec'], # seconds
user_features['d7_levels_completed'],# count
user_features['d7_ad_views'] # count
]
predicted_ltv = model.predict([features])[0]
return predicted_ltv
With predicted LTV, you can estimate ROAS within the first 7 days instead of waiting 365 days.
SKAdNetwork for Games
Conversion Value Scheme
Games need to encode both engagement and revenue signals in SKAdNetwork conversion values:
func updateSKANForGaming(event: GameEvent) {
var fineValue: Int
switch event {
case .tutorialComplete:
fineValue = 5
case .level5Reached:
fineValue = 10
case .firstIAP(let amount):
if amount < 5 { fineValue = 20 }
else if amount < 20 { fineValue = 30 }
else if amount < 50 { fineValue = 40 }
else { fineValue = 50 }
case .day3Retained:
fineValue = 15
case .revenueThreshold(let total):
if total < 10 { fineValue = 25 }
else if total < 50 { fineValue = 35 }
else if total < 100 { fineValue = 45 }
else { fineValue = 55 }
}
// Only update if higher than current value
if fineValue > currentSKANValue {
SKAdNetwork.updatePostbackConversionValue(fineValue, coarseValue: .high) { _ in }
currentSKANValue = fineValue
}
}
SKAN Limitations for Games
- Delayed reporting. SKAN postbacks arrive 24-48 hours after the conversion window closes. Real-time campaign optimization is not possible.
- Limited conversion values. 64 fine-grained values (0-63) must encode both engagement and revenue.
- No user-level data. Campaign-level attribution only, making per-user LTV tracking impossible through SKAN alone.
Creative-Level Attribution
Gaming ads heavily depend on creative performance. The same campaign with different creatives can have 5x variance in CPI and ROAS:
| Creative | CPI | D7 Retention | D30 ROAS |
|---|---|---|---|
| Gameplay video (actual) | $1.20 | 35% | 65% |
| Gameplay video (enhanced) | $0.80 | 22% | 40% |
| Fail compilation | $0.60 | 18% | 30% |
| Story ad | $1.50 | 40% | 80% |
The cheapest creative (fail compilation) has the worst retention and ROAS. The most expensive (story ad) has the best quality. Attribution data at the creative level is essential for optimizing ad spend.
Fraud in Gaming Attribution
Gaming apps are disproportionately targeted by attribution fraud because:
- High CPIs ($1-5+) make fraud profitable.
- Large budgets mean more money to steal.
- Many ad networks serve gaming ads, increasing the attack surface.
Common Gaming Fraud Patterns
| Fraud Type | How It Works | Detection |
|---|---|---|
| Click flooding | Millions of fake clicks to claim organic installs | Abnormally low click-to-install rate |
| Click injection | Fake click fired at install time | CTIT under 10 seconds |
| Device farms | Real devices playing the game briefly | No engagement after D1 |
| SDK spoofing | Fake install events sent without real devices | Invalid device signatures |
| Incentivized installs | Users paid to install (against ToS) | Abnormal uninstall rate (D1 > 50%) |
Deep Links for Gaming
Deep links in games open specific content:
/game/level/15 → Open game at level 15
/game/event/halloween-2026 → Open seasonal event
/game/clan/CLAN-123 → Open clan page
/game/challenge/CHALLENGE-456 → Open challenge invite
/game/store/BUNDLE-789 → Open store with specific bundle
These deep links are used in re-engagement campaigns, social sharing, and cross-promotion:
{
"title": "Your clan needs you!",
"body": "Clan Wars start in 2 hours. Your clan is ranked #3.",
"deep_link": "https://links.game.com/game/clan/CLAN-123",
"category": "re_engagement"
}
Tolinku for Gaming Attribution
Tolinku's analytics track deep link clicks and attribute conversions for gaming campaigns. Deep links for cross-promotion, social sharing, and re-engagement campaigns are tracked and attributed. Configure gaming-specific routes in the Tolinku dashboard.
For mobile attribution, see mobile attribution: a developer's guide. For subscription attribution, see attribution for subscription apps.
Get deep linking tips in your inbox
One email per week. No spam.