Mobile apps, especially the ones that rely solely on subscription-based models, tend to group users into two camps: they either pay, or they ‘churn’ by remaining a non-paying user.
But this is far from accurate, and ignores the path to monetize free users: with ads.
When to consider adding ads to your app
Top-performing app teams are already using ads to increase their ARPU, even across free users, and boost their top-line to become more profitable in record time.
Now, before jumping in and introducing ads to your app, consider these things:
The first and most important thing to consider is scale — meaning the number of daily active users (DAUs) your mobile application currently has. The ad monetization game makes the most sense at scale.
For example, I recommend considering this a task in your business when you can start making at least $100 a day in profit. If you have at least 10,000 DAUs and expect each to see an ad daily, with an average effective cost per mille (eCPM) of $10, then it makes sense to consider ads.

You also need to consider your DAUs’ location. If your user base is primarily in tier two or tier three countries, your expected scale will need to be much bigger than 10,000 DAUs.
Once you have sufficient DAU and your subscription monetization is performing in the top percentile of industry benchmarks (onboarding, paywall, pricing, trials), it makes sense to reinvest a portion of the incremental profit from new revenue streams. In other words, keep subscription optimization your first priority.
I’d also suggest you consider adding ads only if you have the technical capacity to add this new revenue stream to your stack. If not, tools like Appstack can help you unify all your data sources in a single place, including ad mediation.
Finally, make sure to have enough time for it. Ad monetization has a long learning curve, there is little valuable information online, and it’s hard to get high-quality insights worth your time. So consider that it will require more of your time than expected. For beginners, I always recommend listening to this podcast from Two and a Half Gamers, hosted by Felix Braberg.
Common challenges when monetizing free users with ads
If your app seems qualified and you’re ready to monetize free users, the first thing to do is know what you’re getting in for. Adding ads to your mobile app is not as easy as it appears.
After working with multiple apps, these are some of the most frequent challenges I see when it comes to ad monetization.
Firstly — team setup. Most marketing teams don’t have the technical foundation needed to set ad monetization up correctly. I’ve seen numerous app studios try to do this with the internal team and never achieve anything substantial.
My recommendation: hire a freelancer with relevant experience, or pair your marketing team with an experienced developer — this balances one individual with a clear technical understanding, and one with the vision for the product and business goals.
The second word of warning is expect to iterate. You won’t get it right on your first try, (though I hope you prove me wrong). It’s easy to be overly ambitious. Try to break the goal into small, testable steps. For example, if you’re aiming for a complex Firebase Remote Config setup across multiple ad networks connected to your mediation… start simple:
- Connect the Firebase SDK
- Add and monetize a new ad unit
- Expand step by step
One word of warning is on ad logic. Something I’ve personally battled is apps that have ad logic hard-coded into them. This is a nightmare; it’s nearly impossible to decode, slows down iteration, and blocks migration to a fully remote setup. If you only take one piece of advice, adjust this before you begin.
If you’re transitioning to a new ad monetization stack, maintaining stable ad revenue during the change is a significant win — it’s not easy to do, so take a moment to celebrate your accomplishment!
Finally, know that this work can feel lonely! The ad monetization community is small, and there’s not much public information to learn from or communities to find. It’s okay to struggle with your development and experiments, but keep pushing through. It’s worth it in the end.
The endless dilemma: revenue over retention
Everything in ad monetization comes down to a simple question: how can we increase ARPU via ads without pushing users to churn?
In other words, how can I show as many ads as possible to a single user, without affecting their behaviour and willingness to open the app repeatedly? Here are three considerations:
- Your app’s category: Whether users are willing to put up with ads largely depends on the app’s purpose. Ads placed on banking or fintech applications are not standard, but ads on gaming apps are incredibly common. Weigh up the patience your users will have for ads.
- Sacrifice for gain: In short, are you willing to sacrifice a cohort of users to gain a potential uplift in revenue? While frequency, timing, placement, and other variables can considerably increase (or decrease) your churn rate, there is no guaranteed way to remove the risk that comes with ads. Are you confident enough to risk it?
- Testing strategy: Be bold with your experiments. Run aggressive tests with a significant share of your user base to gather reliable, fast data — this is the most accurate way to predict how far you can push users without hurting retention. Avoid wasting time being cautious, as it only delays finding your ARPU ceiling.
5 Levers to safely increase ARPU (and monitor churn)
While you can’t remove all risk of harming user retention, there are ways to reduce it.
eCPM management
The Effective Cost Per Mille (eCPM) is a key ad monetization metric that measures total revenue generated per 1,000 ad impressions. It’s calculated as (total earnings / total impressions) x 1,000.
The goal is to have the highest possible eCPM value while maximizing the number of impressions. Finding the equilibrium point is hard.

One tip is to treat this balance between impressions and eCPM differently depending on the user location:
- Tier 1 countries: Aim to get a high eCPM with low impressions to reduce churn while increasing the amount of in-app purchases
- Tier 2/3 countries: Aim for a reduced eCPM and high amount of impressions — these users are less likely to buy an in-app purchase, and are more used to watching ads to get an expected reward
With your ad mediation provider, you can play with manual bids or automatic setup, although the second option tends to match all the ad requests to have a show rate close to 100%.
Upsell to in-app purchases
Increasing ad monetization shouldn’t be about filling your product with ads — it should be about incentivizing users to upgrade their experience by purchasing an entitlement.
While it might seem like this approach could hurt retention, you can avoid that by limiting ad impressions for new users and instead targeting highly-engaged users after a set number of days — those who’ve already shown a willingness to watch ads rather than pay.
For example, I worked with an app whose main goal was to drive premium conversions but offered a rewarded ad as an alternative way to complete an action. It worked incredibly well: users who wanted to skip the ad chose to pay instead. This is one of the most effective ways to boost ARPU through voluntary choice.
Ad unit placement
Give ads strategic placement in-app: placement that gives enough friction that it encourages them to pay, but not so much it pushes the user to leave the app.

In the past, I had massive success with a subscription app that placed an ad in a specific section of the product where the user wanted to download an image. The app allowed users to download a particular background image as one of its features (it was not the main feature, but thousands of users were doing this action every day). Users were willing to watch an ad to avoid paying because the user intent was high in this specific flow.
Ad format
The format of ads could be a banner, interstitial, rewarded, etc. Based on my experience, the primary focus for subscription apps should be understanding how to leverage interstitials and rewarded ads, as these two have the highest eCPM.
On top of that, depending on the ad placement, you need control of the ad type, e.g. whether the interstitials or rewarded ads will show an image or video. For example, if the placement could be sensitive to user churn, having a specific interstitial ad ID with an image type makes sense. But if you are confident that the placement is ideal to maximize revenue, and users would be willing to watch an ad, you could show a rewarded ad with a video type.
AI predictive flow
Last but not least, a great way to increase ARPU without affecting user retention is by using Firebase Remote Config and AI predictive capabilities to show users the right ad at the right time. This is great for subscription applications that use AdMob as their ad mediation provider.
Don’t get too comfortable though — I still recommend keeping an eye on the impressions each ad unit is getting to look out for any issues.
The ad monetization framework for apps
Goal
Increase ARPU by creating an advanced setup with Firebase’s Remote Config as your main testing and deployment tool.
Now for implementing your ads — the framework below is my go-to since any app growth team can implement it for free using Google Workspace tools, plus it doesn’t require a developer to design and create experiments.
To guarantee the framework’s resilience, all logic conditions must happen under the Firebase project. Knowing the function and purpose of each tool will help you understand how the stack works together:
- Firebase: Where ad experiments are executed using Remote Configuration and A/B tests
- Google AdMob: Responsible for ingesting your ad inventory into the exchange, managing ad requests to fill your placements and monetize your product
- Google Analytics: The tool that lets you measure the impact of your ad experiments via metrics like user retention, ad revenue, purchase revenue, etc.
- It also helps you to build audiences and create custom dimensions to design remote conditions for your A/B tests
Level of complexity
Depending on your experience working with ad monetization, I recommend doing one of three things before starting:
- Low complexity: If you’ve never used AdMob or tried changing eCPM floors to run soft experiments, I recommend doing that first. Play with bids, create ad units, make report templates, and learn how the solution works.
- Medium: Before doing advanced setups with a JSONs schema, prepare your app to receive a simple string when running an A/B test. For example, use a different ad unit ID string to run your first experiments against your baseline.
- High: If you have a decent experience running multiple experiments and an understanding of how the framework operates. I recommend using a JSON approach instead of string, boolean, or number. It will help you scale faster.
Working with conditions
Conditions are essentially rules you set up in the Firebase console to serve different configuration settings to subsets of your user base. It follows the waterfall effect, so be clear about the way you structure your conditions.
This is a list of rule types I use the most, which you can use to create conditions on Firebase. Check out the Firebase Remote Config parameters guide for the complete documentation.
Type | Value |
app | List of available apps in the project |
app_version | Specify the version(s) of your app to target |
platform | iOS, Android, Web |
language | Select one or more languages |
country | Select one or more regions or countries |
user_audiencies | Select from a list of Google Analytics audiences |
user_propperty | Select from a list of Google Analytics user properties |
date | A specified date and time |
Make sure each parameter you create in Firebase has a reason to exist. Before using any conditions, ask yourself if it’s necessary to have them. Maybe the ad unit itself (AdMob) has the condition by default. For example, you don’t need to include the platform condition if your ad unit is from an iOS project.
Maximizing the number of impressions
You can design your setup in two ways to ensure the highest ad impressions in your app. One lives inside your Remote Config setup (custom JSON fallback). The other lives in your mediation platform, like AdMob mediation groups.
In-app JSON fallback (custom logic) | Mediation groups | ||
Your app reads a JSON config and decides which ad unit to try next. It’s recommended that this is used for specific cases where the team has deep knowledge about the topic and needs control over the waterfall logic. | The place where you can configure the bidding in the mediation UI. | ||
Pros: ✅ Very granular control (per segment/geo) without shipping a new build ✅ Fast remote tweaks | Cons: ❌ Complex to build/test/maintain at scale (edge cases, frequency caps, error handling) ❌ Easy to fragment logic across geos/formats ❌ Since the mediation layer orchestrates bidding, you’ll typically miss out on in-app bidding’s unified auction | Pros: ✅ Easier to operate day-to-day ✅ Plays nicely with real-time bidding (more competition, usually better eCPM, less manual tuning) ✅ No extra app code for fallback logic | Cons: ❌ Slightly less granular than a fully custom setup ❌ Changes may take time to propagate (e.g., enabling/pausing can take up to ~1 hour) |
Design system: How to create your first template
To create your advanced ad monetization framework using JSON as a data type within your Remote Config setup, you need to understand how the main components of the ‘design system’ work. This includes the possible elements of the code, their benefits, functions, how to apply them, and if they should be included or not.
Here’s a quickfire breakdown of the design system elements:
Ad units:
These parameters will be focused on helping you to identify, localize, and control each ad unit.
- Unit_id_name: Serves as a readable, user-friendly identifier for the specific AdMob unit in your code or configuration.
- Description: Provides a textual explanation of the ad unit’s purpose or placement within the app.
- Ad_unit_id: The unique identifier provided by AdMob for each ad unit. It’s used to fetch and display ads from AdMob.
- Format: Specifies the type of ad being displayed (e.g., banner, interstitial, rewarded).
- Toggle_ad_unit: A boolean value to turn the ad unit on (true) or off (false).
Frequencies:
These parameters will help you define the intensity and volume of the impressions you serve to your users
- Frequency: This indicates how often the ad should be shown. For example, a frequency of one might mean the ad shows every time a particular event occurs, while a frequency of two shows every other time.
- Is_skippable: This boolean parameter determines whether or not the user has the option to skip the ad after a specific duration (you may also have the chance to do it on your mediation platform).
- Always_on count_intervals: A boolean value that, when set to true, ensures that the ad unit is always active and shown irrespective of any other conditional logic (be cautious with this one. It can bring problems to the logic).
Segmentation:
You can effectively personalize your app’s ad experience, showing the right kind of ads to the right users at the right time.
- Segment name: This serves as your app’s identifier for a specific user group. The segment name could be anything that describes the user group effectively, such as “High_Engagement” or “New_Users.”
- Segment_conditions: These criteria define how users are grouped into the segment. Conditions can include behavioral attributes like “time_spent_on_screen_per_day” or transactional attributes like “total_purchase_value.”
Cross-promotion:
These parameters give you more control over your cross-promotion strategy, and ensure that you maximize user engagement and revenue streams effectively.
- Cross_promotion_ad_name: Identifies the name of the cross-promotion ad campaign.
- Description: Provides a brief description of the cross-promotion ad.
- Format: Specifies the format of the cross-promotion ad, like modal, native, etc.
- Fallback: Acts as a backup plan to display the cross-promotion ad in case the primary ad (like a rewarded video) fails to load.
Premium users:
Control ads’ visibility for users with a premium subscription to your app.
- Block_ads_for_premium: This Boolean parameter controls whether ads are displayed to premium users or not. When set to true, ads are not shown to users who have purchased a premium subscription; when set to false, premium users will still see ads.
Examples set up:


You’re ready to monetize
After that whirlwind walkthrough, you’re ready to go forth and monetize across free users with ads. It can be a lot of work, but once your workflow is setup, you can reap the rewards!
Remember:
- Ads can be additive — if UX stays sacred: Treat ads as value-exchange, avoid interrupting core flows/paywalls, and place them at natural stops. This is how you raise ARPU without hurting retention.
- Start only when the scale exists: Ad monetization makes sense once you can reach ~$100/day profit potential and have meaningful DAU (e.g., ~10k with ~1 impression/day at a ~$10 eCPM).
Geo matters: Tier one: fewer, higher-value impressions, tier two/three: more impressions are acceptable if they don’t harm retention, and users expect ads.