← Build AdMob & Meta Ads for Android
Developer field guideAndroidGoogle Mobile Ads SDKMeta Audience NetworkVerified Sep 15, 2026

AdMob & Meta ads, end to end

Your app sells a few seconds of screen space, many times a day. AdMob runs the sale: it asks Google's advertisers and Meta's advertisers (plus others) what that moment is worth, shows the highest bidder's ad, counts the impression and pays you. This guide walks through every piece of that chain from a developer's side.

Code uses Kotlin and the GMA Next-Gen SDK, which Google made its preferred Android SDK in July 2026. Legacy SDK equivalents are noted where they differ.

Contents
  1. What changed
  2. The ad marketplace
  3. How AdMob & Meta fit
  4. Ad formats
  5. Life of an ad request
  6. Bidding vs waterfall
  7. Metrics & money
  8. Account setup
  9. Code integration
  10. Testing
  11. Privacy & consent
  12. Policies
  13. Optimisation
  14. Troubleshooting
  15. Launch checklist
  16. Glossary
  17. Sources

The short version

AdMob is two things at once

An ad network (it sells your inventory to Google's advertisers) and a mediation platform (it runs an auction that other networks, like Meta, can bid into).

Meta Audience Network is a bidder

Meta's advertisers buy space in other apps through it. Inside AdMob, Meta competes through bidding only. Waterfall support ended in 2021.

You add two dependencies

The Google Mobile Ads SDK plus the Meta mediation adapter (which pulls in Meta's SDK). No Meta-specific ad code is needed; you load AdMob ad units as usual.

Two payouts, two dashboards

AdMob pays for Google demand. Meta pays its share directly through your Meta Business payout account. Each reports its own numbers.

Everything that goes wrong in practice falls into one of five buckets: setup (app-ads.txt, app verification, mapping Meta placements), consent (a missing GDPR message or partner list), code (initialising late, loading on demand instead of preloading), policy (accidental clicks, disruptive interstitials) and expectations (eCPM varies wildly by country and format). Each has its own section below.

What changed recently

Most tutorials online predate these changes. If a guide shows play-services-ads as the only option or a Meta waterfall setup, it is out of date.

  1. Meta Audience Network becomes bidding-only. The adapter drops waterfall support from v6.12.0.0.Meta
  2. AdMob requires app-ads.txt verification for new apps before they can fully serve ads; existing apps rolled in through 2025.AdMob
  3. Google retires Privacy Sandbox on Android (Topics, Protected Audience, Attribution Reporting, SDK Runtime). The Advertising ID (GAID) stays.Platform
  4. India notifies the DPDP Rules, 2025, with core consent obligations phased in over 18 months.Privacy
  5. GMA Next-Gen SDK enters open beta: a Kotlin rewrite with background initialisation and ad preloading.AdMob
  6. Legacy SDK 25.0.0: large anchored adaptive banners, removal of old mediation callbacks; 23.x deprecated.AdMob
  7. Legacy SDK 22.x reaches sunset.AdMob
  8. Next-Gen SDK becomes Google's preferred Android SDK; the legacy 25.x line gets a retirement schedule.AdMob
  9. September 2026: best time to build new integrations on Next-Gen.
  10. DPDP consent notices and data-principal rights apply in India, including verifiable parental consent for users under 18.Privacy
  11. Legacy SDK deprecated: ads still serve, Google support ends.AdMob
  12. Legacy SDK sunset: ads may stop serving and outdated-SDK warnings can block app releases.AdMob
Part I · Concepts

The ad marketplace

Mobile advertising is a two-sided market. Advertisers bring budgets; publishers (you) bring attention. Ad platforms sit in the middle, match the two in milliseconds, and take a cut.

ADVERTISERS BUYING TOOLS AD NETWORKS MEDIATION YOUR APP Advertisers want installs, sales or reach Google Ads App campaigns, DV360 Meta Ads Manager Advantage+ campaigns Google demand AdMob network, AdX Meta Audience Network bidding partner AdMob mediation one auction, highest value wins Android app GMA SDK Meta adapter user sees the ad budget budget buys buys bid bid winner advertiser pays per impression, click or install each network keeps its share net revenue to you
Budgets flow right, money flows back. Google and Meta each run their own advertiser business; AdMob mediation is where their bids meet your ad slot. You never deal with advertisers directly.

Who is who

RoleExamplesWhat they want from you
AdvertiserGame studios, fintech, e-commerce, other appsReal users who install, buy or remember the brand. Fraudulent or accidental clicks cost them money, which is why policies are strict.
Demand-side platformGoogle Ads, DV360, Meta Ads ManagerNothing directly. They decide which of your impressions to buy using the signals your request carries (device, country, app category, consent state, ad ID).
Ad network / exchangeAdMob network, Meta Audience Network, AppLovin, Unity, Pangle…A correctly integrated SDK or adapter, a verified app (app-ads.txt), and clean traffic.
Mediation platformAdMob mediation (also AppLovin MAX, Unity LevelPlay)Ad units, mediation groups and partner mappings configured in its dashboard. It decides which network fills each request.
PublisherYouOwns the app, the ad placements, user consent and policy compliance. Gets paid.

How AdMob and Meta fit together

You have three realistic setups. The difference is whether Meta and Google compete for the same impression.

A · AdMob only Simplest start. One bidder family. Google demand AdMob auction Your app · GMA SDK bids ad B · AdMob + Meta bidding Recommended. Real competition. Google demand Meta AN AdMob auction Your app · GMA SDK + Meta adapter bids winner C · Meta SDK standalone Not advised. Unfilled slots stay empty. Meta AN no auction Your app · Audience Network SDK ad, if Meta has one
Setup B adds one arrow: Meta's bid into the same auction. More bidders per impression means higher prices and fewer empty slots. Meta integrates with AdMob, AppLovin MAX and Unity LevelPlay as a bidder; pick one mediation platform, not several.

AdMob gives you

  • Google's advertiser demand (Google Ads app campaigns, AdX, DV360)
  • Mediation: ad units, mediation groups, bidding partners, A/B tests
  • Consent tooling (User Messaging Platform) and Ad Inspector
  • Reporting, Firebase linking, monthly payments

Meta Audience Network gives you

  • Meta's advertisers, who target using Facebook/Instagram data
  • Often strong prices on interstitial, rewarded and native in many markets
  • Its own dashboard (Monetization Manager), app review and payouts
  • Nothing to code beyond the adapter dependency and a network config

Ad formats

Format choice decides both revenue and how users feel about your app. Full-screen formats pay more per impression and carry most of the policy risk.

FormatWhat it isMeta bids?Relative eCPMPut itWatch out
BannerRectangular strip anchored top or bottom, or inline in scrolling content. Use adaptive sizes; SDK 25 added large anchored adaptive banners.YesPersistent screens users stay onNever next to buttons or overlapping content. Refresh is automatic (set in AdMob).
NativeYou receive assets (headline, image, icon, CTA) and render them in your own layout. Meta also supports native banner.YesFeeds, lists, results screensMust show the "Ad" badge and AdChoices; Meta requires a MediaView for impressions to count.
App openFull-screen ad shown when the user brings the app to the foreground.NoWarm starts, behind your splashDon't show on the very first launch; cap frequency.
InterstitialFull-screen ad the user closes. Static or video.YesNatural breaks: level end, after a task completesNot on app launch/exit, not mid-action, not after every tap. Must be closable.
Rewarded interstitialFull-screen ad that offers a reward, shown at a break without the user asking first.YesLevel end with bonus offerTell the user what they'll get before it plays.
RewardedUser opts in to watch an ad in exchange for a reward (coins, a life, premium content).Yes"Watch to get X" buttonsGrant the reward only in the reward callback; use server-side verification for anything valuable.

Relative eCPM is a typical ordering, not a promise. Actual prices vary by country, season (Q4 is highest), audience and app category, often by 5–20× between markets.

Part II · Mechanics

Life of an ad request

What actually happens between your app launching and a rupee (or cent) landing in your account. This order matters: consent gates initialisation, initialisation gates signals, and signals decide whether Meta can bid at all.

CONSENT INIT REQUEST & AUCTION SHOW & COUNT Your app UMP SDK GMA SDK + Meta adapter & SDK AdMob servers Meta Audience Network 1 request consent info 2 form if needed · status 3 MobileAds.initialize() 4 adapters start 5 preload ad unit 6 collect signals (Meta token) 7 ad request + signals 8 bid request 9 bid ($ eCPM) 10 run auction 11 winning ad 12 ad ready in the preload pool 13 show(activity) 14 impression, clicks 15 if Meta won 16 paid event (ad value)
Steps 6–9 are why the adapter matters. The Meta adapter generates a bidder token on-device; AdMob forwards it to Meta server-to-server. No adapter, no token, no Meta bid. Solid arrows are calls, dashed arrows are responses.

Step by step, in plain words

  1. Consent (1–2). The UMP SDK checks the user's region. In the EEA, UK, Switzerland and US states with privacy laws it may show a consent or opt-out message you configured in AdMob. The result is a stored consent string that later requests carry.
  2. Initialise (3–4). MobileAds.initialize() starts Google's SDK and every mediation adapter on the classpath. The Meta adapter initialises Meta's SDK. Next-Gen runs this on a background thread.
  3. Request (5–7). You ask for an ad on a specific ad unit ID. The SDK bundles device and app signals: ad ID (if permitted), country, OS, app version, consent, and each bidding adapter's token.
  4. Auction (8–11). AdMob sends bid requests to bidding partners, including Meta, collects bids, compares them with Google's own demand and any waterfall sources, and returns the winner's ad.
  5. Show (12–13). With preloading the ad waits in a pool until you call show(). If Meta won, the adapter renders Meta's creative using Meta's SDK.
  6. Count and pay (14–16). The impression is recorded when the ad actually renders. Clicks and video completions are tracked. The paid event reports the estimated value, which you can forward to analytics.
Latency budget

The whole request-to-ad round trip happens in well under a couple of seconds on a good network, but it is never instant. That is why full-screen ads should be preloaded before the moment you want to show them, never requested at that moment.

Bidding vs waterfall

Two ways a mediation platform can decide who fills an impression. Meta only supports the second.

Waterfall · one network at a time Ranked by past eCPM. Each miss adds a round trip. Network X floor $3.00 no fill Network Y floor $2.00 no fill Network Z floor $1.00 fills passes passes Result: ~$1.00 after 3 requests A network that would have paid $2.50 never got asked. Bidding · everyone at once Bidders price this exact impression in real time. Google demand $3.40 Meta AN $3.60 wins Other bidder $2.20 Waterfall source $1.00 $0 $1 $2 $3 $4 Result: $3.60 from Meta, one auction Example eCPM values, for illustration only.
Bidding removes the guesswork of ordering. In a waterfall you set floors from history; in bidding each network says what this impression is worth now. AdMob places the auction winner alongside any remaining waterfall sources and the highest value serves.

eCPM floors

A minimum price. AdMob offers optimised floors for its own demand. Floors too high cut fill; too low and you undersell. Start with Google-optimised floors.

Mediation groups

Rules that say "for these ad units, in these countries, on this platform, use these sources." Split by country tier only when you have enough traffic per group.

Bidding partners

Each needs its adapter in your app, a signed partnership in AdMob, and a mapping (Meta: placement ID per ad unit).

Metrics and money

Revenue is a chain of rates. Every drop in the chain is a place to look when numbers disappoint.

The funnel (example numbers)

Show rate drops when you preload ads that are never shown (user leaves before the break). Low show rate is a code problem; low fill is a demand or setup problem.

Formulas you'll use every week

eCPM = revenue ÷ impressions × 1,000
Fill rate = matched requests ÷ ad requests
Show rate = impressions ÷ matched requests
ARPDAU = daily ad revenue ÷ daily active users
Revenue = DAU × impressions per DAU × eCPM ÷ 1,000

Revenue estimator

Replace the example inputs with numbers from your AdMob report (Reports → Mediation, grouped by format).

Example inputs
Per day$0
Per 30 days$0
ARPDAU$0

How you get paid

AdMobMeta Audience Network
Who paysGoogle, for Google demand and bidding sources paid through AdMobMeta, directly, not through AdMob
Where to set upAdMob → PaymentsMeta Business Suite / Monetization Manager → payout settings
Payment threshold$100 for USD accounts (equivalent amounts in other currencies)Minimum payout applies; confirm the current amount in Meta's Business Help Center
CycleMonthly. Last month's earnings finalise early in the month; if your balance is above the threshold, payment goes out around the 21stMonthly, on Meta's own schedule
VerificationIdentity and address (mailed PIN) once earnings reach $10Business details and tax information before payouts
Numbers of recordAdMob's impression countsMeta's own counts; expect small differences from AdMob's view
Tax note for India-based developers

Foreign ad income has income-tax and GST implications, and US-sourced earnings may need tax forms (such as W-8BEN) in both dashboards. I'm not a tax advisor, so confirm your treatment with a chartered accountant.

Part III · Build

Account setup

Most "ads not showing" problems are dashboard problems, not code problems. Do these in order.

  1. Get the Play listing ready

    AdMob verifies apps against their store listing. Publish the app (or prepare the listing) and set a developer website in Play Console → Store settings. That domain will host app-ads.txt.

  2. Create the AdMob app and ad units

    • AdMob → Apps → Add app → link it to the Play listing. Note the App ID (ca-app-pub-…~…).
    • Create one ad unit per placement (e.g. home_banner, level_end_interstitial, extra_life_rewarded). Note each ad unit ID (ca-app-pub-…/…). Separate units give you per-placement reports and controls.
  3. Publish app-ads.txt and verify

    Host a plain-text file at https://yourdomain.com/app-ads.txt (domain root, not a subfolder). Then AdMob → App settings → Verify app. Apps can't fully serve ads until verification and the app readiness review pass.

    app-ads.txtcopy exact lines from each dashboard
    # Google AdMob (your publisher ID)
    google.com, pub-XXXXXXXXXXXXXXXX, DIRECT, f08c47fec0942fa0
    # Meta Audience Network (line shown in Monetization Manager)
    facebook.com, YOUR_META_ID, DIRECT, c3e20eee3f780d68
  4. Configure privacy messages

    AdMob → Privacy & messaging. Create a European regulations (GDPR) message and a US state regulations message. The UMP SDK shows whatever you publish here, so there's no consent UI to design yourself.

  5. Set up AdMob payments

    Add payee name and address (must match your bank), tax information, and a bank account once you cross the thresholds. Verify the mailed PIN when it arrives.

  6. Set up Meta Audience Network

    • Create a Meta Business account, open Monetization Manager and create a property for your app with the Android platform and package name.
    • Choose Google AdMob as your mediation platform.
    • Create a placement for each AdMob ad unit you want Meta to bid on, in the matching format. Note each placement ID.
    • Add Meta's line to app-ads.txt, and set up payout and tax details. Meta reviews properties before live ads serve.
  7. Connect Meta inside AdMob

    • AdMob → Mediation → create (or edit) a mediation group for Android and the format; add your ad units.
    • Under Bidding, add Meta Audience Network and accept the bidding partnership agreement.
    • Map each AdMob ad unit to its Meta placement ID.
    • Privacy & messaging → add Meta to the ad partners lists for both GDPR and US state regulations. Skip this and Meta can't bid on those users.
  8. Complete Play Console declarations

    App content → Ads (contains ads: yes), Advertising ID declaration, Target audience, and Data safety including what the Google and Meta SDKs collect (both publish guidance for this form).

Code integration

Versions below are current as of September 2026. Check the release notes before copying: adapter versions track Meta SDK versions and move often.

1 · Dependencies

app/build.gradle.ktsminSdk 24 · compileSdk 35 · Kotlin 1.9+
dependencies {
  implementation("com.google.android.libraries.ads.mobile.sdk:ads-mobile-sdk:1.4.0")
  implementation("com.google.android.ump:user-messaging-platform:<latest>")
  // Meta bidding adapter — also brings in Meta's Audience Network SDK
  implementation("com.google.ads.mediation:facebook:6.22.0.0")
}

// Keep the legacy SDK out of a Next-Gen build (adapters can pull it in)
configurations.configureEach {
  exclude(group = "com.google.android.gms", module = "play-services-ads")
  exclude(group = "com.google.android.gms", module = "play-services-ads-lite")
}

2 · Manifest and network config

AndroidManifest.xmlboth SDKs
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- Added automatically by the ads SDK. Child-directed apps must remove it
       with tools:node="remove". -->
  <uses-permission android:name="com.google.android.gms.permission.AD_ID" />

  <application
      android:networkSecurityConfig="@xml/network_security_config">
    <!-- AdMob App ID (note the ~). UMP reads it from here. -->
    <meta-data
        android:name="com.google.android.gms.ads.APPLICATION_ID"
        android:value="ca-app-pub-XXXXXXXXXXXXXXXX~YYYYYYYYYY" />
  </application>
</manifest>
res/xml/network_security_config.xmlfor Meta video caching
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <!-- Meta's SDK serves cached media from localhost. Android 9+ blocks
       cleartext by default, so allow it for 127.0.0.1 only. -->
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">127.0.0.1</domain>
  </domain-config>
</network-security-config>

If you already have a network security config, merge this domain block into it instead of replacing the file.

3 · Consent first, then initialise

Gather consent before any ad request. Call canRequestAds() right away too, because consent from a previous session is usually still valid and you shouldn't make returning users wait.

MainActivity.ktNext-Gen
class MainActivity : AppCompatActivity() {
  private lateinit var consentInformation: ConsentInformation
  private val adsInitStarted = AtomicBoolean(false)

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    consentInformation = UserMessagingPlatform.getConsentInformation(this)
    val params = ConsentRequestParameters.Builder().build()

    consentInformation.requestConsentInfoUpdate(this, params, {
      UserMessagingPlatform.loadAndShowConsentFormIfRequired(this) { formError ->
        // formError is null on success; log it otherwise
        if (consentInformation.canRequestAds()) initializeAds()
      }
    }, { requestError ->
      // Network failure etc. Fall through to the check below.
    })

    // Returning users: consent from last session may already allow ads
    if (consentInformation.canRequestAds()) initializeAds()
  }

  private fun initializeAds() {
    if (adsInitStarted.getAndSet(true)) return
    CoroutineScope(Dispatchers.IO).launch {
      MobileAds.initialize(
        this@MainActivity,
        InitializationConfig.Builder("ca-app-pub-XXXXXXXXXXXXXXXX~YYYYYYYYYY").build()
      ) {
        // All adapters (including Meta) have reported in. Start preloading.
        startPreloading(INTERSTITIAL_UNIT)
      }
    }
  }
}

Add a Privacy settings entry in your app's settings screen when consentInformation.privacyOptionsRequirementStatus == REQUIRED, and open UserMessagingPlatform.showPrivacyOptionsForm(activity) { … } from it. Users must be able to change their choice later.

4 · Load and show ads

Next-Gen · preloaderkeeps a ready ad in a pool
private fun startPreloading(adUnitId: String) {
  val request = AdRequest.Builder(adUnitId).build()
  InterstitialAdPreloader.start(adUnitId, PreloadConfiguration(request))
}

// Call at a natural break, e.g. after a level ends
private fun showInterstitial(activity: Activity, adUnitId: String) {
  val ad = InterstitialAdPreloader.pollAd(adUnitId) ?: return  // none ready: just continue
  ad.adEventCallback = object : InterstitialAdEventCallback {
    override fun onAdImpression() { /* counted */ }
    override fun onAdDismissedFullScreenContent() { /* resume the app */ }
    override fun onAdFailedToShowFullScreenContent(error: FullScreenContentError) { }
  }
  ad.show(activity)
}

Rules of thumb for code

  • Never block app start on ads. Initialise in the background.
  • Preload full-screen ads; an ad object shows once.
  • Handle "no ad" as a normal path: skip the break, hide the banner slot.
  • Retry failed loads with backoff, not in a tight loop.
  • Destroy banners and native ads with their screen to avoid leaks.

Meta-specific code notes

  • No Meta ad code: you only ever reference AdMob ad unit IDs.
  • Native: use a MediaView for the main media, or Meta won't count impressions.
  • Native extras: FacebookMediationAdapter.KEY_SOCIAL_CONTEXT_ASSET in getExtras().
  • Adapter needs API 23+ and Kotlin 1.9+ (v6.22.0.1 and later).

Testing

Never click your own live ads

Clicking or repeatedly viewing real ads on your own device is the fastest way to get ad serving limited or your account disabled. Use test ad units during development and register every team device as a test device.

Google's test IDs

TypeTest ID
App IDca-app-pub-3940256099942544~3347511713
Banner (adaptive)ca-app-pub-3940256099942544/9214589741
Interstitialca-app-pub-3940256099942544/1033173712
Rewardedca-app-pub-3940256099942544/5224354917
Rewarded interstitialca-app-pub-3940256099942544/5354046379
Nativeca-app-pub-3940256099942544/2247696110
App openca-app-pub-3940256099942544/9257395921

Test IDs only exercise Google demand. To test Meta, use your real ad units on a registered test device, as below. Keep IDs in buildConfigField per build type so release builds can never ship test IDs.

Testing Meta through AdMob

  1. Register the device in AdMob

    AdMob → Settings → Test devices. Pick a gesture (shake or flick) to open Ad Inspector on that device.

  2. Turn on test mode in Meta

    Monetization Manager → your property → testing. The Facebook app must be installed and logged in on the test device. Meta's own testing guide also lets you register device IDs.

  3. Force a Meta win in Ad Inspector

    Open Ad Inspector → your ad unit → single ad source testing → "Meta Audience Network (Bidding)". Load an ad and confirm the adapter status is green and a Meta test creative renders.

  4. Test consent from outside Europe

    Use ConsentDebugSettings with DEBUG_GEOGRAPHY_EEA and your hashed device ID (printed in Logcat) to see the GDPR form. Call consentInformation.reset() between runs.

  5. Switch Meta test mode off before release

    Test mode left on means no revenue from Meta.

Part IV · Operate

Privacy and consent

Consent decides whether an ad is personalised, limited, or not requested at all, and it decides which partners may bid. Getting it wrong costs revenue in the best case and fines in the worst.

returning user: previous consent still valid App start Request consent info Show form if required canRequestAds() Initialise SDK and preload ads true false Don't request ads Settings screen: privacy options change choice anytime
Every ad request passes one gate: canRequestAds(). Outside regulated regions it returns true immediately and no form is shown. Inside them, the answer depends on what the user chose.
RegimeApplies toWhat it means for your adsMeta-specific
GDPR / UK GDPRUsers in the EEA, UK, SwitzerlandConsent via the IAB TCF framework, shown by UMP. Without consent, Google can serve limited ads; many partners can't bid at all.Meta isn't on the IAB Global Vendor List. Consent reaches it through Google's Additional Consent spec, so Meta must be in your GDPR ad partners list.
US state lawsCalifornia and other states with privacy lawsUsers can opt out of "sale/sharing". UMP shows the opt-out message; Google applies restricted data processing for its demand.Google's setting doesn't flow through to Meta. Follow Meta's data processing options (Limited Data Use) guidance yourself.
India DPDP ActUsers in IndiaFrom 13 May 2027: clear notice, consent for processing, withdrawal as easy as giving, grievance contact, and verifiable parental consent for under-18s. Plan your notice now.Covers data you and your SDK partners process about Indian users; review both SDKs' disclosures.
Children (COPPA, Play Families)Apps aimed at, or also used by, childrenTag requests as child-directed / under age of consent, use only Play's Families self-certified ad SDKs for child traffic, and remove the AD_ID permission for child-only apps.The adapter maps the age-restricted setting to Meta's mixed-audience flag. Check whether Meta is allowed for your audience before enabling it.

The Advertising ID (GAID)

  • The AD_ID permission is required for apps targeting Android 13+ to read the ID; the ads SDK adds it for you, and you must complete the Advertising ID declaration in Play Console.
  • Users can delete their ad ID. The SDK then receives zeros; ads still serve but usually earn less.
  • Play policy forbids linking the ad ID to persistent identifiers (Android ID, IMEI, email) for ad purposes without explicit consent.
  • Privacy Sandbox on Android was retired in October 2025, so there is no replacement API to migrate to. The ad ID plus consent remain the model.

Policies and invalid traffic

Three rulebooks apply at once: AdMob program policies, Meta Audience Network policies, and Google Play's ads policy. Advertisers pay for real attention, so anything that inflates impressions or clicks is treated as fraud, even if accidental.

Do

  • Show full-screen ads at natural breaks the user expects.
  • Keep banners clearly separated from buttons and game controls.
  • Label native ads with "Ad" and keep AdChoices visible.
  • Make rewarded ads opt-in, with the reward stated up front.
  • Cap frequency (AdMob ad unit settings plus pacing in code).
  • Keep a real, content-rich screen around every ad.

Don't

  • Click your own ads, or ask anyone to ("support us by clicking").
  • Show interstitials on app launch, on exit, or right after a tap the user meant for something else.
  • Show full-screen ads that can't be closed after 15 seconds (Play policy), or ads when your app isn't in the foreground.
  • Place ads on screens with no content, or stack multiple ads over content.
  • Offer rewards for clicking an ad or installing the advertised app.
  • Buy cheap traffic (bots, incentivised installs) to lift impressions.

What enforcement looks like

SignalWhat happenedWhat to do
Ad serving limitedAdMob is assessing traffic quality (common for new accounts) or detected invalid activity. Fill drops sharply.Check placements for accidental clicks, remove test clicks, review traffic sources. Limits often lift on their own as quality is confirmed.
Policy violationA specific app or page breaks a rule. Ads may be restricted on that app.Fix the issue in a new release, then request review in the Policy center.
DeductionsEarnings from invalid traffic are removed at month close.Treat it as a warning; find the spike in reports by country and ad unit.
Meta placement disabledMeta enforces its own integrity rules independently.Check alerts in Monetization Manager; appeal there.

Optimisation and reporting

Earn more per user

  • Rewarded placements users actually want (extra life, hints, unlocks) usually beat more interstitials.
  • Enable bidding with Meta plus a few other networks strong in your users' countries.
  • Switch to (large) anchored adaptive banners.
  • Run AdMob A/B experiments on floors and mediation setups before rolling out.
  • Expect Q4 highs and a January dip; don't react to seasonal swings.

Measure the right thing

  • Link AdMob to Firebase: ad revenue shows up next to retention and in-app purchases.
  • Forward the paid event's ad value to your attribution/analytics tool if you run user-acquisition campaigns.
  • Track ARPDAU and day-7 retention. Extra ads that lose users lose money.
  • Watch show rate per ad unit; a falling show rate means wasted preloads.

Which report answers which question

QuestionWhere
How much did each network earn?AdMob → Reports → Mediation, broken down by ad source
Is Meta bidding and winning?Mediation report, ad source = Meta Audience Network (bidding): bid requests, bids, win rate
What does Meta say I earned?Monetization Manager → performance (this is what Meta pays on)
Why didn't this single request fill?Ad Inspector on a test device: per-source status and error
Do ads hurt retention?Firebase / Google Analytics with AdMob linked

Troubleshooting

SymptomLikely causesFix
Test ads work, real ads don'tApp not verified (app-ads.txt), readiness review pending, ad unit created minutes ago, account payment info incompleteCheck App settings status; new ad units can take up to an hour to serve; confirm app-ads.txt is at the domain root
"No fill" errorsLow demand in the user's country, strict floors, consent denied in EEA, ad serving limitTreat as normal; retry with backoff; lower or remove manual floors; review consent rate
Meta never winsAdapter missing from the build, Meta not added under Bidding, wrong or unmapped placement ID, not in GDPR/US partner lists, Meta property not approved or payout not setAd Inspector → check the Meta adapter initialised; recheck mapping and partner lists; check Monetization Manager alerts
Meta test ads don't appearFacebook app not installed or not logged in; test mode off; not using single ad source testingFollow the Meta testing steps above
Meta video stuck or blankCleartext blocked for localhost cacheAdd the 127.0.0.1 network security config
Consent form never showsYou're outside regulated regions; message not published in AdMob; stale stored consentDebug geography + test device hash; publish the message; reset()
Slow start or ANRsInitialising or loading on the main thread; loading several full-screen ads at launchInitialise in the background; preload one ad per format; defer banners until first screen renders
AdMob and Meta revenue don't matchEach counts impressions on its own side; time zones and finalisation differSmall gaps are normal. Investigate only persistent gaps above a few percent
Build fails with duplicate classesLegacy and Next-Gen SDKs both on the classpathAdd the exclude block from the dependencies step
Reference

Launch checklist

0 of 0 done

Ticks are saved in this browser only.

Glossary

Ad unit
An AdMob placement with its own ID (ca-app-pub-…/…), format and settings. The thing your code requests.
Placement (Meta)
Meta's equivalent of an ad unit. Mapped one-to-one to an AdMob ad unit for bidding.
Mediation
Letting one platform choose among several ad networks for each request.
Mediation group
AdMob rule set: which ad units, countries and sources compete together.
Adapter
A small library that translates between the Google Mobile Ads SDK and another network's SDK.
Bidding
Real-time auction where each network prices the specific impression. Also called in-app header bidding.
Waterfall
Legacy method: ask networks one at a time in a fixed order by expected eCPM.
Signals / bidder token
Data an adapter generates on-device so its network can bid server-to-server.
eCPM
Effective revenue per 1,000 impressions, whatever the advertiser actually paid for.
Fill rate
Share of ad requests that returned an ad.
Show rate
Share of returned ads that were actually displayed.
ARPDAU
Average revenue per daily active user.
Floor
Minimum eCPM you'll accept for an impression.
app-ads.txt
IAB standard file listing who is authorised to sell your app's inventory. Blocks spoofing; required by AdMob.
UMP
Google's User Messaging Platform SDK. Shows GDPR and US state privacy messages you design in AdMob.
TCF / AC string
IAB Transparency & Consent Framework consent string, plus Google's Additional Consent string for vendors outside the IAB list, like Meta.
LDU
Meta's Limited Data Use flag for US state privacy laws.
GAID
Google Advertising ID. Resettable, deletable device ID for ads.
SSV
Server-side verification: AdMob calls your server when a rewarded ad completes, so rewards can't be faked client-side.
IVT
Invalid traffic: clicks or impressions that aren't genuine user interest. Deducted from earnings.
Ad Inspector
In-app debug overlay showing each request, each source's result and errors on test devices.

Sources

  1. Next-Gen SDK as the preferred SDK for Android (Jul 2026)
  2. Announcing the GMA Next-Gen SDK (Jan 2026)
  3. Android Google Mobile Ads SDK 25.0.0
  4. Set up GMA Next-Gen SDK
  5. Integrate Meta Audience Network with bidding (Next-Gen)
  6. Integrate Meta Audience Network with bidding (legacy)
  7. Next-Gen interstitial ads
  8. Next-Gen rewarded ads
  9. Next-Gen banner ads
  10. UMP SDK for Next-Gen
  11. AdMob bidding FAQ
  12. Bidding ad sources that require setup
  13. Verify your app with app-ads.txt
  14. About app readiness
  15. AdMob payment thresholds
  16. About Audience Network payments (Meta)
  17. Update on plans for Privacy Sandbox technologies
  18. Legacy Mobile Ads SDK retirement timeline (PPC Land)
  19. DPDP Rules, 2025 (PIB)
  20. DPDP Rules implementation timeline