מדידת הכנסות מפרסום

מדידה של מקורות ההכנסה מאפשרת לכם להבין את ערך חיי המשתמשים ולהרחיב את הפעילות העסקית שלכם. במדריך הזה מוסבר איך להגדיר מדידה של הכנסות מפרסום בפלטפורמה שלכם.

אחרי שמגדירים מעקב אחר הכנסות מפרסום, אפשר לבצע כל אחת מהפעולות הבאות:

לפני שמתחילים

אם עדיין לא עשיתם זאת, חשוב לבצע את הפעולות הבאות:

  1. מגדירים את הפרויקט ואת האפליקציה לפי ההוראות במאמר תחילת העבודה עם Analytics.

  2. חשוב לוודא שקישרתם את פרויקט Firebase לחשבון Google Analytics.

  3. הקפידו לכלול באפליקציה את ה-Android SDK מגרסה 17.6.0 ואילך או את ה-SDK של מוצרי הפלטפורמה של Apple מגרסה 6.34.0 ואילך.

הטמעה

אפשר להשתמש ב-Google Analytics כדי למדוד את ההכנסות מפרסום שנוצרו מהצגת מודעות בפלטפורמות למונטיזציה, כמו AdMob,‏ AppLovin ו-ironSource. כדי למדוד את ההכנסות מפרסום, צריך לתעד אירועי ad_impression בכל פעם שהמשתמש רואה מודעה באפליקציה. האירועים האלה מכילים פרטים כמו פלטפורמת המודעות, המקור, המטבע והערך.

AdMob

אם אתם משתמשים בפלטפורמה AdMob, צריך לקשר את האפליקציה של AdMob ל-Firebase ול-Analytics כדי להפעיל מדידה אוטומטית של ההכנסות מפרסום. ה-SDK של Firebase ל-Google Analytics מתעד באופן אוטומטי את האירוע ad_impression בכל פעם שהמשתמשים רואים חשיפה של מודעה.

פלטפורמות אחרות למונטיזציה ממודעות

פלטפורמות כמו AppLovin ו-ironSource מספקות נתוני הכנסות ברמת החשיפה, שבאמצעותם אפשר לתעד אירועים מסוג Google Analyticsad_impression.

בקטעים הבאים מוצגות דוגמאות להטמעה של כמה פלטפורמות מונטיזציה שונות של מודעות.

AppLovin

Swift

הערה: מוצר Firebase הזה לא זמין ביעד של macOS.
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

הערה: מוצר Firebase הזה לא זמין ביעד macOS.
- (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

הערה: מוצר Firebase הזה לא זמין ביעד של macOS.
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

הערה: מוצר Firebase הזה לא זמין ביעד macOS.
- (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 יש מספר תכונות לאימות ההטמעה לאורך מחזור הפיתוח.

  1. DebugView
    כשבודקים את ההטמעה בפעם הראשונה, אפשר להשתמש ב-DebugView כדי לראות את נתוני הבדיקה ad_impression במסוף. כשבוחרים אירוע ad_impression, אפשר לבדוק את הפרמטרים ששולחים בחלונית פרמטרים (בצד שמאל של המסך). כך תוכלו לוודא שהמידע הנכון מעובד.

  2. זמן אמת
    אחרי הפריסה של האפליקציה, תוכלו להשתמש בGoogle Analyticsדוח 'זמן אמת' כדי לוודא שההטמעה פועלת בצורה תקינה. בדוח 'פעילות בזמן אמת', בודקים את הכרטיס ספירת אירועים לפי שם האירוע ובוחרים באפשרות ad_impression כדי לראות את פרטי האירוע והפרמטר ב-30 הדקות האחרונות.

  3. BigQuery
    אפשר להשתמש בייצוא BigQuery כדי לחלץ דגימה של אירועי ad_impression מיום אחד או יותר. אפשר להשתמש בדגימה שחולצה כדי לחפש בעיות, כמו ערכים של אפס או ערכים שלא הוגדרו, וליישם תיקונים בקוד לכל תרחיש לדוגמה שלא טופלו.

השלבים הבאים

נכנסים למרכז הבקרה של Analytics במסוף Firebase או בנכס Analytics המקושר במסוף Analytics. ההכנסות מפרסום משוקללות במדדים כמו הכנסה ממוצעת למשתמש (ARPU) וערך חיי המשתמש (LTV).