يساعدك قياس مصادر الأرباح في فهم القيمة الدائمة للمستخدمين وتنمية نشاطك التجاري في مجال التطبيقات. يبيّن لك هذا الدليل كيفية إعداد مقياس أرباح الإعلانات على منصتك.
بعد إعداد قياس أرباح الإعلانات، يمكنك إجراء أيّ ممّا يلي:
يمكنك تحليل إجراءات المستخدمين التي تساهم في أرباح الإعلانات التي يحقّقها تطبيقك.
يمكنك إجراء التجارب باستخدام اختبار A/B من Firebase لمعرفة الميزات التي تساهم في تحسين أرباح الإعلانات في تطبيقك أو تخصيص تجارب الإعلانات باستخدام التخصيص في ميزة "الإعداد عن بُعد".
يمكنك إنشاء شرائح جمهور مستخدمين وتخصيص تجارب المستخدمين باستخدام الإعداد عن بُعد في Firebase استنادًا إلى مستويات أرباح الإعلانات.
قبل البدء
تأكد من إكمال المهام التالية، إذا لم يسبق لك إجراء ذلك:
أعِدّ مشروعك وتطبيقك على النحو الموضّح في بدء استخدام "إحصاءات Google".
تأكَّد من أنّك ربطت مشروعك على Firebase بحساب على "إحصاءات Google".
تأكّد من تضمين الإصدار 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
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
- (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
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
- (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" ميزات متعدّدة للتحقّق من صحة عملية التنفيذ طوال دورة التطوير.
DebugView
عند اختبار عملية التنفيذ لأول مرة، استخدِم DebugView للاطّلاع على بيانات "ad_impression
" الاختبارية في وحدة التحكّم. عند اختيار حدثad_impression
، يمكنك مراجعة المَعلمات التي ترسلها في لوحة المَعلمات (في الجانب الأيسر من الشاشة). يساعدك هذا في التأكد من معالجة المعلومات الصحيحة.الوقت الفعلي
بعد نشر تطبيقك، استخدِم تقرير "الوقت الفعلي" في "إحصاءات Google" للتأكّد من سير عملية التنفيذ بشكل صحيح. في تقرير "الوقت الفعلي"، اطّلِع على بطاقة عدد الأحداث حسب اسم الحدث واختَر ad_impression للاطّلاع على تفاصيل الحدث والمَعلمة في آخر 30 دقيقة.BigQuery
يمكنك استخدام BigQuery Export لاستخراج عيّنة من يوم أو أكثر من أحداثad_impression
. يمكنك استخدام هذه العيّنة المستخلَصة للبحث عن المشاكل، مثل صفر أو عدم ضبط القيم، وتطبيق الإصلاحات على الرمز البرمجي لأي حالات استخدام لم يتم التعامل معها.
الخطوات اللاحقة
انتقِل إلى لوحة بيانات "إحصاءات Google" في وحدة تحكُّم Firebase أو في موقعك المرتبط على "إحصاءات Google" في وحدة تحكُّم "إحصاءات Google". يتم تضمين أرباح الإعلانات في مقاييس، مثل متوسط الأرباح من كل مستخدم (ARPU) والقيمة الدائمة.