Ad Network and Monetization SDK Integration
Adding AdMob to Unity—three lines of code and package from Package Manager. But week after release when Product Manager asks "why is eCPM half on Android vs iOS"—issue isn't ad network. Problem is SDK initialization, waterfall structure, why RewardedAd.OnAdFullScreenContentFailed gets silently swallowed.
Ad monetization is architectural decision, not plugin.
Typical Self-Integration Failures
Wrong initialization moment. MobileAds.Initialize() must call once on app start, before any ad requests. Saw projects where init done in Awake() of each scene via singleton without state check—SDK initialized multiple times, causing mediation adapter conflicts and floating fill rate.
No mediation. Working with one network (only AdMob or only Unity Ads)—accept 60-70% fill rate in Tier-3 geo. Normal scheme: LevelPlay (IronSource) or MAX (AppLovin) as mediation platform, AdMob/Meta/Unity Ads/Pangle as demand sources. Waterfall or bidding setup for specific geo—several days work, not hours.
SDK conflicts. AdMob, Meta Audience Network and Unity Ads pull own com.google.android.gms, play-services-ads and native libraries. Manual dependency management in mainTemplate.gradle easily gives DuplicateClass or NoSuchMethodError runtime on Android. Right way—External Dependency Manager (EDM4U) with clear force-resolves in Dependencies.xml.
GDPR and ATT. Since iOS 14.5+ without AppTrackingTransparency request IDFA unavailable, personalized ads don't work—eCPM drops 40-60% for Tier-1 audience. For EU users need UMP (User Messaging Platform) from Google or alternative. Unconfigured consent flow—not only income loss but account ban risk.
How We Structure Integration
Start with mediation-stack choice for project. For hyper-casual with global audience—MAX with bidding, for mid-core with CIS-focus—sometimes LevelPlay with two-three demand sources sufficient.
Ad formats per game monetization model: interstitial between levels, rewarded for continue or in-game currency, banner in menu (careful—banners kill UX, use only if explicitly needed). Each format with full event handling: OnAdLoaded, OnAdFailedToLoad, OnAdOpening, OnAdClosed, OnUserEarnedReward.
For rewarded critical: block repeated EarnedReward if user exited app during viewing and returned—double currency giving happens exactly this way.
On Android configure ProGuard rules for each SDK—without them release build has half of ad logic stripped by obfuscation. On iOS—SKAdNetwork entries in Info.plist for all networks (can be 30+).
Test with test ad unit IDs in dev environment, then real with limited traffic via internal testing channel.
Ad Revenue Analytics
Without breakdowns ARPDAU by acquisition channel, monetization opaque. Connect attribution via AppsFlyer or Adjust, configure ad revenue event sending—LevelPlay and MAX send impression-level revenue, allowing LTV calculation by campaign, not just overall.
Timeline
| Scenario | Timeline |
|---|---|
| One ad network, basic formats | 3–5 days |
| Mediation (2-3 networks) + GDPR/ATT + analytics | 1.5–3 weeks |
| Full mediation stack with bidding + attribution | 3–5 weeks |
Cost determined after analyzing current project stack, target geo and monetization goals.





