If you've shipped a mobile game before, you already know the tension: your publisher (or your own bottom line) wants more ad impressions, and your players want to actually enjoy the game. Get that balance wrong in either direction, and you lose. Too few ads and your revenue doesn't cover your marketing spend. Too many, too aggressive, or too poorly timed, and your retention curve craters by day three.
This is one of those problems that sounds simple in a design doc — "add ads between levels" — but turns into a surprisingly deep technical and design challenge once you actually start implementing it. In this post, I want to walk through how monetization actually gets built in a real Unity project: the ad formats that matter, the technical architecture that keeps your ad code from turning into spaghetti, and the retention traps that catch almost every first-time mobile developer.
The Three Ad Formats You'll Actually Use
Before getting into code, it's worth being clear about what you're building, because different ad formats have completely different implementation and UX considerations.
Banner ads sit at the top or bottom of the screen and are mostly passive. They generate low revenue per impression but don't interrupt gameplay. They're most useful in menu screens or non-action UI, and honestly, in 2026, a lot of successful casual games skip them entirely in favor of focusing on interstitials and rewarded video, which perform far better on a per-session basis.
Interstitial ads are full-screen ads that appear at natural break points — after a level, on a game-over screen, when returning to the main menu. These are your highest-frequency monetization tool, and also the one most likely to hurt retention if you get the pacing wrong.
Rewarded video ads are the gold standard for balancing revenue and player experience, because the player opts in. "Watch an ad for an extra life," "watch an ad to double your coins" — the player gets tangible value, and you get a guaranteed, high-value impression. Games that lean heavily into well-designed rewarded ad loops consistently outperform games that rely mostly on forced interstitials.
Setting Up a Clean Ad Architecture
One mistake I see constantly, especially in reskinned or template-based projects, is ad SDK calls scattered directly inside gameplay scripts — a LevelManager calling AdMob.ShowInterstitial() directly, a PlayerController calling ad code when the player dies, and so on. This works in the short term but becomes a nightmare the moment you want to add ad mediation, adjust frequency capping, or swap networks.
Instead, centralize everything behind a single manager class that the rest of your game talks to through a clean interface:
public class AdManager : MonoBehaviour
{
public static AdManager Instance { get; private set; }
[SerializeField] private int interstitialFrequency = 3; // every N level completions
private int levelsSinceLastInterstitial = 0;
private void Awake()
{
if (Instance != null) { Destroy(gameObject); return; }
Instance = this;
DontDestroyOnLoad(gameObject);
InitializeAdSdk();
}
public void OnLevelComplete()
{
levelsSinceLastInterstitial++;
if (levelsSinceLastInterstitial >= interstitialFrequency)
{
ShowInterstitial();
levelsSinceLastInterstitial = 0;
}
}
public void RequestRewardedAd(System.Action onRewardEarned)
{
// load and show rewarded ad, invoke callback only on successful completion
}
private void ShowInterstitial() { /* mediation call here */ }
private void InitializeAdSdk() { /* SDK init here */ }
}
This structure gives you a single, testable place to control frequency capping, add analytics events, and swap ad networks or mediation layers without touching gameplay code at all. It also makes it trivial to add rules later — like "never show an interstitial in the player's first session" — without hunting through a dozen scripts.
Frequency Capping Is Not Optional
This is probably the single biggest lever you have for protecting retention while still hitting revenue targets, and it's shockingly under-implemented in a lot of indie projects.
Frequency capping means putting hard limits on how often a player sees interstitials, regardless of how many "trigger points" they hit. A player who dies five times in sixty seconds on a hard level should not see five interstitials in that window — that's an instant uninstall.
A simple but effective pattern is a time-based cooldown layered on top of your event-based trigger:
private float lastInterstitialTime = -999f;
private float minSecondsBetweenInterstitials = 45f;
public bool CanShowInterstitial()
{
return Time.time - lastInterstitialTime >= minSecondsBetweenInterstitials;
}
Combine this with your level-completion or session-based triggers, and you get ad pacing that adapts naturally to how the player is actually playing, rather than punishing frustrated players with a wall of ads at exactly the moment they're most likely to quit.
Don't Interrupt the "Flow State"
Timing matters as much as frequency. There's a specific window right after a player completes a level — that small dopamine hit of success — where an interstitial feels far less intrusive than one that interrupts active gameplay or appears the instant a player fails a level for the third time in a row.
A few timing principles that consistently test well:
- Show interstitials after a success moment (level complete), not immediately after a failure
- Add a short delay (1–2 seconds) after the trigger event before the ad appears, so it doesn't feel like the game itself glitched
- Never show an ad in the first 60–90 seconds of a brand-new player's first session — let them experience the core loop first
- Space rewarded ad offers so they feel like opportunities, not requirements to progress
None of this is exotic game theory — it's just respecting the player's momentary emotional state, which is something a lot of ad SDK documentation completely ignores because it's focused purely on integration steps, not UX.
Rewarded Ads: Design Them Like a Feature, Not an Interruption
The best-performing rewarded ad implementations don't feel like ads at all — they feel like a genuine game mechanic. "Double your coins," "revive and continue your run," "unlock the next character early" — these all give the player agency, and agency is what separates a rewarded ad from an interstitial wearing a disguise.
Technically, this means your rewarded ad flow needs a clean callback structure so you only grant the reward on a verified completion, never on ad load or ad click:
public void OfferDoubleCoins(int baseCoins)
{
AdManager.Instance.RequestRewardedAd(onRewardEarned: () =>
{
PlayerData.Instance.AddCoins(baseCoins); // grants the bonus, doubling total
AnalyticsManager.LogEvent("rewarded_ad_completed", "double_coins");
});
}
Also worth building in from day one: an analytics event for every stage of the rewarded ad funnel — offer shown, ad requested, ad completed, reward granted. Without this, you're flying blind on one of your highest-value monetization tools, and you won't know whether a drop-off is happening at the offer, the load, or the completion stage.
Mediation: Why You Probably Need It
If you're only running a single ad network, you're almost certainly leaving revenue on the table. Ad mediation platforms let you run multiple networks in a waterfall or bidding setup, so each ad request goes to whichever network is currently paying the most for that impression.
The tradeoff is added complexity — more SDKs, more potential points of failure, and more edge cases around fill rates (what happens when no network has an ad to serve?). Your architecture needs to gracefully handle a "no fill" scenario without breaking the player experience — usually by simply not showing the ad opportunity at all rather than showing a broken loading state.
I go into this in a lot more technical depth — actual AdMob setup, mediation configuration, and specific retention-safe patterns for implementation — in a separate, fully hands-on walkthrough here: A Practical Guide to Integrating AdMob in Unity Without Wrecking Retention. If you're about to wire up your first ad network, that post covers the actual SDK integration steps and mediation setup that this article intentionally stayed above.
Testing Your Monetization Without Guessing
A lot of developers ship their ad implementation and just... hope. That's a mistake. At minimum, you should be tracking:
- eCPM by network (effective cost per thousand impressions) to see which network is actually performing
- Fill rate to catch regions or ad units where you're not getting served ads at all
- Session length before and after ad exposure, to catch retention drop-offs tied to specific ad placements
- Rewarded ad completion rate, since a low completion rate usually signals your offer isn't compelling enough, not that players dislike ads in general
Most mediation dashboards give you eCPM and fill rate out of the box. Session length and retention correlation usually require wiring your own analytics events alongside your ad events, which is exactly why the AnalyticsManager.LogEvent calls in the code above matter — they let you actually connect monetization behavior to retention data instead of guessing.
Putting It All Together
Monetization in mobile games isn't something you bolt on at the end — it's a design system that needs to be built with the same care as your core gameplay loop. A centralized ad manager, sensible frequency capping, respect for player flow state, and rewarded ads designed as genuine features rather than disguised interruptions will get you most of the way to a monetization setup that actually holds up against real player retention data.
If you're earlier in the process and still deciding on your overall sourcing and development strategy — whether to build everything from scratch, piece it together from individual Unity Asset Store components, or start from a ready-made, already-tested source code — that foundational decision is worth getting right before you even get to the monetization layer. I broke that comparison down in detail here: Unity Asset Store vs. Ready-Made Source Code Marketplaces: Which Is Better for Indie Developers?
And if you're ready to actually wire up AdMob and mediation the right way, the hands-on implementation guide is here: A Practical Guide to Integrating AdMob in Unity Without Wrecking Retention
Good monetization isn't about maximizing ad impressions — it's about maximizing lifetime impressions per player, which only happens if they stick around long enough to see them. Build for that, and the revenue tends to follow.
Top comments (0)