expoadmobreact-nativemonetization

How to Add AdMob to an Expo App in 2026 (the Right Way)

expo-ads-admob is gone — react-native-google-mobile-ads with a config plugin is the standard. Complete setup for app IDs, ad units, and Play Console ad declaration.

Adding AdMob to an Expo app used to mean expo-ads-admob. That package was removed from the Expo SDK starting with SDK 46, and the standard replacement is react-native-google-mobile-ads (by Invertase) with its Expo config plugin. Here is the full, working setup for 2026 — including the two mistakes that cause most AdMob crashes.

Step 1: Install the package

npx expo install react-native-google-mobile-ads

The package ships its own Expo config plugin, which configures the native iOS and Android projects for you — no manual build.gradle or Podfile edits needed with EAS Build / prebuild.

Step 2: Register the App ID in app config

Create an app entry in the AdMob console for each platform, then wire the App IDs into app.json / app.config.ts:

{
  "react-native-google-mobile-ads": {
    "android_app_id": "ca-app-pub-XXXXXXXXXXXXXXXX~YYYYYYYYYY",
    "ios_app_id": "ca-app-pub-XXXXXXXXXXXXXXXX~YYYYYYYYYY"
  }
}

The plugin reads this key and injects the IDs into AndroidManifest.xml and Info.plist at prebuild time.

The #1 mistake: App IDs use a tilde (ca-app-pub-3940256099942544~3347511713), Ad Unit IDs use a slash (ca-app-pub-3940256099942544/6300978111). Putting an Ad Unit ID in the app config crashes the app at startup with a cryptic GADInvalidInitializationException.

Step 3: Show test ads first

Never develop against real ad units — clicking your own live ads is an easy way to get your AdMob account suspended. Google provides demo ad units for every format:

import { BannerAd, BannerAdSize, TestIds } from "react-native-google-mobile-ads";

<BannerAd
  unitId={__DEV__ ? TestIds.BANNER : "ca-app-pub-XXXX/YYYY"}
  size={BannerAdSize.ANCHORED_ADAPTIVE_BANNER}
/>

Only swap in production ad unit IDs for release builds.

If you serve ads to users in the EEA or UK, you must use Google's User Messaging Platform (UMP) for consent — the SDK exposes it through AdsConsent:

import { AdsConsent } from "react-native-google-mobile-ads";

const info = await AdsConsent.requestInfoUpdate();
if (info.isConsentFormAvailable) {
  const { status } = await AdsConsent.loadAndShowConsentFormIfRequired();
}

Initialize the Mobile Ads SDK only after consent is resolved, and check canRequestAds before serving ads to European users.

Step 5: Declare ads in Google Play Console

Before releasing on Android, set Policy and programmes → App content → Ads → "Yes, my app contains ads" in Play Console. Skipping this declaration is a policy violation, not an optional nicety.

The lazy way: AdMob pre-wired

BowlerKit's Expo template ships with react-native-google-mobile-ads already integrated — banner placements, consent flow, and a reviewed configuration surface gated behind EXPO_PUBLIC_ADMOB_ENABLED, with safe fallback to Google's demo IDs until you add your own. See the quick start and pair it with the Play Store assets guide to finish your release checklist.