People-Based Attribution (PBA) заменяется на Web Performance Measurement — обновленное решение AppsFlyer для измерения эффективности веба. В этой статье описаны изменения, шаги миграции и полное сопоставление полей для ваших отчетов и серверных интеграций.
Почему мы улучшаем ваше веб-измерение
Веб-измерение важно как никогда. Именно на сайте многие ваши пользователи совершают целевые действия, и именно там начинается путь к вашему мобильному приложению. Это не просто лендинг, а полноценная воронка привлечения: квиз-воронки, персонализированный онбординг, пейволлы и веб-магазины, которые часто привлекают более мотивированных пользователей при более низкой стоимости привлечения.
AppsFlyer выводит веб-измерение на тот же уровень, что и мобильное измерение. People-Based Attribution (PBA), прежний веб-продукт, заменяется на Web Performance Measurement, построенный поверх основного движка атрибуции AppsFlyer и единой модели данных. Web Performance Measurement делает все то же, что PBA сегодня, и дополнительно предлагает:
- Единый источник достоверных данных: веб-измерение и измерение мобильного приложения в одном месте, вместе с агрегированием затрат, постбэками для оптимизации и оптимизацией креативов.
- Более эффективные бюджетные решения: гибкая атрибуция, соответствующая вашей бизнес-логике, чтобы вы могли увеличивать инвестиции в кампании, которые действительно работают.
- Улучшенный ROAS, расширенные оптимизационные постбэки в ваши рекламные сети и полная серверная настройка, которая измеряет больше конверсий, чтобы сети могли оптимизировать кампании по более качественным сигналам.
- Реальный кроссплатформенный ROI: измеряйте каждый путь пользователя через веб, приложение и любую платформу.
- Простая унифицированная отчетность: один дэшборд и единый набор отчетов с данными для всех платформ с почасовым обновлением.
Вам не нужно заменять Web SDK. Web Performance Measurement использует тот же SDK; никаких изменений в коде сайта не требуется. Объем работ для остальной части перехода зависит от того, как вы сейчас получаете данные: через дэшборд, Data Locker или Server-to-server (S2S) API.
Сравнение PBA и Web Performance Measurement
В этом разделе PBA и Web Performance Measurement сравниваются по двум параметрам: общие возможности и определение источника трафика.
Web Performance Measurement и PBA
В таблице ниже сравниваются возможности PBA и Web Performance Measurement в области данных, отчетности и атрибуции.
| Возможность | Description(Описание) | PBA | Web Performance Measurement |
| вашего бизнеса | |||
| Агрегированные данные | Как быстро данные становятся доступны для отчетности | ✗ Ежедневно | ✓ Почасовые отчеты, данные обновляются с задержкой примерно в 2 часа |
| Модель данных | Согласованность схемы с данными мобильной атрибуции | ✗ Отличается от мобильной | ✓ Согласовано с мобильной, легко объединять и анализировать |
| Отчетность | |||
| Дэшборд активности | Дэшборд на основе времени события | ✓ Поддерживается | ✓ Поддерживается |
| Ретаргетинг | Анализ эффективности по когортам привлечения с течением времени | ✗ Не поддерживается | ✓ Поддерживается |
| Сырые данные Data Locker | Доступ к сырым данным атрибуции через экспорт Data Locker | ✓ Поддерживается | ✓ Поддерживается |
| Детализация на уровне объявления | Детализация отчета от кампании до уровня рекламного объявления | ✗ Только на дэшборде, не в сырых данных | ✓ Полная детализация по кампаниям и на дэшборде, и в сырых данных |
| Кроссплатформенный LTV | Объединяйте пути пользователей в вебе и на мобильных устройствах в единый LTV | ✗ Не поддерживается | ✓ Поддерживается |
| Стоимость и сигналы | |||
| Стоимость для веба | Сбор данных о расходах на рекламу и отчетность по ним для веб-кампаний | ✗ Не поддерживается | ✓ Поддерживается |
| Постбэки оптимизации | Отправка сигналов оптимизации обратно в рекламные сети | ✗ Не поддерживается | ✓ Поддерживается |
| Внедрение | |||
| Веб-SDK (Pixel) | Клиентский SDK для измерения посещений сайта и событий | ✓ Поддерживается | ✓ Тот же SDK, изменения кода не требуются |
| Поддержка S2S | Полное измерение посещений и событий на стороне сервера | ✗ Только события | ✓ События и посещения. Поддерживает полную реализацию на стороне сервера. |
| Механизм атрибуции | |||
| Окна атрибуции | Конфигурируемые окна атрибуции, повторного вовлечения, неактивности и окна ретроспективы | ✗ Только окно атрибуции по клику | ✓ 5 конфигурируемых окон (полный контроль) |
| Пользовательское событие UA | Определите, какое событие считается событием UA (привлечение пользователей) после первого визита | ✗ Только первый визит | ✓ Любое пользовательское событие (например, регистрация, покупка) |
| UA vs. ретаргетинг | Отдельное распределение ценности для нового привлечения и повторного вовлечения | ✗ Нет концепции UA, события атрибутируются по последнему касанию | ✓ Выделенные представления для UA и ретаргетинга с двойным зачетом атрибуции |
Определение источника трафика, PBA vs. Web Performance Measurement
Если значения медиаисточника, канала или кампании отличаются от тех, о которых сообщил PBA, вот почему. Оба используют один и тот же базовый подход: они определяют медиаисточник по параметрам URL-адреса и referrer во время веб-визита, проходя по списку приоритетов, пока не будет найдено первое совпадение. Но несколько правил изменились, и из-за этих изменений меняются значения, которые вы видите в отчетности, в соответствии с правилами атрибуции медиаисточников в PBA и статьей Об определении источника трафика.
Значения медиаисточника переименованы
| Триггер | Значение PBA | Новое значение |
| Google display/video (utm_source=Google + utm_medium= cpm / display/banner/video/listing) | doubleclick_int |
dv360_int |
| Twitter через UTM (twitter + cpc) |
Web Performance Measurement также сопоставляет больше значений PID с отображаемыми названиями, например: iossearchads_int → Apple Search Ads, metweb_int → Facebook Ads, twitterweb_int → Twitter, tiktokweb_int → tiktokglobal_int, snapweb_int → snapchat_int. В отчетах, построенных на старых необработанных значениях, нужно ожидать новые.
Охват идентификаторов кликов расширен, а dclid удалён
PBA сопоставлял три идентификатора кликов: gclid — с googleadwords_int, dclid — с doubleclick_int и msclkid — с bingsearch_int.
Web Performance Measurement сопоставляет гораздо больше идентификаторов кликов: gclid/wbraid/gbraid — с googleadwords_int, msclkid — с bingsearch_int, twclid — с Twitter, vmcid — с yahoogemini_int, sccid — с snapchat_int, li_fat_id — с linkedin_int, ttclid — с tiktokglobal_int, tbclid — с taboola_int, ob_click_id/dicbo — с outbrain_int, yclid — с yandex_int, rdt_cid — с reddit_int.
Два изменения в поведении: dclid больше не используется для определения сам по себе (в PBA он определялся как doubleclick_int), а fbclid явно не используется.
Пользовательские правила UTM расширены
В Web Performance Measurement сопоставление пользовательских utm_source + utm_medium стало шире: оно включает больше синонимов для medium (paid, paid_search, paid-search и т. д.), а также добавлен охват TikTok, Snapchat и Pinterest помимо узких правил PBA с единственным значением medium. Если ни одно пользовательское правило не подходит, в обоих случаях используется исходное значение utm_source.
канал.
Формат значений канала также меняется: вместо используемых в PBA Direct / Organic search / Social media / Email / Ad / Referral / Other теперь используются новые DIRECT / ORGANIC_SEARCH / SOCIAL_MEDIA / EMAIL / AD / REFERRAL / OTHER. Фильтры и группировки, привязанные к старым меткам, нужно обновить.
Переход на Web Performance Measurement
Миграция включает один обязательный шаг для всех. После этого выполните шаги, которые относятся к вашей настройке PBA.
Ожидайте различий в цифрах (для всех)
Показатели PBA не будут точно совпадать с теми, которые вы получите после миграции. Логика атрибуции в Web Performance Measurement более продвинутая и гибкая. PBA применял собственные правила атрибуции медиаисточников; в Web Performance Measurement используется улучшенное определение источника трафика. Ниже см. раздел «Определение источника трафика: PBA vs. Web Performance Measurement», чтобы понять, каких значений ожидать. Сама логика записи сессий не изменилась: сессия по-прежнему длится 30 минут активности — это рыночный стандарт.
1. Создайте веб-приложение (обязательно для всех)
- Создайте новое веб-приложение, выбрав существующий Dev Key для веб-приложения в поле Web SDK ID. Это позволяет текущему коду вашего сайта работать как есть, без изменений в коде.
- Настройте параметры атрибуции в новом приложении.
2. Если вы отправляете события через S2S API
Перейдите на новый S2S API:
- Ознакомьтесь с разделом «Миграция с PBA Web-S2S на новый S2S API», чтобы узнать, чем новая интеграция отличается от текущей интеграции PBA S2S, включая эндпоинты, аутентификацию и поля полезной нагрузки.
- Настройте новый S2S API для Web Performance Measurement.
- Обновите интеграцию на стороне сервера, чтобы отправлять данные на новые эндпоинты.
3. Если вы используете отчеты о сырых данных PBA
Перейдите на новые отчеты Data Locker. Отчет End User Events заменяет отчеты PBA Website visits и Website events.
- Убедитесь, что у вас есть Data Locker. Если нет, вам нужно добавить его в свою учетную запись или приобрести.
- См. сопоставление полей сырых данных, чтобы ознакомиться с полным сопоставлением на уровне полей, включая переименованные, переопределенные или устаревшие поля.
- Включите новый отчет с помощью экспорта данных отчета AppsFlyer по веб-атрибуции из Data Locker.
- Настройте BI/ETL на использование нового расположения отчета и новых полей. Это относится к обоим случаям: когда ваши события поступают через SDK или S2S, они попадают в один и тот же отчет по сырым данным.
Шаг 6. Если вы используете PBA Brand Bundle для кроссплатформенной отчетности
- Создайте продуктовую линейку.
- Сгруппируйте свое веб-приложение с другими приложениями в этой продуктовой линейке, чтобы получить доступ к кроссплатформенной LTV-отчетности по пользователям.
Возможности, поддержка которых прекращается
| Возможность | Что меняется | Срок |
| Путь конверсии | Уже устарело. | Булево перечисление |
| Web-assisted installs (заслуга веб-кампании, которая помогла привести к более поздней установке мобильного приложения) | Отдельного представления для "Вспомогательных установок" нет. |
Пути Web-to-app измеряются с помощью Smart Script и Smart Banner. Кроссплатформенный отчет предоставляет похожий, хотя и не идентичный, анализ. Как и PBA, она основана на идентификаторе пользователя клиента (CUID):
|
| Обратный пересчет | Обратный пересчет не выполняется, кроме стандартной 30-минутной задержки. | Атрибуция завершается с задержкой в 30 минут, чтобы у пользователей было время идентифицировать себя в течение этого окна. |
| Поля отчетов по необработанным данным | Поля, связанные с мобильными устройствами, устарели для веба. Некоторые поля переименованы, а некоторые значения изменены. | См. сопоставление полей сырых данных, чтобы посмотреть полное сопоставление полей. |
| Поздние события S2S | События, поступающие позднее чем через 30 минут после окончания дня по UTC, в который они произошли, по-прежнему принимаются, но время события заменяется временем, когда AppsFlyer их получил. | Отправляйте события в реальном времени — желательно в течение 30 минут после того, как событие произошло, — вместо того чтобы объединять их в одну ежедневную загрузку. Точная атрибуция зависит от того, насколько быстро события поступают после того, как они происходят. Это приводит веб в соответствие с существующим мобильным поведением. |
Сопоставление полей сырых данных
Если вы уже используете отчеты о сырых данных PBA «Посещения сайта» и «События сайта», вот что изменится. Сам отчет переносится в Data Locker, а здесь приведено полное сопоставление полей с новым отчетом End User Events на основе отчетов PBA о сырых данных.
Сырые данные для любой платформы и кроссплатформенная отчетность доступны только через Data Locker. См. шаг 3 или шаг 4 выше, если у вас еще нет Data Locker.
- Без изменений: то же имя поля и те же данные.
- Переименовано: те же данные, новое имя столбца.
- Переопределено: то же или похожее имя, но формат данных или значений изменен (требует внимательности перед повторным использованием).
- Устарело: эквивалент в новом отчете отсутствует.
| Имя поля | Description(Описание) | Статус | Новое поле/примечание |
рекламный_идентификатор |
Рекламный идентификатор (GAID) | Устаревшее | Рекламный идентификатор мобильного устройства, кроссплатформенно сшитый в PBA. Кроссплатформенные отчеты по LTV и пути пользователя основаны на CUID и не используют это поле. |
af_web_id |
Идентификатор файла cookie, отправляемый из веб-SDK | Переименовано |
appsflyer_id_value, тот же веб-файл cookie. |
amazon_aid |
Рекламный идентификатор Amazon Fire TV | Устаревшее | Идентификатор мобильного устройства, не относится к веб-версии. |
android_id |
Идентификатор устройства Android | Устаревшее | Идентификатор мобильного устройства, не относится к веб-версии. |
app_id (идентификатор приложения) |
Идентификатор последнего установленного приложения | Устаревшее | Мобильное кроссплатформенное поле. Идентификатор веб-приложения в новом отчете — unified_app_id ("website-{domain}"); это другое понятие. |
имя_приложения |
Последнее название приложения | Без изменений |
app_name. |
версия_приложения |
Последняя версия приложения | Устаревшее | Кроссплатформенное мобильное поле, не относится к веб-версии. |
appsflyer_id |
Идентификатор AppsFlyer (установка) | Устаревшее | Идентификатор мобильной установки. Новый appsflyer_id_value — это веб-файл cookie (af_web_id), отдельный идентификатор. |
attributed_touch_time |
Отметка времени (атрибутированного) веб-посещения | Переименовано |
event_time__attribution — время атрибутированного касания (вовлеченности). |
attributed_touch_type (атрибутированный тип взаимодействия) |
Тип точки взаимодействия, всегда "web visit" | Устаревшее | Постоянное значение в PBA. Разделение посещений и событий теперь находится в end_user_event_type (SESSION / IN_APP). |
Авторизовано |
Идентификатор пакета PBA | Устаревшее | Заменено группировкой Product Line (веб + мобильные приложения) в кроссплатформенном отчете. |
campaign (кампания) |
Атрибутируется посещению сайта | Переименовано |
campaign_name. |
campaign_id (идентификатор кампании) |
Атрибутируется посещению сайта | Без изменений |
campaign_id. |
город |
Определено по IP-адресу | Без изменений |
city. |
код_страны |
Определено по IP-адресу | Без изменений |
country_code. |
идентификатор_пользователя_клиента |
Идентификатор клиента (CUID) | Без изменений |
customer_user_id. |
тип_устройства |
Тип устройства | Переименовано |
device_category, значения различаются ("Desktop" vs. "MOBILE_PHONE" / "TV"). |
дма |
Определено по IP-адресу | Без изменений |
dma. |
имя_события |
Посещения: всегда "website visit". События: передается имя события | Переопределено | Пусто для посещений (PBA написал "website visit"). Без изменений для событий. |
event_revenue |
Сумма дохода от события в валюте покупки | Переименовано |
revenue_value_original. |
event_currency |
3-символьный код валюты event_revenue
|
Переименовано |
revenue_currency_original. |
event_revenue_usd |
event_revenue в долларах США |
Переименовано |
revenue_usd. |
источник события |
Либо веб-SDK, либо сервер-сервер | Без изменений |
event_source. |
время_события |
Посещения: время посещения. События: время события | Без изменений |
event_time. |
тип_события |
Стандартное событие / событие конверсии / посещение сайта | Переопределено | Маркировка события конверсии больше не существует. Различие между посещением и событием отражено в end_user_event_type (SESSION / IN_APP). |
event_url |
URL-адрес веб-страницы, на которой произошло событие (соответствует Original URL при посещениях) | Без изменений |
event_url — теперь это также основное место для чтения параметров запроса URL-адреса (UTM и т. д.). |
event_value |
События: сведения о событии в формате JSON. Посещения: null | Без изменений |
event_value. |
IDFA |
Рекламный идентификатор | Устаревшее | Идентификатор мобильного устройства; для веба не актуально. |
IDFV |
Рекламный идентификатор | Устаревшее | Идентификатор мобильного устройства; для веба не актуально. |
imei |
Идентификатор устройства | Устаревшее | Идентификатор мобильного устройства; для веба не актуально. |
время_установки |
Время последней установки приложения | Устаревшее | Мобильное кроссплатформенное поле. Время привлечения веб-пользователя (конверсии) — event_time__conversion — это отдельное понятие.
|
ip |
IP-адрес посетителя | Переименовано |
ip_address_value, то же значение, плюс ip_address_type для метода хеширования. |
язык |
Сообщается user agent (например, "English") | Переопределено |
language, формат значения меняется на ISO 639-1 и код страны. |
медиа_канал |
Атрибутируется посещению сайта ("Рекламное объявление") | Устаревшее | При необходимости можно использовать sub_param_1-5. |
медиа-источник |
Атрибутируется посещению сайта | Без изменений |
media_source. |
media_type |
Атрибутируется посещению сайта ("Платный") | Устаревшее | Пусто для веб-среды. Теперь органический трафик и платный трафик определяются по логическому значению is_organic. |
oaid |
Рекламный идентификатор | Устаревшее | Идентификатор мобильного устройства; для веба не актуально. |
original_url |
URL-адрес, который перенаправил пользователя при атрибутированном посещении | Переименовано | Объединено в event_url (для посещений event_url совпадает с исходным URL-адресом). Отдельного столбца больше нет. |
platform |
Платформа ("macOS", "Windows") | Переопределено | Платформа всегда имеет значение "WEBSITE". ОС перенесена в os_version / user_agent. |
postal_code |
Определено по IP-адресу | Без изменений |
postal_code. |
query_params |
Параметры запроса в URL-адресе перенаправления в формате JSON | Устаревшее | Необработанная строка запроса находится в event_url. Столбец с разобранным JSON удален. |
Referrer |
HTTP-реферер атрибутированного посещения сайта | Переименовано |
http_referrer. |
region |
Определено по IP-адресу ("NA") | Переименовано |
continent, код континента, например "NA". |
Состояние |
Определено по IP-адресу | Без изменений |
state. |
Готовый к использованию промпт для агента написания кода для миграции ETL в Data Locker
Чтобы упростить этот переход, мы подготовили готовый к использованию промпт для вашего ИИ-агента написания кода (Claude Code, Cursor или аналогичного инструмента). Предоставьте агенту доступ к вашему текущему ETL-коду и вставьте промпт ниже; он содержит полное сопоставление полей и все поведенческие различия. Он поможет агенту изучить ваш текущий конвейер обработки данных и перестроить его для нового отчета.
Вы переносите ETL-конвейер с устаревших отчетов Data Locker по необработанным данным PBA в AppsFlyer (Website visits + Website events) на отчет Data Locker AppsFlyer Web Performance Measurement (End User Events). В этом промпте есть все необходимое: структурные изменения, полное сопоставление полей и шаги валидации. Не делайте никаких предположений сверх того, что здесь написано. Если что-то неоднозначно, уточните у меня.
## Шаг 1: Изучите текущий конвейер
Прежде чем писать какой-либо код, изучите существующую кодовую базу и составьте перечень:
1. Какие отчеты PBA вы используете (Website visits, Website events или оба) и где они загружаются.
2. Каждое поле PBA, которое мы считываем, и где каждое из них далее используется (преобразования, объединения, дэшборды, оповещения, экспорт).
3. Частота загрузки и допущения по расписанию (PBA доставляется ежедневно).
4. Любая логика, которая разделяет или объединяет строки визитов и строки событий.
5. Любые фильтры, группировки или жестко заданные значения, завязанные на значения полей PBA (например, имена media_source, метки channel, event_type, значения platform).
Представьте мне этот перечень и дождитесь моего подтверждения, прежде чем продолжить.
## Шаг 2: Задайте мне эти вопросы
1. Новый отчет End User Events уже включен в Data Locker (включается в интерфейсе AppsFlyer)? Если нет, сначала мне нужно включить эту функцию.
2. Какой Unified App ID у нашего нового веб-приложения? Формат: "website-{domain}" (например, website-www.example.com). Если я этого не знаю, я возьму эту информацию из дэшборда AppsFlyer, прежде чем мы продолжим.
3. Нужен ли нам период параллельного запуска (старый и новый пайплайн работают бок о бок, сравнивая результаты) или прямое переключение? Рекомендуй параллельный запуск.
4. Должен ли новый пайплайн также использовать отчет Conversions (уникальные случаи атрибуции, без дублирующихся строк) или кроссплатформенный отчет End User Events (с дедупликацией по CUID, на уровне пользователей web+mobile)? Область применения по умолчанию — отчет End User Events на уровне платформы, прямой преемник отчетов PBA.
## Структурные изменения, которые нужно учесть в дизайне
1. **Один отчет вместо двух.** В PBA визиты и события были разделены на два отчета. Новый отчет End User Events содержит оба типа данных: визиты — это строки с end_user_event_type = 'SESSION', а события — строки с end_user_event_type = 'IN_APP'. Только строки IN_APP содержат корректное значение event_name; в строках SESSION поле event_name пустое (в PBA туда записывали "website visit").
2. **Единая схема для всех платформ.** Этот отчет общий для website, mobile, CTV и PC. Всегда фильтруйте platform = 'WEBSITE', чтобы выделить веб-данные.
3. **Двойной учет атрибуции, нужна дедупликация.** Одно и то же действие может появляться дважды: строка с основным учетом и строка со вторичным учетом (исходный UA-источник, для LTV в представлении UA). По умолчанию применяйте фильтр is_primary_attribution = true, чтобы избежать двойного подсчета. Убирайте этот фильтр только для специального анализа представления UA и представления ретаргетинга с использованием conversion_type.
4. **Ежечасно вместо ежедневно.** Новый отчет доставляется ежечасно с задержкой обновления данных примерно 2 часа. Перестройте инкрементальные загрузки вокруг почасовых пакетов вместо ежедневной выгрузки.
5. **Органический vs платный.** Поле media_type ("Paid") в PBA больше не используется. Используйте логическое поле is_organic; никогда не определяйте органический/платный трафик по media_source.
6. **Подсчет пользователей.** Для подсчета и объединения пользователей используйте COALESCE(customer_user_id, appsflyer_id_value): сначала стабильный идентификатор пользователя customer_user_id, а в качестве резервного варианта — идентификатор на основе cookie.
7. **Пустые значения.** Для полей STRING используется '', для полей NUMERIC — NULL.
## Сопоставление полей (PBA → End User Events)
Обозначения статусов: Unchanged = имя и данные не изменились. Renamed = те же данные, новый столбец. Redefined = изменились данные или формат значения (используйте с осторожностью). Deprecated = эквивалента нет.
| Поле PBA | Статус | Новое поле / обработка |
|---|---|---|
| advertising_id | Deprecated | Идентификатор устройства. Кроссплатформенные отчеты основаны на CUID; удалите его. |
| af_web_id | Renamed | appsflyer_id_value, тот же веб-файл cookie. |
| amazon_aid | Deprecated | Идентификатор устройства, не относится к вебу. |
| android_id | Deprecated | Идентификатор устройства, не относится к вебу. |
| app_id | Deprecated | Мобильное кроссплатформенное поле. Новый идентификатор веб-приложения — unified_app_id ("website-{domain}"); это другое понятие, а не переименование. |
| app_name | Unchanged | app_name. |
| app_version | Deprecated | Мобильное кроссплатформенное поле. |
| appsflyer_id | Deprecated | Идентификатор мобильной установки. Примечание: новый appsflyer_id_value — это веб-файл cookie (af_web_id в PBA), а НЕ это поле. |
| attributed_touch_time | Renamed | event_time__attribution. |
| attributed_touch_type | Deprecated | Было константой. Теперь различие между visit и event задается в end_user_event_type. |
| bundle_id | Deprecated | Заменено группировкой Product Line в кроссплатформенном отчете. |
| campaign | Renamed | campaign_name. |
| campaign_id | Без изменений | campaign_id. |
| city | Без изменений | city. |
| country_code | Без изменений | country_code. |
| customer_user_id | Без изменений | customer_user_id. |
| device_type | Переименовано + изменены значения | device_category, значения отличаются (например, «Desktop» → значения в стиле «MOBILE_PHONE» / «ТВ»). Обновите всю логику, завязанную на ключах значений. |
| dma | Без изменений | dma. |
| event_name | Переопределено | События: без изменений. Визиты: теперь пусто (PBA написал «website visit»). Чтобы определить визиты, используйте end_user_event_type = 'SESSION'. |
| event_revenue | Переименовано | revenue_value_original. |
| event_revenue_currency | Переименовано | revenue_currency_original. |
| event_revenue_usd | Переименовано | revenue_usd. |
| event_source | Без изменений | event_source. |
| event_time | Без изменений | event_time. |
| event_type | Переопределено | Маркер "событие конверсии" больше не существует. Разделение визитов и событий находится в end_user_event_type (SESSION / IN_APP). |
| event_url | Без изменений | event_url, теперь это также основное место, откуда считываются параметры запроса URL-адреса (UTM и т. д.). |
| event_value | Без изменений | event_value. |
| idfa / idfv / imei / oaid | Устарело | Идентификаторы мобильных устройств, неактуально для веба. |
| install_time | Устарело | Поле для мобильных устройств. В вебе время привлечения пользователя — это event_time__conversion, отдельное понятие. |
| ip | Переименовано | ip_address_value (плюс ip_address_type для метода хеширования). |
| language | Переопределено | language, формат изменен на ISO 639-1 + код страны (например, раньше было «English»). |
| media_channel | Устарело | При необходимости можно использовать sub_param_1-5. |
| media_source | Без изменений | media_source (но см. переименование значений ниже). |
| media_type | Устарело | Вместо этого используйте булев флаг is_organic. |
| original_url | Переименовано | Объединено в event_url (для посещений event_url равен исходному URL-адресу). Отдельный столбец удален. |
| platform | Переопределено | platform всегда имеет значение "WEBSITE". ОС перенесена в os_version / user_agent. |
| postal_code | Без изменений | postal_code. |
| query_params | Устарело | Необработанная строка запроса теперь находится в event_url; столбец с разобранным JSON удален. При необходимости заново внедрите парсинг из event_url. |
| referrer | Переименовано | http_referrer. |
|region | Переименовано | континент, код континента (например, "NA"). |
| state | Без изменений | state. |
## Изменения атрибутированных значений (обновите фильтры и группировки)
Механизм атрибуции теперь иначе определяет источники трафика, поэтому некоторые значения меняются даже там, где названия полей остаются прежними:
- Переименования media_source: doubleclick_int → dv360_int (Google display/video через UTM); "X Ads" → "Twitter" (Twitter через UTM). Теперь больше значений PID сопоставляются с отображаемыми названиями (например, iossearchads_int → Apple Search Ads, metweb_int → Facebook Ads, tiktokweb_int → tiktokglobal_int, snapweb_int → snapchat_int).
- Формат меток каналов меняется: Direct / Organic search / Social media / Email / Ad / Referral / Other становятся DIRECT / ORGANIC_SEARCH / SOCIAL_MEDIA / EMAIL / AD / REFERRAL / OTHER.
- Расширено покрытие Click-ID (теперь больше сетей определяется по click ID); один только dclid больше не определяется; fbclid не используется.
Просканируйте кодовую базу на наличие фильтров, конструкций CASE, ключей соединения и группировок на дэшбордах, использующих эти старые значения, и обновите их.
## Шаг 3: Сборка
1. Предложите новую архитектуру ETL (приём данных, схему, логику почасовой инкрементальной загрузки и обязательные фильтры из раздела «Структурные изменения»).
2. После моего одобрения реализуйте эту архитектуру, используя существующие соглашения и инфраструктуру.
3. Для каждого устаревшего поля, которое инвентаризация обнаружила в последующем использовании, укажите потребителя и предложите решение (удалить, заменить предложенной альтернативой или передать на рассмотрение владельцу бизнеса).
## Шаг 4: Проверка
1. Запустите оба пайплайна для одного и того же диапазона дат и сравните: посещения (строки SESSION) и посещения сайта PBA, события (строки IN_APP) и события сайта PBA, а также итоговые суммы дохода.
2. Ожидайте различий, а не равенства: новая логика атрибуции более продвинута, поэтому атрибутированные измерения (media_source, campaign) не будут точно совпадать с PBA. Логика подсчета сессий не изменилась (30 минут активности), поэтому объемы визитов, как ожидается, останутся примерно на том же уровне.
3. Убедитесь, что фильтр is_primary_attribution применяется везде; его отсутствие проявляется в виде завышенного количества событий.
4. Подготовьте краткий отчет о миграции: что было сопоставлено, что было отброшено, что изменилось в значениях и какие открытые вопросы остались для владельца бизнеса.
Миграция PBA Web-S2S на новый API S2S
Если вы отправляете события в PBA через API событий Web Server-to-server (Web-S2S), перейдите на новый S2S API. Новый API поддерживает визиты и события, поэтому ваш сайт может работать полностью на стороне сервера; S2S в PBA принимает только события.
Конечные точки и аутентификация
| PBA Web-S2S | Новый S2S API | |
| Базовый URL-адрес | https://webs2s.appsflyer.com |
https://events.appsflyer.com |
| Вызов события | POST /v1/{bundleId}/event |
POST /v2.0/s2s/inapps/app/web/{appId} |
| Вызов визита | Недоступно (визиты поступали только из Web SDK) | POST /v2.0/s2s/visits/app/web/{appId} |
| Вызов идентификации |
POST /v1/{bundleId}/setcuid (отдельный вызов для связывания CUID с веб-пользователем) |
Нет, идентификатор передается в объекте user_id в каждой отправке события/визита |
| Идентификатор приложения |
bundleId (идентификатор ID пакета бренда) в пути |
appId = веб-unified_app_id ("website-{domain}") в пути |
| Аутентификация |
webDevKey в теле JSON при каждом вызове |
Заголовок Authorization, содержащий ключ S2S API |
| Тип контента | application/json |
application/json |
| Успешный ответ | 200 OK | 202 приняты |
Сопоставление полей полезной нагрузки
| Поле PBA Web-S2S | Новое поле S2S | Примечание |
customerUserId |
user_id.customer_user_id |
Теперь вложено в объект user_id. |
afUserId |
user_id.appsflyer_id |
Теперь вложено в объект user_id. Передавайте как минимум один из customer_user_id или appsflyer_id; передавайте оба, если пользователь идентифицирован. |
webDevKey |
Булево перечисление | Удалено из тела запроса. Аутентификация перенесена в заголовок Authorization; приложение идентифицируется по appId в пути. |
eventType (всегда EVENT) |
Булево перечисление | Удаленные. Тип определяется конечной точкой (/inapps или /visits). |
eventName |
имя_события |
1–64 символа; не может содержать @ = + -. |
timestamp (Unix ms, 13 цифр) |
timestamp (Unix ms) |
Тот же формат. Рекомендуется для каждого вызова; если не передан, AppsFlyer использует время получения. |
Значение события |
event_value |
Произвольный формат; поддерживает подобъект custom_parameters. |
eventRevenue |
event_revenue |
Теперь необязательно (в PBA было обязательно для дэшбордов). |
eventRevenueCurrency |
event_currency |
Теперь необязательно (в PBA было обязательно для дэшбордов). |
Referrer |
http_referrer |
Переименовано. |
userAgent |
user_agent |
Переименовано. |
ip |
ip |
Без изменений. |
| Булево перечисление | event_url |
Новый. Обязательно для посещений; необязательно для событий. |
| Булево перечисление | customer_dedup_id |
Новый. Устраняет дубликаты, если одно и то же событие поступает из другого источника (например, из Web SDK). |
| Булево перечисление |
email_hashed, phone_number_hashed, phone_number_e164_hashed, first_name_hashed, last_name_hashed
|
Новый. SHA256 (64-символьное шестнадцатеричное значение в нижнем регистре) нормализованных значений для обогащения идентичности. |
Примечания по S2S API
- Визиты теперь обрабатываются на стороне сервера. S2S в PBA принимал только события; визиты должны были поступать из Web SDK. Новый эндпоинт /visits позволяет сайту полностью работать на стороне сервера.
- Вызов setcuid больше не нужен. Для PBA требовался Web SDK, поэтому был нужен отдельный вызов, чтобы связать CUID с веб-пользователем. Новый API передает идентификатор в каждом запросе, поэтому этот шаг исключается.
- Окно для поздних данных. Отправляйте события и визиты в реальном времени, предпочтительно в течение 30 минут после возникновения события, а не объединяйте их в одну ежедневную загрузку. Данные, поступившие более чем через 30 минут после окончания дня UTC, в который произошло событие, по-прежнему принимаются, но время события заменяется временем, когда AppsFlyer их получил.
Миграция S2S-сервиса: готовый промпт для coding agent
Если вы отправляете события через PBA Server-to-server API, мы подготовили готовый промпт для вашего ИИ-агента для написания кода (Claude Code, Cursor или аналогичного инструмента). Предоставьте агенту доступ к сервису, который отправляет события в AppsFlyer, и вставьте приведённый ниже промпт – он содержит полное сопоставление эндпоинтов и передаваемых данных. Он поможет агенту изучить вашу текущую реализацию и создать обновленную.
Вы переносите серверную интеграцию с устаревшего API событий PBA Web S2S от AppsFlyer (webs2s.appsflyer.com) на новый S2S API AppsFlyer для Web Performance Measurement (events.appsflyer.com). В этом промпте есть все необходимое: эндпоинты, аутентификация, полное сопоставление полей данных и изменения в логике работы. Не делайте никаких предположений сверх того, что здесь указано. Если что-то неоднозначно, уточните у меня.
## Шаг 0: Задайте мне эти вопросы, прежде чем вносить изменения в код
1. Следует изменить существующий сервис или создать новый сервис/модуль параллельно с ним, чтобы обеспечить параллельную работу и затем полностью перейти на новый сервис? Рекомендуй создать новый модуль параллельно с существующим.
2. Знаю ли я Unified App ID нашего нового веб-приложения? Формат: "website-{domain}" (например, website-www.example.com). Он заменяет bundle ID PBA в пути URL-адреса. Если я не знаю его, то получу Unified App ID нового веб-приложения на дэшборде AppsFlyer, прежде чем продолжить.
3. Есть ли у меня новый ключ S2S API? Аутентификация перенесена из webDevKey в теле запроса в заголовок Authorization, передающий этот ключ. Если у меня его нет, я получу его на дэшборде AppsFlyer.
4. Хотим ли мы отправлять только события (как в PBA) или также начать использовать новый эндпоинт для посещений? Новый API поддерживает визиты на стороне сервера, поэтому сайт может полностью работать на стороне сервера; PBA принимал только события.
5. AppsFlyer Web SDK по-прежнему работает на нашем сайте? (Определяет, поступают ли визиты из SDK и нужна ли дедупликация событий между SDK и S2S.)
## Шаг 1: Изучите текущий сервис
Изучите кодовую базу и составьте перечень:
1.
## Шаг 1: Изучите текущий сервис
Изучите кодовую базу и составьте перечень:
1. Все места вызова webs2s.appsflyer.com, вызовы /event и любые вызовы /setcuid.
2. Поля, заполняемые при каждом вызове (customerUserId, afUserId, eventName, eventValue, eventRevenue, timestamp, referrer, userAgent, ip и т. д.), и источники их значений.
3. Обработка ошибок и мониторинг, завязанные на ответ 200 OK.
4. Поведение повторных попыток, пакетной обработки и очередей.
Предоставь мне этот список и дождись моего подтверждения, прежде чем продолжить.
## Что изменилось: конечные точки и аутентификация
| | PBA Web-S2S (старый) | Новый API S2S |
|---|---|---|
| Базовый URL-адрес | https://webs2s.appsflyer.com | https://events.appsflyer.com |
| Вызов события | POST /v1/{bundleId}/event | POST /v2/s2s/inapps/app/web/{appId} |
| Вызов визита | Недоступно | POST /v2/s2s/visits/app/web/{appId} |
| Вызов идентификации | POST /v1/{bundleId}/setcuid | Нет, идентификация встроена в объект user_id в каждом вызове |
| Идентификатор приложения в пути | bundleId (bundle ID бренда) | appId = унифицированный идентификатор веб-приложения ("website-{domain}") |
| Аутентификация | webDevKey в теле JSON | Заголовок Authorization с ключом API S2S |
| Тип контента | application/json | application/json (415, если отсутствует) |
| Успешный ответ | 200 OK | 202 Accepted |
## Сопоставление полей полезной нагрузки
| Поле PBA | Новое поле | Примечание |
|---|---|---|
| customerUserId | user_id.customer_user_id | Вложено в объект user_id. |
| afUserId | user_id.appsflyer_id | Вложено в объект user_id. Отправляйте как минимум одно из значений: customer_user_id или appsflyer_id; отправляйте оба, когда пользователь идентифицирован. |
| webDevKey | (удалено) | Аутентификация перенесена в заголовок Authorization; приложение идентифицируется по appId в пути. |
| eventType (всегда "EVENT") | (удалено) | Тип определяется конечной точкой (/inapps или /visits). |
| eventName | event_name | 1–64 символа; не может содержать символы @ = + -. |
| timestamp (Unix ms) | timestamp (Unix ms) | Тот же формат. Рекомендуется при каждом вызове; если параметр не указан, AppsFlyer использует время получения. |
| eventValue | event_value | Произвольный формат; поддерживает вложенный объект sub-object custom_parameters. |
| eventRevenue | event_revenue | Теперь необязателен (PBA требовал его для дэшбордов). |
| eventRevenueCurrency | event_revenue_currency | Теперь необязателен (PBA требовал его для дэшбордов). |
| referrer | http_referrer | Переименован. |
| userAgent | user_agent | Переименован. |
| ip | ip | Без изменений. |
| (new) | event_url | Обязателен для визитов; необязателен для событий. |
| (new) | customer_dedup_id | Устраняет дубликаты, если одно и то же событие поступает из другого источника (например, из Web SDK). |
| (new) | email_hashed, phone_number_hashed, phone_number_e164_hashed, first_name_hashed, last_name_hashed | SHA256 (64-символьная шестнадцатеричная строка в нижнем регистре) нормализованных значений для обогащения идентификации. |
## Изменения в поведении и важные нюансы
1. **appId — это Unified App ID, а не "Web SDK ID".** На странице настроек приложения в AppsFlyer отображается UUID "Web SDK ID" (бывший Web Dev Key, сохраненный для непрерывности SDK). Путь S2S должен содержать Unified App ID ("website-{domain}"), а не этот UUID. 401 "app not found" обычно означает неверный appId в пути или отсутствие/некорректность заголовка Authorization.
2. **Успешный статус — 202, а не 200.** Соответственно обновите проверки работоспособности, повторы попыток и оповещения.
3. **Не выполняй валидацию по старому эндпоинту.** Устаревший эндпоинт все еще может возвращать код 200, но такой ответ не подтверждает, что данные поступили в Web Performance Measurement. Всегда проверяйте, что события действительно появляются в данных нового веб-приложения.
4. **Полностью откажитесь от потока setcuid.** Идентификационные данные передаются inline в объекте user_id при каждом событии и визите.
5. **Сначала визиты, потом события.** Система ожидает визит до любого события от пользователя; события для пользователя без предыдущего визита классифицируются как органические. Визиты поступают из Web SDK или, теперь, из эндпоинта /visits.
6. **Отправляй в реальном времени; не отправляй пакетами.** Отправлять каждое событие и каждый визит по мере их возникновения, желательно в течение 30 минут после того, как событие произошло. Данные, поступившие позже чем через 30 минут после окончания дня UTC, в который произошло событие, всё равно принимаются, но время события заменяется временем получения, что искажает атрибуцию. Всегда отправлять временную метку. Обратите внимание: приблизительно 30-минутная задержка атрибуции, о которой вы могли читать, — это отдельная серверная задержка на стороне AppsFlyer, и нам ничего реализовывать не нужно.
7. **Полностью серверный вариант (если мы внедрим визиты).** Без Web SDK наш сервер управляет идентификатором веб-пользователя: сгенерируйте стабильный идентификатор для посетителей, которые заходят впервые, сохраните его как установленный сервером first-party HTTP cookie (заголовок Set-Cookie, не JavaScript; в Safari срок действия JS-cookie ограничен примерно 7 днями), используйте его повторно при каждом запросе и отправляйте как user_id.appsflyer_id. Payload визита должен включать event_url; мы также рекомендуем добавлять ip, user_agent и http_referrer для повышения качества атрибуции.
8. **SDK + S2S вместе.** Если оба отправляют одно и то же событие, заполните customer_dedup_id, чтобы AppsFlyer сохранил только одну копию.
## Step 2: Сборка
1. Предложите архитектуру: новый клиент/модуль, конфигурация (базовый URL-адрес, appId, хранение API-ключа в нашем менеджере секретов, никогда не хардкодить), конструкторы полезной нагрузки для событий (и визитов, если они входят в область работ), а также обработка ответов и повторных попыток для 202.
2. После моего одобрения внедрить это в соответствии с нашими существующими соглашениями.
3. Сопоставьте каждое поле из инвентаря с полезной нагрузкой, указанной выше; отметьте все поля, которые мы сейчас отправляем, но для которых нет нового эквивалента.
## Step 3: Проверка
1. Отправьте тестовое событие (и визит, если он входит в область работ) и подтвердите ответ 202.
2. Проверьте, что тестовые данные появились в новом веб-приложении в AppsFlyer (в дэшборде или в Data Locker); это и есть реальный признак успеха, а не HTTP-ответ.
3. Убедитесь, что имена событий соответствуют новым ограничениям (1–64 символа, без @ = + -).
4. Если старая служба и новая работают параллельно, сравните объемы событий в старой и новой службе в течение нескольких дней перед переключением, а затем выведите из эксплуатации старые вызовы, включая setcuid.