広告収入を測定する

収益源の測定は、ユーザーのライフタイム バリューの把握、ひいてはアプリビジネスの拡大につながります。このガイドでは、お使いのプラットフォームに応じて広告収入の測定を設定する方法について説明します。

広告収入の測定を設定すると、以下のことが可能になります。

始める前に

次のタスクをまだ完了していない場合は、すべて完了する必要があります。

  1. Google アナリティクスを使ってみるの説明に沿って、プロジェクトとアプリを設定します。

  2. Firebase プロジェクトが Google アナリティクス アカウントにリンクされていることを確認します。

  3. Android SDK v17.6.0 以降または Apple プラットフォーム SDK v6.34.0 以降がアプリに含まれていることを確認します。

実装

Google アナリティクスを使用すると、AdMob、AppLovin、ironSource などの収益化プラットフォームで広告を表示することによって生じる広告収入を測定できます。広告収入を測定するには、アプリ内で広告がユーザーに表示されるたびに ad_impression イベントをロギングします。これらのイベントには、広告プラットフォーム、ソース、通貨、値などの詳細情報が含まれます。

AdMob

AdMob プラットフォームを使用している場合は、AdMob アプリを Firebase とアナリティクスにリンクして、広告収入の自動測定を有効にします。Google アナリティクス用の Firebase SDK は、広告がユーザーに表示されるたびに、自動的に ad_impression イベントをロギングします。

その他の広告収益化プラットフォーム

AppLovin や ironSource などのプラットフォームでは、インプレッション単位の収益データが提供されます。このデータを使用して Google アナリティクスの ad_impression イベントをロギングできます。

次のセクションでは、いくつかの広告収益化プラットフォームの実装例を示します。

AppLovin

Swift

注: この Firebase プロダクトは、macOS ターゲットでは使用できません。
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

注: この Firebase プロダクトは、macOS ターゲットでは使用できません。
- (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

注: この Firebase プロダクトは、macOS ターゲットでは使用できません。
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

注: この Firebase プロダクトは、macOS ターゲットでは使用できません。
- (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 広告で ad_impression を処理できるようにするには、currencyvalue の両方のパラメータを含める必要があります(下記を参照)。ユーザーの価値の過大評価または過小評価を防ぐために、どちらのパラメータもできる限り正確である必要があります。

currency パラメータ

currency パラメータ(iOS+ | Android | Unity)は、ISO_4217 形式の 3 文字の文字列で送信します(例: "USD")。広告収益化プラットフォームによっては通貨が省略されるため、その場合はパラメータをハードコードする必要があります。

value パラメータ

value パラメータ(iOS+ | Android | Unity)は、小数点にドット「.」を使用して送信します。プラットフォームによっては、受け取った値をこの形式に変換しなければならない場合があります。一部のプラットフォームでは数値の形式がローカライズされ、小数点としてカンマが使用されることがあります。中には値を送信しないプラットフォームもあります。

値は double や long などの数値型にする必要があります。たとえば、1000.010.0011.00 はすべて有効です。

検証

Google アナリティクスは、開発サイクル全体を通じて実装を検証するためのいくつかの機能を備えています。

  1. DebugView
    実装を最初にテストするときは、DebugView を使用して ad_impression のテストデータをコンソールに表示できます。ad_impression イベントを選択すると、送信されたパラメータを画面右側の [パラメータ] パネルで確認できます。これにより、正しい情報が処理されているかどうかを確認できます。

  2. リアルタイム
    アプリをデプロイしたら、Google アナリティクスのリアルタイム レポートを使用して、実装が正しく機能していることを確認できます。リアルタイム レポートで、イベント名ごとのイベント数のカードを表示して [ad_impression] を選択すると、過去 30 分間のイベントとパラメータの詳細が表示されます。

  3. BigQuery
    BigQuery Export を使用して、1 日または複数日の ad_impression イベントのサンプルを抽出します。この抽出されたサンプルを使用して、ゼロの値、未設定の値などの問題を見つけます。正しく処理されていないケースがあれば、コードを修正します。

次のステップ

Firebase コンソールでアナリティクス ダッシュボードを確認します。また、アナリティクス コンソールでリンクされているアナリティクスのプロパティを確認します。広告収入は、ユーザーあたりの平均収益額(ARPU)やライフタイム バリュー(LTV)などの指標に組み込まれます。