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

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

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

  • วิเคราะห์การกระทําของผู้ใช้ที่มีส่วนทําให้แอปได้รายได้จากโฆษณา

  • ทำการทดสอบโดยใช้ Firebase A/B Testing เพื่อดูว่า ฟีเจอร์ใดที่ช่วยให้แอปมีรายได้จากโฆษณาเพิ่มขึ้น หรือปรับเปลี่ยนประสบการณ์การใช้งานโฆษณาตามโปรไฟล์ของผู้ใช้ด้วยการปรับการกำหนดค่าระยะไกล Remote Config

  • สร้าง กลุ่มเป้าหมายผู้ใช้ และ ปรับแต่งประสบการณ์ของผู้ใช้ โดยใช้ Firebase Remote Config ตามระดับรายได้จากโฆษณา

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

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

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

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

  3. ตรวจสอบว่าคุณได้รวม 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 สำหรับ Google Analytics จะบันทึกเหตุการณ์ ad_impression โดยอัตโนมัติทุกครั้งที่ ผู้ใช้เห็นการแสดงผลโฆษณา

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

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

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

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

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

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 หรือไม่ได้ตั้งค่า และใช้การแก้ไขกับโค้ดสำหรับกรณีการใช้งานที่ไม่ได้จัดการ

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

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