[Бета] Интеграция Web SDK от AppsFlyer

Краткий обзор: Установите Web SDK AppsFlyer (также известный как пиксель) на своем сайте, чтобы сообщать о посещениях пользователей и событиях в AppsFlyer, а также установить постоянный идентификатор пользователя (CUID) для унификации путей пользователей на разных платформах.

Обзор

Web SDK позволяет фиксировать, как посетители взаимодействуют с вашим сайтом, и отправляет эту информацию в AppsFlyer. Это модуль плагина размером 40–60 КБ, который сообщает о посещениях пользователей и действиях на вашем сайте на платформу AppsFlyer.

Следуйте приведенным ниже шагам, чтобы завершить интеграцию Web SDK от установки до валидации и настройки конфиденциальности.

  1. Получите свои ключи. Получите идентификатор Web SDK (также известный как ключ разработчика Web).
  2. Выберите фрагмент кода. Выберите фрагмент, который соответствует вашему типу интеграции и требованиям безопасности.
  3. Разверните Web SDK. Разверните SDK, используя нативный сниппет кода, Google Tag Manager или Adobe Launch Tag Manager.
  4. Убедитесь, что SDK работает. Проверьте, что SDK отправляет запросы, проверив сетевые обращения в инструментах разработчика браузера.
  5. Настройте и регистрируйте события Задайте и отправляйте пользовательские события при загрузке страницы или взаимодействии пользователя, используя нативный JavaScript или Google Tag Manager.
  6. идентификатор пользователя клиента. Установите постоянный CUID для унификации веб-активности с другими платформами.
  7. Управление конфиденциальностью. Управляйте согласием на сбор метрик или отказом от него, а также настраивайте безопасность и фильтрацию данных (политику безопасности данных и отбрасывание параметров запроса).
  8. Справочник по файлам cookie Web SDK [ Просмотрите cookie, которые устанавливает или использует Web SDK, включая цель, срок действия и область применения.

1. Получите свои ключи

Получите идентификатор Web SDK (также известный как ключ веб-разработчика):

  1. В AppsFlyer в верхнем меню откройте Мои приложения.
  2. Выберите свое веб-приложение (домен вашего сайта с префиксом "website-").
  3. Скопируйте необходимый идентификатор Web SDK.

Получите ключ Smart Banner (если необходимо):

  1. В AppsFlyer в боковом меню перейдите в раздел Вовлечение > Web to App > Смарт-баннеры.
  2. Скопируйте необходимый ключ смарт-баннеров. 

2. Выберите фрагмент кода

Выберите фрагмент, который соответствует вашему типу интеграции и требованиям безопасности. Доступны следующие две опции:

  • Стандартный Web SDK: Стандартная интеграция.
  • Расширенная проверка SDK: Улучшенная интеграция, которая добавляет защиту цепочки поставок для Web SDK. Используйте эту опцию, чтобы добавить дополнительный уровень защиты от компрометации CDN, перехвата DNS и атак «человек-посередине».

Важно!

Если вы переходите от стандартного Web SDK к расширенной проверке SDK, замените существующий фрагмент на новый. Не добавляйте новый фрагмент поверх существующего.

Стандартный Web SDK

Используйте этот фрагмент для развертывания стандартной интеграции Web SDK. Вставьте его в верхней части тега на всех страницах, где вы хотите загрузить SDK.

Без смарт-баннеров

<script>
  // Queue — buffers AF() calls until the SDK is ready
  window.AppsFlyerSdkObject = "AF";
  window.AF = window.AF || function() {
    (window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
  };
  window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" } };
  window.AF.plugins = {};

  // Inject SDK
  var o = document.createElement("script"),
      p = document.getElementsByTagName("script")[0];
  o.async = 1;
  o.src = "https://websdk.appsflyersdk.com?" + "st=pba&af_id=WEB_DEV_KEY";
  p.parentNode.insertBefore(o, p);
</script>

Со смарт-баннерами

<script>
  // Queue — buffers AF() calls until the SDK is ready
  window.AppsFlyerSdkObject = "AF";
  window.AF = window.AF || function() {
    (window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
  };
  window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" }, banners: { key: "YOUR_BANNER_KEY" } };
  window.AF.plugins = {};

  // Inject SDK
  var o = document.createElement("script"),
      p = document.getElementsByTagName("script")[0];
  o.async = 1;
  o.src = "https://websdk.appsflyersdk.com?" + "st=pba,banners&af_id=WEB_DEV_KEY";
  p.parentNode.insertBefore(o, p);
  AF('banners', 'showBanner');
</script>

Расширенная проверка SDK

Расширенная проверка SDK добавляет защиту цепочки поставок для Web SDK. Это гарантирует, что код, выполняющийся в браузерах ваших пользователей, точно соответствует тому, что опубликовал AppsFlyer. Исходный код SDK идентичен стандартной интеграции; различаются только механизмы доставки и проверки.

Расширенная проверка SDK:

  • Добавляет дополнительный уровень безопасности против компрометации CDN, захвата DNS и атак «человек посередине».
  • Добавляет примерно 250 мс к времени загрузки SDK.

Расширенная проверка SDK является необязательной. Стандартная интеграция полностью поддерживается и является рыночным стандартом для аналитических пикселей третьих сторон. Расширенная проверка SDK предоставляет дополнительный уровень защиты, выходящий за рамки этого стандарта.

Если ваш сайт применяет Политику безопасности контента (CSP) с использованием nonce, смотрите Политика безопасности контента (CSP) в разделе Управление конфиденциальностью чтобы получить расширенный вариант этого сниппета с nonce.

Без смарт-баннеров

<script>
  // Queue — buffers AF() calls until the SDK is ready
  window.AppsFlyerSdkObject = "AF";
  window.AF = window.AF || function() {
    (window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
  };
  window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" } };
  window.AF.plugins = {};

  // Manifest loader config
  window.AF_LOADER_CONFIG = {
    baseUrl: "https://websdk.appsflyersdk.com",
    plugins: ["pba"]
  };

  // Inject manifest loader
  var loaderScript = document.createElement("script");
  loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
  loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
  loaderScript.crossOrigin = "anonymous";
  loaderScript.async = true;
  document.head.appendChild(loaderScript);
</script>

Со смарт-баннерами

<script>
  // Queue — buffers AF() calls until the SDK is ready
  window.AppsFlyerSdkObject = "AF";
  window.AF = window.AF || function() {
    (window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
  };
  window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" }, banners: { key: "YOUR_BANNER_KEY" } };
  window.AF.plugins = {};

  // Manifest loader config
  window.AF_LOADER_CONFIG = {
    baseUrl: "https://websdk.appsflyersdk.com",
    plugins: ["banners", "pba"]
  };

  // Inject manifest loader
  var loaderScript = document.createElement("script");
  loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
  loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
  loaderScript.crossOrigin = "anonymous";
  loaderScript.async = true;
  document.head.appendChild(loaderScript);
</script>

3. Разверните сниппет

Разверните выбранный вами на Шаге 2 сниппет, используя один из следующих методов. Убедитесь, что SDK загружается только один раз при каждой загрузке страницы.

Вариант A: Добавьте непосредственно на ваш сайт

Повторите это на всех страницах:

  1. В сниппете из Шага 2 замените WEB_DEV_KEY на ваш ID Web SDK (и YOUR_BANNER_KEY, если применимо).
  2. Вставьте сниппет ближе к началу тега вашего сайта.

Вариант B: Разверните через Google Tag Manager (GTM)

Убедитесь, что SDK загружается лишь один раз за каждую загрузку страницы и настройте его так, чтобы он запускался сразу после загрузки страницы, используя приоритизацию в Google Tag Manager.

  1. Открыть Google Tag Manager.
  2. Создать новый тег для веб-SDK AppsFlyer.
  3. Выберите тип тега Пользовательский HTML.
  4. Присвойте тегу понятное название.
  5. Вставьте сниппет из Шага 2 в Конфигурации тега.
  6. Нажмите Сохранить.
  7. Добавьте триггер:
    • Для всех страниц:
      1. Нажмите Добавить триггер.
      2. Выберите Все страницы.
      3. Нажмите Сохранить.
      4. Введите имя тега, затем нажмите Сохранить.
    • Для конкретных страниц:
      1. Нажмите Сохранить тег.
      2. В главном окне GTM выберите Триггеры. Нажмите Новый.
      3. Нажмите на значок карандаша.
      4. Выберите тип триггера Просмотр страницы.
      5. Выберите Просмотр нескольких страниц.
      6. Настройте страницу и условия триггера по мере необходимости.
      7. Нажмите Сохранить.
      8. Свяжите триггер с тегом веб-SDK AppsFlyer.
        1. В главном окне GTM выберите Теги.
        2. Выберите тег, который вы создали ранее.
        3. В панели триггеров нажмите на иконку карандаша.
        4. Выберите триггер просмотра страницы, который вы создали ранее.
        5. Нажмите Сохранить.

Примечание

Пользовательские шаблоны GTM не поддерживаются для продвинутой проверки SDK, потому что их изолированная среда не позволяет установить атрибут integrity, необходимый для верификации. Вместо этого используйте тип тега Пользовательский HTML.

Вариант С: Разверните через Adobe Launch Tag Manager

Создание свойства в Adobe Experience Cloud

  1. Перейдите в раздел Adobe Experience Cloud >Запустить.
  2. В разделе Adobe Experience Cloud Launch нажмите Перейти к запуску.
  3. Нажмите Новое свойство.
  4. Присвойте свойству название.
  5. В разделе Платформа выберите Веб.
  6. Укажите домен своего сайта.
  7. Нажмите Сохранить.

Добавьте сниппет в свойство Adobe Launch

  1. На странице Свойства сайта выберите вкладку Правила .
  2. Дайте правилу название. Рекомендуется: Загрузите веб-SDK.
  3. В разделе ЕСЛИ под пунктом СОБЫТИЯ нажмите Добавить.
    • В разделе Тип события выберите Основное, с поддержкой DOM.
    • Нажмите Сохранить изменения.
  4. В разделе ТОГДА в пункте Действия нажмите Добавить.
    • В разделе Тип действия выберите Пользовательский код.
    • Выберите JavaScript > Открыть редактор и вставьте сниппет из Шага 2 (без строк-оберток).
    • Нажмите Сохранить изменения, чтобы закрыть редактор кода.
  5. Нажмите Сохранить.

Добавьте тег Adobe Launch на сайт

  1. На странице Свойства сайта выберите вкладку Среды.
  2. Найдите строку со средой, которую вы хотите опубликовать (разработка или рабочая).
  3. В колонке Установка нажмите на иконку коробки в соответствующей строке.
  4. В диалоговом окне Инструкции по установке на веб-сайте скопируйте фрагмент кода скрипта и закройте диалоговое окно.
  5. Вставьте фрагмент кода в раздел <head> сайта.

Опубликуйте окружение Adobe Launch

  1. На странице Мой веб-ресурсвыберите вкладку Публикация .
  2. В разделе Разработка нажмите Добавить новую библиотеку.
    • Назовите библиотеку и выберите среду.
    • В пункте Изменения ресурсов нажмите Добавить ресурс.
    • Нажмите Правила  > Загрузить веб-SDK > ПоследниеВыбрать и создать новую редакцию .
    • Нажмите Сохранить.
  3. В разделе Разработка:
    • Рядом с только что созданной библиотекой откройте меню действий (3 точки) и выберите Создать сборку для разработки.
    • Снова откройте меню действий и выберите опцию Отправить на утверждение.
  4. В разделе Отправленные:
    • Откройте меню действий и выберите опцию Собрать для стейджинга.
    • Снова откройте меню действий и выберите опцию Утвердить для публикации.
  5. В разделе Утвержденные:
    • Откройте меню действий выберите опцию Собрать и выложить в продакшн.

2. Убедитесь, что SDK работает

После установки проверьте, что SDK отправляет запросы, проверив сетевые запросы в инструментах разработчика вашего браузера.

Скриншот DevTools

Чтобы убедиться, что SDK работает, выполните следующие шаги:

  1. Откройте веб-сайт.
  2. Откройте инструменты разработчика в браузере.
  3. Перейдите на вкладку (A) Сеть
  4. Обновите страницу.
  5. Фильтровать по (B) appsflyer. Может появиться два запроса:
    • Загрузчик SDK — URL запроса начинается с https://websdk.appsflyersdk.com. Это подтверждает, что скрипт SDK загружен правильно.
    • Данные события — URL запроса начинается с https://wa.appsflyer.com/events. Это подтверждает, что SDK отправляет данные событий в AppsFlyer.
  6. Выберите сообщение (C) события (вызов wa.appsflyer.com).
  7. В разделе Заголовки (D) убедитесь, что:
    • URL запроса начинается с https://wa.appsflyer.com/events?site-id=.
    • site_id параметры запроса = WEB_SDK_KEY.
    • Код статуса 200.
  8. Проверьте, что site_id соответствует WEB_SDK_KEY в AppsFlyer > верхнее меню > Мои приложения.
  9. Убедитесь, что пакет SDK загружается только один раз. Многократная загрузка SDK может привести к тому, что SDK перестанет работать.

3. Установите и запишите события

После инициализации Web SDK вы можете перейти от измерения базовых посещений к захвату конкретных действий пользователей. В этом разделе показано, как задавать и регистрировать пользовательские события, такие как покупки или регистрации, с использованием либо нативного JavaScript, либо Google Tag Manager.

Задать события

События являются основными строительными блоками веб-измерений, представляя собой конкретные действия пользователей, которые имеют ценность для вашего бизнеса. Чтобы записать эти взаимодействия, вы должны определить логику и параметры для каждого события, убедившись, что правильные параметры события, такие как доход и пользовательские метаданные, передаются на платформу AppsFlyer.

Пример события (событие покупки с сопутствующим доходом)

AF('pba', 'event', {eventType: 'EVENT', eventName: 'purchase', eventRevenue: 12, eventValue: {"key1": 123, "key2": "name"}});

Таблица параметров событий Web SDK

Название параметра Обязательный Описание
eventType Да Тип события Формат: Строка. Всегда заполняйте этот параметр значением EVENT.. Пример: eventType: "EVENT"
eventName Да Название события Формат: Строка. Пример: Покупка, подписка
eventRevenue Нет Доход, присвоенный событию конверсии Формат: Число с плавающей запятой
eventRevenueCurrency Нет Валюта выручки Код валюты по ISO 4217 из трех символов По умолчанию: USD Формат: Строка
eventValue Нет Сопоставление параметров события, описывающих событие. Используйте этот параметр, чтобы передавать расширенные события внутри приложения, например артикул товара и цену позиции. Формат: JSON Пример: {"sku": "ABC123", "color": "blue", "unit_price": 3.99, "currency": "USD"}Ограничение: 1000 символов. Не превышайте этого значения, оно будет усечено.

Записывайте события при загрузке страницы

Это стандартный подход для конверсий, которые заканчиваются перенаправлением, например, на странице Спасибо или подтверждения.

Вы можете реализовать этот триггер, добавив метод загрузки окна в ваш нативный JavaScript или настроив триггер просмотра страницы в Google Tag Manager.

Предупреждение

Приведённые ниже примеры кода предназначены только для иллюстрации. Не используйте этот код в таком виде; адаптируйте его к конкретной структуре вашего сайта.

Пример: Запишите событие через AF Web SDK

Этот подход идеален для записи конверсий, которые происходят через перенаправления, такие как страница "Спасибо" для подписки на рассылку.

Пример: Пользователь завершает регистрацию на рассылку и перенаправляется на страницу подтверждения. Вы хотите записать событие подписки, как только эта страница станет видимой.

Пример загрузки нативной страницы:

window.onload = function(){
  AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category': 'holiday_promotion'}, eventName: 'subscription'});
}

Как это работает:

  1. Страница загружает необходимый контент.
  2. Как только окно полностью загружено (window.onload), скрипт автоматически вызывает метод AF().
  3. Событие подписки, вместе с его сопутствующими метаданными (категория и метка), отправляется напрямую в AppsFlyer.

Пример: Запишите событие через GTM

Этот подход используется для записи успешных конверсий, таких как подписка на рассылку, путем срабатывания тега, когда загружается страница "Спасибо".

1. Создайте страницу «Спасибо»

Следующая структура HTML загружает GTM, который, в свою очередь, загружает Web SDK. Она также демонстрирует, как данные могут быть доступны для GTM через функции или localStorage.

<html>
<head>
    <script>
        // Google Tag Manager loads the Web SDK
        (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
        new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
        j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
        'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
        })(window,document,'script','dataLayer','GTM-XXXX');
    </script>
    <script>
        function getResponseFromServer() {
            return JSON.stringify({ action: 'subscribe', category: 'site actions', label: userEmail })
        }
        localStorage.setItem('data', JSON.stringify({ action: 'subscribe', category: 'site actions', label: 'user@email.com' }));
    </script>
</head>
<body>
    <h1>Thank You for Subscribing to Our Newsletter</h1>
</body>
</html>

2. Настройте тег GTM

  1. Создайте новый тег в GTM и выберите тип тега Пользовательский HTML.
  2. Укажите уникальное имя (например, "Событие подписки AF").
  3. Вставьте следующий скрипт в текстовое поле HTML:

    AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'subscription'});
  4. Разверните Расширенные настройки > Последовательность тегов. Убедитесь, что он настроен на срабатывание после основного тега инициализации Web SDK.
  5. Установите триггер для этого тега, чтобы он срабатывал при Просмотре страницы вашей страницы "Спасибо".

Записывайте события при взаимодействии пользователя.

Используйте это для отслеживания действий без перезагрузки страницы (нажатия кнопок, загрузок, добавления в корзину).

Обычно такие взаимодействия обрабатываются либо привязкой обработчика клика к нативному элементу HTML, либо с помощью переменных Google Tag Manager для идентификации и измерения конкретных идентификаторов элементов или CSS селекторов.

Предупреждение

Приведённые ниже примеры кода предназначены только для иллюстрации. Не используйте этот код в таком виде; адаптируйте его к конкретной структуре вашего сайта.

Пример: Запишите событие через AF Web SDK

Используйте этот метод для отслеживания конкретных действий, которые пользователи выполняют на странице, таких как нажатие кнопки Оформить заказ или Скачать.

Пример: Вы управляете сайтом электронной коммерции и хотите зафиксировать событие оформления заказа в момент, когда пользователь нажимает кнопку Оформить заказ в своей корзине.

Пример нативного взаимодействия пользователя:

<html>
<head>
    <script>
        window.onload = function () {
            document.getElementById('checkout').addEventListener('click', function () {
                AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'checkout'});
            });
        }
    </script>
</head>
<body>
    <h1>Shopping Cart</h1>
    <button id='checkout'>Checkout</button>
</body>
</html>

Как это работает:

  1. Когда страница загружается, скрипт привязывает обработчик событияклика к элементу с идентификатором checkout.
  2. Когда пользователь нажимает кнопку, вызывается функция-обработчик обратного вызова.
  3. Функция может извлекать соответствующие данные (например, из localStorage) и передавать их в метод AF().
  4. SDK затем передает событие оформления заказа на платформу AppsFlyer.

Пример: Запишите событие через GTM

Этот метод фиксирует конкретные действия, такие как нажатие кнопки Оформить заказ, используя встроенные переменные и триггеры GTM.

1. Настройка страницы оформления заказа

<html>
<head>
    <script>
        (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
        new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
        j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
        'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
        })(window,document,'script','dataLayer','GTM-XXXX');
    </script>
</head>
<body>
    <h1>Shopping Cart</h1>
    <button id='checkout'>Checkout</button>
</body>
</html>

2. Настройте переменные и триггеры GTM

  1. В GTM нажмите Переменные > Настроить и включите Элемент клика в списке встроенных переменных.
  2. Создайте новую переменную, определяемую пользователем (Тип: Все элементы).
  3. Создайте новый Триггер:
    • Тип триггера: Клик - Все элементы.
    • Этот триггер срабатывает на: Некоторые клики.
    • Условие Элемент клика соответствует CSS селектору #checkout.

3. Создайте тег взаимодействия

  1. Создайте новый тег Пользовательский HTML для действия «Оформление заказа».
  2. Вставьте скрипт взаимодействия:

    <script>
      AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'checkout'});
    </script>
  3. Назначьте триггер "Клик по оформлению заказа", который вы создали на предыдущем шаге.

Лучшие практики реализации событий

Чтобы обеспечить точность данных и успешную передачу, учитывайте следующие технические требования:

  • Порядок загрузки: Убедитесь, что тег функций Web SDK полностью загружен в области страницы до выполнения любых вызовов событий.
  • Форматирование данных: Не включайте специальные символы в значения событий. Например, используйте числовые значения для дохода, а не включайте символы валюты (используйте 10.50 вместо $10.50).
  • Ограничения строк: Делайте event_value строки лаконичными; значения длиннее 4000 символов будут обрезаны.

4. Установить идентификатор пользователя клиента

После внедрения измерения событий задайте постоянный идентификатор, чтобы связать веб-активность с другими платформами (мобильными, ПК, CTV), используя setCustomerUserId, и получить целостное представление о пути пользователя на всех платформах.

Ключевые правила

  • Последовательность: Используйте то же значение CUID, что и в ваших мобильных приложениях (см. мобильный setCustomerUserId для: iOS, Android, Unity).
  • Время: Вы можете отправить CUID на любом этапе (например, после входа в систему или регистрации). Установите CUID как можно раньше, как только у вас будет к нему доступ. В большинстве случаев это означает, что вам нужно подождать, пока пользователь пройдет идентификацию через вход или регистрацию.
  • Синтаксис: Отправьте значение как строку (в кавычках). Пример: AF('pba', 'setCustomerUserId', '663274')
  • Конфиденциальность: Не включайте персональные данные (PII), например адреса электронной почты или номера телефонов.

Пример: Установка CUID после регистрации (нативно)

Приведенный в этих примерах код предназначен только для ознакомления. Не используйте этот код в таком виде. Если вы не знаете, как использовать этот код, проконсультируйтесь со своим веб-разработчиком. 

Предположение: Web SDK загружается на странице перед отправкой события; не загружайте его снова.

Сценарий пользователя:

  • Пользователь регистрируется на вашем сайте.
  • Код сайта собирает данные пользователя и отправляет их на ваш сервер.
  • Сервер генерирует уникальный CUID для пользователя.
  • На странице «Спасибо» после регистрации вы запрашиваете у сервера новый CUID.
  • Используя ответ сервера, вы устанавливаете CUID AppsFlyer с помощью метода Web SDK setCustomerUserId().

Пример формы регистрации

Код ниже представляет собой простую форму регистрации. При отправке формы адрес электронной почты сохраняется в localStorage. Когда пользователь переходит на страницу «Спасибо», адрес электронной почты пользователя отправляется на сервер для получения уникального CUID для этого адреса.

<html>
<head>
    <script>
!function(t,e,n,s,a,c,i,o,p){t.AppsFlyerSdkObject=a,t.AF=t.AF||function(){
(t.AF.q=t.AF.q||[]).push([Date.now()].concat(Array.prototype.slice.call(arguments)))},
t.AF.id=t.AF.id||i,t.AF.plugins={},o=e.createElement(n),p=e.getElementsByTagName(n)[0],o.async=1,
o.src="https://websdk.appsflyersdk.com?"+(c.length>0?"st="+c.split(",").sort().join(",")+"&":"")+(i.length>0?"af_id="+i:""),
p.parentNode.insertBefore(o,p)}(window,document,"script",0,"AF","pba",{pba: {webAppId: "WEB_DEV_KEY"}})
    </script>
    <script>
        function storeUserEmail() {
            var userEmail = document.getElementById('email').value;
            localStorage.setItem('user_email', userEmail);
        }
    </script>
</head>
<body>
    <h1>Sign Up</h1>
    <form onsubmit="storeUserEmail()" action="/signup" method="post">
        <div><label>Name</label><input type="text" name="name" id="name"></div>
        <br/>
        <div><label>Email</label><input type="email" name="email" id="email"></div>
        <br/>
        <input type="submit" id="submit">
    </form>
</body>
</html>

Пример страницы благодарности

Код использует Fetch API. Он отправляет серверу адрес электронной почты, введенный пользователем. Предположим, что сервер создаёт пользователя с уникальным CUID во время регистрации; при отправке на сервер адреса электронной почты он возвращает этот уникальный CUID. Сервер отвечает уникальным CUID, и этот уникальный CUID является значением, передаваемым с помощью методаsetCustomerUserId.

<html>
<head>
    <script>
!function(t,e,n,s,a,c,i,o,p){t.AppsFlyerSdkObject=a,t.AF=t.AF||function(){
(t.AF.q=t.AF.q||[]).push([Date.now()].concat(Array.prototype.slice.call(arguments)))},
t.AF.id=t.AF.id||i,t.AF.plugins={},o=e.createElement(n),p=e.getElementsByTagName(n)[0],o.async=1,
o.src="https://websdk.appsflyersdk.com?"+(c.length>0?"st="+c.split(",").sort().join(",")+"&":"")+(i.length>0?"af_id="+i:""),
p.parentNode.insertBefore(o,p)}(window,document,"script",0,"AF","pba",{pba: {webAppId: "WEB_DEV_KEY"}})
    </script>
    <script>
        window.onload = function () {
            var userEmail = localStorage.getItem('user_email');
            fetch('users/' + userEmail).then(function (res) {
                res.text().then(function (id) {
                    console.log(id);
                    AF('pba', 'setCustomerUserId', id);
                });
            });
        }
    </script>
</head>
<body>
    <h1>Thank You for Signing Up!</h1>
</body>
</html>

Пример: Установка CUID после регистрации (Google Tag Manager)

  1. Настройка страницы регистрации.

    Пример кода ниже представляет собой простую форму регистрации. При отправке формы адрес электронной почты сохраняется в localStorage. Когда пользователь переходит на страницу «Спасибо», адрес электронной почты пользователя отправляется на сервер для получения уникального CUID для этого адреса.

    <html>
    <head>
        <script>
            (function (w, d, s, l, i) {
                w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
                var f = d.getElementsByTagName(s)[0], j = d.createElement(s),
                    dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true;
                j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
                f.parentNode.insertBefore(j, f);
            })(window, document, 'script', 'dataLayer', 'GTM-5VJ6C7R');
            function storeUserEmail() {
                var userEmail = document.getElementById('email').value;
                localStorage.setItem('user_email', userEmail);
            }
        </script>
    </head>
    <body>
        <h1>Sign Up</h1>
        <form onsubmit="storeUserEmail()" action="/signup" method="post">
            <div><label>Name</label><input type="text" name="name" id="name"></div>
            <br />
            <div><label>Email</label><input type="email" name="email" id="email"></div>
            <br />
            <input type="submit" id="submit">
        </form>
    </body>
    </html>
  2. Настройте страницу благодарности для пользователей, которые регистрируются: Код ниже представляет собой страницу благодарности с триггером GTM, который отправляет серверу адрес электронной почты, предоставленный пользователем в форме регистрации. Предположим, что при регистрации сервер создаёт пользователя с уникальным CUID; при отправке на сервер адреса электронной почты он возвращает этот уникальный CUID. Сервер отвечает уникальным CUID, который отправляется с помощью метода setCustomerUserId().

    <script>
        window.onload = function () {
            var userEmail = localStorage.getItem('user_email');
            fetch('users/' + userEmail).then(function (res) {
                res.text().then(function (id) {
                    console.log(id);
                    AF('pba', 'setCustomerUserId', id);
                });
            });
        }
    </script>
  3. Добавьте новый тег для атрибуции подписок после загрузки страницы благодарности.

  4. Дайте тегу отдельное имя и выберите тип тега Custom HTML.

    <script>
        var userEmail = localStorage.getItem('user_email');
        fetch('users/' + userEmail).then(function (res) {
            res.text().then(function (id) {
                console.log(id);
                AF('pba', 'setCustomerUserId', id);
            });
        });
    </script>
  5. Разверните Расширенные настройки и затем Последовательность тегов под текстовой областью и убедитесь, что конверсия настроена на срабатывание после выполнения тега.

  6. Установите триггер для тега конверсии, чтобы указать, когда тег конверсии должен срабатывать (в приведенном ниже примере он срабатывает при загрузке страницы благодарности).

5. Управление конфиденциальностью

После внедрения измерения событий вам может потребоваться ввести особые требования по безопасности и конфиденциальности, чтобы соответствовать внутренним стандартам организации или региональным нормам.

Согласие на отправку событий или отказ от нее

Вы можете контролировать измерение двумя способами:

Настройка начального состояния SDK (в сниппете)

Определяет, будет ли SDK отправлять события сразу при загрузке веб-страницы или подождет, пока вы явно не укажете ему начать их отправку. Эта настройка задаётся в веб-сниппете.

  • Отправить события: {pba: {webAppId: "...", measurementStatus:true}}
  • Не отправлять события: {pba: {webAppId: "...", measurementStatus:false}}

Примечание

Если measurementStatus пусто или NULL, AppsFlyer рассматривает это так, как если бы measurementStatus:true.

Явный контроль

Явный контроль имеет приоритет над начальной настройкой состояния и использует постоянные собственные файлы cookie:

  • Устанавливается на домене сайта.
  • Истекает через период, установленный Web SDK или браузером.
  • Всегда зависит от настроек файлов cookie в браузере.

Команды

  • Начать отправлять события (согласие): window.AF_SDK.PLUGINS.PBA.enableMeasurement()
  • Прекратить отправлять события (отказ): window.AF_SDK.PLUGINS.PBA.disableMeasurement()

Защита и фильтрация данных

Если ваш веб-сайт требует строгих протоколов безопасности или конфиденциальности данных, используйте следующие механизмы для настройки взаимодействия Web SDK с вашей средой и вашими данными.

Политика безопасности контента (CSP)

Если ваш веб-сайт требует, чтобы JavaScript был защищен CSP, Web SDK поддерживает два подхода в зависимости от вашей конфигурации CSP и фрагмента, который вы выбрали на шаге 2.

  • CSP с использованием 'self': Добавьте https://websdk.appsflyersdk.com в ваш script-src белый список. Это работает как для стандартного Web SDK, так и для расширенной проверки SDK.
  • CSP с использованием nonce: Если ваша политика использует script-src 'nonce-...', используйте вариант расширенной проверки SDK с nonce ниже. Это передает nonce всем трем тегам скриптов, которые требуются для процесса проверки. Замените {{CSP_NONCE}} на сгенерированное сервером (для каждого запроса) значение nonce.

Таблица ниже показывает, какие политики CSP совместимы с вариантом с расширенным nonce.

Политика Работает Примечания
script-src 'self' Нет Внешний CDN-источник не разрешен; встроенный скрипт также заблокирован.
script-src 'self' https://websdk.appsflyersdk.com Частичный Разрешает загрузчик и SDK, но встроенный скрипт настройки все еще заблокирован.
script-src 'nonce-...' https://websdk.appsflyersdk.com Да Nonce охватывает встроенный скрипт и загрузчик; тег SDK получает nonce, переданный загрузчиком.
script-src 'nonce-...' 'strict-dynamic' Да (рекомендуется) Nonce охватывает встроенный скрипт и загрузчик; strict-dynamic передает доверие динамически внедренному тегу SDK. CDN-источник не требуется в белом списке.
Совместимость политики CSP

Расширенная проверка SDK с фрагментами CSP nonce

Без смарт-баннеров

<script nonce="{{CSP_NONCE}}">
  // Queue — buffers AF() calls until the SDK is ready
  window.AppsFlyerSdkObject = "AF";
  window.AF = window.AF || function() {
    (window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
  };
  window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" } };
  window.AF.plugins = {};

  // Manifest loader config — nonce forwarded to the injected SDK <script> tag
  window.AF_LOADER_CONFIG = {
    baseUrl: "https://websdk.appsflyersdk.com",
    plugins: ["pba"],
    nonce: "{{CSP_NONCE}}"
  };

  // Inject manifest loader
  var loaderScript = document.createElement("script");
  loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
  loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
  loaderScript.crossOrigin = "anonymous";
  loaderScript.nonce = "{{CSP_NONCE}}";
  loaderScript.async = true;
  document.head.appendChild(loaderScript);
</script>

Со смарт-баннерами

<script nonce="{{CSP_NONCE}}">
  // Queue — buffers AF() calls until the SDK is ready
  window.AppsFlyerSdkObject = "AF";
  window.AF = window.AF || function() {
    (window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
  };
  window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" }, banners: { key: "YOUR_BANNER_KEY" } };
  window.AF.plugins = {};

  // Manifest loader config — nonce forwarded to the injected SDK <script> tag
  window.AF_LOADER_CONFIG = {
    baseUrl: "https://websdk.appsflyersdk.com",
    plugins: ["banners", "pba"],
    nonce: "{{CSP_NONCE}}"
  };

  // Inject manifest loader
  var loaderScript = document.createElement("script");
  loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
  loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
  loaderScript.crossOrigin = "anonymous";
  loaderScript.nonce = "{{CSP_NONCE}}";
  loaderScript.async = true;
  document.head.appendChild(loaderScript);
</script>

Отбрасывать параметры запроса

Если ваши параметры запроса URL содержат конфиденциальную информацию, укажите AppsFlyer отбрасывать их (URL, рефереры и header_referer).

  • Отбрасывать все параметры запроса: добавьте af_url=true
  • Отбрасывать конкретные параметры: используйте af_url_mask=param (разделяйте несколько параметров с помощью ;)

Пример:

  • Оригинал: param1=value1&param2=value2&param3=value3&af_url_mask=param2;param3
  • Результат:param1=value1&af_url_mask=param2;param3

Справочник файлов cookie Web SDK

Web SDK устанавливает или использует следующие файлы cookie:

Название файла cookie  Домен Срок действия Когда применяется Подробности
afUserid Домен вашего сайта 395 дней Страницы без AMP Идентифицирует пользователя в контексте загрузки веб-страницы и событий навигации.
AF_SYNC Домен вашего сайта 1 неделя Страницы без AMP Указывает, что установлен окончательный идентификатор пользователя. Используется для уменьшения времени загрузки сайта.
af_id appsflyer.com 395 дней Обычные мобильные страницы (не AMP) при разрешённых сторонних cookie Идентифицирует пользователя в контексте событий запуска приложения и навигации
af_id onelink.me 395 дней Обычные мобильные страницы (не AMP) при разрешённых сторонних cookie Ссылки связывают взаимодействия с баннерами, взаимодействия OneLink или оба этих типа с событиями запуска приложения.
amp-afUserid AMP CDN или домен вашего сайта 1 год Ускоренные мобильные страницы (AMP)
AF_DEFAULT_MEASUREMENT_STATUS Домен вашего сайта 395 дней Страницы без AMP Хранит состояние согласия. Блокирует работу SDK до тех пор, пока пользователь не даст согласие. По умолчанию не установлено. Используется только когда механизм согласия настроен.