SDK do Android - Rastreamento de receita de anúncios

Atribuição de receita de anúncios

Rastreie a receita de anúncios proveniente de plataformas de mediação e a atribua às campanhas de marketing que adquiriram seus usuários, oferecendo visibilidade completa do ROI sobre custos de campanha, compras dentro do aplicativo e monetização por anúncios.

Visão geral

O que é a atribuição de receita de anúncios

A atribuição de receita de anúncios conecta a receita de anúncios de aplicativos móveis com as campanhas de aquisição de usuários que geraram as instalações, permitindo medir a rentabilidade real das campanhas, incluindo a monetização por anúncios.

Principais benefícios:

  • Visão unificada de ROI: Veja os custos de campanha, a receita in-app e a receita de anúncios em um único dashboard
  • Otimização de campanha: Envie os dados de receita de anúncios de volta para as redes de anúncios para melhorar o lance e a segmentação
  • Mensuração de LTV: Calcule o valor de vida completo do usuário incluindo a monetização por anúncios

Fontes de dados: Os dados de receita de anúncios normalmente vêm da sua plataforma de mediação (por exemplo, AdMob, AppLovin MAX, IronSource) no nível de usuário ou no nível de impressão. A Singular oferece suporte a vários métodos de integração para receber esses dados.

Saiba mais: Consulte o FAQ de atribuição de receita de anúncios para detalhes completos sobre configuração, relatórios e resolução de problemas.


Requisitos de implementação

Diretrizes essenciais

Parâmetros obrigatórios do SingularAdData: Os argumentos do construtor adPlatform , currency , e revenue são todos obrigatórios. Se algum estiver ausente, vazio ou inválido, o SDK descarta silenciosamente a chamada para Singular.adRevenue() sem lançar uma exceção nem retornar um erro. Singular.adRevenue() também ignora silenciosamente quando o SDK ainda não foi inicializado — sempre confirme que Singular.init() foi executado antes de chamá-lo.

A precisão dos dados é fundamental:

  1. Códigos de moeda: Use códigos de moeda ISO 4217 de três letras (por exemplo, USD, EUR, INR). Muitas plataformas de mediação reportam em USD — verifique a moeda da sua plataforma antes da implementação.
  2. Valide antes de enviar: Sempre valide os dados de receita e moeda antes de chamar Singular.adRevenue() . Dados incorretos não podem ser corrigidos após o envio.
  3. Diferenças entre plataformas: Alguns SDKs reportam a receita em micros (divida por 1.000.000), enquanto outros reportam em unidades de moeda padrão. Consulte a documentação da sua plataforma.

Etapas de configuração

Siga estas etapas para implementar a atribuição de receita de anúncios:

  1. Atualize o SDK: Certifique-se de estar usando a versão mais recente do SDK da Singular.
  2. Escolha a integração: Selecione abaixo a integração de plataforma de mediação que corresponde à sua configuração.
  3. Implemente os callbacks: Adicione listeners de eventos pagos específicos da plataforma para capturar os dados de receita.
  4. Valide os dados: Teste o relatório de receita e verifique se os dados aparecem no dashboard da Singular.

Integrações de plataforma

Integração com AdMob

Rastreie a receita de anúncios do Google AdMob usando o listener de eventos pagos para relatórios de receita no nível de impressão.

Requisitos:

Relatório de receita por plataforma: O AdMob reporta a receita de forma diferente por plataforma. O Android retorna a receita em micros (por exemplo, $0,005 = 5000). Divida adValue.valueMicros por 1.000.000 para converter para unidades de moeda padrão antes de enviar para a Singular.

Implementação

Defina um listener de eventos pagos ao carregar anúncios para capturar os dados de receita e enviá-los para a Singular.

Kotlin Java
import com.singular.sdk.Singular
import com.singular.sdk.SingularAdData
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.rewarded.RewardedAd
import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback

private const val AD_UNIT_ID = "YOUR_AD_UNIT_ID"

class AdManager(private val context: Context) {
    private var rewardedAd: RewardedAd? = null

    fun loadRewardedAd() {
        val adRequest = AdRequest.Builder().build()

        RewardedAd.load(context, AD_UNIT_ID, adRequest,
            object : RewardedAdLoadCallback() {
                override fun onAdLoaded(ad: RewardedAd) {
                    rewardedAd = ad

                    // Set full screen content callback
                    rewardedAd?.fullScreenContentCallback =
                        object : FullScreenContentCallback() {
                            override fun onAdShowedFullScreenContent() {
                                Log.d("AdManager", "Rewarded ad displayed")
                            }

                            override fun onAdDismissedFullScreenContent() {
                                Log.d("AdManager", "Rewarded ad dismissed")
                            }
                        }

                    // Set paid event listener for revenue tracking
                    rewardedAd?.setOnPaidEventListener { adValue ->
                        // Convert revenue from micros to standard units
                        val revenue = adValue.valueMicros / 1_000_000.0
                        val currency = adValue.currencyCode

                        // Validate revenue data before sending
                        if (revenue > 0 && !currency.isNullOrEmpty()) {
                            val data = SingularAdData(
                                "AdMob",
                                currency,
                                revenue
                            )

                            Singular.adRevenue(data)
                            Log.d("AdManager", "Ad revenue sent: $revenue $currency")
                        } else {
                            Log.w("AdManager", "Invalid revenue: $revenue $currency")
                        }
                    }
                }

                override fun onAdFailedToLoad(error: LoadAdError) {
                    Log.e("AdManager", "Ad failed to load: ${error.message}")
                }
            })
    }
}

Integração com AppLovin MAX

Compartilhe a receita de anúncios em nível de impressão usando a AppLovin Impression-Level User Revenue API.

Requisitos:

Implementação

Trate as mensagens de receita por meio do callback do AppLovin Communicator.

Kotlin Java
import com.singular.sdk.Singular
import com.singular.sdk.SingularAdData
import com.applovin.communicator.AppLovinCommunicatorMessage

override fun onMessageReceived(message: AppLovinCommunicatorMessage) {
    // Check for revenue events topic
    if (message.topic == "max_revenue_events") {
        val adData: Bundle? = message.messageData

        // Extract and validate revenue value
        val revenueValue = adData?.getDouble("revenue", 0.0) ?: 0.0

        if (revenueValue > 0) {
            val data = SingularAdData(
                "AppLovin",
                "USD",  // AppLovin typically reports in USD
                revenueValue
            )

            Singular.adRevenue(data)
            Log.d("AppLovin", "Ad revenue sent: $revenueValue USD")
        } else {
            Log.w("AppLovin", "Invalid revenue value: $revenueValue")
        }
    }
}

Integração com Unity LevelPlay (IronSource)

Rastreie a receita em nível de impressão do ironSource e das redes mediadas usando o IronSource SDK.

Requisitos:

  • Implemente o ironSource SDK (consulte Guia de introdução )
  • Habilite a flag ARM SDK Postbacks no seu dashboard do IronSource
  • Defina um listener de dados de impressão para receber os callbacks de receita

Saiba mais: Consulte a Documentação de receita de anúncios do IronSource para detalhes completos de configuração.

Implementação

Implemente o callback de sucesso de dados de impressão para capturar e enviar a receita.

Kotlin Java
import com.singular.sdk.Singular
import com.singular.sdk.SingularAdData
import com.ironsource.mediationsdk.impressionData.ImpressionData

fun onImpressionDataSuccess(impressionData: ImpressionData?) {
    // Validate impression data
    if (impressionData == null) {
        Log.d("IronSource", "No impression data available")
        return
    }

    // Extract and validate revenue
    val revenue = impressionData.revenue?.toDouble() ?: 0.0
    if (revenue <= 0) {
        Log.w("IronSource", "Invalid revenue: $revenue")
        return
    }

    // Create and send ad revenue data
    val data = SingularAdData(
        "IronSource",
        "USD",  // IronSource typically reports in USD
        revenue
    )

    Singular.adRevenue(data)
    Log.d("IronSource", "Ad revenue sent: $revenue USD")
}

Integração com TradPlus

Capture a receita de anúncios da mediação do TradPlus usando o listener global de impressões.

Requisitos:

  • Defina o listener global de impressões via TradPlusSdk.setGlobalImpressionListener()
  • Trate o callback onImpressionSuccess para receber os dados de receita
  • Converta o eCPM de miliunidades para a moeda padrão (divida por 1000)

Implementação

Registre um listener global de impressões para rastrear todas as impressões de anúncios e a receita.

Kotlin Java
import com.singular.sdk.Singular
import com.singular.sdk.SingularAdData
import com.tradplus.ads.mgr.GlobalImpressionManager
import com.tradplus.ads.base.bean.TPAdInfo

// Set global impression listener
TradPlusSdk.setGlobalImpressionListener(
    object : GlobalImpressionManager.GlobalImpressionListener {
        override fun onImpressionSuccess(tpAdInfo: TPAdInfo?) {
            // Validate ad info
            if (tpAdInfo == null) {
                Log.w("TradPlus", "AdInfo is null")
                return
            }

            // Convert eCPM from milli-units to dollars
            val ecpm = tpAdInfo.ecpm ?: run {
                Log.w("TradPlus", "eCPM is null")
                return
            }
            val revenue = ecpm.toDouble() / 1000.0

            // Validate revenue
            if (revenue <= 0) {
                Log.w("TradPlus", "Invalid revenue: $revenue")
                return
            }

            // Create and send ad revenue data
            val data = SingularAdData(
                "TradPlus",
                "USD",
                revenue
            )

            Singular.adRevenue(data)
            Log.d("TradPlus", "Ad revenue sent: $revenue USD")
        }
    }
)

Integração genérica (outras plataformas)

Integre qualquer plataforma de mediação usando a interface genérica SingularAdData .

Requisitos:

  • Acesso aos dados de receita em nível de impressão da sua plataforma de mediação
  • Valor da receita em unidades de moeda padrão (não em micros)
  • Código de moeda ISO 4217 (por exemplo, USD, EUR, INR)

Precisão dos dados: Valide os dados de receita e moeda antes de enviar para a Singular. Dados incorretos não podem ser corrigidos após o envio.

Implementação

Crie um objeto SingularAdData com o nome da plataforma, a moeda e a receita, e então chame Singular.adRevenue() .

Kotlin Java
import com.singular.sdk.Singular
import com.singular.sdk.SingularAdData

fun reportAdRevenue(adPlatform: String, currency: String, revenue: Double) {
    // Validate revenue
    if (revenue <= 0) {
        Log.w("AdRevenue", "Invalid revenue: $revenue")
        return
    }

    // Validate currency
    if (currency.isEmpty()) {
        Log.w("AdRevenue", "Invalid currency: $currency")
        return
    }

    // Create ad revenue data object
    val data = SingularAdData(
        adPlatform,
        currency,
        revenue
    )

    // Send to Singular
    Singular.adRevenue(data)
    Log.d("AdRevenue", "Revenue sent: $revenue $currency from $adPlatform")
}

// Example usage
reportAdRevenue("MyMediationPlatform", "USD", 0.05)

Enriquecendo os dados de anúncios com atributos adicionais

SingularAdData expõe setters encadeáveis para metadados em nível de impressão. Use-os para enriquecer o evento com detalhes de placement, ad unit, agrupamento de mediação e precisão quando sua plataforma de mediação os fornecer. Os atributos definidos por esses métodos aparecem nos relatórios da Singular e nos postbacks posteriores.

Método Descrição
withNetworkName(String networkName) Sobrescreve o nome da rede (o padrão é a plataforma de anúncios passada ao construtor). Use na mediação quando a rede subjacente for diferente da plataforma de mediação.
withAdType(String adType) Formato do anúncio (por exemplo, "Rewarded" , "Interstitial" , "Banner" ).
withAdGroupType(String adGroupType) Categorização do grupo de anúncios definida pela sua plataforma de mediação.
withImpressionId(String impressionId) Identificador único da impressão, usado para deduplicação e conciliação.
withAdPlacementName(String adPlacementName) Nome legível do placement (por exemplo, "level_complete" ).
withAdUnitId(String adUnitId) Identificador do ad unit específico da plataforma (por exemplo, "ca-app-pub-..." para AdMob).
withAdUnitName(String adUnitName) Nome legível do ad unit.
withAdGroupId(String adGroupId) Identificador do grupo de anúncios da plataforma de mediação.
withAdGroupName(String adGroupName) Nome legível do grupo de anúncios.
withAdGroupPriority(String adGroupPriority) Prioridade atribuída ao grupo de anúncios na cascata de mediação.
withPrecision(String precision) Indicador de precisão da receita (por exemplo, "publisher_provided" , "estimated" , "exact" ) quando a plataforma oferecer suporte.
withPlacementId(String placementId) Identificador de placement específico da plataforma.
withLimitDataSharing(boolean shouldLimitDataSharing) Sobrescreve o limite global de compartilhamento de dados para este evento de anúncio individual, por exemplo, quando um usuário optou por não receber anúncios personalizados.

Exemplo de uso em Kotlin:

val data = SingularAdData("AdMob", "USD", 0.05)
    .withAdUnitId("ca-app-pub-123456789/1234567890")
    .withAdType("Rewarded")
    .withAdPlacementName("level_complete")
    .withImpressionId("imp_abc123")
    .withPrecision("publisher_provided")

Singular.adRevenue(data)

Exemplo de uso em Java:

SingularAdData data = new SingularAdData("AdMob", "USD", 0.05)
    .withAdUnitId("ca-app-pub-123456789/1234567890")
    .withAdType("Rewarded")
    .withAdPlacementName("level_complete")
    .withImpressionId("imp_abc123")
    .withPrecision("publisher_provided");

Singular.adRevenue(data);

Testes e validação

Verificar o relatório de receita

Teste sua implementação de receita de anúncios para garantir que os dados fluam corretamente para a Singular.

  1. Verifique os logs: Confirme que os logs do callback de receita aparecem com os valores e a moeda corretos.
  2. Anúncios de teste: Carregue e exiba anúncios de teste para acionar os eventos de receita.
  3. Verificação no dashboard: Confirme que a receita aparece no dashboard da Singular em até 24 horas.
  4. Precisão dos dados: Valide se os valores de receita correspondem aos relatórios da sua plataforma de mediação.

Resolução de problemas: Se a receita não aparecer na Singular, verifique se:

  • A atribuição de receita de anúncios está habilitada na sua conta Singular
  • Os valores de receita são maiores que 0
  • Os códigos de moeda são códigos ISO 4217 válidos
  • O nome da plataforma corresponde ao formato esperado pela Singular