収益源の測定は、ユーザーのライフタイム バリューの把握、ひいてはアプリビジネスの拡大につながります。このガイドでは、お使いのプラットフォームに応じて広告収入の測定を設定する方法について説明します。
広告収入の測定を設定すると、以下のことが可能になります。
アプリから得られる広告収入に貢献しているユーザー アクションを分析する。
Firebase A/B Testing を使用してテストを実施し、アプリの広告収入の増大につながる要素を見つける。または Remote Config のパーソナライズを使用して広告エクスペリエンスをパーソナライズする。
Firebase Remote Config を使用して、広告収入のレベルに基づいてユーザー オーディエンスを作成し、ユーザー エクスペリエンスを調整する。
始める前に
次のタスクをまだ完了していない場合は、すべて完了する必要があります。
Analytics を使ってみるの説明に沿って、プロジェクトとアプリを設定します。
Android SDK v17.6.0 以降または Apple プラットフォーム SDK v6.34.0 以降がアプリに含まれていることを確認します。
実装
Google Analytics を使用すると、AdMob、AppLovin、ironSource などの収益化プラットフォームで広告を表示することによって生じる広告収入を測定できます。広告収入を測定するには、アプリ内で広告がユーザーに表示されるたびに ad_impression
イベントをロギングします。これらのイベントには、広告プラットフォーム、ソース、通貨、値などの詳細情報が含まれます。
AdMob
AdMob プラットフォームを使用している場合は、AdMob アプリを Firebase と Analytics にリンクして、広告収入の自動測定を有効にします。Google Analytics 用の Firebase SDK は、広告のインプレッションがユーザーに表示されるたびに、自動的に ad_impression
イベントを記録します。
その他の広告収益化プラットフォーム
AppLovin や ironSource などのプラットフォームでは、インプレッション単位の収益データが提供されます。このデータを使用して Google Analytics の ad_impression
イベントをロギングできます。
次のセクションでは、いくつかの広告収益化プラットフォームの実装例を示します。
AppLovin
Swift
func didPayRevenue(_ impressionData: MAAd?) { if let impressionData = impressionData { Analytics.logEvent( AnalyticsEventAdImpression, parameters: [ AnalyticsParameterAdPlatform: "AppLovin", AnalyticsParameterAdUnitName: impressionData.adUnitIdentifier, AnalyticsParameterAdFormat: impressionData.format, AnalyticsParameterValue: impressionData.revenue, AnalyticsParameterCurrency: "USD", // All Applovin revenue is sent in USD AnalyticsParameterAdSource: impressionData.networkName, ]) } }
Objective-C
- (void)didPayRevenueForAd:(MAAd *)impressionData { [FIRAnalytics logEventWithName:kFIREventAdImpression parameters: @{ kFIRParameterAdPlatform: @"AppLovin", kFIRParameterAdSource: impressionData.networkName, kFIRParameterAdFormat: impressionData.format, kFIRParameterAdUnitName: impressionData.adUnitIdentifier, kFIRParameterCurrency: @"USD", // All Applovin revenue is sent in USD kFIRParameterValue: impressionData.revenue }]; }
Kotlin+KTX
override fun onAdRevenuePaid(impressionData: MaxAd?) { impressionData?.let { firebaseAnalytics = Firebase.analytics firebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION) { param(FirebaseAnalytics.Param.AD_PLATFORM, "appLovin") param(FirebaseAnalytics.Param.AD_UNIT_NAME, impressionData.adUnitId) param(FirebaseAnalytics.Param.AD_FORMAT, impressionData.format.label) param(FirebaseAnalytics.Param.AD_SOURCE, impressionData.networkName) param(FirebaseAnalytics.Param.VALUE, impressionData.revenue) param(FirebaseAnalytics.Param.CURRENCY, "USD") // All Applovin revenue is sent in USD } } }
Java
@Override public void onAdRevenuePaid(MaxAd impressionData) { double revenue = impressionData.getRevenue(); // In USD mFirebaseAnalytics = FirebaseAnalytics.getInstance(this); Bundle params = new Bundle(); params.putString(FirebaseAnalytics.Param.AD_PLATFORM, "appLovin"); params.putString(FirebaseAnalytics.Param.AD_SOURCE, impressionData.getNetworkName()); params.putString(FirebaseAnalytics.Param.AD_FORMAT, impressionData.getFormat().getLabel()); params.putString(FirebaseAnalytics.Param.AD_UNIT_NAME, impressionData.getAdUnitId()); params.putDouble(FirebaseAnalytics.Param.VALUE, revenue); params.putString(FirebaseAnalytics.Param.CURRENCY, "USD"); // All Applovin revenue is sent in USD mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION, params); }
Unity
// Attach callbacks based on the ad format(s) you are using MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent; MaxSdkCallbacks.Rewarded.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent; MaxSdkCallbacks.Banner.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent; MaxSdkCallbacks.MRec.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent; private void OnAdRevenuePaidEvent(string adUnitId, MaxSdkBase.AdInfo impressionData) { double revenue = impressionData.Revenue; var impressionParameters = new[] { new Firebase.Analytics.Parameter("ad_platform", "AppLovin"), new Firebase.Analytics.Parameter("ad_source", impressionData.NetworkName), new Firebase.Analytics.Parameter("ad_unit_name", impressionData.AdUnitIdentifier), new Firebase.Analytics.Parameter("ad_format", impressionData.AdFormat), new Firebase.Analytics.Parameter("value", revenue), new Firebase.Analytics.Parameter("currency", "USD"), // All AppLovin revenue is sent in USD }; Firebase.Analytics.FirebaseAnalytics.LogEvent("ad_impression", impressionParameters); }
ironSource
Swift
func impressionDataDidSucceed(_ impressionData: ISImpressionData!) { Analytics.logEvent( AnalyticsEventAdImpression, parameters: [ AnalyticsParameterAdPlatform: "ironSource", AnalyticsParameterAdSource: impressionData.ad_network ?? "No ad_network", AnalyticsParameterAdFormat: impressionData.ad_unit ?? "No ad_unit", AnalyticsParameterAdUnitName: impressionData.instance_name ?? "No instance_name", AnalyticsParameterCurrency: "USD", AnalyticsParameterValue: impressionData.revenue ?? 0, ]) }
Objective-C
- (void)impressionDataDidSucceed:(ISImpressionData *)impressionData { [FIRAnalytics logEventWithName:kFIREventAdImpression parameters:@{ kFIRParameterAdPlatform: @"ironSource", kFIRParameterAdSource: impressionData.ad_network, kFIRParameterAdFormat: impressionData.ad_unit, kFIRParameterAdUnitName: impressionData.instance_name, kFIRParameterCurrency: @"USD", kFIRParameterValue: impressionData.revenue }]; }
Kotlin+KTX
override fun onImpressionSuccess(impressionData: ImpressionData) { // The onImpressionSuccess will be reported when the rewarded video and interstitial ad is // opened. // For banners, the impression is reported on load success. Log.d(TAG, "onImpressionSuccess" + // impressionData) firebaseAnalytics = Firebase.analytics firebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION) { param(FirebaseAnalytics.Param.AD_PLATFORM, "ironSource") param(FirebaseAnalytics.Param.AD_SOURCE, impressionData.adNetwork) param(FirebaseAnalytics.Param.AD_FORMAT, impressionData.adUnit) param(FirebaseAnalytics.Param.AD_UNIT_NAME, impressionData.instanceName) param(FirebaseAnalytics.Param.CURRENCY, "USD") param(FirebaseAnalytics.Param.VALUE, impressionData.revenue) } }
Java
@Override public void onImpressionSuccess(ImpressionData impressionData) { // The onImpressionSuccess will be reported when the rewarded video and interstitial ad is opened. // For banners, the impression is reported on load success. Log.d(TAG, "onImpressionSuccess" + impressionData); mFirebaseAnalytics = FirebaseAnalytics.getInstance(this); if (impressionData != null) { Bundle bundle = new Bundle(); bundle.putString(FirebaseAnalytics.Param.AD_PLATFORM, "ironSource"); bundle.putString(FirebaseAnalytics.Param.AD_SOURCE, impressionData.getAdNetwork()); bundle.putString(FirebaseAnalytics.Param.AD_FORMAT, impressionData.getAdUnit()); bundle.putString(FirebaseAnalytics.Param.AD_UNIT_NAME, impressionData.getInstanceName()); bundle.putString(FirebaseAnalytics.Param.CURRENCY, "USD"); bundle.putDouble(FirebaseAnalytics.Param.VALUE, impressionData.getRevenue()); mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION, bundle); } }
Unity
private void ImpressionSuccessEvent(IronSourceImpressionData impressionData) { if (impressionData != null) { Firebase.Analytics.Parameter[] AdParameters = { new Firebase.Analytics.Parameter("ad_platform", "ironSource"), new Firebase.Analytics.Parameter("ad_source", impressionData.adNetwork), new Firebase.Analytics.Parameter("ad_unit_name", impressionData.getInstanceName), new Firebase.Analytics.Parameter("ad_format", impressionData.getAdUnit), new Firebase.Analytics.Parameter("currency","USD"), new Firebase.Analytics.Parameter("value", impressionData.getRevenue) }; Firebase.Analytics.FirebaseAnalytics.LogEvent("ad_impression", AdParameters); } }
実装に関する注意事項
Google Ads で ad_impression
を処理できるようにするには、currency
と value
の両方のパラメータを含める必要があります(以下を参照)。ユーザーの価値の過大評価または過小評価を防ぐために、どちらのパラメータもできる限り正確である必要があります。
currency パラメータ
currency
パラメータ(iOS+ | Android | Unity)は、ISO_4217 形式の 3 文字の文字列で送信します(例: "USD"
)。広告収益化プラットフォームによっては通貨が省略されるため、その場合はパラメータをハードコードする必要があります。
value パラメータ
value
パラメータ(iOS+ | Android | Unity)は、小数点にドット「.」を使用して送信します。プラットフォームによっては、受け取った値をこの形式に変換しなければならない場合があります。一部のプラットフォームでは数値の形式がローカライズされ、小数点としてカンマが使用されることがあります。中には値を送信しないプラットフォームもあります。
値は double や long などの数値型にする必要があります。たとえば、1000.01
、0.001
、1.00
はすべて有効です。
検証
Google Analytics には、開発サイクル全体を通じて実装を検証するための複数の機能が用意されています。
DebugView
実装を最初にテストするときは、DebugView を使用してad_impression
のテストデータをコンソールに表示できます。ad_impression
イベントを選択すると、送信されたパラメータを画面右側の [パラメータ] パネルで確認できます。これにより、正しい情報が処理されているかどうかを確認できます。リアルタイム
アプリをデプロイしたら、Google Analytics のリアルタイム レポートを使用して、実装が正しく機能していることを確認できます。リアルタイム レポートで、イベント名ごとのイベント数のカードを表示して [ad_impression] を選択すると、過去 30 分間のイベントとパラメータの詳細が表示されます。BigQuery
BigQuery Export を使用して、1 日または複数日のad_impression
イベントのサンプルを抽出します。この抽出されたサンプルを使用して、ゼロの値、未設定の値などの問題を見つけます。正しく処理されていないケースがあれば、コードを修正します。
次のステップ
Firebase コンソールの Analytics ダッシュボード、または Analytics コンソールのリンクされた Analytics プロパティに移動します。広告収入は、ユーザーあたりの平均収益額(ARPU)やライフタイム バリュー(LTV)などの指標に組み込まれます。