قياس أرباح الإعلانات

يساعدك قياس مصادر أرباحك في فهم القيمة الدائمة للمستخدمين وتنمية نشاطك التجاري على تطبيقك. يوضّح لك هذا الدليل كيفية إعداد عملية قياس عوائد الإعلانات لплатформتك.

بعد إعداد ميزة قياس أرباح الإعلانات، يمكنك إجراء أي مما يلي:

قبل البدء

يُرجى إكمال المهام التالية إذا لم يسبق لك إكمالها:

  1. يمكنك إعداد مشروعك وتطبيقك كما هو موضّح في مقالة البدء باستخدام Analytics.

  2. تأكَّد من ربط مشروعك على Firebase بحساب على Google Analytics.

  3. تأكَّد من تضمين الإصدار 17.6.0 أو إصدار أحدث من حزمة تطوير البرامج (SDK) لنظام التشغيل Android أو الإصدار 6.34.0 أو إصدار أحدث من حزمة تطوير البرامج (SDK) لأنظمة التشغيل من Apple في تطبيقك.

التنفيذ

يمكنك استخدام Google Analytics لقياس أرباح الإعلانات الناتجة عن عرض الإعلانات باستخدام منصّات تحقيق الربح، مثل AdMob وAppLovin و ironSource. لقياس أرباح الإعلانات، عليك تسجيل أحداث ad_impression عندما يرى المستخدم إعلانًا في تطبيقك. تحتوي هذه الأحداث على تفاصيل مثل منصة الإعلان والمصدر والعملة والقيمة.

AdMob

إذا كنت تستخدم منصة AdMob، اربط تطبيقك على AdMob بمنصّتَي Firebase وAnalytics لتفعيل ميزة القياس التلقائي لأرباح الإعلانات. تسجِّل حزمة تطوير البرامج (SDK) لمنصّة Google Analytics حدث ad_impression تلقائيًا عندما يشاهد المستخدِمون مرّة ظهور للإعلان.

المنصّات الأخرى التي تسمح بتحقيق الربح من الإعلانات

توفّر منصات مثل AppLovin وironSource بيانات الأرباح على مستوى مرّات الظهور التي يمكنك استخدامها بعد ذلك لتسجيل أحداث Google Analytics ad_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).