Đo lường doanh thu từ quảng cáo

Việc đo lường các nguồn doanh thu giúp bạn hiểu được giá trị vòng đời của người dùng và phát triển hoạt động kinh doanh ứng dụng. Hướng dẫn này cho bạn biết cách thiết lập tính năng đo lường doanh thu từ quảng cáo cho nền tảng của bạn.

Sau khi thiết lập tính năng đo lường doanh thu từ quảng cáo, bạn có thể làm bất kỳ việc nào sau đây:

Trước khi bắt đầu

Hãy nhớ hoàn thành các việc sau nếu bạn chưa thực hiện:

  1. Thiết lập dự án và ứng dụng như mô tả trong phần Bắt đầu với Analytics.

  2. Hãy đảm bảo rằng bạn đã liên kết dự án Firebase với tài khoản Google Analytics.

  3. Đảm bảo rằng bạn đã đưa SDK Android phiên bản 17.6.0 trở lên hoặc SDK nền tảng Apple phiên bản 6.34.0 trở lên vào ứng dụng.

Triển khai

Bạn có thể sử dụng Google Analytics để đo lường doanh thu từ quảng cáo được tạo ra từ việc hiển thị quảng cáo bằng các nền tảng kiếm tiền, chẳng hạn như AdMob, AppLovin và ironSource. Để đo lường doanh thu từ quảng cáo, bạn phải ghi lại các sự kiện ad_impression bất cứ khi nào người dùng nhìn thấy quảng cáo trong ứng dụng của bạn. Các sự kiện này chứa thông tin chi tiết như nền tảng quảng cáo, nguồn, đơn vị tiền tệ và giá trị.

AdMob

Nếu bạn đang sử dụng nền tảng AdMob, hãy liên kết ứng dụng AdMob với Firebase và Analytics để bật tính năng tự động đo lường doanh thu từ quảng cáo. SDK Firebase cho Google Analytics tự động ghi nhật ký sự kiện ad_impression bất cứ khi nào người dùng nhìn thấy một lượt hiển thị quảng cáo.

Các nền tảng kiếm tiền từ quảng cáo khác

Các nền tảng như AppLovin và ironSource cung cấp dữ liệu doanh thu ở cấp lượt hiển thị mà bạn có thể sử dụng để ghi lại các sự kiện Google Analytics ad_impression.

Các phần sau đây trình bày ví dụ về cách triển khai cho một số nền tảng kiếm tiền từ quảng cáo.

AppLovin

Swift

Lưu ý: Sản phẩm Firebase này không có trên mục tiêu 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

Lưu ý: Sản phẩm Firebase này không có trên mục tiêu 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

Lưu ý: Sản phẩm Firebase này không có trên mục tiêu 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

Lưu ý: Sản phẩm Firebase này không có trên mục tiêu 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);
  }
}

Những điều cần cân nhắc khi triển khai

Để cho phép Google Ads xử lý ad_impression, hãy nhớ thêm cả tham số currencyvalue (như mô tả bên dưới). Cả hai tham số phải chính xác nhất có thể để tránh đánh giá quá cao hoặc đánh giá thấp người dùng.

Tham số đơn vị tiền tệ

Bạn nên gửi thông số currency (iOS+ | Android | Unity) dưới dạng chuỗi ở định dạng ISO_4217 gồm 3 chữ cái (ví dụ: "USD"). Một số nền tảng kiếm tiền từ quảng cáo bỏ qua đơn vị tiền tệ, vì vậy, bạn có thể phải mã hoá cứng thông số này.

Tham số giá trị

Bạn nên gửi tham số value (iOS+ | Android | Unity) bằng cách sử dụng dấu chấm làm dấu thập phân. Bạn có thể cần chuyển đổi các giá trị nhận được từ một số nền tảng để phù hợp với định dạng bắt buộc ở trên. Một số nền tảng bản địa hoá định dạng số và sử dụng dấu phẩy làm dấu thập phân. Trong một số trường hợp, nền tảng có thể không gửi giá trị nào cả.

Ngoài ra, giá trị phải là một loại số, chẳng hạn như double hoặc long. Ví dụ: 1000.01, 0.0011.00 đều là hợp lệ

Xác thực

Google Analytics cung cấp nhiều tính năng để xác thực quá trình triển khai của bạn trong suốt vòng đời phát triển.

  1. DebugView
    Trong lần đầu kiểm thử quá trình triển khai, hãy sử dụng DebugView để xem dữ liệu ad_impression kiểm thử trong bảng điều khiển. Khi chọn một sự kiện ad_impression, bạn có thể xem lại các thông số mà bạn đang gửi trong bảng điều khiển Parameters (Thông số) (ở bên phải màn hình). Điều này giúp bạn xác nhận rằng thông tin chính xác đang được xử lý.

  2. Thời gian thực
    Sau khi triển khai ứng dụng, hãy sử dụng Google Analytics Báo cáo theo thời gian thực để xác nhận rằng quá trình triển khai đang hoạt động đúng cách. Trong báo cáo Theo thời gian thực, hãy xem thẻ Số lượng sự kiện theo tên sự kiện rồi chọn lượt hiển thị quảng cáo để xem thông tin chi tiết về sự kiện và thông số trong 30 phút qua.

  3. BigQuery
    Sử dụng tính năng xuất BigQuery để trích xuất một mẫu gồm một hoặc nhiều ngày của các sự kiện ad_impression. Sử dụng mẫu đã trích xuất này để tìm các vấn đề, chẳng hạn như giá trị bằng 0 hoặc chưa được đặt, đồng thời áp dụng các bản sửa lỗi cho mã của bạn đối với mọi trường hợp sử dụng chưa được xử lý.

Các bước tiếp theo

Truy cập trang tổng quan Analytics trong bảng điều khiển Firebase hoặc trong tài sản Analytics được liên kết trong bảng điều khiển Analytics. Doanh thu từ quảng cáo được tính vào các chỉ số, chẳng hạn như Doanh thu trung bình trên mỗi người dùng (ARPU) và Giá trị vòng đời (LTV).