了解广告收入归因
广告收入归属可帮助您将广告收入与将用户引入应用程序的特定广告活动联系起来。这样,广告活动成本、应用内收入和广告收入都会显示在一个地方,让您清楚地了解广告效果如何。该功能还能让您将广告收入数据发送回广告网络,以提高广告效果。
要点
- 作用:广告收入归属将移动应用广告收入与为应用带来用户的营销活动联系起来。这样,您就可以看到您从每个营销活动中获得了多少收入,以及这些收入对您的整体广告投资回报率有何影响。
- 数据来源:这些数据通常来自您的中介平台,可以是用户级别的数据,也可以是印象级别的数据。Singular 支持通过不同方式获取这些归因数据。
- 更多信息:更多详情,请查看有关 Singular 广告收入归因的常见问题和故障排除文章。
重要说明:
- 货币代码:使用三个字母的 ISO 4217 货币代码(例如,"USD "表示美元,"EUR "表示欧元,"INR "表示印度卢比)。许多调解平台都使用 "USD",因此,如果您使用 "USD",请确保您的代码与之匹配。如果使用其他货币,请相应更新验证码。
- 数据准确性:在发送给 Singular 之前,请务必检查收入和货币数据是否正确。不正确的数据事后无法修复,因此确保数据准确至关重要。
实施广告收入归因
- 更新 SDK:确保拥有最新版本的 Singular SDK。
- 添加代码片段:根据您的调解平台,将正确的代码片段添加到您的 Singular SDK 设置中。
遵循这些步骤将帮助您正确设置广告收入归因,并充分利用广告数据。
AdMob
合作伙伴说明
- 此功能需要在您的 AdMob 账户中启用。
请参阅AdMob 支持。
-
加载广告格式(如 "App Open"、"Banner"、"Interstitial"、"Native "或 "Rewarded")时,将paidEventHandler设置为回调函数,在广告产生收入时触发。Google 移动广告 SDK 会跟踪印象事件,并根据广告产生的收入调用该处理程序。
为此,请修改广告格式的"加载"函数,使其包含paidEventHandler。在该回调函数中,您可以管理广告收入数据、验证数据并使用 Singular.adRevenue函数将其发送给Singular。
例如,当 "奖励广告 "加载成功时,paidEventHandler 将收到广告收入信息(adValue)。在该函数中,处理收入数据并将其发送给 Singular。
更多详情,请查阅AdMob 文档。
重要:AdMob SDK 报告收入的方式因平台而异。例如,在 Unity 和 Android 平台上,0.005 美元的广告收入将以 5000 的形式返回,而在 iOS 平台上则以 0.005 的形式返回。对于 iOS,请直接向 Singular SDK 发送 0.005。在其他平台上,将adValue从微米转换成美元后再发送到Singular。
选择 SDK 实现的代码库:
如何运行
- 实施 Google AdMob 移动广告 SDK(安卓):请参阅《入门指南》。
- 整合 AdMob:从 AdMob 加载广告并设置setOnPaidEventListener以处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。
- 货币验证:在向 Singular 发送数据之前,确保货币不是零或空。
- 记录无效数据:如果数据未通过验证,则打印日志信息进行调试,并不向 Singular 发送数据。
import com.singular.sdk.Singular
import com.singular.sdk.SingularAdData
private const val AD_UNIT_ID = "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
rewardedAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdShowedFullScreenContent() {
Log.d("AdManager", "Rewarded ad displayed.")
}
override fun onAdFailedToShowFullScreenContent(adError: AdError) {
Log.d("AdManager", "Rewarded ad failed to show with error: ${adError.message}")
}
override fun onAdDismissedFullScreenContent() {
Log.d("AdManager", "Rewarded ad dismissed.")
}
}
rewardedAd?.setOnPaidEventListener { adValue: AdValue ->
// Ensure valid revenue data
val revenue = adValue.valueMicros / 1_000_000.0
val currency = adValue.currencyCode
if (revenue > 0 && !currency.isNullOrEmpty()) {
val data = SingularAdData(
"Admob",
currency,
revenue
)
// Send Ad Revenue data to Singular
Singular.adRevenue(data)
// Log the data for debugging
Log.d("AdManager", "Ad Revenue reported to Singular: $data")
} else {
Log.d("AdManager", "Invalid ad revenue data: revenue = $revenue, currency = $currency")
}
}
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
Log.d("AdManager", "Rewarded ad failed to load with error: ${loadAdError.message}")
}
})
}
}
如何运行
- 执行 Google AdMob 移动广告 SDK(安卓):请参阅《入门指南》。
- 整合 AdMob:从 AdMob 加载广告,并设置setOnPaidEventListener来处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。
- 货币验证:在向 Singular 发送数据之前,确保货币不是零或空。
- 记录无效数据:如果数据未通过验证,则打印日志信息进行调试,并不向 Singular 发送数据。
import com.singular.sdk.Singular;
import com.singular.sdk.SingularAdData;
// Define constants for better maintainability
private static final String AD_UNIT_ID = "AD_UNIT_ID";
public class AdManager {
private RewardedAd rewardedAd;
private Context context;
public AdManager(Context context) {
this.context = context;
}
public void loadRewardedAd() {
AdRequest adRequest = new AdRequest.Builder().build();
RewardedAd.load(context, AD_UNIT_ID, adRequest, new RewardedAdLoadCallback() {
@Override
public void onAdLoaded(RewardedAd ad) {
rewardedAd = ad;
rewardedAd.setFullScreenContentCallback(new FullScreenContentCallback() {
@Override
public void onAdShowedFullScreenContent() {
Log.d("AdManager", "Rewarded ad displayed.");
}
@Override
public void onAdFailedToShowFullScreenContent(AdError adError) {
Log.d("AdManager", "Rewarded ad failed to show with error: " + adError.getMessage());
}
@Override
public void onAdDismissedFullScreenContent() {
Log.d("AdManager", "Rewarded ad dismissed.");
}
});
rewardedAd.setOnPaidEventListener(new OnPaidEventListener() {
@Override
public void onPaidEvent(AdValue adValue) {
double revenue = adValue.getValueMicros() / 1_000_000.0;
String currency = adValue.getCurrencyCode();
// Validate the revenue value
if (revenue <= 0 || currency == null || currency.isEmpty()) {
Log.d("AdManager", "Invalid ad revenue data: revenue = " + revenue + ", currency = " + currency);
return;
}
SingularAdData data = new SingularAdData(
"Admob",
currency,
revenue
);
// Send Ad Revenue data to Singular
Singular.adRevenue(data);
// Log the data for debugging
Log.d("AdManager", "Ad Revenue reported to Singular: " + data);
}
});
}
@Override
public void onAdFailedToLoad(LoadAdError loadAdError) {
Log.d("AdManager", "Rewarded ad failed to load with error: " + loadAdError.getMessage());
}
});
}
}
AppLovinMax
合作伙伴注意事项
- 使用 Applovin 印象级用户收入 API 共享印象级广告收入数据。
为您的 SDK 实施选择代码库:
工作原理:
- 使用 AppLovin 印象级用户收入 API(Android):请参阅入门指南。
- AppLovin 集成:从 AppLovin MAX 加载奖励广告,并使用onMessageReceived函数处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。
- 货币验证:在下面的示例中,货币被硬编码为 "美元"。在向 Singular 发送数据之前,请确保货币准确无误,而不是零或空值。
- 记录无效数据:如果数据未通过验证,则打印日志信息进行调试,并不向 Singular 发送数据。
import com.singular.sdk.*
override fun onMessageReceived(message: AppLovinCommunicatorMessage) {
// In the case that you are subscribed to multiple topics, check for the desired one
if ("max_revenue_events" == message.topic) {
val adData: Bundle? = message.messageData
// Safely access and validate revenue value
val revenueValue = adData?.getDouble("revenue", 0.0) ?: 0.0
if (revenueValue > 0) {
val data = SingularAdData(
adPlatform = "AppLovin",
currency = "USD",
revenue = revenueValue
)
Singular.adRevenue(data)
} else {
Log.e("AppLovinRevenue", "Failed to parse valid revenue value from message data or revenue is not greater than 0")
}
}
}
工作原理
- 使用 AppLovin 印象级用户收入 API(安卓):请参见入门指南。
- AppLovin集成:从 AppLovin MAX 加载奖励广告,并使用onMessageReceived函数处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。
- 货币验证:在下面的示例中,货币被硬编码为 "美元"。在向 Singular 发送数据之前,请确保货币准确无误,而不是零或空值。
- 记录无效数据:如果数据未通过验证,请打印日志信息进行调试,不要将数据发送到 Singular。
import com.singular.sdk.*;
@Override
public void onMessageReceived(AppLovinCommunicatorMessage message) {
// In the case that you are subscribed to multiple topics, check for the desired one
if ("max_revenue_events".equals(message.getTopic())) {
Bundle adData = message.getMessageData();
// Safely access and validate revenue value
double revenueValue = (adData != null) ? adData.getDouble("revenue", 0.0) : 0.0;
if (revenueValue > 0) {
SingularAdData data = new SingularAdData(
"AppLovin",
"USD",
revenueValue
);
Singular.adRevenue(data);
} else {
Log.e("AppLovinRevenue", "Failed to parse valid revenue value from message data or revenue is not greater than 0");
}
}
}
Unity LevelPlay (IronSource)
合作伙伴说明
- Impression Level Revenue (ILR) SDK API 使用 ironSource SDK 为 ironSource Ads 和其他中介网络提供印象级别数据。在[developers.is.com] 上阅读更多内容
- 确保打开 IronSource 中的 ARM SDK 回传标志
为您的 SDK 实施选择代码库:
工作原理:
- 使用 ironSource SDK 获取印象级用户收入(Android):请参阅《入门指南》。
- Ironsource集成:从 Ironsource 加载奖励广告,并使用onImpressionDataSuccess函数处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。
- 货币验证:在下面的示例中,货币被硬编码为 "美元"。在向 Singular 发送数据之前,请确保货币准确无误,而不是零或空值。
- 记录无效数据:如果数据未通过验证,则打印日志信息进行调试,并不向 Singular 发送数据。
import com.singular.sdk.Singular
// Method called when impression data is successfully received
fun onImpressionDataSuccess(impressionData: ISImpressionData?) {
// Ensure impressionData is not null
if (impressionData == null) {
Log.d("IronSource", "No impression data available.")
return
}
// Ensure revenue value is valid
val revenue = impressionData.revenue.toDouble()
if (revenue <= 0) {
Log.w("IronSource", "Invalid revenue value: $revenue")
return
}
// Create SingularAdData object with required fields
val data = SingularAdData(
adPlatform = "IronSource",
currency = "USD",
revenue = revenue
)
// Send the Ad Revenue data to Singular
Singular.adRevenue(data)
// Log the data for debugging
Log.i("IronSource", "Ad Revenue reported to Singular: AdPlatform: ${data.adPlatform}, Currency: ${data.currency}, Revenue: ${data.revenue}")
}
工作原理
- 使用 ironSource SDK 获取印象级用户收入(Android):请参阅《入门指南》。
- Ironsource集成:从 Ironsource 加载奖励广告,并使用onImpressionDataSuccess函数处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。
- 货币验证:在下面的示例中,货币被硬编码为 "美元"。在向 Singular 发送数据之前,请确保货币准确无误,而不是零或空值。
- 记录无效数据:如果数据未通过验证,请打印日志信息进行调试,不要将数据发送到 Singular。
import com.singular.sdk.Singular;
import com.singular.sdk.SingularAdData;
public class IronSourceAdManager {
// Method called when impression data is successfully received
public void onImpressionDataSuccess(ISImpressionData impressionData) {
// Ensure impressionData is not null
if (impressionData == null) {
Log.d("IronSource", "No impression data available.");
return;
}
// Ensure revenue value is valid
double revenue = impressionData.getRevenue().doubleValue();
if (revenue <= 0) {
Log.w("IronSource", "Invalid revenue value: " + revenue);
return;
}
// Create SingularAdData object with required fields
SingularAdData data = new SingularAdData(
"IronSource", // adPlatform
"USD", // currency
revenue // revenue
);
// Send the Ad Revenue data to Singular
Singular.adRevenue(data);
// Log the data for debugging
Log.i("IronSource", "Ad Revenue reported to Singular: AdPlatform: " + data.getAdPlatform() +
", Currency: " + data.getCurrency() +
", Revenue: " + data.getRevenue());
}
}
TradPlus
合作伙伴注意事项
- 设置impressionDelegate
- 在TradPlusAdImpression回调中添加 Singular
为您的 SDK 实现选择代码库:
如何工作:
- TradPlus 集成:从 TradPlus 加载奖励广告,并使用onImpressionSuccess函数处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。adInfo字典包含一个具有有效 NSNumber 值的"ecpm"键。它将此值转换为双倍值并进行缩放(ecpm 通常以毫安单位表示,因此除以 1000.0 将其转换为美元)。
- 货币验证:在下面的示例中,货币被硬编码为 "美元"。在向 Singular 发送数据之前,请确保货币的准确性,而不是零或空。
- 记录无效数据:如果数据未通过验证,则打印日志信息进行调试,并不向 Singular 发送数据。
import com.singular.sdk.Singular
import com.singular.sdk.SingularAdData
// Set the global impression listener for TradPlus
TradPlusSdk.setGlobalImpressionListener(
object : GlobalImpressionManager.GlobalImpressionListener {
override fun onImpressionSuccess(tpAdInfo: TPAdInfo?) {
// Ensure tpAdInfo is not null
if (tpAdInfo == null) {
println("AdInfo is null")
return
}
// Calculate revenue (assuming ecpm is a valid field)
val revenue = tpAdInfo.ecpm.toDouble() / 1000
// Validate the revenue value
if (revenue <= 0) {
println("Ad Revenue value out of expected range: $revenue")
return
}
// Create SingularAdData object with required fields
val data = SingularAdData(
adPlatform = "TradPlus",
currency = "USD", // Assuming USD, adjust if necessary
revenue = revenue
)
// Send the Ad Revenue data to Singular
Singular.adRevenue(data)
// Log for debugging
println("Ad Revenue reported to Singular: AdPlatform: ${data.adPlatform}, Currency: ${data.currency}, Revenue: ${data.revenue}")
}
}
)
如何运行
- TradPlus 集成:从 TradPlus 加载奖励广告,并使用onImpressionSuccess函数处理广告收入事件。
- 收入验证:添加检查以确保收入大于 0,从而防止发送零或负收入值。adInfo字典包含一个具有有效 NSNumber 值的"ecpm"键。它将此值转换为双倍值并进行缩放(ecpm 通常以毫安单位表示,因此除以 1000.0 将其转换为美元)。
- 货币验证:在下面的示例中,货币被硬编码为 "美元"。在向 Singular 发送数据之前,请确保货币的准确性,而不是零或空。
- 记录无效数据:如果数据未能通过验证,请打印日志信息以便调试,同时不要向 Singular 发送数据。
import com.singular.sdk.Singular;
import com.singular.sdk.SingularAdData;
public class AdImpressionListener implements GlobalImpressionManager.GlobalImpressionListener {
private static final String TAG = "AdImpressionListener";
@Override
public void onImpressionSuccess(TPAdInfo tpAdInfo) {
// Ensure tpAdInfo is not null
if (tpAdInfo == null) {
Log.e(TAG, "AdInfo is null");
return;
}
// Ensure eCPM is valid and not null
if (tpAdInfo.getEcpm() == null) {
Log.e(TAG, "eCPM value is null");
return;
}
// Calculate revenue (assuming ecpm is in micros)
double revenue = tpAdInfo.getEcpm().doubleValue() / 1000;
// Validate the revenue value
if (revenue <= 0) {
Log.e(TAG, "Ad Revenue value out of expected range: " + revenue);
return;
}
// Create SingularAdData object with required fields
SingularAdData data = new SingularAdData(
"TradPlus",
"USD",
revenue
);
// Send the Ad Revenue data to Singular
Singular.adRevenue(data);
// Log for debugging
Log.d(TAG, "Ad Revenue reported to Singular: AdPlatform: " + data.getAdPlatform() +
", Currency: " + data.getCurrency() + ", Revenue: " + data.getRevenue());
}
}
其他(通用)
合作伙伴说明
- 通用集成:初始化一个 SingularAdData 对象并传递所需的数据。数据应包括字符串形式的广告平台、字符串形式的货币和双倍形式的收入。
- 收入报告:在将收入和货币数据发送给 Singular 之前,请检查这些数据是否正确。不正确的数据以后无法修复,因此确保数据准确至关重要。
- 提示:记录调试信息。
为您的 SDK 实施选择代码库:
import com.singular.sdk.Singular
import com.singular.sdk.SingularAdData
// Function to send Ad Revenue data to Singular
fun reportAdRevenue(adPlatform: String, currency: String, revenue: Double) {
// Validate the revenue value
if (revenue <= 0) {
println("Invalid revenue value: $revenue")
return
}
// Create a SingularAdData object with the provided fields
val data = SingularAdData(
adPlatform = adPlatform,
currency = currency,
revenue = revenue
)
// Send the Ad Revenue data to Singular
Singular.adRevenue(data)
// Log the data for debugging
println("Ad Revenue reported to Singular: AdPlatform: ${data.adPlatform}, Currency: ${data.currency}, Revenue: ${data.revenue}")
}
import com.singular.sdk.Singular;
import com.singular.sdk.SingularAdData;
// Function to send Ad Revenue data to Singular
public void reportAdRevenue(String adPlatform, String currency, double revenue) {
// Validate the revenue value
if (revenue <= 0) {
Log.w("AdRevenue", "Invalid revenue value: " + revenue);
return;
}
// Create a SingularAdData object with the provided fields
SingularAdData data = new SingularAdData(
adPlatform, // adPlatform
currency, // currency
revenue // revenue
);
// Send the Ad Revenue data to Singular
Singular.adRevenue(data);
// Log the data for debugging
Log.d("AdRevenue", "Ad Revenue reported to Singular: AdPlatform: " + data.getAdPlatform() + ", Currency: " + data.getCurrency() + ", Revenue: " + data.getRevenue());
}