衡量收入来源有助于您了解用户的生命周期价值并拓展应用业务。本指南介绍了如何根据您的平台来设置广告收入衡量功能。
设置广告收入衡量功能后,您就可以:
分析对您的应用产生的广告收入做出了贡献的用户操作。
使用 Firebase A/B Testing 运行实验,确定哪些功能可以提高您的应用广告收入,或者使用 Remote Config 个性化服务来打造个性化广告体验。
根据广告收入水平,使用 Firebase Remote Config 创建用户受众群体和打造个性化用户体验。
准备工作
请务必完成以下任务(如果您尚未完成):
按照 Analytics 使用入门中的说明设置您的项目和应用。
确保您在应用中添加了 Android SDK v17.6.0 及更高版本或 Apple 平台 SDK v6.34.0 及更高版本。
实现
您可以使用 Google Analytics 来衡量通过变现平台(例如 AdMob、AppLovin 和 ironSource)在应用中展示广告所带来的广告收入。为了衡量广告收入,每当用户在您的应用中看到广告时,您都必须记录 ad_impression
事件。这些事件包含广告平台、来源、货币和价值等详细信息。
AdMob
如果您使用的是 AdMob 平台,请将 AdMob 应用关联到 Firebase 和 Analytics,以实现自动衡量广告收入。每当用户看到广告展示时,Firebase SDK for Google Analytics 都会自动记录 ad_impression
事件。
其他广告变现平台
AppLovin 和 ironSource 等平台会提供展示级收入数据,您随后可以使用这些数据来记录 Google Analytics ad_impression
事件。
以下几个部分给出了几个不同的广告变现平台的实现示例。
AppLovin
Swift
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
- (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
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
- (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); } }
实现方面的注意事项
为了让 Google Ads 能够处理您的 ad_impression
,请务必同时添加 currency
和 value
参数(如下所述)。两者都应尽可能准确,以防止高估或低估用户价值。
currency 参数
currency
参数 (iOS+ | Android | Unity) 应以三字母 ISO_4217 格式的字符串形式发送(例如 "USD"
)。有些广告变现平台会省略币种,因此您可能需要对参数进行硬编码。
value 参数
value
参数 (iOS+ | Android | Unity) 在发送时应使用句点作为小数分隔符。您可能需要转换从某些平台接收的值,以符合上述格式要求。某些平台会将数字格式本地化,并使用英文逗号作为小数分隔符。在某些情况下,平台可能根本不会发送值。
此外,此值应该是一个数值类型,例如 double 或 long。例如,1000.01
、0.001
和 1.00
都是有效值。
验证
Google Analytics 提供了多项功能,可用于在整个开发周期中验证您的实现效果。
DebugView
首次测试实现时,请使用 DebugView 在控制台中查看您的测试ad_impression
数据。选择ad_impression
事件后,您可以在“参数”面板(位于屏幕右侧)中查看您要发送的参数。这样有助于您确认系统处理的信息正确无误。实时
部署应用后,请使用 Google Analytics 实时报告来确认实现在正常运行。在实时报告中,查看“按事件名称统计的事件数”卡片,然后选择 ad_impression,以查看过去 30 分钟的事件和参数详细信息。BigQuery
可使用 BigQuery Export 提取一天或多天的ad_impression
事件样本。您可以使用所提取的样本查找问题(例如值为零或未设置值),并针对任何未处理的用例对代码进行修复。
后续步骤
通过 Firebase 控制台以及 Analytics 控制台内关联的 Analytics 媒体资源,访问 Analytics 信息中心。广告收入会纳入到每用户平均收入 (ARPU) 和生命周期价值 (LTV) 等指标中。