開発Tips

フリーミアム設計の勘所 — 広告の入れ方・プレミアムの価値・トライアル・画面PV計測

個人開発しているゲーム記録アプリ「ログ簿」で、フリーミアム(無料+プレミアム課金)まわりの設計を見直しました。広告・課金・計測を一通りたどってみると、それぞれが噛み合って初めて機能する構造だと再確認できたので、設計の勘所として整理します。

フリーミアムは掛け算で考える

広告・課金からの収益は、ざっくり次の掛け算で決まります。

収益 ≒ ユーザー数 × エンゲージメント(表示・接触回数) × 単価/効率

どれか一つが小さいと全体が小さくなります。特に見落としやすいのが真ん中の「エンゲージメント(=広告やプレミアム導線が実際に目に触れる回数)」と、右の「効率(=課金に至る動線があるか)」です。ここを設計の観点で見直しました。

広告は「常時表示」と「オプトイン」を役割分担する

広告をリワード(動画視聴の見返りに報酬)だけにすると、ユーザーが自分から見に行かない限り一度も表示されません。オプトインのリワードは体験を邪魔しない良さがある一方、表示機会そのものは少なくなります。表示機会を作るには、常時表示のバナーや、区切りで出すインタースティシャルを組み合わせる必要があります。

ただし常時広告はポリシー順守が最優先です(規約違反はアカウント停止に直結します)。

  • バナーは操作領域と明確に分離して誤タップを防ぐ(誤タップは無効トラフィック扱いになりうる)。
  • インタースティシャルは頻度キャップ必須。表示は自然な区切りに限定し、回数も絞る。

頻度判定は1か所に閉じ込めておくとテストしやすくなります。

// 「1セッションN回まで」「前回から最低M分」を判定するだけの小さな方針クラス
bool canShow(int shownThisSession, DateTime? lastShownAt, DateTime now) {
  if (shownThisSession >= maxPerSession) return false;
  if (lastShownAt != null && now.difference(lastShownAt) < minInterval) return false;
  return true;
}

プレミアムに「広告非表示」という価値を持たせる

フリーミアムは「無料に、有料で解消したくなる摩擦がある」ことで回ります。常時広告を入れるなら、プレミアム(およびトライアル中)はその広告を消す——ここが表裏一体です。追加した広告は単一のゲートで一括制御しておくと分かりやすい。

// プレミアム/トライアル中は追加広告を出さない、という単一ゲート
bool shouldShowAds(bool isPremium) => !isPremium;

課金状態はクライアントで勝手に判断せず、課金プラットフォーム(RevenueCat)のエンタイトルメントを真実として参照します。あわせて、プレミアムのタスク枠を実質無制限にすると価値が明確になります。

無制限にするときの「解約時の挙動」を先に決める

無制限化で悩むのが解約時です。無料上限を超えて作ったデータが、解約したらどうなるか。ここは「既存データは消さない」を最優先にしました。

  • 既存のデータはそのまま使える(編集・完了・並び替えは可)。
  • 無料上限を超えている間は新規追加だけ不可。アプリが勝手にデータを減らすことはしない。

再開を促す動線は出しますが、ユーザーの記録を人質に取る挙動は避ける、という方針です。

トライアルの「本体」はストア側にある

継続課金への入り口として無料トライアルを付けるとき、整理しておきたいのは、トライアルの本体はアプリのコードではなくストア側の設定だという点です。

  • iOS は App Store Connect、Android は Google Play のオファー機能で無料トライアルを定義する。
  • どちらも「そのサブスクを一度も購入していない新規ユーザーのみ・1人1回」に自動で限定できる。
  • 購入処理(StoreKit / Billing)がトライアルを自動適用するので、付与のためのコード変更は不要

自前のペイウォールなら、アプリ側の仕事は「ストアが返す入門オファー情報を読んで『◯日間無料』と表示する」ことだけ。ストア設定が伝播していない間は通常価格にフォールバックし、例外を出さないようにしておきます。

計測を先に整える(画面PV)

施策の前に「どの画面がどれだけ見られているか」を測れる状態にしておきます。ここで踏みやすい落とし穴が2つありました。

  • 画面遷移の自動計測(FirebaseAnalyticsObserver)は、遷移先のルートに名前が付いていないと拾えない。名前を付け忘れた画面は計上されない。
  • screen_view を独自パラメータで送ると、GA4 標準の「画面」レポートに乗らない。標準の予約パラメータ(firebase_screen)に合わせて送る必要がある。

測れないものは改善できないので、施策より先にここを揃えておく価値があります。

まとめ

  • フリーミアムは掛け算。ユーザー数・エンゲージメント・効率のどれかが欠けると全体が小さくなる。
  • 広告とプレミアムは表裏一体。常時広告を入れるなら、有料でそれを消せることをセットで設計する。
  • 無料の抜け道は課金動線と干渉する。無料で得られるものと有料の価値の線引きを最初に決める。
  • トライアルの本体はストア設定。アプリ側は表示に徹し、未設定時のフォールバックを用意する。
  • 計測を先に整える。標準の画面計測に乗せ、取りこぼしを無くしてから施策を打つ。