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

يساعدك قياس مصادر الأرباح في فهم القيمة الدائمة للمستخدمين وتنمية نشاطك التجاري في مجال التطبيقات. يبيّن لك هذا الدليل كيفية إعداد مقياس أرباح الإعلانات على منصتك.

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

قبل البدء

تأكد من إكمال المهام التالية، إذا لم يسبق لك إجراء ذلك:

  1. أعِدّ مشروعك وتطبيقك على النحو الموضّح في بدء استخدام "إحصاءات Google".

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

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

التنفيذ

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

AdMob

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

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

توفِّر منصّات مثل AppLovin وironSource بيانات أرباح على مستوى مرّات الظهور، ويمكنك استخدامها بعد ذلك لتسجيل أحداث ad_impression في "إحصاءات Google".

تعرض الأقسام التالية أمثلة على تنفيذ بعض المنصّات المختلفة لتحقيق الربح من الإعلانات.

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);
}

مصدر الحديد

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" بمعالجة ad_impression، تأكَّد من تضمين كل من المَعلمتَين currency وvalue (الموضّحة أدناه). يجب أن تكون كلتا المعلمتَين دقيقتَين قدر الإمكان لتجنّب تقدير قيمة المستخدمين أكثر من غيرها أو خفض قيمتها.

مَعلمة العملة

يجب إرسال المَعلمة currency (iOS+ | Android | Unity) كسلسلة بتنسيق ISO_4217 المكوَّن من ثلاثة أحرف (مثل "USD"). تتجاهل بعض المنصات لتحقيق الربح من الإعلانات العملة، ما قد يتطلّب منك ترميز المَعلمة بشكل ثابت.

مَعلمة القيمة

يجب إرسال المَعلمة value (iOS+ | Android | Unity) باستخدام نقطة كفاصل عشري. قد تحتاج إلى تحويل القيم الواردة من بعض المنصات لتناسب التنسيق المطلوب أعلاه. تعمل بعض الأنظمة الأساسية على ترجمة التنسيقات الرقمية واستخدام الفواصل كفواصل عشرية. وفي بعض الحالات، قد لا ترسل المنصة أي قيمة على الإطلاق.

بالإضافة إلى ذلك، يجب أن تكون القيمة من نوع عددي، مثل مزدوج أو طويل. على سبيل المثال، تُعد 1000.01 و0.001 و1.00 جميعها صالحة.

التحقق

تقدّم "إحصاءات Google" ميزات متعدّدة للتحقّق من صحة عملية التنفيذ طوال دورة التطوير.

  1. DebugView
    عند اختبار عملية التنفيذ لأول مرة، استخدِم DebugView للاطّلاع على بيانات "ad_impression" الاختبارية في وحدة التحكّم. عند اختيار حدث ad_impression، يمكنك مراجعة المَعلمات التي ترسلها في لوحة المَعلمات (في الجانب الأيسر من الشاشة). يساعدك هذا في التأكد من معالجة المعلومات الصحيحة.

  2. الوقت الفعلي
    بعد نشر تطبيقك، استخدِم تقرير "الوقت الفعلي" في "إحصاءات Google" للتأكّد من سير عملية التنفيذ بشكل صحيح. في تقرير "الوقت الفعلي"، اطّلِع على بطاقة عدد الأحداث حسب اسم الحدث واختَر ad_impression للاطّلاع على تفاصيل الحدث والمَعلمة في آخر 30 دقيقة.

  3. BigQuery
    يمكنك استخدام BigQuery Export لاستخراج عيّنة من يوم أو أكثر من أحداث ad_impression. يمكنك استخدام هذه العيّنة المستخلَصة للبحث عن المشاكل، مثل صفر أو عدم ضبط القيم، وتطبيق الإصلاحات على الرمز البرمجي لأي حالات استخدام لم يتم التعامل معها.

الخطوات اللاحقة

انتقِل إلى لوحة بيانات "إحصاءات Google" في وحدة تحكُّم Firebase أو في موقعك المرتبط على "إحصاءات Google" في وحدة تحكُّم "إحصاءات Google". يتم تضمين أرباح الإعلانات في مقاييس، مثل متوسط الأرباح من كل مستخدم (ARPU) والقيمة الدائمة.