1. مقدمة
بعض المعلومات السياقية قبل البدء
إذا كنت من مطوّري تطبيقات iOS، من المؤكّد أنّك سمعت عن تعديلات الخصوصية في الإصدار 14.5 من نظام التشغيل iOS والإصدارات الأحدث. لقياس إجراءات الإحالات الناجحة المهمة بعد التثبيت، توفّر Apple واجهة برمجة التطبيقات SKAd Network API التي تتيح لك قياس مدى نجاح حملاتك الإعلانية مع احترام خصوصية المستخدمين. استنادًا إلى احتياجات نشاطك التجاري، يمكنك التوصّل إلى الطريقة المثلى للاستفادة من SKAdNetwork من أجل الحصول على إحصاءات مفيدة عن حملاتك. في هذا الدرس العملي، سنتناول مثالاً على منهجية للاستفادة من بيانات "إحصاءات Google 4 للوحات القيادة" في BigQuery من أجل تجميع الأرباح بعد تثبيت التطبيق في مجموعات، ويمكنك بعد ذلك استخدامها لإعدادها مع شريك تحديد مصدر التطبيق. على الرغم من أنّ هذا الدرس التطبيقي العملي يستخدم نهجًا يستند إلى الأرباح، يمكنك أيضًا استخدام نهج يستند إلى الأحداث أو المسار الإحالي لقياس أداء SKAN. يُرجى الرجوع إلى مركز المساعدة هذا للحصول على إرشادات أكثر تفصيلاً. هذا مجرد مثال، وليس اقتراحًا رسميًا من Google. يمكنك تصميم المخطط الخاص بك استنادًا إلى احتياجات نشاطك التجاري المحدّدة
المواضيع التي سنناقشها
- استكشاف بيانات GA4F في BigQuery
- العثور على بيانات الأرباح للمستخدمين الذين أجروا إحالات ناجحة خلال 0 إلى يومَين
- تجميع بيانات الأرباح في حِزم
- التعرّف على توزيع المستخدمين في كل مجموعة
- تنفيذ المجموعات في "استوديو إحالات SKAN الناجحة" من Appsflyer
المتطلبات الأساسية
- حزمة تطوير البرامج (SDK) في "إحصاءات Google لـ Firebase" في تطبيق iOS، وجميع أحداث الأرباح المدمجة (in_app_purchase أو الأرباح المستندة إلى الإعلانات)
- تم تفعيل عملية التصدير من Firebase إلى BigQuery
- شريك قياس الأداء على التطبيقات الذي يسجّل أيضًا جميع أحداث الإيرادات
2. الوصول إلى BigQuery Export
الانتقال إلى مجموعة بيانات Google Cloud
انتقِل إلى مجموعة البيانات في GA4F من خلال الانتقال إلى إعدادات المشروع > عمليات الدمج > BigQuery. يجب تفعيل زر التبديل أولاً، وبعد تفعيله، يستغرق توفّر مجموعة البيانات حوالي 48 ساعة. يمكنك النقر على الرابط الموضّح أدناه وسيتم نقلك إلى BigQuery

تنفيذ بعض طلبات البحث
بعد الانتقال إلى BigQuery، من المفترض أن تظهر لك الجداول اليومية التي تم إنشاؤها. في لقطة الشاشة أدناه، نرى 64 جدولاً يوميًا، ما يعني أنّ عملية التصدير مستمرة منذ 64 يومًا. إذا كنت تصل إلى هذه البيانات للمرة الأولى، قد يظهر لك جدول يومي واحد فقط لبيانات اليوم السابق. على يسار الشاشة، يظهر مخطط الجدول. يمكنك الرجوع إلى مزيد من التفاصيل حول الحقول هنا.
لبدء كتابة طلب البحث، يمكنك النقر على طلب البحث > في علامة تبويب جديدة

يمكنك بعد ذلك محاولة تنفيذ طلب البحث النموذجي في علامة التبويب الجديدة.

3- تحليل بيانات الأرباح
استرداد بيانات عمليات التثبيت
الآن، لبدء إنشاء مجموعات الأرباح، علينا أولاً الاطّلاع على بيانات المستخدمين الذين ثبَّتوا التطبيق خلال آخر 24 إلى 72 ساعة. يتيح لك الإصدار 4.0 من SKAdNetwork عرض البيانات في الفترة من 0 إلى يومَين، بينما يتيح الإصدار 3.5 من SKAdNetwork عرض البيانات لمدة 24 ساعة تلقائيًا. (بناءً على إمكانات شريك إحالة التطبيقات، قد تتمكّن من تعديل فترة النشاط هذه بشكلٍ عام بما لا يزيد عن 72 ساعة). عندما يثبِّت المستخدِمون التطبيق ويفتحونه لأول مرة، يتم تشغيل الحدث first_open من خلال حزمة تطوير البرامج (SDK) وتسجيله في BigQuery.
المعرّف الذي يمكنك استخدامه في BigQuery هو user_pseudo_id (يُعرف أيضًا باسم رقم تعريف نسخة التطبيق الافتراضية)، لذا يمكنك استخدام طلب البحث أدناه للعثور على هؤلاء المستخدمين.
SELECT
user_pseudo_id,
event_name,
event_date,
event_timestamp
FROM `project_name.dataset_name.events_2023*`
WHERE
event_name = 'first_open'
AND platform = 'IOS'
في ما يلي بعض الملاحظات حول هذا الاستعلام
- يُرجى استبدال اسم الجدول بجدول "إحصاءات Google" الذي تم تصديره. يمكنك استخدام أحرف البدل للاستعلام عن جداول يومية متعددة. على سبيل المثال، سيتم البحث عن 2023* في جميع البيانات في عام 2023
- إذا كان لديك الكثير من المستخدمين، يمكنك أيضًا طلب البحث عن آخر 30 يومًا فقط لتسريع عملية المعالجة.
- نُجري فلترة حسب النظام الأساسي = "IOS". في حال كان لديك عدّة تطبيقات iOS في مشروعك على Firebase، يمكنك أيضًا إضافة فلتر app_info.firebase_app_id للحصول على بيانات التطبيق المحدّد.
جلب بيانات الإيرادات
لنلقِ الآن نظرة على طلب بحث للعثور على أرباح المستخدمين. في هذه الحالة، سنفترض أنّ أحداث الأرباح هي in_app_purchase وad_impression. تتوفّر الأرباح من in_app_purchase في event_value_usd، بينما تتوفّر الأرباح من ad_impression في المَعلمة value ضِمن مَعلمات الحدث. إذا لم تكن على دراية بمَعلمات الأحداث في BigQuery، ننصحك بالاطّلاع على التعريف هنا، ويمكنك أيضًا تجربة طلب البحث النموذجي هذا في المرجع الرسمي، والذي يغطّي أيضًا استخراج القيمة من event_params.
SELECT
user_pseudo_id,
event_name,
EXTRACT(date FROM Parse_datetime('%Y%m%d', event_date)) AS event_date,
(
SELECT COALESCE(value.int_value, value.float_value, value.double_value, NULL)
FROM UNNEST(event_params)
WHERE
KEY = 'value'
AND event_name = 'ad_impression'
) AS ad_funded_revenue,
(
SELECT value.string_value
FROM UNNEST(event_params)
WHERE
KEY = 'currency'
AND event_name = 'ad_impression'
) AS ad_revenue_currency,
(
CASE
WHEN event_name = 'in_app_purchase' THEN event_value_in_usd
ELSE 0
END) AS iap_revenue_usd,
FROM `project_name.dataset_name.events_2023*`
WHERE
platform = 'IOS'
AND event_name IN (
'in_app_purchase',
'ad_impression')
لننتقل إلى فهم ما يفعله الاستعلام هنا. إليك بعض الأمور التي ستلاحظها
- في عبارة WHERE، نعمل على فلترة أحداث الأرباح لأنّنا مهتمّون بها فقط، وكما فعلنا في المرة السابقة، نبحث عن بيانات iOS.
- الآن، في عبارة SELECT، نأخذ القيمة والعملة لحدث إيرادات الإعلانات (ad_impression)، ونأخذ event_value_in_usd عندما يكون الحدث in_app_purchase.
- في حال إرسال عملات متعدّدة، عليك أولاً تحديد عملة واحدة لهذا التحليل. لأغراض هذا المثال، سنفترض أنّ عملة الإيرادات المموّلة من الإعلانات هي أيضًا الدولار الأمريكي.
سيكون الناتج مشابهًا لما يلي (تم إخفاء عمود user_pseudo_id هنا).

دمج هذه البيانات
حتى الآن، نفّذنا طلبَي بحث، أحدهما للعثور على بيانات المستخدمين الذين ثبّتوا التطبيق وفتحوه، والآخر للعثور على الأرباح التي حقّقها هؤلاء المستخدمون. والآن، دعونا نتذكّر ما ناقشناه بشأن قيود SKAdNetwork. لا يمكن أن تتوفّر فترة تحديد المصدر إلا خلال 0 إلى يومَين بعد التثبيت. وبالتالي، علينا التحقّق من الطوابع الزمنية للأحداث المتعلقة بالتثبيت والإيرادات، ولن نأخذ المعلومات إلا إذا حدثت خلال هذا الإطار الزمني. لنحاول الآن دمجها في طلب بحث يقدّم إجمالي الأرباح لكل مشاركة بعد يومَين من تثبيت التطبيق.
#creating the install table
WITH
install_table AS (
SELECT
user_pseudo_id,
event_name,
event_date,
event_timestamp
FROM `project_name.dataset_name.events_2023*`
WHERE
event_name = 'first_open'
AND platform = 'IOS'
),
#creating the revenue table
revenue_table AS (
SELECT
user_pseudo_id,
event_name,
event_timestamp,
EXTRACT(date FROM Parse_datetime('%Y%m%d', event_date)) AS event_date,
(
SELECT COALESCE(value.int_value, value.float_value, value.double_value, NULL)
FROM UNNEST(event_params)
WHERE
KEY = 'value'
AND event_name = 'ad_impression'
) AS ad_funded_revenue,
(
SELECT value.string_value
FROM UNNEST(event_params)
WHERE
KEY = 'currency'
AND event_name = 'ad_impression'
) AS ad_revenue_currency,
(
CASE
WHEN event_name = 'in_app_purchase' THEN event_value_in_usd
ELSE 0
END) AS iap_revenue_usd,
FROM `project_name.dataset_name.events_2023*`
WHERE
platform = 'IOS'
AND event_name IN (
'in_app_purchase',
'ad_impression')
)
SELECT
it.user_pseudo_id AS user_pseudo_id,
#combine ad revenue and IAP revenue, assuming both are in same currency
sum(ifnull(rt.iap_revenue_usd,0) + ifnull(rt.ad_funded_revenue,0)) AS total_revenue,
FROM install_table it
INNER JOIN revenue_table rt
ON it.user_pseudo_id = rt.user_pseudo_id
WHERE
rt.event_timestamp >= it.event_timestamp
AND rt.event_timestamp
<= it.event_timestamp + 86400000000 * 2 #added 86400 000 millisecond as 24 hours, taking for 2 days later
GROUP BY 1
يحاول طلب البحث ربط بيانات التثبيت وبيانات الأرباح في حقل user_pseudo_id، ثمّ علينا التأكّد من أنّ الطابع الزمني يقع في غضون يومَين. إذا كنت تستخدم الإصدار 3.5 من SKAdNetwork، تكون القيمة التلقائية 24 ساعة، لذا يمكنك أيضًا تغيير الشرط لتضمين بيانات يوم واحد فقط.
تجميع الأرباح في مجموعات
بعد طلب البحث السابق، ستحصل على user_pseudo_id وإجمالي الأرباح

سنحتاج الآن إلى دمج ذلك في مجموعات يمكننا استخدامها لنطاقات قيم الإحالات الناجحة. لهذا الغرض، سنستخدم الدالة approx_quantiles في BigQuery، والتي تنشئ هذه النطاقات تلقائيًا. لنفترض لأغراض هذا المثال أنّنا نريد إنشاء 5 نطاقات، لذا يمكننا استخدام SELECT approx_quantiles(total_revenue, 5) AS buckets
لنضمّن ذلك في استعلامنا العام
#creating the install table
WITH
install_table AS (
SELECT
user_pseudo_id,
event_name,
event_date,
event_timestamp
FROM `project_name.dataset_name.events_2023*`
WHERE
event_name = 'first_open'
AND platform = 'IOS'
),
#creating the revenue table
revenue_table AS (
SELECT
user_pseudo_id,
event_name,
event_timestamp,
EXTRACT(date FROM Parse_datetime('%Y%m%d', event_date)) AS event_date,
(
SELECT COALESCE(value.int_value, value.float_value, value.double_value, NULL)
FROM UNNEST(event_params)
WHERE
KEY = 'value'
AND event_name = 'ad_impression'
) AS ad_funded_revenue,
(
SELECT value.string_value
FROM UNNEST(event_params)
WHERE
KEY = 'currency'
AND event_name = 'ad_impression'
) AS ad_revenue_currency,
(
CASE
WHEN event_name = 'in_app_purchase' THEN event_value_in_usd
ELSE 0
END) AS iap_revenue_usd,
FROM `project_name.dataset_name.events_2023*`
WHERE
platform = 'IOS'
AND event_name IN (
'in_app_purchase',
'ad_impression')
),
total_revenue_table AS (
SELECT
it.user_pseudo_id AS user_pseudo_id,
#combine ad revenue and IAP revenue, assuming both are in same currency
sum(ifnull(rt.iap_revenue_usd,0) + ifnull(rt.ad_funded_revenue,0)) AS total_revenue,
FROM install_table it
INNER JOIN revenue_table rt
ON it.user_pseudo_id = rt.user_pseudo_id
WHERE
rt.event_timestamp >= it.event_timestamp
AND rt.event_timestamp
<= it.event_timestamp + 86400000000 * 2 #added 86400 000 millisecond as 24 hours
GROUP BY 1
)
SELECT approx_quantiles(total_revenue, 5) AS buckets FROM total_revenue_table
سيقسّم طلب البحث هذا الأرباح إلى 5 مجموعات، وستحاول BigQuery الحفاظ على توزيع النسبة المئوية بشكل متّسق.

تحليل توزيع المستخدمين باستخدام هذه المجموعات
هذه الخطوة اختيارية، إذا كنت تريد فهم توزيع المستخدمين في كل مجموعة. بالنسبة إلى مثالنا، تكون نطاقات الحِزم التي تم عرضها في طلب البحث السابق هي
- 0.1
- 0.5
- 2
- 2.5
- 5 [يجب عدم استخدام القيمة الأخيرة في إعداد النطاق]
بالنسبة إلى النطاقات النهائية، سنتجاهل الفئة الأخيرة 5، لأنّها تكون عادةً القيمة القصوى، ويمكننا اعتبار 2.5 النطاق الأخير. ويرجع ذلك إلى أنّ مقدّمي خدمات تحديد مصدر الإحالات الناجحة للتطبيقات يميلون إلى احتساب عائد الإنفاق الإعلاني باستخدام متوسط النطاق، لذا يجب استبعاد القيمة الشاذة لإجراء عملية احتساب أكثر اتساقًا.
سنحاول الآن إلقاء نظرة على عدد المستخدمين لكل تاريخ في جميع النطاقات، حتى نتمكّن من فهم عدد المستخدمين اليومي في كل مجموعة.يمكننا إجراء ذلك باستخدام نموذج طلب البحث هذا، حيث يمكنك استبدال قيم المجموعات ببياناتك الفعلية، وسيبدو طلب البحث على النحو التالي
#creating the install table
WITH
install_table AS (
SELECT
user_pseudo_id,
event_name,
event_date,
event_timestamp
FROM `project_name.dataset_name.events_2023*`
WHERE
event_name = 'first_open'
AND platform = 'IOS'
),
#creating the revenue table
revenue_table AS (
SELECT
user_pseudo_id,
event_name,
event_timestamp,
EXTRACT(date FROM Parse_datetime('%Y%m%d', event_date)) AS event_date,
(
SELECT COALESCE(value.int_value, value.float_value, value.double_value, NULL)
FROM UNNEST(event_params)
WHERE
KEY = 'value'
AND event_name = 'ad_impression'
) AS ad_funded_revenue,
(
SELECT value.string_value
FROM UNNEST(event_params)
WHERE
KEY = 'currency'
AND event_name = 'ad_impression'
) AS ad_revenue_currency,
(
CASE
WHEN event_name = 'in_app_purchase' THEN event_value_in_usd
ELSE 0
END) AS iap_revenue_usd,
FROM `project_name.dataset_name.events_2023*`
WHERE
platform = 'IOS'
AND event_name IN (
'in_app_purchase',
'ad_impression')
),
total_revenue_table AS (
SELECT
it.user_pseudo_id AS user_pseudo_id,
rt.event_date,
#combine ad revenue and IAP revenue, assuming both are in same currency
sum(ifnull(rt.iap_revenue_usd,0) + ifnull(rt.ad_funded_revenue,0)) AS total_revenue,
FROM install_table it
INNER JOIN revenue_table rt
ON it.user_pseudo_id = rt.user_pseudo_id
WHERE
rt.event_timestamp >= it.event_timestamp
AND rt.event_timestamp
<= it.event_timestamp + 86400000000 * 2 #added 86400 000 millisecond as 24 hours
GROUP BY 1, 2
)
SELECT
event_date,
sum(CASE WHEN total_revenue BETWEEN 0 AND 0.1 THEN 1 ELSE 0 END) AS Bucket1,
sum(CASE WHEN total_revenue BETWEEN 0.1 AND 0.5 THEN 1 ELSE 0 END) AS Bucket2,
sum(CASE WHEN total_revenue BETWEEN 0.5 AND 2 THEN 1 ELSE 0 END) AS Bucket3,
sum(CASE WHEN total_revenue BETWEEN 2 AND 2.5 THEN 1 ELSE 0 END) AS Bucket4,
sum(CASE WHEN total_revenue > 2.5 THEN 1 ELSE 0 END) AS Bucket5
FROM total_revenue_table
GROUP BY 1 ORDER BY 1 DESC
يجب أن تعرض هذه السمة المستخدمين في كل نطاق أرباح لكل يوم، كما هو موضّح أدناه. إذا لاحظت أعدادًا منخفضة جدًا في أيّ مجموعة أو توزيعًا غير متساوٍ بشكل عام، قد تحتاج إلى تعديل عدد المجموعات وإعادة تنفيذ طلب البحث.

ملاحظة سريعة حول الإصدار 4.0 من SKAdNetwork
توفّر الشبكة 4.0 من SKAdNetwork فترات إحالة ناجحة متعدّدة تصل إلى يومَين، ومن 3 إلى 7 أيام، ومن 8 إلى 35 يومًا. في الطريقة الموضّحة أعلاه، يمكنك بسهولة تغيير النافذة لتحليل البيانات لهذه السيناريوهات الإضافية أيضًا. تتوفّر أيضًا قيم تقريبية للمستويات "منخفض" و"متوسط" و"مرتفع". مرة أخرى، إذا أردت استخدام هذا الأسلوب، يمكنك التفكير في ذلك على أنّه 3 مجموعات، وبالتالي، من خلال تغيير عدد المجموعات إلى 3، يمكنك الحصول على الحدود الدنيا لكل من LOW وMEDIUM وHIGH.
4. النشر باستخدام مقدّم خدمة تحديد المصدر
قد تتغيّر هذه الإرشادات حسب النظام الأساسي المحدّد. يُرجى التواصل مع ممثلي المنصة للحصول على أحدث المعلومات حول هذا الموضوع. لأغراض هذا المثال، سنلقي نظرة على كيفية نشر هذا الإعداد حاليًا على AppsFlyer.
في الاستعلام الذي نفّذناه سابقًا، كانت النطاقات النهائية التي تلقّيناها كمخرجات كما يلي

- النطاق 1 : من 0 إلى 0.1
- النطاق 2 : من 0.1 إلى 0.5
- النطاق 3 : من 0.5 إلى 2
- النطاق 4 : من 2 إلى 2.5
يُرجى العِلم أنّنا قرّرنا تجاهل آخر نطاق للإيرادات، لأنّه سيكون قيمة شاذة، وسيؤدي إلى تحريف متوسط العمليات الحسابية لمقدّم خدمة تحديد المصدر في تطبيقك.
توفّر AppsFlyer SKAN Conversion Studio، حيث يسهل إدخال هذه البيانات مباشرةً في واجهة المستخدم. يمكنك استخدام الإصدار 4.0 مباشرةً أو استخدام الوضع "مخصّص" إذا كنت تستخدم الإصدار 3.5، وإضافة قياس "الأرباح". يمكنك بعد ذلك إضافة نطاقات الأرباح التي حسبتها من التحليل السابق.

أفضل الممارسات والدروس المستفادة في "إعلانات Google"
نودّ أن نقدّم لك بعض الاقتراحات إذا كنت تُطلق حملات على "إعلانات Google" وتقيس تأثيرها من خلال مخطّط قيمة الإحالة الناجحة على SKAdNetwork.
- تأكَّد من أنّ فترة الإحالة الناجحة التي تستخدمها على "إعلانات Google" تتطابق مع فترة النشاط التي حدّدتها على منصة App Attribution. بالنسبة إلى الإصدار 3.5 من شبكة SKAd، من المرجّح أن يكون ذلك في غضون يوم إلى 3 أيام، لذا يمكنك تعديله وفقًا لذلك على "إعلانات Google" باتّباع الخطوات الواردة هنا.

- إذا كنت تستخدم Appsflyer، يبلغ عدد الأحداث التلقائي حاليًا 1، ما يعني أنّه لا يأخذ في الاعتبار الأحداث المتعددة لكل مستخدم. إذا كنت تستخدم نموذجًا مستندًا إلى الأحداث لقياس SKAN وتقارنه بحملات "التكلفة المستهدَفة للإجراء" على "إعلانات Google"، يمكنك اختيار التخصيص باتّباع هذه الإرشادات من Appsflyer.

5- تهانينا
تهانينا، لقد أعددت مخطّط قيمة الإحالة الناجحة في SKAdNetwork بنجاح. يمكنك الآن تتبُّع البيانات في تقرير SKAdNetwork على "إعلانات Google" للتحقّق من قيم الإحالات الناجحة في حملاتك على "إعلانات Google" بعد نشرها.
لقد تعلّمت
- كيفية استكشاف البيانات الأولية الغنية من GA4F في BigQuery
- طريقة تحليلية لاحتساب فئات الأرباح لنشاطك التجاري
- نشر المخطط باستخدام AppsFlyer