Unity Ads
Ad Monetization
Rewarded Video
eCPM Optimization
Game Monetization
iOS & Android

Unity Ads & Rewarded Video Monetization: Setup, eCPM Optimization & Waterfall Guide (2026)

5 min read
Eshan Naithani

In casual and hyper-casual mobile gaming, Ad Monetization accounts for 60% to 90% of total revenue. Rewarded video ads, in particular, boast the highest user acceptance rates because players voluntarily exchange 30 seconds of watch time for in-game currency or extra lives.

However, poorly timed ad placements or unoptimized ad mediation waterfalls can ruin player retention and tank your eCPM (effective Cost Per Mille).

In this guide, we provide a complete C# integration blueprint for Unity Ads (com.unity.ads), eCPM waterfall optimization strategies, and best practices for balancing ad frequency with player retention.


1. Mobile Ad Formats & Global eCPM Benchmarks

Mobile games utilize 3 main ad placements. Choosing the right format directly impacts your Average Revenue Per Daily Active User (ARPDAU).

Ad FormatUser Trigger MechanicGlobal Tier 1 eCPM Range (US/UK)Player Retention Impact
Rewarded VideoOpt-in voluntary watch for in-game reward (e.g. +50 Coins)$25.00 – $45.00Positive (+15% D30 Retention when placed correctly)
Interstitial AdFull-screen ad triggered at natural level breaks$12.00 – $22.00Moderate to Negative (Requires strict cooldown timers)
Banner AdAnchored top/bottom persistent display$1.50 – $3.50Minimal (Low engagement, visual clutter)

2. Complete C# Unity Ads Implementation (IUnityAdsLoadListener)

Using Unity Ads requires initializing the Advertisement SDK with your Game ID and registering callbacks for loading and showing ad units.

CSHARP
using UnityEngine;
using UnityEngine.Advertisements;

public class UnityAdsManager : MonoBehaviour, IUnityAdsInitializationListener, IUnityAdsLoadListener, IUnityAdsShowListener
{
    [Header("Store Game IDs")]
    [SerializeField] private string androidGameId = "1234567";
    [SerializeField] private string iOSGameId = "7654321";
    [SerializeField] private bool testMode = true;

    [Header("Ad Unit IDs")]
    [SerializeField] private string androidRewardedAdUnitId = "Rewarded_Android";
    [SerializeField] private string iOSRewardedAdUnitId = "Rewarded_iOS";

    private string gameId;
    private string rewardedAdUnitId;

    private void Awake()
    {
        InitializeAds();
    }

    public void InitializeAds()
    {
#if UNITY_IOS
        gameId = iOSGameId;
        rewardedAdUnitId = iOSRewardedAdUnitId;
#elif UNITY_ANDROID
        gameId = androidGameId;
        rewardedAdUnitId = androidRewardedAdUnitId;
#else
        gameId = androidGameId;
        rewardedAdUnitId = androidRewardedAdUnitId;
#endif

        if (!Advertisement.isInitialized && Advertisement.isSupported)
        {
            Debug.Log($"[Unity Ads] Initializing SDK for Game ID: {gameId}");
            Advertisement.Initialize(gameId, testMode, this);
        }
    }

    // =========================================================================
    // INITIALIZATION CALLBACKS
    // =========================================================================
    public void OnInitializationComplete()
    {
        Debug.Log("[Unity Ads] Initialization Complete. Preloading Rewarded Ad...");
        LoadRewardedAd();
    }

    public void OnInitializationFailed(UnityAdsInitializationError error, string message)
    {
        Debug.LogError($"[Unity Ads Error] Initialization Failed: {error} - {message}");
    }

    // =========================================================================
    // LOADING ADS
    // =========================================================================
    public void LoadRewardedAd()
    {
        Debug.Log($"[Unity Ads] Loading Rewarded Ad Unit: {rewardedAdUnitId}");
        Advertisement.Load(rewardedAdUnitId, this);
    }

    public void OnUnityAdsAdLoaded(string placementId)
    {
        Debug.Log($"[Unity Ads] Ad Successfully Loaded for Placement: {placementId}");
    }

    public void OnUnityAdsFailedToLoad(string placementId, UnityAdsLoadError error, string message)
    {
        Debug.LogError($"[Unity Ads Error] Failed to Load Ad '{placementId}': {error} - {message}");
    }

    // =========================================================================
    // SHOWING REWARDED ADS
    // =========================================================================
    public void ShowRewardedAd()
    {
        Debug.Log($"[Unity Ads] Showing Rewarded Ad Placement: {rewardedAdUnitId}");
        Advertisement.Show(rewardedAdUnitId, this);
    }

    public void OnUnityAdsShowComplete(string placementId, UnityAdsShowCompletionState showCompletionState)
    {
        if (placementId.Equals(rewardedAdUnitId) && showCompletionState == UnityAdsShowCompletionState.COMPLETED)
        {
            Debug.Log("[Unity Ads Success] Player completed rewarded video. Granting reward!");
            GrantPlayerReward();

            // Preload next rewarded ad immediately
            LoadRewardedAd();
        }
    }

    public void OnUnityAdsShowFailure(string placementId, UnityAdsShowError error, string message)
    {
        Debug.LogError($"[Unity Ads Error] Show Failed for '{placementId}': {error} - {message}");
    }

    public void OnUnityAdsShowStart(string placementId) { }
    public void OnUnityAdsShowClick(string placementId) { }

    private void GrantPlayerReward()
    {
        // Example Reward Logic
        PlayerPrefs.SetInt("UserCoins", PlayerPrefs.GetInt("UserCoins", 0) + 50);
        Debug.Log("[Rewards] Granted 50 Coins to player.");
    }
}

3. eCPM Optimization & Mediation Waterfalls

Relying on a single ad network leads to low fill rates in international territories. Implementing Ad Mediation (via AppLovin MAX, Unity LevelPlay, or Google AdMob) creates an automated real-time bidding auction for your ad impressions.

High-eCPM Mediation Waterfall Strategy

  1. Bidding Networks: Enable real-time bidding (Header Bidding) where networks bid simultaneously for every impression.
  2. Floor Prices: Set high eCPM floor targets ($30.00+) for Tier 1 geos (US, UK, CA, JP).
  3. Fallback Line Items: Use un-floored ad placements to ensure 99%+ fill rates in Tier 3 markets (IN, BR, SE).

4. Production Ad Monetization Best Practices

[!TIP] Follow these engineering guidelines to maximize ARPDAU while protecting player retention.

  1. Enforce Interstitial Cooldown Timers: Never show interstitials back-to-back. Maintain a strict 60 to 90-second minimum timer between ads.
  2. Preload Ad Placements: Load the next ad unit immediately after showing the previous one so players experience zero lag when tapping a rewarded button.
  3. Combine IAP with Rewarded Ads: Offer rewarded ads to non-paying users and give paid IAP buyers an "Ad-Free" status. Learn more in our Unity In-App Purchases (IAP) Setup Guide →.
  4. Track Ad Revenue Telemetry: Measure ad impression revenue (eCPM & ARPU) by integrating the GameAnalytics Unity SDK →.

🎮 Shipped Mobile Games & Official Store Profiles

Explore live commercial titles built with Unity and published across official app stores:


Planning to monetize your mobile game or optimize your ad waterfall? Explore our full cost breakdown in the 2026 Mobile Game Development Cost Guide or book an engineering consultation.

Share this article

Looking to build a production-ready game?

See how I built Bird Sort Mania in 20 days using AI, or check out my full Mobile Games Portfolio to see my shipped titles on Android and iOS.

Join 5,000+ Game Developers

Get weekly insights on Unity performance optimization, AI gameplay architectures, and robust system design. No spam, just deep technical breakdowns.

Unsubscribe at any time. Your data is never shared.

Recommended Reading

More articles in Unity Ads