Avaliar a receita de publicidade

Avaliar suas fontes de receita ajuda a entender o valor da vida útil dos usuários e a ampliar seu negócio de apps. Veja neste guia como configurar a medição da receita de publicidade na sua plataforma.

Depois disso, você vai poder fazer o seguinte:

Antes de começar

Conclua as tarefas a seguir, caso ainda não tenha feito isso:

  1. Configure o projeto e o app como descrito em Primeiras etapas com o Analytics.

  2. Verifique se você vinculou seu projeto do Firebase a uma conta do Google Analytics.

  3. Veja se você incluiu no seu app o SDK do Android v17.6.0 ou o SDK para plataformas da Apple v6.34.0 (ou versões posteriores a essas duas).

Implementação

Use o Google Analytics para medir a receita de publicidade gerada pela exibição de anúncios com plataformas de monetização, como AdMob, AppLovin e ironSource. Para avaliar a receita de publicidade, registre os eventos ad_impression sempre que seu usuário visualizar um anúncio no app. Esses eventos contêm detalhes como plataforma, origem, moeda e valor dos anúncios.

AdMob

Se você usa a plataforma AdMob, vincule seu app da AdMob ao Firebase e ao Analytics para ativar a avaliação automática da receita de publicidade. O SDK do Firebase para Google Analytics registra automaticamente o evento ad_impression sempre que seus usuários visualizam uma impressão de anúncio.

Outras plataformas de monetização de anúncios

Plataformas como AppLovin e ironSource fornecem dados de receita no nível da impressão que podem ser usados para registrar eventos ad_impression do Google Analytics.

As seções a seguir mostram exemplos de implementação para algumas plataformas de monetização de anúncios diferentes.

AppLovin

Swift

Observação: este produto do Firebase não está disponível no destino 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

Observação: este produto do Firebase não está disponível no destino 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

Observação: este produto do Firebase não está disponível no destino 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

Observação: este produto do Firebase não está disponível no destino 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);
  }
}

Considerações de implementação

Para permitir que o Google Ads processe o ad_impression, inclua os parâmetros currency e value (descritos abaixo). Ambos os parâmetros precisam ter o maior nível de precisão possível para evitar que os usuários sejam supervalorizados ou subvalorizados.

Parâmetro de moeda

O parâmetro currency (iOS+ | Android | Unity) precisa ser enviado como uma string em um formato ISO_4217 de três letras (por exemplo, "USD"). Algumas plataformas de monetização de anúncios omitem a moeda, e isso pode exigir que você fixe o parâmetro no código.

Parâmetro de valor

O parâmetro value (iOS+ | Android | Unity) precisa ser enviado com um ponto como separador decimal. Talvez seja necessário transformar os valores recebidos de algumas plataformas para que se ajustem ao formato descrito acima. Algumas plataformas localizam formatos numéricos e usam vírgulas como separadores decimais. Em alguns casos, é possível que uma plataforma não envie um valor.

Além disso, o valor deve ser numérico, como double ou long. Por exemplo, 1000.01, 0.001 e 1.00 são válidos.

Validação

O Google Analytics oferece vários recursos para validar sua implementação durante o ciclo de desenvolvimento.

  1. DebugView
    Ao testar a implementação pela primeira vez, use o DebugView para ver os dados ad_impression do teste no console. Ao selecionar um evento ad_impression, é possível revisar os parâmetros enviados no painel Parâmetros (no lado direito da tela). Isso ajuda a confirmar se as informações corretas estão sendo processadas.

  2. Tempo real
    Depois de implantar o app, use o Relatório em tempo real do Google Analytics para confirmar se a implementação está funcionando corretamente. No Relatório em tempo real, consulte o card Contagem de eventos por nome e selecione ad_impression para conferir os detalhes dos eventos e parâmetros dos últimos 30 minutos.

  3. BigQuery
    Use o BigQuery Export para extrair a amostra de um ou mais dias de eventos ad_impression. Com essa amostra extraída, é possível procurar problemas, como valores zero ou não definidos, e aplicar correções ao seu código para todos os casos de uso não processados.

Próximas etapas

Acesse o painel do Analytics no Console do Firebase ou na sua propriedade vinculada no console do Analytics. A receita de publicidade é incluída em métricas, como a receita média por usuário (ARPU, na sigla em inglês) e o valor da vida útil (LTV).