◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Beta since 09/15 with no stable date yet; running projects in Expo Go has required login since 09/03●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Beta since 09/15 with no stable date yet; running projects in Expo Go has required login since 09/03●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
Articles/Dev Tools
⬡ Dev Tools/2026-05-18Advanced

Rork × Firebase Remote Config: Tuning AdMob Safely in Production — Run App Open Frequency Caps Without a Release

From the experience of pushing wallpaper-app App Open ads too hard and watching DAU drop, here is a design for treating AdMob format mix, frequency caps, and exclusions as a Firebase Remote Config contract. Expo/Rork wiring, fail-safe defaults, A/B testing, and metric joins included.

Rork585AdMob73Firebase Remote ConfigExpo219indie developer43monetization47

✦ Premium Article

I have never been fond of apps that show an ad the moment they open. I also know exactly how it feels to be on the other side of that decision: in one of my wallpaper apps, I pushed App Open ads a little too hard and watched DAU drop in a way that took me a week to notice. By the time I realised that it was users disappearing rather than ad impressions softening, I had already lost the easy headroom that early DAU gives you. The weight of that week stayed with me.

What I took from it was simple but important: ad-side configuration needs to move at a finer grain than your release cycle. Waiting on App Store or Google Play review to change a 30-second interval to 60 seconds is too slow for the rhythms of solo development. I wanted to leave the binary alone and just nudge how ads are served.

When I hit the same problem again on a newer wallpaper app generated through Rork, I rebuilt the setup around Firebase Remote Config as the contract that drives AdMob behaviour. Format mix, frequency caps, first-day exclusion, ATT/UMP ordering — all of it became something I could move without shipping a new build. The notes below are the design that finally calmed me down, plus the small habits I have collected over twelve years of running AdMob across roughly 50 million downloads.

Why AdMob and Remote Config fit together

The AdMob dashboard lets you change a few things without a release: unit on/off, price floors per unit, mediation waterfall edits. What it does not let you change without a release is the app-side logic — whether you show App Open at all, what the interval is, which screen transitions trigger interstitials, whether to exclude first-day users. That logic lives in your code unless you build a way to move it without a release.

Firebase Remote Config fits there neatly.

  • Values live on the server and are fetched at launch
  • Each parameter can be conditioned on OS, version, country, user property, or audience
  • It plugs into Firebase A/B Testing so you can serve different values to different buckets
  • It sits in the same Firebase project as Crashlytics and Analytics

After more than a decade of indie app development, the single biggest determinant of whether I sleep well during a monetization change has been whether the ad logic is decoupled from the release. When it is welded to a release, every tweak feels heavier, and over time I stop tweaking. That is the worst possible failure mode for an ad setup.

Treat Remote Config as a contract, not a flag bag

Early on I used Remote Config as a place to park a single enable_admob boolean. That is easy to ship but does not let you express anything interesting. The shape that has held up for me is to treat the ad configuration as a small typed contract — a structured document describing how ads should behave for this user, this app version, this country, this experiment bucket.

Concretely, that means parameters like:

  • ad_config_version — version number of the contract (vital for analytics joins)
  • show_app_open — show App Open ads at all
  • app_open_min_interval_sec — minimum seconds between two App Open shows
  • app_open_first_session_excluded — skip App Open during the first session window
  • interstitial_after_n_screens — interstitial every N screen transitions (0 disables)
  • rewarded_optin_position — where the rewarded entry point lives (detail / tab / none)
  • paywall_probability — probability of routing to the paywall on a particular surface

The crucial habit is to type these on the client, not to read them as raw strings. Remote Config will happily hand you any value; the app must enforce the schema.

// types/AdConfig.ts
export type AdConfig = {
  ad_config_version: number;
  show_app_open: boolean;
  app_open_min_interval_sec: number;
  app_open_first_session_excluded: boolean;
  interstitial_after_n_screens: number;
  rewarded_optin_position: "detail" | "tab" | "none";
  paywall_probability: number;
};
 
export const DEFAULT_AD_CONFIG: AdConfig = {
  ad_config_version: 1,
  show_app_open: true,
  app_open_min_interval_sec: 60,
  app_open_first_session_excluded: true,
  interstitial_after_n_screens: 5,
  rewarded_optin_position: "detail",
  paywall_probability: 0.0,
};

The defaults lean conservative. That is intentional, and we will come back to why under the fail-safe section.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦Design AdMob format mix, frequency caps, and exclusions as a typed Remote Config contract, not a flag bag
✦Wire fetchAndActivate into Expo/Rork startup without delaying launch, with a fail-closed fallback chain
✦Join AdMob and Firebase Analytics via ad_config_version so you can judge variants on a three-day rhythm
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
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 →

Related Articles

⬡ Dev Tools2026-06-12
Building a Developer Debug Menu Into Your Rork App — Verify Ads, Purchases, and Remote Config Before Release
A production-safe developer debug menu for Rork apps — switch environments, force test ads, simulate entitlements, and override Remote Config, with working TypeScript code and the pitfalls I hit running six apps.
⬡ Dev Tools2026-05-23
Auditing Privacy Manifests for Rork-Generated Expo Apps — A One-Day Pre-Submission Workflow for Indie Developers
A pre-submission workflow for indie developers shipping Rork-generated Expo apps: enumerate every dependency, tell ITMS-91053 apart from ITMS-91061, and catch the Pods that npm names never show you — hermes included.
⟐ Business2026-04-20
From Rork Prompt to App Store Revenue: A Case Study
A practical record of taking a Rork app from planning through App Store review, launch, and revenue improvements: total costs, review pitfalls, and a stated-assumption estimate of ad revenue at 100 DAU.