◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/2026-05-18上級

Rork × Firebase Remote Config で AdMob を本番のまま安全に切り替える — 起動広告と頻度キャップを「リリースなし」で動かす運用

壁紙アプリ運用で起動広告を強くしすぎて DAU が落ちた経験から、AdMob のフォーマット配信比率・頻度キャップ・除外条件を Firebase Remote Config で扱う設計をまとめました。Expo/Rork での実装、フェイルセーフ、A/B、指標の繋ぎ込みまで。

Rork585AdMob73Firebase Remote ConfigExpo219個人開発218収益化68

✦ プレミアム記事

起動した瞬間に広告が出るアプリが嫌いです。自分でも壁紙アプリの起動広告(App Open Ads)を強くしすぎて、想定外に DAU が落ちた経験があります。リリースしてから 1 週間ほど見ていて、ようやく「広告ではなくユーザーが消えていた」と気づいた、あの時の重さを今もよく覚えています。

このとき痛感したのは、広告まわりの設定は「リリースの粒度より細かく動かしたい」ということでした。Apple や Google の審査を待ってから 30 秒のインターバルを 60 秒に変える、という運用は、個人開発のスピード感に合わありません。本番アプリのまま、コードを変えずに、広告の出し方だけを徐々に調整したい。

その後、Rork で作った新しい壁紙アプリでも同じ問題に直面したとき、私は Firebase Remote Config を「広告の契約書」として使う設計 に切り替えました。AdMob のフォーマット出し分け、頻度キャップ、初日除外、ATT/UMP との順序まで、すべてリリース不要で動かせるようにしてあります。この設計に落ち着くまでに踏んだ落とし穴と、12 年の AdMob 運用で身についた「広告は静かに調整する」という作法を、この記事にまとめておきます。

なぜ AdMob は Remote Config と相性が良いのか

AdMob の設定は、AdMob 管理画面側でも一部はリリースなしで変えられます。たとえばユニットの有効/無効や、ad unit の単価フロアは管理画面から触れます。ただし、アプリ側のロジック — 起動広告を出すかどうか、何秒間隔で出すか、どの画面遷移で出すか、初日のユーザーを除外するか — はコードに書かれていて、リリース不要で動かす仕組みを自分で用意しないと変えられません。

Firebase Remote Config はここに綺麗にハマります。

  • 値はサーバー側に保管され、起動時に取りに行く
  • パラメータ単位で条件分岐できる(OS/バージョン/国/プロパティ/オーディエンス)
  • Firebase A/B Testing と直結していて、抽出されたバケットごとに値を出し分けられる
  • Crashlytics・Analytics と並んで Firebase の同じプロジェクトに同居する

2014 年から個人アプリ開発を続けていて、累計 5,000 万 DL を超えるまで色々な収益化の試行錯誤をしてきましたが、「広告ロジックをアプリのリリースから切り離せたかどうか」が、その後の精神的余裕を大きく左右する分岐点でした。リリースに紐付いた広告ロジックは、いざ何かあったときに戻すコストが大きく、慎重さがどんどん増していきます。

設計:Remote Config を「フラグ集」ではなく「広告契約」として扱う

最初の頃、私は Remote Config を enable_admob のような単純なブール値の置き場として使っていました。これは扱いが楽な一方、出せる工夫が限られます。やがて、広告の運用は「契約書」のような構造として扱うほうがずっと自然だと考えるようになりました。

ここでいう「契約」は、たとえば次のようなパラメータ群です。

  • ad_config_version:契約のバージョン番号(後述する分析で必須)
  • show_app_open:起動広告を出すか
  • app_open_min_interval_sec:起動広告の最小インターバル秒
  • app_open_first_session_excluded:初回起動セッションを除外するか
  • interstitial_after_n_screens:n 画面遷移ごとに出す(0 で停止)
  • rewarded_optin_position:リワード広告の導線を出す位置(detail / tab / none)
  • paywall_probability:ペイウォール導線を出す確率(0.0〜1.0)

ポイントは、これらを TypeScript の型で固める ことです。Remote Config の値は何でも入れられる代わりに、何が入っているかコード側で保証されません。型の枠を先に作り、Remote Config の値はそこに当てはめる方針にしておくと、3 か月後の自分が壊さずに済みます。

// 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,
};

デフォルト値は 安全側(保守的) に振っておきます。後で詳しく触れますが、これは Remote Config が取れなかったときに過剰広告で事故らないためのフェイルセーフです。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦AdMob のフォーマット出し分け・頻度キャップ・除外条件を Remote Config の「広告契約」として型化する設計
✦Expo/Rork で fetchAndActivate を初期化フローに組み込み、起動を遅らせない fail-closed 実装
✦Firebase A/B Testing と AdMob 指標を ad_config_version で結びつけ、3 日単位で判定するための監視構成
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ 開発ツール2026-09-03
リンクを押してもアプリが開かないとき、疑うのは assetlinks.json の置き場所より先に署名鍵です
Android App Links が検証されずブラウザに吸われる原因の多くは指紋の食い違いです。keytool の実出力と、手元で照合できる小さな検査スクリプトの実行結果を添えて整理しました。
⬡ 開発ツール2026-08-14
ライセンス表示に載せる依存は、lockfile の dev/prod では決まりません
AI ビルダーが書き出したプロジェクトの依存を実際に分類し、ライセンス表示に載せる範囲をどう決めたかの記録です。copyleft の検出結果と配布物の境界の食い違いを、本番プロジェクトの実データで確かめました。
⬡ 開発ツール2026-06-12
Rork 製アプリに開発者デバッグメニューを実装する — 広告・課金・Remote Config の検証をリリース前に終わらせる設計
リリースビルドでしか再現しない広告・課金・Remote Config の不具合に毎回本番で向き合うのは消耗します。壁紙アプリ6本の運用で固まった、ストア提出ビルドには存在ごと残さない開発者デバッグメニューの設計と実装を、動くコードと落とし穴付きで共有します。