מדידת מקורות ההכנסה עוזרת לכם להבין את ערך חיי המשתמש ולפתח את העסק של האפליקציה. במדריך הזה מוסבר איך להגדיר מדידה של הכנסות מפרסום בפלטפורמה שלכם.
אחרי שמגדירים מדידה של הכנסות מפרסום, אפשר לבצע כל אחת מהפעולות הבאות:
ניתוח של פעולות של משתמשים שתורמים להכנסות מפרסום באפליקציה שלכם.
אתם יכולים להריץ ניסויים באמצעות 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 Analyticsad_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
(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).