۱. مقدمه
قبل از شروع، کمی توضیح میدهیم
اگر شما یک توسعهدهنده اپلیکیشن iOS هستید، حتماً نام بهروزرسانیهای حریم خصوصی iOS 14.5+ را شنیدهاید. برای اندازهگیری اقدامات تبدیل معنادار پس از نصب، اپل API شبکه SKAd را ارائه میدهد که به شما امکان میدهد موفقیت کمپینهای تبلیغاتی خود را با احترام به حریم خصوصی کاربر اندازهگیری کنید. بر اساس نیازهای تجاری خود، میتوانید بهینهترین روش را برای استفاده از شبکه SKAd برای به دست آوردن بینشهای معنادار در مورد کمپینهای خود ارائه دهید. در این آزمایشگاه کد، ما یک روش نمونه برای استفاده از دادههای GA4F شما در BigQuery برای گروهبندی درآمد پس از نصب اپلیکیشن در سطلها بررسی میکنیم که میتوانید از آنها برای تنظیم با شریک انتساب اپلیکیشن خود استفاده کنید. در حالی که این آزمایشگاه کد از رویکرد مبتنی بر درآمد استفاده میکند، میتوانید از رویکردهای مبتنی بر رویدادها یا قیف نیز برای اندازهگیری SKAN استفاده کنید. لطفاً برای راهنمایی دقیقتر به این مرکز راهنما مراجعه کنید. این فقط یک مثال است، نه یک توصیه رسمی گوگل . میتوانید طرحواره خود را بر اساس نیازهای خاص تجاری خود طراحی کنید.
آنچه قصد پوشش آن را داریم
- کاوش دادههای GA4F در BigQuery
- دادههای درآمد کاربرانی را که ظرف ۰ تا ۲ روز تبدیل به مشتری شدهاند، پیدا کنید
- دادههای درآمد را در دستههای مختلف گروهبندی کنید
- توزیع کاربر در هر سطل را درک کنید
- پیادهسازی سطلها در Appsflyer SKAN Conversion Studio
پیشنیازها
- کیت توسعه نرمافزار GA4F در اپلیکیشن iOS شما، و تمام رویدادهای درآمدی یکپارچه (خرید درونبرنامهای یا درآمد حاصل از تبلیغات )
- فعال بودن قابلیت انتقال خروجی فایربیس به بیگکوئری
- شریک تخصیص برنامه، که تمام رویدادهای درآمد را نیز ثبت میکند
۲. دسترسی به خروجی BigQuery
به مجموعه دادههای ابری گوگل بروید
با مراجعه به تنظیمات پروژه > ادغامها > BigQuery، به مجموعه دادهها در GA4F بروید. ابتدا باید این گزینه فعال شود و پس از فعال شدن، حدود ۴۸ ساعت طول میکشد تا مجموعه دادهها در دسترس قرار گیرد. میتوانید روی پیوند نشان داده شده در زیر کلیک کنید تا به BigQuery هدایت شوید.

اجرای برخی کوئریها
حالا که در BigQuery هستید، باید جداول روزانه تولید شده را ببینید. در تصویر مثال زیر، ۶۴ جدول روزانه میبینیم، بنابراین خروجی گرفتن ۶۴ روز است که در حال انجام است. اگر برای اولین بار به آن دسترسی پیدا میکنید، ممکن است فقط ۱ جدول روزانه برای دادههای روز قبل ببینید. در سمت راست، طرح جدول را مشاهده میکنید. میتوانید برای جزئیات بیشتر در مورد فیلدها به اینجا مراجعه کنید.
برای شروع نوشتن پرسوجو، میتوانید روی پرسوجو > در برگه جدید کلیک کنید.

سپس میتوانید کوئری نمونه را در تب جدید اجرا کنید.

۳. دادههای درآمد را تجزیه و تحلیل کنید
دریافت دادههای نصب
حالا برای شروع ساخت سطلهای درآمد، ابتدا باید به دادههای کاربرانی که در ۲۴ تا ۷۲ ساعت گذشته برنامه را نصب کردهاند، نگاهی بیندازیم. SKAd Network 4.0 به شما امکان میدهد دادهها را در ۰ تا ۲ روز مشاهده کنید، در حالی که SKAd Network 3.5 به طور پیشفرض ۲۴ ساعت را مجاز میداند. (بسته به قابلیتهای شریک تخصیص برنامه شما، ممکن است بتوانید این پنجره فعالیت را به طور کلی به حداکثر ۷۲ ساعت تغییر دهید). وقتی کاربران برنامه را نصب میکنند و برای اولین بار آن را باز میکنند، رویداد first_open توسط SDK اجرا شده و در BigQuery ثبت میشود.
شناسهای که میتوانید برای BigQuery استفاده کنید user_pseudo_id است (که به آن app instance 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'
چند نکته در مورد این سوال قابل توجه است
- لطفاً نام جدول را با جدول خروجی گرفته شده از Analytics خود جایگزین کنید. میتوانید از کاراکترهای عمومی (wildcards) برای پرسوجوی چندین جدول روزانه استفاده کنید. برای مثال، 2023* پرسوجو را روی تمام دادههای سال 2023 انجام میدهد.
- اگر تعداد کاربران شما زیاد است، میتوانید برای پردازش سریعتر، فقط ۳۰ روز گذشته را جستجو کنید.
- ما روی platform = '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) در نظر میگیریم، و وقتی رویداد in_app_purchase باشد، مقدار event_value_in_usd را در نظر میگیریم.
- اگر چندین ارز ارسال میکنید، ابتدا باید برای این تحلیل، آن را با یک ارز واحد تراز کنید. برای اهداف این مثال، فرض میکنیم که ارز برای درآمد حاصل از تبلیغات نیز دلار آمریکا است.
خروجی چیزی شبیه به زیر خواهد بود (ستون مربوط به user_pseudo_id در اینجا حذف شده است).

ترکیب این دادهها
تاکنون، ما دو کوئری اجرا کردهایم، یکی برای یافتن دادههای کاربرانی که برنامه را نصب و باز کردهاند، و دیگری برای یافتن درآمد حاصل از آن کاربران. حال، بیایید آنچه را که در مورد محدودیتهای شبکه SKAd بحث کردیم، به یاد بیاوریم. پنجره انتساب فقط میتواند ظرف ۰ تا ۲ روز پس از نصب در دسترس باشد. از این رو، باید مهرهای زمانی رویداد را برای نصب و درآمد بررسی کنیم و فقط در صورتی که در آن بازه زمانی اتفاق بیفتد، اطلاعات را دریافت کنیم. اکنون بیایید سعی کنیم آنها را در یک کوئری ترکیب کنیم که کل درآمد حاصل از هر پست دو روز نصب برنامه را ارائه دهد.
#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 به هم متصل کند، و سپس باید مطمئن شویم که برچسب زمانی ظرف ۲ روز باشد. اگر از SKAd Network 3.5 استفاده میکنید، پیشفرض ۲۴ ساعت است، بنابراین میتوانید شرط را طوری تغییر دهید که فقط دادههای ۱ روز را شامل شود.
گروهبندی درآمد در قالبهای مختلف
پس از کوئری قبلی، باید user_pseudo_id و کل درآمد را داشته باشید.

اکنون باید این را در سطلهایی ترکیب کنیم که بتوانیم برای محدودههای مقدار تبدیل خود استفاده کنیم. برای این منظور، از تابع approx_quantiles در BigQuery استفاده خواهیم کرد که به طور خودکار این محدودهها را برای شما ایجاد میکند. برای اهداف این مثال فرض کنید که میخواهیم ۵ محدوده ایجاد کنیم، بنابراین میتوانیم از 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
این کوئری درآمد را به ۵ بخش تقسیم میکند و BigQuery سعی میکند توزیع درصدی ثابتی را حفظ کند.

توزیع کاربران را با این سطلها تجزیه و تحلیل کنید
اگر میخواهید توزیع کاربران خود را در هر دسته (باکت) درک کنید، این یک مرحله اختیاری است. برای مثال ما، محدوده دستههایی که در پرسوجوی قبلی برگردانده شدهاند عبارتند از:
- ۰.۱
- ۰.۵
- ۲
- ۲.۵
- ۵ [آخرین مقدار نباید در پیکربندی محدوده استفاده شود]
برای محدودههای نهایی، آخرین دسته ۵ را نادیده میگیریم، زیرا عموماً حداکثر مقدار است و میتوانیم فقط ۲.۵ را به عنوان آخرین محدوده در نظر بگیریم. دلیل این امر این است که ارائه دهندگان attribution برنامه تمایل دارند ROAS را با استفاده از میانگین محدوده محاسبه کنند، بنابراین برای محاسبه یکنواختتر، باید مقدار پرت را حذف کرد.
اکنون سعی خواهیم کرد تعداد کاربران را برای هر تاریخ در تمام محدودهها بررسی کنیم تا بتوانیم حجم روزانه کاربران در هر دسته را درک کنیم. میتوانیم این کار را با استفاده از این نمونه پرسوجو انجام دهیم، که در آن میتوانید مقادیر دسته را با دادههای واقعی خود جایگزین کنید و پرسوجو چیزی شبیه به این خواهد بود.
#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
این تابع، کاربران را در هر محدوده درآمدی برای هر روز، مانند زیر، برمیگرداند. اگر تعداد بسیار کمی در هر دسته مشاهده کردید یا توزیع بهطورکلی ناهموار بود، ممکن است بخواهید تعداد دستهها را تنظیم کرده و پرسوجو را دوباره اجرا کنید.

مختصری در مورد شبکه SKAd 4.0
شبکه SKAd 4.0 چندین پنجره تبدیل تا ۲ روز، ۳-۷ روز و ۸-۳۵ روز را ارائه میدهد. در رویکرد بالا، میتوانید به راحتی پنجره را برای تجزیه و تحلیل دادهها برای این سناریوهای اضافی نیز تغییر دهید. مقادیر جزئی LOW، MEDIUM و HIGH نیز موجود است. باز هم، اگر میخواهید از این رویکرد استفاده کنید، میتوانید این را به عنوان ۳ سطل در نظر بگیرید، بنابراین، با تغییر تعداد سطلها به ۳، میتوانید آستانههای LOW، MEDIUM و HIGH را بدست آورید.
۴. استقرار با ارائهدهندهی اتریبیوشن شما
بسته به پلتفرم خاص، این راهنما ممکن است تغییر کند. لطفاً برای دریافت بهروزترین اطلاعات در این مورد با نمایندگان پلتفرم همکاری کنید. برای اهداف این مثال، بررسی خواهیم کرد که چگونه میتوانیم در حال حاضر این را در AppsFlyer مستقر کنیم.
در کوئری که قبلاً اجرا کردیم، محدودههای نهایی که به عنوان خروجی دریافت کردیم به شرح زیر بود.

- محدوده ۱: ۰ تا ۰.۱
- محدوده ۲: ۰.۱ تا ۰.۵
- محدوده ۳: ۰.۵ تا ۲
- محدوده ۴: ۲ تا ۲.۵
به یاد داشته باشید که ما تصمیم گرفتیم آخرین محدوده درآمد را نادیده بگیریم ، زیرا یک داده پرت خواهد بود و محاسبات میانگین را برای ارائه دهنده اتریبیوشن برنامه شما منحرف میکند.
AppsFlyer نرمافزار SKAN Conversion Studio را ارائه میدهد که وارد کردن این اطلاعات به طور مستقیم در رابط کاربری آن بسیار ساده است. میتوانید مستقیماً از نسخه ۴.۰ استفاده کنید یا اگر از نسخه ۳.۵ استفاده میکنید، از حالت «سفارشی» استفاده کنید و معیار «درآمد» را اضافه کنید. سپس میتوانید محدودههای درآمدی را که از تحلیل قبلی محاسبه کردهاید، اضافه کنید.

بهترین شیوهها و آموختهها در مورد تبلیغات گوگل
اگر در حال اجرای کمپینهای تبلیغاتی در گوگل ادز هستید و میخواهید تأثیر آن را از طریق طرح ارزش تبدیل شبکه SKAd اندازهگیری کنید، مایلیم چند توصیه برای شما داشته باشیم.
- مطمئن شوید که پنجره تبدیلی که در گوگل ادز استفاده میکنید با پنجره فعالیتی که در پلتفرم App Attribution خود مشخص کردهاید، مطابقت داشته باشد. برای شبکه SKAd نسخه ۳.۵، این احتمالاً ظرف ۱ تا ۳ روز خواهد بود، بنابراین میتوانید با دنبال کردن مراحل ذکر شده در اینجا ، آن را در گوگل ادز مطابق با آن تنظیم کنید.

- اگر از Appsflyer استفاده میکنید، در حال حاضر شمارنده رویداد پیشفرض ۱ است، به این معنی که چندین رویداد را برای هر کاربر در نظر نمیگیرد. اگر از یک مدل مبتنی بر رویداد برای اندازهگیری SKAN و مقایسه با کمپینهای tCPA در Google Ads استفاده میکنید، میتوانید با دنبال کردن این راهنمایی از Appsflyer، آن را سفارشی کنید.

۵. تبریک
تبریک میگوییم، شما با موفقیت طرحواره ارزش تبدیل شبکه SKAd خود را تنظیم کردید. اکنون میتوانید دادههای گزارش شبکه SKAd گوگل ادز خود را رصد کنید تا پس از راهاندازی، مقادیر تبدیل کمپینهای گوگل ادز خود را بررسی کنید.
یاد گرفتی.
- چگونه دادههای خام غنی از GA4F را در BigQuery کاوش کنیم
- رویکرد تحلیلی برای محاسبه سطوح درآمد برای کسب و کار شما
- طرحواره را با AppsFlyer مستقر کنید