Как отслеживать доход от рекламы

Измерение источников дохода поможет вам понять пожизненную ценность ваших пользователей и развивать свой бизнес. В этом руководстве рассказывается, как настроить отслеживание дохода от рекламы для вашей платформы.

После настройки отслеживания дохода от рекламы вы можете:

Подготовка

Если вы ещё этого не сделали, выполните следующие действия:

  1. Настройте проект и приложение, как описано в статье Начало работы с Analytics.

  2. Убедитесь, что вы связали проект Firebase с аккаунтом Google Analytics.

  3. Убедитесь, что в ваше приложение включен Android SDK версии 17.6.0 или выше либо SDK для платформ Apple версии 6.34.0 или выше.

Реализация

Google Analytics позволяет отслеживать доход от показа рекламы на платформах монетизации, таких как AdMob, AppLovin и ironSource. Чтобы отслеживать доход от рекламы, вы должны регистрировать события ad_impression каждый раз, когда пользователь видит рекламу в вашем приложении. Эти события содержат сведения о рекламной платформе, источнике, валюте и стоимости.

AdMob

Если вы используете платформу AdMob, свяжите приложение AdMob с Firebase и Analytics, чтобы включить автоматическое отслеживание дохода от рекламы. Firebase SDK для Google Analytics автоматически регистрирует событие ad_impression при каждом показе объявления вашим пользователям.

Другие платформы монетизации

Такие платформы, как AppLovin и ironSource, предоставляют данные о доходе на уровне показа, которые можно использовать для регистрации событий Google Analytics ad_impression.

Ниже приведены примеры реализации для нескольких платформ монетизации.

AppLovin

Swift

Примечание. Эта функция Firebase недоступна для watchOS.
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 недоступна для watchOS.
- (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

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 недоступна для watchOS.
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 недоступна для watchOS.
- (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

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 (iOS+ | Android | Unity) должен передаваться в виде строки в трехбуквенном формате ISO_4217 (например, "USD"). Некоторые платформы для монетизации с помощью рекламы не передают валюту, поэтому вам может потребоваться задать этот параметр в коде.

Параметр value

В параметре value (iOS+ | Android | Unity) в качестве десятичного разделителя должна использоваться точка. Возможно, вам потребуется преобразовать значения, полученные от некоторых платформ, чтобы они соответствовали указанному выше формату. На некоторых платформах числовые форматы локализованы и в качестве десятичного разделителя используется запятая. В некоторых случаях платформа может вообще не отправлять значение.

Кроме того, значение должно быть числовым, например double или long. Например, 1000.01, 0.001 и 1.00 – это допустимые значения.

Проверка

В Google Analytics есть несколько функций, которые позволяют проверять реализацию на протяжении всего цикла разработки.

  1. DebugView
    При первом тестировании реализации используйте DebugView, чтобы посмотреть тестовые данные ad_impression в консоли. Выбрав событие ad_impression, вы можете посмотреть параметры, которые отправляете, на панели Параметры в правой части экрана. Это поможет вам убедиться, что обрабатывается правильная информация.

  2. Отчет в реальном времени
    После развертывания приложения используйте Google Analytics отчет в реальном времени, чтобы убедиться, что реализация работает правильно. В отчете в реальном времени найдите карточку Количество событий с разбивкой по параметру "Название события" и выберите ad_impression, чтобы посмотреть сведения о событии и параметрах за последние 30 минут.

  3. BigQuery
    Используйте экспорт BigQuery, чтобы извлечь выборку событий ad_impression за один или несколько дней. Используйте этот извлеченный образец для поиска проблем, таких как нулевые или незаданные значения, и примените исправления к своему коду для любых необработанных вариантов использования.

Дальнейшие действия

Откройте панель управления Analytics в консоли Firebase или связанный ресурс Analytics в консоли Analytics. Доход от рекламы учитывается в таких показателях, как средний доход на пользователя (ARPU) и общая ценность (LTV).