RORK LABJP
TOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude CodeSIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App StoreMAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessageNATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core MLSEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the roundTOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude CodeSIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App StoreMAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessageNATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core MLSEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the round
Articles/App Dev
App Dev/2026-04-08Intermediate

Rork App AdMob Ads Not Showing — How to Fix Missing Ads and Revenue Issues

Fix AdMob ads not displaying in your Rork app and troubleshoot revenue not reflecting. Covers test ID mistakes, app-ads.txt setup, policy violations, and step-by-step solutions.

troubleshooting65error6fix6admob4monetization47ads2react-native12

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 build

Verifying 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 platform

Test 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 production

Cause 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

  1. In the AdMob console, go to "Apps" → "app-ads.txt" tab and copy your unique snippet
  2. Place the app-ads.txt file at the root of your developer website
  3. 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, f08c47fec0942fa0

Verification

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 displayed

Rebuilding 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 screen

Correct 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 correctly

Common 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

  1. Open the AdMob console → "Policy center" in the left menu
  2. Look for any warnings or violation notices
  3. 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:

  1. App ID in app.json matches the AdMob console
  2. Ad unit IDs are for the correct platform (iOS vs. Android)
  3. app-ads.txt is published at your website root and verified in AdMob
  4. You're testing on a real device with EAS Build (not Expo Go)
  5. Test ads (TestIds.BANNER, etc.) display correctly
  6. Production builds use production ad IDs
  7. No warnings in the AdMob Policy Center
  8. 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 logs

Preventing 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 .env files with app.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.

Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

App Dev2026-05-31
Fixing the 'Signed With the Wrong Key' Error When Uploading a Rork App to Google Play
Your Rork app builds fine but Google Play rejects the upload with 'signed with the wrong key'? Here's how to tell which signing key is involved and the exact steps to fix it for each build setup.
App Dev2026-04-09
Fix Rork Android Build Errors: Gradle & SDK Troubleshooting Guide
Struggling with Android build errors in your Rork app? This guide covers the most common Gradle errors, SDK version mismatches, and memory issues — with step-by-step solutions for each.
Dev Tools2026-04-08
Rork In-App Purchase Setup Errors: How to Fix IAP Not Working (StoreKit & RevenueCat)
Troubleshoot Rork app In-App Purchase errors: products not loading, sandbox test failures, RevenueCat API key issues, and StoreKit configuration problems. Step-by-step fixes for 12 common IAP errors.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →