يساعدك قياس مصادر إيراداتك في التعرّف على القيمة الدائمة للمستخدمين وتطوير تطبيقاتك. يعرض هذا الدليل كيفية إعداد قياس إيرادات الإعلانات لمنصّتك.
بعد إعداد قياس إيرادات الإعلانات، يمكنك إجراء أيّ ممّا يلي:
تحليل إجراءات المستخدمين التي تعزّز إيرادات الإعلانات التي يحقّقها تطبيقك
إجراء تجارب باستخدام Firebase A/B Testing للتعرّف على الميزات التي تحسّن إيرادات الإعلانات على تطبيقك، أو تخصيص تجارب الإعلانات باستخدام خيار التخصيص في ميزة "Remote Configالإعداد عن بُعد".
إنشاء شرائح جمهور المستخدمين وتخصيص تجاربهم باستخدام Firebase Remote Config استنادًا إلى مستويات إيرادات الإعلانات
قبل البدء
إذا لم يسبق لك ذلك، احرص على إكمال المهام التالية:
إعداد مشروعك وتطبيقك كما هو موضّح في مقالة البدء في استخدام Analytics.
التأكّد من ربط مشروع Firebase الخاص بك بحساب على إحصاءات Google Google Analytics account.
التأكّد من تضمين الإصدار 17.6.0 أو إصدار أحدث من حزمة تطوير البرامج (SDK) لنظام التشغيل Android أو الإصدار 6.34.0 أو إصدار أحدث من حزمة تطوير البرامج (SDK) لمنصّات Apple في تطبيقك
التنفيذ
يمكنك استخدام Google Analytics لقياس إيرادات الإعلانات الناتجة عن
عرض الإعلانات باستخدام منصّات تحقيق الربح من الإعلانات، مثل AdMob وAppLovin و
ironSource. لقياس إيرادات الإعلانات، عليك تسجيل
ad_impression أحداث
كلّما يرى المستخدم إعلانًا في تطبيقك. تتضمّن هذه الأحداث
تفاصيل مثل المنصّة الإعلانية والمصدر والعملة والقيمة.
AdMob
إذا كنت تستخدم منصّة AdMob،
اربط تطبيقك على AdMob بمنصّة Firebase وAnalytics
لتفعيل القياس التلقائي لإيرادات الإعلانات. تسجِّل حزمة تطوير البرامج (SDK) لمنصّة Firebase في
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
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
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).