◉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-06-02上級

広告の本当のeCPMを自分で測る — Impression-Level Ad Revenue を計測基盤に流し込む実装記録

AdMob の管理画面が見せる平均eCPMだけでは、どの地域やプレースメントが本当に稼いでいるかは分かりません。1インプレッションごとの収益を paidEventListener で受け取り、解析基盤に流して本当のeCPMを出すまでの実装と運用をまとめました。

React Native239AdMob73メディエーション10収益分析設計11

✦ プレミアム記事

きっかけは、6本並行で運用している壁紙アプリのうち、収益が伸び悩んでいた1本のメディエーション設定を見直そうとして、AdMob の管理画面を開いたときでした。ネットワークごとの平均eCPMは並んでいます。AdMob が高い、AppLovin がそこそこ、Pangle は低め。では、その数字を信じて Pangle のフロアを下げるべきでしょうか。

手が止まりました。管理画面が見せているのは「そのネットワークが、すべての地域・すべてのプレースメントを混ぜた平均」です。私のアプリは日本のユーザーが6割、残りが北米と東南アジアに散らばっています。インタースティシャルとアプリ起動時広告では単価がまるで違います。混ぜた平均で「Pangle は低い」と判断して切り捨てると、実は東南アジアのバナーで Pangle だけが埋めてくれていた在庫を、まるごと空にしてしまうかもしれません。

2014年から個人開発を続けて累計5,000万ダウンロードを超えるなかで、広告収益については長いあいだ「管理画面の数字を眺めて勘で調整する」をくり返してきました。この記事は、その勘を捨てて、1インプレッションごとの収益を自分の計測基盤に取り込み、ネットワーク×プレースメント×地域で「本当のeCPM」を出せるようにした実装の記録です。

なぜ管理画面の平均eCPMでは判断を誤るのか

eCPMは「1,000インプレッションあたりの収益」です。管理画面はこれをネットワーク単位、日単位で集計して見せてくれます。便利なのですが、メディエーションの優先度やフロア(最低落札価格)を決めるには粒度が粗すぎます。

問題は3つあります。第一に、地域差が平均に埋もれます。同じバナー1枠でも、北米のインプレッション単価は日本の数倍、東南アジアの数分の一になることが普通です。第二に、プレースメント差が埋もれます。起動時広告と記事下バナーでは、ユーザーの注意の量が違うので単価も違います。第三に、メディエーションの「勝者」しか管理画面の収益には現れないため、「このネットワークを切ったら、その在庫を誰が拾うのか」が平均値からは読めません。

つまり、フロアや優先度という「プレースメント×地域×ネットワーク」の3次元で効く操作を、管理画面が見せる1次元(ネットワーク平均)で決めようとしているのが、判断を誤る根本でした。必要なのは、自分のアプリの中で、1インプレッションが実際にいくら稼いだかを記録することです。

Impression-Level Ad Revenue は何を返すのか

AdMob には Impression-Level Ad Revenue(ILRD、インプレッションレベル広告収益)という仕組みがあり、広告が表示されるたびに、その1インプレッションの推定収益を端末側のコールバックで受け取れます。react-native-google-mobile-ads では、各広告オブジェクトの paidEventListener がこれを担当します。

コールバックが返すのは主に次の値です。value(収益額。ただしマイクロ単位=実額の100万倍の整数)、currencyCode("USD" や "JPY" などの通貨コード)、precision(推定精度。ESTIMATED / PUBLISHER_PROVIDED / PRECISE など)、そしてメディエーションのアダプター情報(どのネットワークが落札したか)です。

ここで最初の落とし穴があります。value はマイクロ単位なので、value / 1_000_000 で初めて通貨単位の金額になります。そして currencyCode はアカウント設定や入札ネットワークによって USD で返ることも JPY で返ることもあります。この2点を取り違えると、収益が桁違いにずれます。私は実際にやりました(後述します)。

✦

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

この記事の続きを読む

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

この記事で得られること
✦管理画面の平均eCPMが判断を誤らせる理由と、Impression-Level Ad Revenue で1インプレッション単位の収益を取る実装(react-native-google-mobile-ads の paidEventListener 実コード)
✦通貨コードとマイクロ単位を取り違えて収益を1,000,000倍/100倍ずれさせた私の失敗と、正規化のBefore/After
✦ネットワーク×プレースメント×地域で本当のeCPMを集計し、入札フロアとメディエーション優先度に反映するまでの運用ルール
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ 開発ツール2026-10-14
起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、読み込みより先に過ぎていたためです
Android 版の起動広告が、アプリを完全に終了してから開く回だけ一度も出ていませんでした。「前面に戻った」合図を読み込みの完了と切り離し、順番ごとにテストできる形へ組み直した記録です。
⬡ 開発ツール2026-08-04
名前が20文字ちょうどでも保存できない — 文字数の数え方を1か所に決めるまでの実測
絵文字や合成文字が入ると、クライアントとサーバーで文字数が食い違います。4つの数え方をNode v22で実測し、切り詰め2,000件の破損率75.6%・UTF-8往復での置換文字化36.1%という結果から、カウントの正本を1か所に置く設計へ至るまでをまとめました。
⬡ 開発ツール2026-06-22
壊れたキャッシュで毎回起動時に落ちるアプリ——ユーザーが自力で抜け出せる「セーフモード起動」を設計する
永続化したキャッシュが壊れて起動のたびに同じ場所で落ちると、ユーザーには再インストールしか残りません。アプリ自身が早期クラッシュの連続を数え、対話可能になって初めて起動を確定し、危険な状態だけを段階的にリセットするセーフモードを、Expo(React Native)の実装で設計します。