Android SDK - 广告收入跟踪

文档

广告收入归属

跟踪来自中介平台的广告收入,并将其归因于获取用户的营销活动,从而在营销活动成本、应用内购买和广告货币化方面提供完整的投资回报率可见性。

概述

什么是广告收入归因

广告收入归属将移动应用广告收入与推动应用安装的用户获取营销活动联系起来,使您能够衡量包括广告货币化在内的真实营销活动盈利能力。

主要优势

  • 统一的投资回报率视图:在单一仪表板中查看营销活动成本、应用内收入和广告收入
  • 活动优化:将广告收入数据发回广告网络,以改进竞价和定位
  • LTV 测量:计算包括广告货币化在内的完整用户生命周期价值

数据来源:广告收入数据通常来自用户级别或印象级别的中介平台(如AdMob、AppLovin MAX、IronSource)。Singular 支持多种集成方法来接收这些数据。

了解更多信息:有关设置、报告和故障排除的全面详情,请参阅广告收入归因常见问题解答


实施要求

关键准则

数据准确性至关重要

  1. 货币代码:使用三个字母的 ISO 4217 货币代码(如美元、欧元、印度卢比)。许多调解平台以美元为单位进行报告--实施前请核实您平台的货币。
  2. 发送前验证:在调用Singular.adRevenue() 之前,请务必验证收入和货币数据。不正确的数据在提交后无法更正。
  3. 平台差异:某些 SDK 以微米(除以 1,000,000)为单位报告收入,而其他 SDK 则以标准货币单位报告。请查看平台文档

设置步骤

按照以下步骤实施广告收入归属:

  1. 更新 SDK:确保使用的是最新版本的 Singular SDK
  2. 选择集成:在下面选择与您的设置相匹配的调解平台集成
  3. 实施回调:添加平台特定的付费事件监听器,以获取收入数据
  4. 验证数据:测试收入报告并验证数据是否出现在 Singular 面板中

平台集成

AdMob 集成

使用付费事件监听器跟踪来自 Google AdMob 的广告收入,以获得印象级收入报告。

要求

  • 在您的 AdMob 账户中启用付费事件跟踪(请参阅AdMob 支持
  • 实施 Android 版 Google 移动广告 SDK(请参阅入门指南

平台收入报告:AdMob 按平台报告不同的收入。Android 返回的收入单位为微(例如,0.005 美元 = 5000)。将adValue.valueMicros 除以 1,000,000 转换为标准货币单位后再发送至 Singular。

执行

在加载广告时设置付费事件监听器,以捕获收入数据并将其发送到 Singular。

KotlinJava
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}")
                }
            })
    }
}

AppLovin MAX 集成

使用 AppLovin 印象级用户收入 API 共享印象级广告收入。

要求

实施

通过 AppLovin Communicator 回调处理收入消息。

KotlinJava
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")
        }
    }
}

Unity LevelPlay(IronSource)集成

使用 IronSource SDK 跟踪来自 ironSource 和中介网络的印象级收入。

要求

  • 实施 ironSource SDK(请参阅《入门指南
  • 在 IronSource 面板中启用 ARM SDK 回传标志
  • 设置印象数据监听器以接收收入回调

了解更多信息:有关完整设置的详细信息,请参阅IronSource 广告收入文档

实施

实施印象数据成功回调以获取和发送收入。

KotlinJava
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")
}

TradPlus 整合

使用全局印象监听器捕获来自 TradPlus 中介的广告收入。

要求

  • 通过TradPlusSdk.setGlobalImpressionListener()设置全局印象监听器
  • 处理onImpressionSuccess 回调以接收收入数据
  • 将 eCPM 从毫位转换为标准货币(除以 1000)

执行

注册全局印象监听器,跟踪所有广告印象和收入。

KotlinJava
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 revenue = tpAdInfo.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")
        }
    }
)

通用集成(其他平台)

使用通用SingularAdData 接口集成任何中介平台。

要求

  • 从您的调解平台访问印象级收入数据
  • 以标准货币单位(非微)表示的收入金额
  • ISO 4217 货币代码(如美元、欧元、印度卢比)

数据准确性:在发送给 Singular 之前,请验证收入和货币数据。错误数据在提交后无法更正。

执行

使用平台名称、货币和收入创建SingularAdData 对象,然后调用Singular.adRevenue()

KotlinJava
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)

测试和验证

验证收入报告

测试广告收入实施情况,确保数据正确流向 Singular。

  1. 检查日志:验证收入回调日志是否显示正确的值和货币。
  2. 测试广告:加载并显示测试广告以触发收入事件
  3. 仪表板验证:确认收入在 24 小时内出现在 Singular 面板中
  4. 数据准确性:验证收入金额与调解平台报告相符

故障排除:如果收入未出现在 Singular 中,请检查以下几点

  • 您的 Singular 账户已启用广告收入归因功能
  • 收入值大于 0
  • 货币代码是有效的 ISO 4217 代码
  • 平台名称符合 Singular 的预期格式