Mide los ingresos publicitarios

La medición de tus fuentes de ingresos te ayuda a comprender el valor del ciclo de vida de los usuarios y a hacer crecer el negocio de tu app. En esta guía, se muestra cómo configurar la medición de los ingresos publicitarios en tu plataforma.

Después de configurar la medición de estos ingresos, puedes realizar cualquiera de las siguientes acciones:

Antes de comenzar

Si aún no lo hiciste, asegúrate de completar las siguientes tareas:

  1. Configura tu proyecto y app como se describe en Comienza a usar Google Analytics.

  2. Asegúrate de haber vinculado tu proyecto de Firebase a una cuenta de Google Analytics.

  3. Asegúrate de haber incluido en tu app la versión 17.6.0 (o una posterior) del SDK de Android o el SDK para plataformas de Apple versión 6.34.0 (o una posterior).

Implementación

Puedes usar Google Analytics para medir los ingresos publicitarios que se generan por la publicación de anuncios en plataformas de monetización, como AdMob, ironSource y AppLovin. Para medir los ingresos publicitarios, debes registrar los eventos ad_impression cada vez que los usuarios vean anuncios en tu app. Estos eventos contienen detalles como la plataforma del anuncio, la fuente, la moneda y el valor.

AdMob

Si usas la plataforma de AdMob, vincula la app de AdMob a Firebase y Analytics para habilitar la medición automática de los ingresos publicitarios. El SDK de Firebase para Google Analytics registra automáticamente el evento ad_impression cada vez que los usuarios ven una impresión de anuncios.

Otras plataformas de monetización mediante anuncios

Las plataformas como ironSource y AppLovin proporcionan datos de ingresos a nivel de las impresiones que puedes usar para registrar eventos ad_impression de Google Analytics.

En las siguientes secciones, se muestran ejemplos de implementación para diferentes plataformas de monetización mediante anuncios.

AppLovin

Swift

Nota: Este producto de Firebase no está disponible en el segmento de 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

Nota: Este producto de Firebase no está disponible en el segmento de 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

Nota: Este producto de Firebase no está disponible en el segmento de 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

Nota: Este producto de Firebase no está disponible en el segmento de 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);
  }
}

Consideraciones sobre la implementación

Para permitir que Google Ads procese tu ad_impression, asegúrate de incluir los parámetros currency y value (como se describe a continuación). Ambos deben ser lo más precisos posible para evitar sobrevalorar o infravalorar a los usuarios.

Parámetro currency

El parámetro currency (iOS+ | Android | Unity) debe enviarse como una cadena en un formato ISO_4217 de tres letras (por ejemplo, "USD"). Algunas plataformas de monetización mediante anuncios omiten la moneda, lo que puede requerir que codifiques el parámetro.

Parámetro value

El parámetro value (iOS+ | Android | Unity) debe enviarse con un punto como separador decimal. Es posible que debas transformar los valores recibidos de algunas plataformas para que se ajusten al formato que se mencionó. Algunas plataformas localizan formatos numéricos y usan comas como separadores decimales. En algunos casos, es posible que una plataforma no envíe ningún valor.

Además, el valor debe ser un tipo numérico, como del tipo double o long. Por ejemplo, 1000.01, 0.001 y 1.00 son válidos

Validación

Google Analytics ofrece varias funciones para validar tu implementación durante todo el ciclo de desarrollo.

  1. DebugView
    Cuando pruebes tu implementación por primera vez, usa DebugView para ver los datos de ad_impression de prueba en la consola. Cuando seleccionas un evento ad_impression, puedes revisar los parámetros que envías en el panel Parameters (en el lado derecho de la pantalla). Esto te ayudará a confirmar que se esté procesando la información correcta.

  2. Realtime
    Una vez que hayas implementado la app, usa el informe Realtime de Google Analytics para confirmar que la implementación funciona correctamente. En el informe Realtime, consulta la tarjeta Event count by Event name y selecciona ad_impression para ver los detalles del evento y los parámetros de los últimos 30 minutos.

  3. BigQuery
    Usa BigQuery Export para extraer una muestra de uno o más días de eventos ad_impression. Usa esta muestra para buscar problemas, como valores cero o de parámetro no establecido, y aplica correcciones a tu código para todos los casos de uso no controlados.

Próximos pasos

Visita el panel de Analytics en Firebase console o en la propiedad vinculada de Analytics en la consola de Analytics. Los ingresos publicitarios se incluyen en métricas, como el promedio de ingresos por usuario (ARPU) y el valor del ciclo de vida del cliente (LTV).