<aside> <img src="/icons/sync_gray.svg" alt="/icons/sync_gray.svg" width="40px" /> Current version: v1.0 supports limited data related to the Google ecosystem focused on subscription-based apps. The last update was in October of 2023. New versions will be coming soon.

</aside>

<aside> <img src="/icons/exclamation-mark_gray.svg" alt="/icons/exclamation-mark_gray.svg" width="40px" /> Important note: each JSON template isn’t designed to be implemented the way it is. App developers must modify them to fit their app needs. To add or report any piece of information, contact Lucas Moscon on LinkedIn.

</aside>

<aside> 📖 Index

</aside>

Introduction

Problem

<aside> 🧨 Most of the subscription-based apps in the industry simply don’t know how to do ad monetization correctly. As one of the least talked about topics out there, it’s hard to find valuable information on increasing ad revenue while positively impacting other product metrics like retention.

</aside>

Opportunity

<aside> 💪🏼 After talking with industry colleagues and posting ad monetization content on LinkedIn, I saw that a lot of small and medium app developers were looking for a place to get inspiration, learn how to use in their favor any tech stack, and they can do it by themselves without losing thousands of dollars in the way.

</aside>

Solution

<aside> 💡 Build the first ad monetization hub for subscription-based apps in the industry. The place where app founders, developers, UA, ASO, and Product Marketing Managers can learn a bit about how ad monetization works and how they can use it in their favor to boost their knowledge (career). The goal is to democratize the information so it's accessible to everyone.

</aside>


Things to consider

<aside> <img src="/icons/exclamation-mark_gray.svg" alt="/icons/exclamation-mark_gray.svg" width="40px" /> The documentation below considers that you have already installed the AdMob SDK, Google Analytics SDK and have it all linked to your Firebase project account. For documentation related to technical aspects, I recommend you to look at Google’s official page. The next versions plan to include step-by-step on technical aspects.

</aside>

The framework

Knowing the function and purpose of each pillar will help you understand sooner how the stack works together

  1. Firebase: will be the place where ad experiments are executed by using Remote Config and A/B tests.
  2. Google AdMob: is responsible for ingesting your ad inventory to the exchange. It manages ad requests to fill your placements and monetize your product.
  3. Google Analytics: is the tool that will allow you to measure the impact of your ad experiments via metrics like user retention, ad revenue, purchase revenue, etc. Also will help you to build audiences and create custom dimensions to design remote conditions for your A/B tests.

Level of complexity

Depending on your previous experience working with ad monetization, I recommend considering three options before using any JSON template.

Complexity Stack Data type Conditions Testing goal
Low AdMob null 0 Ad Revenue
Medium AdMob Firebase GA string number boolean Up to 10 Ad Revenue Purchases Retention
High AdMob Firebase GA json Unlimited Ad Revenue Purchases Retention

<aside> 1️⃣ Low

</aside>

If you have 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.

<aside> 2️⃣ Medium

</aside>

Before doing advanced setups with a JSON 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.

<aside> 3️⃣ High

</aside>

You have a decent experience in 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

are essentially rules that you set up in the Firebase console to serve different configuration settings to different subsets of your user base. It follows the waterfall effect. So be clear in the way you structure your conditions.

This is a list of rule types I use the most you can use to create conditions on Firebase. Go here to read the full documentation.

Type Value Notes
app List of available apps in the project n/a
app_version Specify the version(s) of your app to target n/a
platform iOS, Android, Web n/a
language Select one or more languages n/a
country Select one or more regions or countries n/a
user_audiencies Select from a list of Google Analytics audiences Delay of up to 48 to update
user_propperty Select from a list of Google Analytics user properties Relies on custom dimensions
date A specified date and time No time range is allowed

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 it. 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.

<aside> <img src="/icons/exclamation-mark_gray.svg" alt="/icons/exclamation-mark_gray.svg" width="40px" /> The main reason why this framework is so powerful is that any product/growth team can operate without the need for a developer to design and create experiments. To guarantee this, all logic conditions must happen under the Firebase project.

</aside>

Mediation

You can design your waterfall schema with the JSON template in two ways.

  1. Ad Units Fallback (JSON Configuration)
  2. Mediation Groups (AdMob)

<aside> <img src="/icons/thought_gray.svg" alt="/icons/thought_gray.svg" width="40px" /> I recommend you stay away from building a waterfall in the JSON configuration. It’s really hard to manage and optimize. Also, you lose the chance to access bidding. This may not apply for your setup in mind.

</aside>

Align expectations

This is hard to get done. Not all that glitters is gold.

10 things to consider before moving on:

  1. You won’t get it right on your first try
  2. Testing your strategy could get hard
  3. Migrating from your current app code logic is a challenge
  4. Being able to maintain your ad revenue stable during the transition is a big step
  5. First experiments may go wrong
  6. Don’t try to go the advanced way if you are just starting
  7. You may feel alone. Google’s support for this tends to be nonexistent
  8. Small and limited community means you have to learn by yourself
  9. The content is 100% based on my learnings and failures. Nothing is perfect
  10. This document may be wrong. I’m learning every day, and I could make many mistakes.

Learn the logic

Design system

Understand the possible elements of the code, their benefits, and functions. How to apply them, and if they must be included or not.

Parameters Data types Status
Ad units admob_unit_id_name description ad_unit_id format toggle_ad_unit string number boolean array Recommended
Frequencies frequency is_skippable always_on count_intervals string number boolean array Recommended
User segmentation segment_name segment_conditions string number boolean array Optional
Premium users block_ads_for_premium boolean Optional
Cross-promotion cross_promotion_ad_name description type fallback string number boolean array Optional

<aside> <img src="/icons/exclamation-mark_gray.svg" alt="/icons/exclamation-mark_gray.svg" width="40px" /> This is just a simple model to build JSONs that can adapt to any app. It’s a starting point.

</aside>

Ad units

These parameters will be focused on helping you to identify, localize, and control each ad unit

Frequencies

These parameters will help you define the intensity and volume of the impressions you serve to your users

User segmentation

You can effectively personalize your app's ad experience, showing the right kind of ads to the right users at the right time.

Premium users

Control ads' visibility for users with a premium subscription to your app.

Cross-promotion

These parameters give you more control over your cross-promotion strategy and ensure that you maximize user engagement and revenue streams effectively.


Steal the (JSON) templates

<aside> <img src="/icons/snippet_gray.svg" alt="/icons/snippet_gray.svg" width="40px" /> Template 1

{
  "block_ads_for_premium": true,
  "app_sections": {
    "ad_placement_1": {
      "ad_units": [
        {
          "admob_unit_id_name": "Bonus_Rewarded",
          "description": "Rewarded ad for bonus features",
          "ad_unit_id": "ca-app-pub-XXXXXX/AAAAAA",
          "format": "rewarded",
          "toggle_ad_unit": true,
          "always_on": false,
          "frequency": 1,
          "is_skippable": true,
          "fallback": {
            "type": "cross_promotion",
            "cross_promotion_ad_name": "Bonus_Rewarded_CrossPromo",
            "description": "Cross-promotion for bonus features"
          }
        }
      ]
    },
    "ad_placement_2": {
      "ad_units": [
        {
          "admob_unit_id_name": "Level_Completion_Interstitial",
          "description": "Interstitial shown upon level completion",
          "ad_unit_id": "ca-app-pub-XXXXXX/ZZZZZZ",
          "format": "interstitial",
          "toggle_ad_unit": true,
          "always_on": false,
          "frequency": 2,
          "is_skippable": false,
          "fallback": {
            "type": "cross_promotion",
            "cross_promotion_ad_name": "Level_Completion_CrossPromo",
            "description": "Cross-promotion upon level completion"
          }
        }
      ]
    },
    "ad_placement_3": {
      "ad_units": [
        {
          "admob_unit_id_name": "MainPage_Banner",
          "description": "Banner displayed on the main page",
          "ad_unit_id": "ca-app-pub-XXXXXX/YYYYYY",
          "format": "banner",
          "toggle_ad_unit": true,
          "always_on": true,
          "frequency": 1,
          "is_skippable": false,
          "fallback": {
            "type": "cross_promotion",
            "cross_promotion_ad_name": "MainPage_CrossPromo",
            "description": "Cross-promotion for main page"
          }
        }
      ]
    }
  }
}

</aside>

<aside> <img src="/icons/snippet_gray.svg" alt="/icons/snippet_gray.svg" width="40px" /> Template 2

{
  "ad_signal": {
    "block_ads_for_premium": true
  },
  "user_segments": [
    {
      "segment_name": "High_Engagement",
      "segment_conditions": {
        "consecutive_days_opened": 2,
				"total_read_quotes": 100,
        "time_spent_on_screen_per_day": 20
      },
      "ad_units": [
        {
          "admob_unit_id_name": "QuoteRead_Interstitial",
          "description": "Interstitial shown after reading a certain number of quotes",
          "ad_unit_id": "ca-app-pub-XXXXXX/YYYYYY",
          "format": "interstitial",
          "toggle_ad_unit": true,
          "always_on": false,
          "frequency": 1,
          "is_skippable": false
        },
        {
          "admob_unit_id_name": "Themes_Rewarded",
          "description": "Rewarded Ad shown in the Themes section",
          "ad_unit_id": "ca-app-pub-XXXXXX/YYYYYY2",
          "format": "rewarded",
          "toggle_ad_unit": true,
          "always_on": false,
          "frequency": 1,
          "is_skippable": true
        },
        {
          "admob_unit_id_name": "Categories_Rewarded",
          "description": "Rewarded Ad shown in the Categories section",
          "ad_unit_id": "ca-app-pub-XXXXXX/YYYYYY3",
          "format": "rewarded",
          "toggle_ad_unit": true,
          "always_on": false,
          "frequency": 1,
          "is_skippable": true
        }
      ]
    }

</aside>