วัดรายได้จากโฆษณา

การวัดแหล่งที่มาของรายได้จะช่วยให้คุณเข้าใจมูลค่าตลอดช่วงชีวิตของผู้ใช้และขยายธุรกิจแอป คู่มือนี้จะแสดงวิธีตั้งค่าการวัดรายได้จากโฆษณาสําหรับแพลตฟอร์มของคุณ

หลังจากตั้งค่าการวัดรายได้จากโฆษณาแล้ว คุณจะทําสิ่งต่อไปนี้ได้

ก่อนเริ่มต้น

หากยังไม่ได้ดำเนินการ โปรดตรวจสอบว่าคุณได้ทำงานต่อไปนี้เสร็จสมบูรณ์แล้ว

  1. ตั้งค่าโปรเจ็กต์และแอปตามที่อธิบายไว้ในเริ่มต้นใช้งาน Analytics

  2. ตรวจสอบว่าคุณได้ลิงก์โปรเจ็กต์ Firebase กับบัญชี Google Analytics แล้ว

  3. ตรวจสอบว่าคุณได้รวม Android SDK เวอร์ชัน 17.6.0 ขึ้นไปหรือ Apple Platforms SDK เวอร์ชัน 6.34.0 ขึ้นไปไว้ในแอปแล้ว

การใช้งาน

คุณสามารถใช้ Google Analytics เพื่อวัดรายได้จากโฆษณาที่เกิดจากการแสดงโฆษณา Display ด้วยแพลตฟอร์มที่สร้างรายได้ เช่น AdMob, AppLovin และ ironSource หากต้องการวัดรายได้จากโฆษณา คุณต้องบันทึกเหตุการณ์ ad_impression ทุกครั้งที่ผู้ใช้เห็นโฆษณาในแอป เหตุการณ์เหล่านี้มีรายละเอียดต่างๆ เช่น แพลตฟอร์มโฆษณา แหล่งที่มา สกุลเงิน และมูลค่า

AdMob

หากคุณใช้แพลตฟอร์ม AdMob ให้ลิงก์แอป AdMob กับ Firebase และ Analytics เพื่อเปิดใช้การวัดรายได้จากโฆษณาโดยอัตโนมัติ Firebase SDK สำหรับ Google Analytics จะบันทึกเหตุการณ์ ad_impression โดยอัตโนมัติเมื่อใดก็ตามที่ผู้ใช้เห็นการแสดงโฆษณา

แพลตฟอร์มที่สร้างรายได้จากโฆษณาอื่นๆ

แพลตฟอร์มอย่าง AppLovin และ ironSource จะให้ข้อมูลรายได้ระดับการแสดงผลซึ่งคุณสามารถใช้เพื่อบันทึกเหตุการณ์ Google Analytics ad_impression ได้

ส่วนต่อไปนี้แสดงตัวอย่างการติดตั้งใช้งานสำหรับแพลตฟอร์มที่สร้างรายได้จากโฆษณาที่แตกต่างกัน 2-3 แพลตฟอร์ม

AppLovin

Swift

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย watchOS
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 นี้ไม่พร้อมใช้งานในเป้าหมาย watchOS
- (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

หมายเหตุ: ผลิตภัณฑ์ Firebase นี้ไม่พร้อมใช้งานในเป้าหมาย watchOS
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 นี้ไม่พร้อมใช้งานในเป้าหมาย watchOS
- (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 (อธิบายไว้ด้านล่าง) พารามิเตอร์ทั้ง 2 รายการควรมีความแม่นยำมากที่สุดเพื่อป้องกันไม่ให้ประเมินมูลค่าผู้ใช้สูงหรือต่ำเกินไป

พารามิเตอร์สกุลเงิน

ควรส่งพารามิเตอร์ currency (iOS+ | Android | Unity) เป็นสตริงในรูปแบบ ISO_4217 3 ตัวอักษร (เช่น "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 อย่างน้อย 1 วัน ใช้ตัวอย่างที่ดึงมานี้เพื่อค้นหาปัญหา เช่น ค่าเป็น 0 หรือไม่ได้ตั้งค่า และใช้การแก้ไขกับโค้ดสำหรับ Use Case ที่ไม่ได้รับการจัดการ

ขั้นตอนถัดไป

ไปที่แดชบอร์ด Analytics ในคอนโซล Firebase หรือในพร็อพเพอร์ตี้ Analytics ที่ลิงก์ไว้ในคอนโซล Analytics ระบบจะนำรายได้จากโฆษณามาพิจารณาในเมตริกต่างๆ เช่น รายได้เฉลี่ยต่อผู้ใช้ (ARPU) และมูลค่าตลอดอายุการใช้งาน (LTV)