広告を実装したアプリが、AdMobのレポート上でリクエスト数0件・収益¥0のままだった。
コードを何度読み直しても、実装に問題は見当たらない。結論から書くと、原因はコードではなく、配信面の設定漏れが3つ重なっていたことだった。しかも3つとも、それぞれ独立した別の理由で起きていて、1つ直しても残り2つが残っていれば収益は0のままになる構造だった。
1つ目: UMPのfail-closed設計が、意図どおりに働いていた
EU圏向けの同意画面(UMP)をfail-closed設計で実装していた。同意状態が確認できない場合は、広告を出さない側に倒す設計だ(詳しくは別記事に書いた)。
この設計自体は、別のアプリで実装して問題なく動いていたものを移植した。ところが実装した直後、広告が1枚も表示されなくなった。アプリ側にエラーは出ない。 ログにも異常はない。ただ、バナーの場所に何も表示されないだけだった。
原因は、AdMobコンソール側でGDPR同意メッセージを1つも作っていなかったことだった。UMP SDKは、コンソール側に同意メッセージの設定が無いと、同意を取得できたかどうかを正しく判定できない。fail-closed設計はこれを「同意が取れていない」と正しく解釈し、設計どおりに広告を止めていた。
実装は正しかった。設定が足りていなかっただけだ。 そしてこのケースの厄介なところは、実装側のログを見ても、コンソール側の設定不足には気づけないことだった。
2つ目: AdMobとストアが、そもそも紐付いていなかった
1つ目を直しても、まだ収益は¥0だった。
AdMobの管理画面には、「アプリストアの詳細」というアプリごとの設定項目がある。ここが空欄のままになっていた。AdMob側のアプリ登録と、実際にPlay Storeで公開しているアプリが、システム的に結び付いていなかったということだ。
「アプリを追加」のフローから、公開済みのパッケージ名を検索してリンクし直すと解消した。これも、アプリのコードやビルド設定とは無関係の、AdMobコンソール側だけで完結する設定だった。
3つ目: ウェブサイト欄が、404のドメインを指していた
2つ直しても、まだ収益は¥0だった。
原因はapp-ads.txtの検証エラーだった。app-ads.txtは、広告枠の販売主を宣言するテキストファイルで、AdMobがアプリの公式ウェブサイトを巡回して確認する仕組みになっている。
問題は、Play Consoleの「ストアの設定」にあるウェブサイト欄が、旧ドメインを指したままだったことだ。以前GitHubのアカウント名を変更したことがあり、そのタイミングで参照していたGitHub Pagesのドメインが変わり、旧URLは404になっていた(このアカウント名変更が引き起こした別の被害は、規約ページが軒並み404になって審査提出がブロックされた話として別記事にまとめている)。AdMobは404のURLを巡回してもapp-ads.txtを見つけられず、検証に失敗し続けていた。
正しいドメインに直して、即座に反映されるのを確認した。
3つの共通点
3つとも、症状は同じ「広告収益¥0」だった。だが原因は、
- AdMobコンソール側の同意メッセージ未設定
- AdMobとストアのリンク忘れ
- Play Consoleのウェブサイト欄の参照切れ(別件のドメイン変更が波及)
と、互いに無関係な3か所にあった。どれか1つを直しても、残り2つが残っていれば症状(収益¥0)は変わらない。「直したのに変わらない」という状態が続くと、直した対応自体が間違っていたのかと疑いたくなるが、今回はそうではなかった。複数の独立した原因が、たまたま同じ症状を出していただけだった。
そして3つとも、アプリのコード側からは一切見えない。flutter analyzeも静的解析も、実機での動作確認さえも、この種の設定漏れを検出しない。AdMobコンソールとPlay Consoleの設定画面を、実際に自分の目で1つずつ確認する以外に、気づく方法がなかった。
今の状態
3つとも直したが、記事執筆時点でAdMobのレポートは依然としてリクエスト数0件・収益¥0のままだ。設定を直してから実際にクロールされ、レポートに反映されるまでには時間がかかる。「直した」と「収益が出る」の間には、まだタイムラグがある。
正直に書いておくと、この記事は「直したら儲かった」という話ではない。 「直したのに、まだ結果が出ていない」という記録だ。結果が出たら、そのときにまた書く。
まとめ
- 広告収益が0円のとき、コードよりも先にコンソール側の設定を疑う価値がある
- 症状(収益0円)が同じでも、原因は複数箇所に独立して存在しうる。1つ直して変化がなくても、その修正が間違っていたとは限らない
- AdMob・Play Console双方の設定は、アプリのコードから静的に検出できない。定期的に画面を直接見て確認するしかない
- 過去に別の目的(ドメイン変更など)で行った変更が、時間差で別の場所に波及することがある