يساعدك قياس مصادر أرباحك في فهم القيمة الدائمة لمستخدمي تطبيقك وتنمية نشاطك التجاري على التطبيق. يوضّح لك هذا الدليل كيفية إعداد عملية قياس عوائد الإعلانات لплатформتك.
بعد إعداد ميزة قياس أرباح الإعلانات، يمكنك إجراء أي مما يلي:
تحليل إجراءات المستخدمين التي تساهم في أرباح الإعلانات التي يحقّقها تطبيقك
يمكنك إجراء تجارب باستخدام Firebase A/B Testing لمعرفة ميزات التي تحقّق تحسينات في أرباح إعلانات تطبيقك، أو تخصيص تجربتَي استخدام الإعلانات باستخدام ميزة تخصيصRemote Config.
أنشئ شرائح جمهور مستخدِمين وخصِّص تجارب المستخدِمين باستخدام Firebase Remote Config استنادًا إلى مستويات أرباح الإعلانات.
قبل البدء
يُرجى إكمال المهام التالية إذا لم يسبق لك إكمالها:
يمكنك إعداد مشروعك وتطبيقك كما هو موضّح في مقالة البدء باستخدام Analytics.
تأكَّد من ربط مشروعك على Firebase بحساب على Google Analytics.
تأكَّد من تضمين الإصدار 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
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); }
ironSource
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 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 ميزات متعدّدة للتحقّق من صحة عملية التنفيذ أثناء دورة التطوير.
DebugView
عند اختبار عملية التنفيذ لأول مرة، استخدِم DebugView للاطّلاع على بياناتad_impression
الاختبار في وحدة التحكّم. عند اختيار حدثad_impression
، يمكنك مراجعة المَعلمات التي ترسلها في لوحة المَعلمات (على الجانب الأيمن من الشاشة). يساعدك ذلك في التأكّد من أنّه تتم معالجة المعلومات الصحيحة.الوقت الفعلي
بعد نشر تطبيقك، استخدِم Google Analytics تقرير "الوقت الفعلي" للتأكّد من أنّ عملية التنفيذ تعمل بشكلٍ صحيح. في تقرير "الوقت الفعلي"، اطّلِع على بطاقة عدد الأحداث حسب اسم الحدث واختَر ad_impression للاطّلاع على تفاصيل الحدث والمَعلمة في آخر 30 دقيقة.BigQuery
استخدِم تصدير BigQuery لاستخراج عيّنة من أحداثad_impression
ليوم واحد أو أكثر. استخدِم هذا المثال المُستخرَج للبحث عن المشاكل، مثل القيم الصفرية أو القيم غير المحدّدة، وطبِّق الإصلاحات على الرمز البرمجي لأي حالات استخدام لم تتم معالجتها.
الخطوات التالية
انتقِل إلى لوحة بيانات Analytics في وحدة تحكّم Firebase أو في موقعك المرتبط Analytics في وحدة تحكّم Analytics. يتمّ احتساب إيرادات الإعلانات في المقاييس، مثل متوسط الأرباح من كلّ مستخدِم (ARPU) والقيمة الدائمة (LTV).