AdMob メディエーションを設定した翌朝、ダッシュボードを開いて思わず固まりました。
eCPM が30%下がっていたのです。「複数の広告ネットワークを競わせれば収益が上がる」という理屈で導入したのに、逆の結果が出ました。あの日の感覚は今でも覚えています。2014年から個人でアプリ開発を続けてきた中で、収益周りでこれほど「やってしまった」と思った瞬間はほとんどありませんでした。
累計5,000万ダウンロードを超えるアプリ事業を運営しながら、AdMob とは長い付き合いがあります。月の広告収益がピーク時に150万円を超えた時期もあり、収益最大化のための試行錯誤はかなりの量をこなしてきました。その経験からすると、メディエーション導入直後の失敗は「あるある」です。特にRorkで作ったアプリは、設定の落とし穴にはまりやすいポイントが独自にあると気づきました。
AdMob メディエーションで何が起きていたか
メディエーションとは、複数の広告ネットワーク(AppLovin、Unity Ads、Meta Audience Network など)に入札させて、最高額を提示したネットワークの広告を表示する仕組みです。うまく機能すれば eCPM は上がります。
ただし「うまく機能すれば」という条件付きです。
私が経験した eCPM 下落の原因は、後から振り返ると明確でした。ウォーターフォール(各ネットワークへの入札順序)の設定が間違っていたのです。AdMob が最初に呼ばれるべき場面で、単価の低いネットワークが先に応答してしまっていました。
Rorkで広告実装をするとき、AIが生成するコードはAdMobの基本設定としては問題ありません。ただしメディエーションアダプターの追加設定は、コード外のコンソール操作が多く、AIの出力だけでは完結しない部分が残ります。そこが詰まりやすいポイントです。
Rork アプリ特有の3つの落とし穴
落とし穴1: ウォーターフォールの順序をデフォルトのまま放置する
AdMob コンソールでメディエーションを設定するとき、各ネットワークの eCPM フロアをデフォルト値のままにしていませんか。
Googleが推奨する「Bidding(入札型)」方式を使えば自動最適化されますが、一部のネットワークは現時点でもウォーターフォール方式にしか対応していません。この場合、eCPM フロアを実際の表示単価から±10〜15%の範囲で手動設定する必要があります。
私の失敗は、初期設定の $0.50 というフロアをそのまま使ったことでした。実際の eCPM が $1.80 〜 $2.20 のレンジで推移していたため、$0.50 フロアの低品質な広告が大量に表示されてしまいました。フロアを $1.50 に設定し直したところ、3日で元の水準に戻りました。
落とし穴2: iOS の ATT と広告 ID の連携が切れる
Rork のプロジェクトで ATT(App Tracking Transparency)の実装を後から追加したとき、メディエーション側のネットワークが広告IDを受け取れていない状態になることがあります。
ATT の許可を取得した後、メディエーションアダプターを初期化するタイミングが重要です。ATT の許可を取得する前にアダプターを初期化してしまうと、iOS 14以降では広告IDなしで動作するため、ターゲティングなし広告が表示され続けます。
import { requestTrackingPermission } from 'react-native-tracking-transparency';
import MobileAds from 'react-native-google-mobile-ads';
// ✅ ATT許可取得 → アダプター初期化の順番が正しい
const initializeAdsAfterATT = async () => {
// iOS のみ ATT を先に処理
if (Platform.OS === 'ios') {
const status = await requestTrackingPermission();
console.log('ATT status:', status);
}
// ATT 処理後に AdMob SDK を初期化
await MobileAds().initialize();
// この時点でメディエーションアダプターも自動初期化される
};Rork のプロンプトで「ATT許可取得後にAdMob SDKを初期化する」と明示すると、AIもこの順番でコードを生成します。ただし既存プロジェクトに後からATTを追加するときは、生成コードをそのまま使わず、初期化タイミングを必ず確認してください。
落とし穴3: Android と iOS でアダプター設定を分けていない
Rork は iOS/Android 両対応のコードを一括で生成しますが、AdMob メディエーションのアダプターは OS ごとに別のパッケージIDが必要です。
app.json のプラグイン設定で iOS 用と Android 用を分けて記述していないと、どちらかのプラットフォームでアダプターが認識されずに広告が表示されないことがあります。
// app.json のプラグイン設定例(iOS/Android 分離)
{
"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" }
]
}
]
]
}SKAdNetworkItems の一覧は各ネットワークが公式ドキュメントで提供していますが、バージョン更新のたびに内容が変わります。月に1回は確認する習慣をつけておくと、iOS 広告の表示率が落ちるトラブルを防げます。
回復してわかったこと
設定を修正してから2週間後、eCPM は導入前の水準に戻り、さらに8%ほど上回るようになりました。メディエーションが本来の機能を発揮し始めたのです。
个人開発でメディエーションを扱うとき、最初の設定に時間をかけることが後の収益に大きく効きます。Rorkでアプリを素早く作れるようになったぶん、広告設定のような「コード外の作業」に時間を割く余裕も生まれました。それは良い変化だと思っています。
基本的なAdMob設定についてはRork AdMob広告収益化ガイドを、ATTの承認率を上げる実装についてはATT承認率を最大化する方法も参照してみてください。
まず AdMob コンソールでウォーターフォールのeCPMフロアを実態に近い値に設定し直すことが、今日からできる最初のアクションです。過去のデータがあれば、直近7日間の平均 eCPM から±10%の範囲を目安にしてみてください。
同じ失敗をしている方の参考になれば幸いです。