מדידת מקורות ההכנסה עוזרת לכם להבין את ערך חיי המשתמשים ולהרחיב את העסק של האפליקציה. במדריך הזה מוסבר איך להגדיר מדידה של הכנסות מפרסום בפלטפורמה.
אחרי שמגדירים מעקב אחר הכנסות מפרסום, אפשר לבצע כל אחת מהפעולות הבאות:
ניתוח של פעולות משתמשים שמניבות הכנסות מפרסום באפליקציה.
מריצים ניסויים באמצעות Firebase A/B Testing כדי לגלות אילו תכונות משפרות את ההכנסות ממודעות באפליקציה, או משתמשים בRemote Configהתאמה אישית כדי להתאים אישית את חוויית הצפייה במודעות.
ליצור קהלים של משתמשים ולהתאים אישית את חוויות המשתמשים באמצעות Firebase Remote Config על סמך רמות ההכנסה מפרסום.
לפני שמתחילים
אם עדיין לא עשיתם זאת, הקפידו לבצע את המשימות הבאות:
מגדירים את הפרויקט והאפליקציה כמו שמתואר במאמר תחילת העבודה עם Analytics.
חשוב לוודא שקישרתם את פרויקט Firebase לחשבון Google Analytics.
חשוב לוודא שכללתם באפליקציה את Android SDK בגרסה 17.6.0 ואילך או את Apple platforms SDK בגרסה 6.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
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
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
(iOS+ | Android | Unity) צריך להישלח כמחרוזת בפורמט ISO_4217 של שלוש אותיות (לדוגמה, "USD"
). חלק מהפלטפורמות למונטיזציה של מודעות משמיטות את המטבע, ולכן יכול להיות שתצטרכו להגדיר את הפרמטר הזה בהארדקוד.
פרמטר ערך
הפרמטר value
(iOS+ | Android | Unity) צריך להישלח עם נקודה כמפריד העשרוני. יכול להיות שתצטרכו לשנות את הערכים שמתקבלים מפלטפורמות מסוימות כדי שיתאימו לפורמט הנדרש שמופיע למעלה. יש פלטפורמות שמבצעות לוקליזציה של פורמטים מספריים ומשתמשות בפסיקים כמפרידים עשרוניים. במקרים מסוימים, יכול להיות שפלטפורמה לא תשלח ערך בכלל.
בנוסף, הערך צריך להיות מסוג מספרי, כמו double או long.
לדוגמה, 1000.01
, 0.001
ו-1.00
הם תקינים
אימות
Google Analytics מציע כמה תכונות לאימות ההטמעה לאורך מחזור הפיתוח.
DebugView
כשבודקים את ההטמעה בפעם הראשונה, כדאי להשתמש ב-DebugView כדי לראות את נתוני הבדיקהad_impression
במסוף. כשבוחרים אירועad_impression
, אפשר לבדוק את הפרמטרים שאתם שולחים בחלונית Parameters (בצד שמאל של המסך). כך תוכלו לוודא שהמידע הנכון מעובד.זמן אמת
אחרי פריסת האפליקציה, משתמשים Google Analytics בדוח 'פעילות בזמן אמת' כדי לוודא שההטמעה פועלת בצורה תקינה. בדוח 'פעילות בזמן אמת', בכרטיס מספר האירועים לפי שם האירוע, בוחרים באפשרות ad_impression כדי לראות את פרטי האירוע והפרמטרים ב-30 הדקות האחרונות.BigQuery
אפשר להשתמש בייצוא של BigQuery כדי לחלץ מדגם של אירועים מיום אחד או יותר ב-ad_impression
. אפשר להשתמש בדוגמה שחולצה כדי לחפש בעיות, כמו ערכים אפסיים או ערכים שלא הוגדרו, ולהחיל תיקונים על הקוד לכל תרחיש שימוש שלא טופל.
השלבים הבאים
אפשר להיכנס לAnalytics מרכז הבקרה במסוף Firebase או לנכס המקושר במסוף Analytics.Analytics ההכנסה מפרסום נכללת במדדים כמו הכנסה ממוצעת למשתמש (ARPU) וערך חיי המשתמש (LTV).