1. Введение
Некоторый контекст, прежде чем мы начнем
Если вы разработчик приложений для iOS, вы наверняка слышали об обновлениях конфиденциальности iOS 14.5+ . Для измерения значимых конверсионных действий после установки Apple предоставляет API SKAd Network , который позволяет измерять успешность ваших рекламных кампаний, уважая при этом конфиденциальность пользователей. Исходя из потребностей вашего бизнеса, вы можете найти наиболее оптимальный способ использования SKAd Network для получения значимых аналитических данных о ваших кампаниях. В этой лабораторной работе мы рассмотрим пример методологии использования ваших данных GA4F в BigQuery для группировки доходов после установки приложения в сегменты, которые затем можно использовать для настройки с вашим партнером по атрибуции приложений. Хотя в этой лабораторной работе используется подход, основанный на доходе, вы также можете использовать подходы, основанные на событиях или воронках, для измерения SKAN. Пожалуйста, обратитесь к этому справочному центру для получения более подробных инструкций. Это всего лишь пример, а не официальная рекомендация Google . Вы можете разработать собственную схему на основе конкретных потребностей вашего бизнеса.
Что мы намерены охватить
- Изучите данные GA4F в BigQuery
- Найдите данные о доходах для пользователей, которые совершили конверсию в течение 0–2 дней.
- Группировка данных о доходах по группам
- Понимание распределения пользователей в каждом сегменте
- Реализуйте контейнеры в Appsflyer SKAN Conversion Studio
Предварительные условия
- GA4F SDK в вашем приложении iOS и все события получения дохода интегрированы (in_app_purchase или доход от рекламы )
- Включен экспорт из Firebase в BigQuery
- App Attribution Partner, который также регистрирует все события получения дохода
2. Доступ к BigQuery Export
Перейдите к набору данных Google Cloud.
Перейдите к набору данных в GA4F, выбрав «Настройки проекта» > «Интеграции» > «BigQuery». Сначала необходимо включить переключатель. После включения набор данных станет доступен примерно через 48 часов. Перейдите по ссылке ниже, чтобы перейти в BigQuery.

Выполните несколько запросов
Теперь, когда вы находитесь в BigQuery, вы должны увидеть сгенерированные ежедневные таблицы. На скриншоте ниже мы видим 64 ежедневные таблицы, то есть экспорт выполняется уже 64 дня. Если вы открываете его впервые, вы можете увидеть только одну ежедневную таблицу с данными за предыдущий день. Справа представлена схема таблицы. Подробнее о полях можно узнать здесь.
Чтобы начать писать свой запрос, нажмите «Запрос» > «В новой вкладке».

Затем вы можете попробовать запустить пример запроса в новой вкладке.

3. Анализ данных о доходах
Извлечение данных об установке
Чтобы начать строить сегменты дохода, нам нужно сначала посмотреть данные о пользователях, установивших приложение в течение последних 24–72 часов. SKAd Network 4.0 позволяет просматривать данные за период от 0 до 2 дней, а SKAd Network 3.5 — за 24 часа по умолчанию. (В зависимости от возможностей вашего партнёра по атрибуции приложений вы можете изменить этот период активности, чтобы он не превышал 72 часов.) Когда пользователи устанавливают приложение и открывают его впервые, SDK генерирует событие first_open, которое регистрируется в 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'
Несколько вещей, которые следует отметить по поводу этого запроса
- Замените имя таблицы на экспортированную таблицу из Analytics. Вы можете использовать подстановочные знаки для запроса нескольких ежедневных таблиц. Например, запрос 2023* будет выполняться по всем данным за 2023 год.
- Если у вас много пользователей, вы также можете запросить только последние 30 дней для более быстрой обработки.
- Фильтрация по платформе = 'IOS'. Если в вашем проекте Firebase несколько приложений iOS, вы также можете добавить фильтр по 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 здесь отредактирован).

Объединяя эти данные
До сих пор мы выполнили два запроса: один для поиска данных о пользователях, установивших и открывших приложение, и другой для поиска дохода от этих пользователей. Теперь давайте вспомним, что мы обсуждали об ограничениях сети SKAd. Окно атрибуции доступно только в течение 0–2 дней после установки. Следовательно, нам необходимо проверить временные метки событий установки и дохода и использовать информацию только в том случае, если она произошла в течение этого периода. Теперь попробуем объединить эти данные в запрос, который выдаст общий доход для каждого поста через два дня после установки приложения.
#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, значение по умолчанию — 24 часа, поэтому вы можете изменить условие, включив данные только за один день.
Группировка доходов по сегментам
После предыдущего запроса у вас будет user_pseudo_id и общий доход.

Теперь нам нужно объединить эти данные в сегменты, которые можно использовать для диапазонов значений конверсии. Для этого мы воспользуемся функцией approx_quantiles в BigQuery, которая автоматически создаёт эти диапазоны. Предположим, что в этом примере мы хотим создать 5 диапазонов, поэтому мы можем просто использовать SELECT approx_quantiles(total_revenue, 5) AS сегменты.
Итак, давайте включим это в наш общий запрос.
#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 последним диапазоном. Это связано с тем, что поставщики атрибуции приложений, как правило, рассчитывают 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 Network 4.0
SKAd Network 4.0 предоставляет несколько окон конверсии длительностью до 2 дней, 3–7 дней и 8–35 дней. В описанном выше подходе вы можете легко изменить окно для анализа данных и для этих дополнительных сценариев. Также доступны укрупнённые значения LOW, MEDIUM и HIGH. Опять же, если вы хотите использовать этот подход, вы можете представить это как 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 Ads
Мы хотели бы дать вам несколько рекомендаций, если вы проводите кампании в Google Ads и оцениваете их влияние с помощью схемы ценности конверсии в сети SKAd.
- Убедитесь, что период конверсии, используемый в Google Ads, соответствует периоду активности , указанному на платформе App Attribution. Для сети SKAd 3.5 он, скорее всего, составит от 1 до 3 дней, поэтому вы можете настроить его соответствующим образом в Google Ads, выполнив следующие действия.

- Если вы используете Appsflyer, то в настоящее время счётчик событий по умолчанию равен 1, что означает, что он не учитывает несколько событий для каждого пользователя. Если вы используете модель на основе событий для измерения SKAN и сравнения с кампаниями tCPA в Google Ads, вы можете настроить счётчик, следуя этим инструкциям Appsflyer.

5. Поздравления
Поздравляем! Вы успешно настроили схему ценности конверсии в SKAd Network. Теперь вы можете отслеживать данные в отчёте Google Ads SKAd Network, чтобы проверить ценность конверсий в своих кампаниях Google Ads после его запуска.
Вы узнали
- Как исследовать обширные необработанные данные из GA4F в BigQuery
- Аналитический подход к расчету сегментов дохода для вашего бизнеса
- Разверните схему с помощью AppsFlyer