Entrate pubblicitarie a livello di impressione

Quando si verifica un'impressione, GMA Next-Gen SDK fornisce i dati sulle entrate pubblicitarie associati a questa impressione. Puoi utilizzare i dati per calcolare il lifetime value di un utente o inoltrarli ad altri sistemi pertinenti.

Questa guida ha lo scopo di aiutarti a implementare l'acquisizione dei dati sulle entrate pubblicitarie a livello di impressione nella tua app per Android.

Prerequisiti

Ogni formato dell'annuncio ha un onAdPaid callback di evento. Durante il ciclo di vita di un evento annuncio, GMA Next-Gen SDK monitora gli eventi di impressione e richiama il gestore con un valore ottenuto.

Il seguente esempio gestisce gli eventi di pagamento per un annuncio con premio:

Kotlin

ad.adEventCallback =
  object : RewardedAdEventCallback {
    override fun onAdPaid(adValue: AdValue) {
      // Send the impression-level ad revenue information to your
      // preferred analytics server directly within this callback.

      // Extract the impression-level ad revenue data.
      val valueMicros = adValue.valueMicros
      val currencyCode = adValue.currencyCode
      val precisionType = adValue.precisionType

      val loadedAdSourceResponseInfo = ad.getResponseInfo().loadedAdSourceResponseInfo
      val adSourceName = loadedAdSourceResponseInfo?.name
      val adSourceId = loadedAdSourceResponseInfo?.id
      val adSourceInstanceName = loadedAdSourceResponseInfo?.instanceName
      val adSourceInstanceId = loadedAdSourceResponseInfo?.instanceId
      val extras = ad.getResponseInfo().responseExtras
      val mediationGroupName = extras.getString("mediation_group_name")
      val mediationABTestName = extras.getString("mediation_ab_test_name")
      val mediationABTestVariant = extras.getString("mediation_ab_test_variant")
    }
  }

Java

ad.setAdEventCallback(
    new RewardedAdEventCallback() {
      @Override
      public void onAdPaid(@NonNull AdValue value) {
        // Send the impression-level ad revenue information to your preferred
        // analytics server directly within this callback.

        // Extract the impression-level ad revenue data.
        long valueMicros = value.getValueMicros();
        String currencyCode = value.getCurrencyCode();
        PrecisionType precisionType = value.getPrecisionType();

        AdSourceResponseInfo loadedAdSourceResponseInfo =
            ad.getResponseInfo().getLoadedAdSourceResponseInfo();
        String adSourceName = loadedAdSourceResponseInfo.getName();
        String adSourceId = loadedAdSourceResponseInfo.getId();
        String adSourceInstanceName = loadedAdSourceResponseInfo.getInstanceName();
        String adSourceInstanceId = loadedAdSourceResponseInfo.getInstanceId();

        Bundle extras = ad.getResponseInfo().getResponseExtras();
        String mediationGroupName = extras.getString("mediation_group_name");
        String mediationABTestName = extras.getString("mediation_ab_test_name");
        String mediationABTestVariant = extras.getString("mediation_ab_test_variant");
      }
    });

Identifica il nome di un'origine annuncio evento personalizzato

Per le origini annuncio di eventi personalizzati, la proprietà AdSourceResponseInfo.name restituisce il nome dell'origine annuncio Custom event. Se utilizzi più eventi personalizzati, il nome dell'origine annuncio non è abbastanza granulare da distinguere tra più eventi personalizzati. Per individuare un evento personalizzato specifico:

  1. Recupera la proprietà AdSourceResponseInfo.name.
  2. Imposta un nome univoco per l'origine annuncio.

L'esempio seguente imposta un nome di origine annuncio univoco per un evento personalizzato:

Kotlin

private fun getUniqueAdSourceName(loadedAdapterResponseInfo: AdSourceResponseInfo): String {
  var adSourceName = loadedAdapterResponseInfo.name
  if (adSourceName == "Custom Event") {
    if (
      loadedAdapterResponseInfo.adapterClassName ==
        "com.google.ads.mediation.sample.customevent.SampleCustomEvent"
    ) {
      adSourceName = "Sample Ad Network (Custom Event)"
    }
  }
  return adSourceName
}

Java

private String getUniqueAdSourceName(@NonNull AdSourceResponseInfo loadedAdapterResponseInfo) {
  String adSourceName = loadedAdapterResponseInfo.getName();
  if (adSourceName.equals("Custom Event")) {
    if (loadedAdapterResponseInfo
        .getAdapterClassName()
        .equals("com.google.ads.mediation.sample.customevent.SampleCustomEvent")) {
      adSourceName = "Sample Ad Network (Custom Event)";
    }
  }
  return adSourceName;
}

Per saperne di più sull'origine annuncio vincente, consulta Recupera informazioni sulla risposta all'annuncio.

Integrazione con i partner di attribuzione app (AAP)

Per informazioni dettagliate sull'inoltro dei dati sulle entrate pubblicitarie alle piattaforme di analisi, consulta la guida del partner:

SDK partner
Adjust
AppsFlyer
Singular
Tenjin

La guida del partner potrebbe non essere aggiornata per fare riferimento a GMA Next-Gen SDK.

I seguenti esempi mostrano come inviare i dati sulle entrate a livello di impressione ai partner AAP utilizzando GMA Next-Gen SDK:

Regola

Kotlin

rewardedAd.adEventCallback =
  object : RewardedAdEventCallback {
    override fun onAdPaid(value: AdValue) {
      // Send ad revenue info to Adjust.
      val adRevenue = AdjustAdRevenue("admob_sdk")
      adRevenue.setRevenue(value.valueMicros / 1000000.0, value.currencyCode)
      val loadedAdSourceResponseInfo = rewardedAd.getResponseInfo().loadedAdSourceResponseInfo
      loadedAdSourceResponseInfo?.let { adRevenue.setAdRevenueNetwork(it.name) }
      Adjust.trackAdRevenue(adRevenue)
    }
  }

Java

rewardedAd.setAdEventCallback(
    new RewardedAdEventCallback() {
      @Override
      public void onAdPaid(@NonNull AdValue value) {
        // Send ad revenue info to Adjust.
        AdjustAdRevenue adRevenue = new AdjustAdRevenue("admob_sdk");
        adRevenue.setRevenue(value.getValueMicros() / 1000000.0, value.getCurrencyCode());
        if (rewardedAd.getResponseInfo().getLoadedAdSourceResponseInfo() != null) {
          adRevenue.setAdRevenueNetwork(
              rewardedAd.getResponseInfo().getLoadedAdSourceResponseInfo().getName());
        }
        Adjust.trackAdRevenue(adRevenue);
      }
    });

AppsFlyer

Kotlin

rewardedAd.adEventCallback =
  object : RewardedAdEventCallback {
    override fun onAdPaid(value: AdValue) {
      val valueMicros = value.valueMicros
      val currencyCode = value.currencyCode

      val adRevenueData =
        AFAdRevenueData(
          "AdMob Mediation", // monetizationNetwork
          MediationNetwork.GOOGLE_ADMOB, // mediationNetwork
          currencyCode, // currencyIso4217Code
          valueMicros.toDouble(), // revenue
        )

      val additionalParameters: MutableMap<String?, Any?> = HashMap()
      additionalParameters[COUNTRY] = "US"
      additionalParameters[AD_UNIT] = AD_UNIT_ID
      additionalParameters[AD_TYPE] = AdFormat.REWARDED

      appsflyer.logAdRevenue(adRevenueData, additionalParameters)
    }
  }

Java

rewardedAd.setAdEventCallback(
    new RewardedAdEventCallback() {
      @Override
      public void onAdPaid(@NonNull AdValue value) {
        long valueMicros = value.getValueMicros();
        String currencyCode = value.getCurrencyCode();

        AFAdRevenueData adRevenueData =
            new AFAdRevenueData(
                "AdMob Mediation", // monetizationNetwork
                MediationNetwork.GOOGLE_ADMOB, // mediationNetwork
                currencyCode, // currencyIso4217Code
                (double) valueMicros // revenue
                );

        Map<String, Object> additionalParameters = new HashMap<>();
        additionalParameters.put(COUNTRY, "US");
        additionalParameters.put(AD_UNIT, AD_UNIT_ID);
        additionalParameters.put(AD_TYPE, AdFormat.REWARDED);

        AppsFlyerLib.getInstance().logAdRevenue(adRevenueData, additionalParameters);
      }
    });

Singolare

Kotlin

rewardedAd.adEventCallback =
  object : RewardedAdEventCallback {
    override fun onAdPaid(value: AdValue) {
      // Convert revenue from micros to standard units.
      val revenue = value.valueMicros / 1000000.0
      val currency = value.currencyCode

      // Validate ad revenue data before sending.
      if (revenue > 0 && currency.isNotEmpty()) {
        val adData = SingularAdData("AdMob", currency, revenue)
        Singular.adRevenue(adData)
      }
    }
  }

Java

rewardedAd.setAdEventCallback(
    new RewardedAdEventCallback() {
      @Override
      public void onAdPaid(@NonNull AdValue value) {
        // Convert revenue from micros to standard units.
        double revenue = value.getValueMicros() / 1000000.0;
        String currency = value.getCurrencyCode();

        // Validate ad revenue data before sending.
        if (revenue > 0 && !currency.isEmpty()) {
          SingularAdData adData = new SingularAdData("AdMob", currency, revenue);
          Singular.adRevenue(adData);
        }
      }
    });

Tenjin

Per GMA Next-Gen SDK, devi eseguire l'integrazione utilizzando un oggetto JSON. L'esempio seguente invia i dati sulle entrate a livello di impressione a Tenjin utilizzando un oggetto JSON:

Kotlin

rewardedAd.adEventCallback =
  object : RewardedAdEventCallback {
    override fun onAdPaid(value: AdValue) {
      val responseInfo = rewardedAd.getResponseInfo()

      // Extract the impression-level ad revenue data.
      val valueMicros = value.valueMicros
      val currencyCode = value.currencyCode
      val precisionType = value.precisionType

      val json = JSONObject()
      try {
        json.put("ad_unit_id", AD_UNIT_ID)
        json.put("currency_code", currencyCode)
        json.put("response_id", responseInfo.responseId)
        json.put("value_micros", valueMicros)
        responseInfo.loadedAdSourceResponseInfo?.let {
          json.put("mediation_adapter_class_name", it.adapterClassName)
        }
        json.put("precision_type", precisionType)

        tenjinInstance.eventAdImpressionAdMob(json)
      } catch (_: JSONException) {
        // Handle error.
      }
    }
  }

Java

rewardedAd.setAdEventCallback(
    new RewardedAdEventCallback() {
      @Override
      public void onAdPaid(@NonNull AdValue value) {
        ResponseInfo responseInfo = rewardedAd.getResponseInfo();

        // Extract the impression-level ad revenue data.
        long valueMicros = value.getValueMicros();
        String currencyCode = value.getCurrencyCode();
        PrecisionType precisionType = value.getPrecisionType();

        JSONObject json = new JSONObject();
        try {
          json.put("ad_unit_id", AD_UNIT_ID);
          json.put("currency_code", currencyCode);
          json.put("response_id", responseInfo.getResponseId());
          json.put("value_micros", valueMicros);
          if (responseInfo.getLoadedAdSourceResponseInfo() != null) {
            json.put(
                "mediation_adapter_class_name",
                responseInfo.getLoadedAdSourceResponseInfo().getAdapterClassName());
          }
          json.put("precision_type", precisionType);

          tenjinInstance.eventAdImpressionAdMob(json);
        } catch (JSONException e) {
          // Handle error.
        }
      }
    });

Best practice per l'implementazione

  • Imposta il listener immediatamente dopo aver creato o ottenuto l'accesso all'oggetto annuncio e, in ogni caso, prima di mostrare l'annuncio. In questo modo, non perderai nessun callback di eventi a pagamento.
  • Invia le informazioni sulle entrate pubblicitarie a livello di impressione al tuo server di analisi preferito immediatamente quando viene richiamato il callback dell'evento di pagamento. In questo modo, eviti di eliminare accidentalmente i callback ed eviti discrepanze nei dati.

AdValue

AdValue è una classe che rappresenta il valore monetario guadagnato per un annuncio, incluso il codice valuta del valore e il tipo di precisione codificato come segue.

PrecisionType Descrizione
UNKNOWN Un valore dell'annuncio sconosciuto. Questo valore viene restituito quando il pingback LTV è attivato, ma non sono disponibili dati sufficienti.
ESTIMATED Il valore di un annuncio stimato a partire da dati aggregati.
PUBLISHER_PROVIDED Un valore dell'annuncio fornito dal publisher, ad esempio i CPM manuali in un gruppo di mediazione.
PRECISE L'esatto valore pagato per questo annuncio.

Nel caso della Mediazione AdMob, AdMob tenta di fornire un valore ESTIMATED per le origini annuncio ottimizzate. Per le origini annuncio non ottimizzate o nei casi in cui non sono disponibili dati aggregati sufficienti per generare un report con una stima significativa, viene restituito il valore PUBLISHER_PROVIDED.

Impressioni di test dalle origini annuncio per l'asta

Dopo che si verifica un evento di entrate pubblicitarie a livello di impressione per un'origine annuncio per l'asta tramite una richiesta di test, ricevi solo i seguenti valori:

  • UNKNOWN: indica il tipo di precisione.
  • 0: indica il valore aggiunto dell'annuncio.
In precedenza, potresti aver visto il tipo di precisione come un valore diverso da UNKNOWN e un valore dell'annuncio superiore a 0.

Per maggiori dettagli sull'invio di una richiesta di annuncio di prova, consulta Attiva i dispositivi di test.