The morning after setting up AdMob mediation, I opened the dashboard and froze.
My eCPM had dropped 30%. I had set up mediation specifically because "competing ad networks drive prices up" — yet somehow the result was the opposite. I've been building apps independently since 2014, with over 50 million total downloads across my portfolio, and very few monetization experiments have made me feel as much like I'd made a mistake.
Reaching peak monthly AdMob revenue above ¥1.5 million (roughly $10,000) took years of iteration, so I understand the mechanics well. But mediation failures right after setup? That turns out to be remarkably common — and Rork apps have a few specific pitfalls that make them especially prone to it.
What Was Actually Happening
Mediation works by letting multiple ad networks (AppLovin, Unity Ads, Meta Audience Network, etc.) compete for each impression, theoretically pushing eCPM higher. When it works, it works well. The key phrase is "when it works."
Looking back, my eCPM drop had a clear cause: the waterfall configuration was wrong. In situations where AdMob should have been called first, lower-CPM networks were responding first instead.
When you implement ads in a Rork app, the AI-generated code handles the basic AdMob setup reliably. Mediation adapter configuration, though, requires a lot of work in the AdMob console outside of the code — and that's where things tend to go sideways.
Three Pitfalls Specific to Rork Apps
Pitfall 1: Leaving Waterfall eCPM Floors at Default Values
When you configure mediation in the AdMob console, did you leave each network's eCPM floor at the default value?
Google's recommended Bidding (real-time bidding) approach handles optimization automatically, but some networks still only support waterfall mediation. For those, you need to manually set eCPM floors within 10–15% of your actual display rates.
My mistake was leaving the default $0.50 floor in place. My actual eCPM was running between $1.80 and $2.20, so low-quality $0.50-floor ads were flooding my impressions. After adjusting the floor to $1.50, eCPM recovered within three days.
Pitfall 2: ATT and Ad ID Disconnect on iOS
When I added ATT (App Tracking Transparency) to an existing Rork project after the fact, the mediation adapters ended up in a state where they couldn't receive the advertising identifier.
The initialization order matters. If you initialize mediation adapters before the user has responded to the ATT prompt, iOS 14+ will run them without an advertising ID — meaning untargeted ads run for those users indefinitely.
import { requestTrackingPermission } from 'react-native-tracking-transparency';
import MobileAds from 'react-native-google-mobile-ads';
// ✅ Correct order: ATT permission first, then SDK initialization
const initializeAdsAfterATT = async () => {
// Handle ATT on iOS only
if (Platform.OS === 'ios') {
const status = await requestTrackingPermission();
console.log('ATT status:', status);
}
// Initialize AdMob SDK after ATT is resolved
await MobileAds().initialize();
// Mediation adapters initialize automatically at this point
};When writing Rork prompts, specifying "initialize the AdMob SDK after requesting ATT permission" gets the AI to generate code in the correct order. That said, when adding ATT to an existing project, don't just paste the generated code — verify the initialization timing manually.
Pitfall 3: Not Separating Adapter Configuration by Platform
Rork generates code for iOS and Android simultaneously, but AdMob mediation adapters require separate package IDs per OS. If you don't specify iOS and Android configurations separately in your app.json plugin settings, one platform's adapters won't be recognized and ads simply won't show.
// app.json plugin configuration example (iOS/Android separated)
{
"plugins": [
[
"react-native-google-mobile-ads",
{
"androidAppId": "ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX",
"iosAppId": "ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX",
"userTrackingUsageDescription": "This identifier will be used to deliver personalized ads to you.",
"skAdNetworkItems": [
{ "SKAdNetworkIdentifier": "cstr6suwn9.skadnetwork" },
{ "SKAdNetworkIdentifier": "4fzdc2evr5.skadnetwork" }
]
}
]
]
}The SKAdNetworkItems list changes with every network version update. Building a habit of reviewing it monthly prevents the kind of silent iOS ad impression drops that are easy to miss until you check the data.
What Recovery Looked Like
Two weeks after fixing the configuration, eCPM returned to its pre-mediation baseline — and then climbed about 8% above it. Mediation finally started doing what it was supposed to do.
Working with mediation as an indie developer taught me that the initial setup quality has a disproportionate effect on long-term revenue. One thing I appreciate about building with Rork is that faster app development frees up time for exactly this kind of detailed configuration work outside the code. The tool changes where you spend your attention.
For foundational AdMob implementation in Rork, see the Rork AdMob Monetization Guide. For maximizing ATT approval rates — which directly affects mediation performance — see Maximizing ATT Opt-In Rate for AdMob.
The first concrete action you can take today: open your AdMob console and check whether your waterfall eCPM floors reflect your actual recent eCPM. If you have 7 days of data, set floors within 10% of your average — that single change recovered most of my losses.