How can we help?

Миграция с PBA на Web Performance Measurement

  • Обновлено

Кратко: 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 более продвинутая и гибкая, поэтому показатели PBA не будут полностью совпадать.

Web Performance Measurement и PBA

Возможность Description(Описание) PBA Web Performance Measurement
вашего бизнеса
Агрегированные данные Как быстро данные становятся доступны в отчетности ✗ ежедневно ✓ Почасовые отчеты, свежесть данных — примерно 2 часа
Модель данных Выравнивание схемы с данными мобильной атрибуции ✗ Отличается от мобильного ✓ Согласовано с мобильным, легко объединять и анализировать
Отчетность
Дэшборд активности Дэшборд на основе времени события ✓ Поддерживается ✓ Поддерживается
Ретаргетинг Анализируйте эффективность по когортам привлечения с течением времени ✗ Не поддерживается ✓ Поддерживается
Сырые данные Data Locker Доступ к данным атрибуции в формате сырых данных через экспорт Data Locker ✓ Поддерживается ✓ Поддерживается
Детализация до уровня рекламного объявления Разбивка отчета от уровня кампании до уровня рекламного объявления ✗ Только на дэшборде, не в сырых данных ✓ Полная детализация по кампаниям и на дэшборде, и в сырых данных
Кроссплатформенный LTV Объединяйте пути пользователей в вебе и на мобильных устройствах в единый LTV ✗ Не поддерживается ✓ Поддерживается
Стоимость и сигналы
Стоимость веба Сбор данных о расходах на рекламу и отчетность по веб-кампаниям ✗ Не поддерживается ✓ Поддерживается
Постбэки оптимизации Отправка сигналов оптимизации обратно в рекламные сети ✗ Не поддерживается ✓ Поддерживается
Внедрение
Веб-SDK (Pixel) Клиентский SDK для измерения веб-визитов и событий ✓ Поддерживается ✓ Тот же SDK — изменения кода не требуются
Поддержка S2S Полноценное измерение визитов и событий на стороне сервера ✗ Только события ✓ События и визиты. Поддерживает полную реализацию на стороне сервера.
Механизм атрибуции
Окна атрибуции Конфигурируемые окна: лукбэк, атрибуция, повторное вовлечение и неактивность ✗ Только окно лукбэка по кликам ✓ 5 конфигурируемых окон (полный контроль)
Пользовательское событие UA Определите, какое событие считается привлечением пользователей помимо первого посещения ✗ Только первое посещение ✓ Любое пользовательское событие (например, регистрация, покупка)
UA vs. ретаргетинг Раздельное начисление атрибуции для нового привлечения и повторного вовлечения ✗ Нет понятия UA, события атрибутируются по последней точке взаимодействия ✓ Отдельные представления для UA и ретаргетинга с двойным начислением атрибуции

Этапы миграции

В таблице ниже миграция разбита на пять этапов. Создание веб-приложения относится ко всем; остальные шаги зависят от того, какие функции PBA вы сейчас используете, например S2S API или отчеты Data Locker.

Действие Актуально для Что входит
Создайте веб-приложение Все Когда вы создаете новое веб-приложение, выберите существующий веб Dev Key в поле Web SDK ID. Это позволяет текущему коду вашего сайта работать как есть, без изменений в коде. Затем настройте параметры Атрибуции в новом Приложении.
Перейдите на новый S2S API Используете PBA S2S API Настройте новый S2S API. Он поддерживает и посещения, и события, поэтому вы можете полностью перейти на серверную обработку. См. приложение по миграции S2S API ниже.
Перейдите на новые отчеты Data Locker Использование отчетов Data Locker по PBA Включите новый веб-отчет в интерфейсе и настройте ваши инструменты бизнес-аналитики/ETL на работу с обновленными данными. В новых отчетах используется единая схема для всех платформ, включая мобильные приложения, веб-сайты, CTV и ПК. См. ниже приложение с сопоставлением полей отчетов по сырым данным.
Проверьте параметры атрибуции Рекомендовано PBA применял собственные правила атрибуции медиаисточников. Web Performance Measurement использует улучшенное определение источника трафика, чтобы повысить точность аналитики. Ознакомьтесь с различиями, чтобы понимать, какие значения ожидать в отчетах. См. ниже приложение со сравнением определения источников трафика.
Объедините приложения в линейку продуктов НЕОБЯЗАТЕЛЬНОЕ Создайте продуктовую линейку и сгруппируйте веб-приложение с вашими мобильными приложениями, чтобы получить отчетность по LTV пользователей на разных платформах (аналогично PBA Brand Bundle).

Примечание

Ожидайте некоторых расхождений в цифрах. Логика атрибуции в Web Performance Measurement более продвинутая и гибкая, поэтому показатели PBA не будут полностью совпадать. Сама логика записи сессий не изменилась: сессия по-прежнему длится 30 минут активности, что является рыночным стандартом.

Возможности, поддержка которых прекращается

Возможность Что меняется Срок
Путь конверсии Уже устарело.
Web-assisted installs (заслуга веб-кампании, которая помогла привести к более поздней установке мобильного приложения) Отдельного представления для "Вспомогательных установок" нет.

Пути Web-to-app измеряются с помощью Smart Script и Smart Banner. Кроссплатформенный отчет предоставляет похожий, хотя и не идентичный, анализ. Как и в PBA, он основан на CUID:

  • Веб-кампании, которые способствовали установке, ранее учитывавшейся как органическая, теперь отображаются как неорганическое привлечение пользователей. Это не ассисты; источник привлечения — веб-кампания.
  • Веб-кампании, которые способствовали неорганической установке: веб-кампания становится источником привлечения пользователей, а мобильная установка — кроссплатформенным ретаргетингом.
Обратный пересчет Обратный пересчет не выполняется, кроме стандартной 30-минутной задержки. Атрибуция завершается через 30 минут — это дает пользователям время идентифицировать себя в течение этого окна.
Поля отчетов по необработанным данным Поля, связанные с мобильными устройствами, устарели для веба. Некоторые поля переименованы, а некоторые значения изменены. См. приложение с сопоставлением полей отчетов о сырых данных ниже.
Поздние события S2S События, поступающие позднее чем через 30 минут после окончания дня по UTC, в который они произошли, по-прежнему принимаются, но время события заменяется временем, когда AppsFlyer их получил. Отправляйте события в реальном времени — желательно в течение 30 минут после того, как событие произошло, — вместо того чтобы объединять их в одну ежедневную загрузку. Точная атрибуция зависит от того, насколько быстро события поступают после того, как они происходят. Это приводит веб в соответствие с существующим мобильным поведением.

Приложение: изменения в отчетах о сырых данных

Единое сопоставление каждого поля в Отчете о сырых данных PBA (Website visits и Website events) с новым отчетом End User Events. Источник: Отчеты о сырых данных PBA.

Область действия: отчет PBA «Посещения сайта» и «События на сайте».

  • Без изменений: то же имя поля и те же данные.
  • Переименовано: те же данные, новое имя столбца.
  • Переопределено: то же или похожее имя, но формат данных или значений изменен (требует внимательности перед повторным использованием).
  • Устарело: эквивалент в новом отчете отсутствует.
Имя поля 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, метки каналов, 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" / значения в стиле "TV"). Обновите всю логику, завязанную на ключах значений. |
| 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 | Переименовано | continent, код континента (например, "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, ключей join или группировок в дэшборде, завязанных на эти старые значения, и обнови их.

## Шаг 3: Сборка

1. Предложи новый дизайн ETL (ingestion, schema, почасовую инкрементальную логику, обязательные фильтры из «Structural changes»).
2. После моего одобрения внедри это, повторно используя наши существующие соглашения и инфраструктуру.
3. Для каждого устаревшего поля, которое инвентаризация обнаружила в последующем использовании, укажите потребителя и предложите решение (удалить, заменить предложенной альтернативой или передать на рассмотрение владельцу бизнеса).

## Шаг 4: Проверка

1. Запустите оба пайплайна для одного и того же диапазона дат и сравните: посещения (строки SESSION) и посещения сайта PBA, события (строки IN_APP) и события сайта PBA, а также итоговые суммы дохода.
2. Ожидайте различий, а не равенства: новая логика атрибуции более продвинута, поэтому атрибутированные измерения (media_source, campaign) не будут точно совпадать с PBA. Логика подсчета сессий не изменилась (30 минут активности), поэтому объемы посещений должны быть сопоставимыми.
3. Убедитесь, что фильтр is_primary_attribution применяется везде; его отсутствие проявляется в виде завышенного количества событий.
4. Подготовьте краткий отчет о миграции: что было сопоставлено, что было отброшено, что изменилось в значениях и какие открытые вопросы остались для владельца бизнеса.

Приложение: миграция с PBA Web-S2S на новый S2S API

Если вы отправляете события в PBA через Web Server-to-server events API (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, и вставьте промпт ниже; он содержит полное сопоставление endpoint и payload. Он поможет агенту изучить вашу текущую реализацию и создать обновленную.

Вы переносите серверную интеграцию с устаревшего API веб-событий PBA Web S2S AppsFlyer (webs2s.appsflyer.com) на новый S2S API AppsFlyer для измерения эффективности веб-ресурсов (events.appsflyer.com). В этом запросе есть всё, что вам нужно: конечные точки, аутентификация, полное сопоставление полезной нагрузки и изменения в поведении. Не делайте предположений сверх того, что здесь написано; если что-то неоднозначно, спросите меня.

## Шаг 0: Задайте мне эти вопросы, прежде чем вносить изменения в код

1. Нам следует изменить существующий сервис на месте или создать рядом с ним новый сервис/модуль (чтобы обеспечить параллельный запуск и чистое переключение)? Рекомендуйте новый модуль рядом с существующим.
2. Знаю ли я Unified App ID нашего нового веб-приложения? Формат: "website-{domain}" (например, website-www.example.com). Он заменяет bundle ID PBA в пути URL-адреса. Если я его не знаю, я найду его на дэшборде AppsFlyer, прежде чем мы продолжим.
3. Есть ли у меня новый ключ S2S API? Аутентификация перенесена из webDevKey в теле запроса в заголовок Authorization, передающий этот ключ. Если у меня его нет, я найду его на дэшборде AppsFlyer.
4. Мы хотим отправлять только события (как в PBA) или также использовать новую конечную точку visits? Новый API поддерживает визиты на стороне сервера, поэтому сайт может полностью работать на стороне сервера; PBA принимал только события.
5. AppsFlyer Web SDK по-прежнему работает на нашем сайте? (Определяет, поступают ли визиты из SDK и нужна ли дедупликация событий между SDK и S2S.)

## Шаг 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, но этот ответ не подтверждает, что данные поступили в систему измерения эффективности веб-ресурсов. Всегда проверяйте, что события действительно появляются в данных нового веб-приложения.
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. Полезная нагрузка визита должна включать 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.

Приложение: определение источника трафика, 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) Twitter Twitter

Web Performance Measurement также сопоставляет больше значений PID с отображаемыми названиями, например: iossearchads_int → Apple Search Ads, metweb_int → Facebook Ads, twitterweb_int → Twitter, tiktokweb_inttiktokglobal_int, snapweb_intsnapchat_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. Фильтры и группировки, привязанные к старым меткам, нужно обновить.

This article was translated using AI and may contain errors. For the most accurate information, please refer to the English version using the language selector.


Share article: