AdMob Ads Not Showing — Common Symptoms and Overview
You've integrated AdMob into your Rork-built app, but ads refuse to appear on a real device. Or maybe they were showing fine until they suddenly stopped. Perhaps the AdMob dashboard shows zero revenue despite getting traffic. These are frustrating problems that directly impact your bottom line as an indie developer.
The root causes of missing AdMob ads fall into five main categories:
- Configuration errors: Wrong app ID or ad unit ID, using test IDs in production
- Policy issues: Missing app-ads.txt, AdMob policy violations leading to account restrictions
- Implementation bugs: Incorrect React Native / Expo ad component setup
- Network and environment: No ad inventory, regional restrictions, VPN interference
- Pending review: New ad units taking up to an hour to activate
This guide walks through each cause with concrete code examples and step-by-step fixes so you can get your ads running again.
Cause 1: Wrong AdMob App ID or Ad Unit ID
The most common culprit is a simple ID mismatch. AdMob uses two distinct types of identifiers — an "App ID" and "Ad Unit IDs" — and confusing them will silently prevent ads from loading.
Verifying Your App ID
Log into the AdMob console (apps.admob.com) and navigate to your app's settings to find your App ID. The format looks like this:
- iOS:
ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX - Android:
ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX
If you're using Expo with Rork, make sure this is correctly set in your app.json or app.config.js:
// app.json — AdMob App ID configuration
{
"expo": {
"plugins": [
[
"react-native-google-mobile-ads",
{
"androidAppId": "ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX",
"iosAppId": "ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX"
}
]
]
}
}
// Expected: AdMob SDK initializes correctly after buildVerifying Ad Unit IDs
Ad unit IDs are separate from the app ID. Each ad format (banner, interstitial, rewarded) gets its own unique ID.
// Centralized ad unit ID management (recommended pattern)
const AD_UNIT_IDS = {
banner: {
ios: 'ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX',
android: 'ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX',
},
interstitial: {
ios: 'ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX',
android: 'ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX',
},
rewarded: {
ios: 'ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX',
android: 'ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX',
},
} as const;
// Platform-specific selection
import { Platform } from 'react-native';
const bannerAdUnitId = Platform.select(AD_UNIT_IDS.banner);
// Expected: Correct unit ID selected for each platformTest IDs Left in Production
During development you should use Google's official test ad IDs, but leaving them in a release build can cause ads to stop loading entirely. Use an environment-based toggle to switch automatically:
// Environment-aware ad ID switching
const getAdUnitId = (type: 'banner' | 'interstitial' | 'rewarded') => {
if (__DEV__) {
// Official Google test ad IDs
const testIds = {
banner: 'ca-app-pub-3940256099942544/6300978111',
interstitial: 'ca-app-pub-3940256099942544/1033173712',
rewarded: 'ca-app-pub-3940256099942544/5224354917',
};
return testIds[type];
}
// Production ad IDs
return Platform.select(AD_UNIT_IDS[type]);
};
// Expected: Test ads in development, real ads in productionCause 2: Missing or Incorrect app-ads.txt
The app-ads.txt file declares which ad networks are authorized to sell ads in your app. Without it, ad requests may be rejected and you won't earn any revenue.
How to Set Up app-ads.txt
- In the AdMob console, go to "Apps" → "app-ads.txt" tab and copy your unique snippet
- Place the
app-ads.txtfile at the root of your developer website - Make sure the website URL matches what's registered in App Store Connect / Google Play Console
# Example app-ads.txt
# Contains your AdMob publisher ID (copy from AdMob console)
google.com, pub-XXXXXXXXXXXXXXXX, DIRECT, f08c47fec0942fa0Verification
Visit https://yoursite.com/app-ads.txt in a browser and confirm it displays correctly. In the AdMob console, the app-ads.txt tab should show a "Verified" status.
Note that it can take up to 24 hours for changes to propagate, so don't panic if ads don't appear immediately after setup.
Cause 3: React Native / Expo Implementation Issues
Since Rork generates React Native + Expo apps, there are specific gotchas with the ad SDK integration.
Confirming react-native-google-mobile-ads Installation
# Verify the package is installed
npx expo install react-native-google-mobile-ads
# Check that the Expo config plugin is applied correctly
npx expo config --type introspect | grep -A5 "google-mobile-ads"
# Expected: androidAppId and iosAppId are displayedRebuilding with EAS Build
AdMob's native SDK does not work in Expo Go. You must use EAS Build (Development Build) for testing on a real device.
# Create a development build
eas build --profile development --platform ios
eas build --profile development --platform android
# Install on a physical device and test
# Expected: Test banner ad appears at the bottom of the screenCorrect Ad Component Implementation
// components/BannerAd.tsx — Banner ad component
import React, { useState } from 'react';
import { View, Text, StyleSheet } from 'react-native';
import {
BannerAd as RNBannerAd,
BannerAdSize,
TestIds,
} from 'react-native-google-mobile-ads';
interface Props {
adUnitId?: string;
}
export const BannerAdComponent: React.FC<Props> = ({ adUnitId }) => {
const [adLoaded, setAdLoaded] = useState(false);
const [adError, setAdError] = useState<string | null>(null);
const unitId = __DEV__ ? TestIds.BANNER : (adUnitId ?? '');
if (!unitId) {
return null; // Don't render if no ad unit ID is configured
}
return (
<View style={styles.container}>
{adError && (
<Text style={styles.errorText}>
Failed to load ad: {adError}
</Text>
)}
<RNBannerAd
unitId={unitId}
size={BannerAdSize.ANCHORED_ADAPTIVE_BANNER}
requestOptions={{
requestNonPersonalizedAdsOnly: true,
}}
onAdLoaded={() => {
setAdLoaded(true);
setAdError(null);
console.log('✅ Banner ad loaded successfully');
}}
onAdFailedToLoad={(error) => {
setAdError(error.message);
console.error('❌ Banner ad failed to load:', error);
}}
/>
</View>
);
};
const styles = StyleSheet.create({
container: {
alignItems: 'center',
marginVertical: 8,
},
errorText: {
color: '#ef4444',
fontSize: 12,
marginBottom: 4,
},
});
// Expected: Console logs success message when ad loads correctlyCommon Error Codes
When an ad fails to load, the onAdFailedToLoad callback provides an error code you can use to diagnose the issue:
- ERROR_CODE_NO_FILL (code 3): No ads available. Wait and retry, or try a different ad format
- ERROR_CODE_NETWORK_ERROR (code 2): Network connection issue. Check Wi-Fi or mobile data
- ERROR_CODE_INVALID_REQUEST (code 1): Invalid request. Double-check your ad unit ID
- ERROR_CODE_INTERNAL_ERROR (code 0): Internal SDK error. Restart the app or update the SDK version
Cause 4: AdMob Account and Policy Problems
If ads suddenly stop showing after working fine, a policy violation is the likely culprit.
Checking the AdMob Policy Center
- Open the AdMob console → "Policy center" in the left menu
- Look for any warnings or violation notices
- Check the "App review" section to see each app's status
Common Policy Violations and Fixes
- Invalid traffic: Clicking your own ads or repeatedly loading ads during testing → Always use test ad IDs during development
- Content policy violation: App contains adult or violent content → Fix the content and request a re-review
- Ad placement violation: Ads placed in a way that encourages accidental clicks → Add sufficient spacing between ads and interactive content
- App under review: New apps must pass AdMob's review before ads are served → Wait for the status to change to "Ready"
Revenue Not Reflecting
AdMob dashboard revenue can be delayed by up to 48 hours. Additionally, clicks and impressions flagged as invalid traffic are deducted from your earnings.
There will always be a gap between "estimated revenue" and "finalized revenue." Final numbers are confirmed at month-end, with payment typically processed around the 21st of the following month.
Cause 5: Ad Inventory and Network Environment
Even with a perfect implementation, ads may not show due to external factors.
No Fill (Low Ad Inventory)
Apps targeting niche categories or regions outside major markets may encounter low ad inventory. The solution is to implement AdMob mediation, which adds multiple ad networks (Meta Audience Network, Unity Ads, AppLovin, etc.) as fallback sources, improving your fill rate.
VPN and Proxy Interference
Running a VPN during development can disrupt ad delivery. Turn off your VPN when testing ads to rule out this issue.
New Ad Unit Propagation Time
Newly created ad unit IDs can take up to one hour to become active. If you just created a new unit and it's not showing, give it some time before troubleshooting further.
Verification Checklist
After applying your fixes, run through this checklist to confirm everything is working:
- App ID in
app.jsonmatches the AdMob console - Ad unit IDs are for the correct platform (iOS vs. Android)
app-ads.txtis published at your website root and verified in AdMob- You're testing on a real device with EAS Build (not Expo Go)
- Test ads (
TestIds.BANNER, etc.) display correctly - Production builds use production ad IDs
- No warnings in the AdMob Policy Center
- App status is "Ready" in the AdMob console
# Check logs on a real device (iOS)
npx react-native log-ios | grep -i "admob\|ad\|google"
# Check logs on a real device (Android)
adb logcat | grep -i "admob\|Ads\|Google"
# Expected: "Ad loaded successfully" or relevant error logsPreventing Future Issues
Once you've resolved the immediate problem, put safeguards in place to avoid recurrence:
- Manage ad IDs with environment variables: Avoid hardcoding — use
.envfiles withapp.config.js - Clearly separate test and production: Use the
__DEV__flag to auto-switch between test and production IDs - CI/CD ad ID validation: Add a build step that verifies app ID consistency
- Regular AdMob dashboard checks: Review the Policy Center and revenue reports at least weekly
- Error logging: Follow the Sentry crash monitoring setup guide to include ad-related errors in your monitoring pipeline
Looking back
AdMob ads failing to show in your Rork app almost always comes down to one of these categories: configuration mistakes, policy violations, implementation bugs, or environmental factors. By working through the checklist in this guide from top to bottom, you should be able to identify and fix the root cause in most cases.
Ad revenue is a critical pillar of app monetization. With the right setup and regular monitoring, you can build a stable and growing revenue stream. For a broader look at monetization strategies beyond ads, check out the complete Rork app monetization strategy guide.