يساعدك قياس مصادر الإيرادات في فهم القيمة الدائمة للمستخدمين وتطوير تطبيقاتك. يوضّح لك هذا الدليل كيفية إعداد قياس إيرادات الإعلانات لمنصتك.
بعد إعداد قياس إيرادات الإعلانات، يمكنك إجراء أيّ ممّا يلي:
يمكنك تحليل إجراءات المستخدمين التي تعزّز إيرادات الإعلانات التي يحقّقها تطبيقك.
يمكنك إجراء تجارب باستخدام 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"
لتفعيل القياس التلقائي لإيرادات الإعلانات. تسجّل حزمة Firebase 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
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).