Как работает роутинг трафика в кампаниях
Что такое роутинг и зачем он нужен
Роутинг — это механизм, который решает, что показать каждому конкретному пользователю, кликнувшему по трекинговой ссылке.
Бизнес-задачи роутинга:
Гео-распределение: льёшь из FB на EU и LATAM — нужно европейский трафик слать на оффер 1win, а LATAM — на mostbet
A/B тестирование: два креатива или два PWA-дизайна — нужно 50/50 split и Sticky Flow чтобы один пользователь не видел оба варианта
Защита от модерации: модераторы FB/Instagram кликают по объявлениям — их нужно отправить на безобидный White Page
Оптимизация по устройствам: Android → PWA с установкой, iOS → отдельная воронка (или external PWA / iOS App)
Бот-фильтрация: отсечь ботов и прокси ещё до передачи click_id партнёрке
Пример: Запускаешь кампанию из FB. Создал два Stream Set: первый — для мобильного Android трафика из целевых GEO (PWA + оффер 1win), второй — для десктопа (лендинг + оффер parimatch). Всё остальное (боты, модераторы, нецелевые страны) уходит на White Page.
Архитектура кампании
Кампания в Adset.Pro состоит из нескольких уровней:
Кампания (Campaign)
├─ Трекинговая ссылка: https://domain.com/track/{campaignId}
├─ Sticky Flow (on/off)
├─ White Page (none / url / system)
│
└─ Stream Set #1 (набор фильтров + потоки)
│ ├─ Фильтры (applyMode: AND / OR)
│ │ ├─ user_device = mobile
│ │ ├─ user_os = Android
│ │ └─ user_country IN [UA, KZ, UZ]
│ ├─ Пиксели (FB CAPI, TikTok)
│ └─ Потоки (Flows):
│ ├─ Flow 1 (вес 70) → PWA-1 → CPA-1 → Оффер-А
│ └─ Flow 2 (вес 30) → PWA-2 → CPA-2 → Оффер-Б
│
└─ Stream Set #2 (другие фильтры)
├─ Фильтры: user_device = desktop
└─ Потоки:
└─ Flow 1 (вес 100) → Landing → CPA-3 → Оффер-В
Трекинговая ссылка кампании — единый URL для источника трафика. Трекер сам решает, в какой flow направить каждый клик.
Stream Sets: наборы правил
Stream Set — набор фильтров + список потоков. Кампания может содержать несколько Stream Sets.
Когда приходит клик, трекер проверяет Stream Sets сверху вниз (по приоритету) и применяет первый подходящий. Если ни один Stream Set не подошёл — клик уходит на White Page.
Режимы работы фильтров
Режим | Логика | Когда использовать |
|---|---|---|
AND | Все условия должны совпасть | Точный таргетинг (страна И устройство И источник) |
OR | Достаточно одного условия | Широкий охват (любая из перечисленных стран) |
Типы фильтров
Тип | Что фильтрует | Примеры ключей |
|---|---|---|
EVENT | Параметры события трекера |
|
HEADERS | HTTP-заголовки запроса |
|
QUERY | GET-параметры URL |
|
DATE | Время и дата клика | Дни недели, часы (временное расписание) |
DATA | Данные из внешних источников | IP, регион, ASN-организация, прокси-тип |
Операторы фильтров
Оператор | Логика | Пример |
|---|---|---|
| Значение входит в список |
|
| Значение НЕ входит в список |
|
| В диапазоне (для чисел/времени) |
|
| Поле существует и не пустое |
|
| Поле отсутствует |
|
Практические примеры фильтров
Только мобильный Android трафик:
applyMode: AND
├─ user_device IN [mobile]
└─ user_os IN [Android]
Исключить ботов:
applyMode: AND
└─ user_bot IN [0]
Значение
user_bot="0"для людей,"1"для ботов. Важно: именно строка"0", неfalse.
Только FB трафик (есть fbclid):
applyMode: AND
└─ fbclid EXIST
Трафик из конкретных стран (OR):
applyMode: OR
├─ user_country IN [UA]
├─ user_country IN [KZ]
└─ user_country IN [UZ]
White Page: редирект для нецелевых кликов
White Page — специальный URL или встроенный сайт, на который перенаправляются клики, не прошедшие ни один из Stream Sets.
Зачем это нужно
Модераторы рекламных сетей (FB, TikTok) кликают по объявлениям при проверке → их нужно отправить на безобидный сайт
Боты и автоматические сканеры → White Page
Трафик из запрещённых регионов → White Page
Нецелевой трафик (десктоп когда нужна только мобилка) → White Page
Типы White Page в Adset.Pro
Тип | Как работает | Когда использовать |
|---|---|---|
| Клик без роутинга получает 404 | Когда нет необходимости в фильтрации |
| Редирект 302 на внешний URL | Простой вариант: ссылка на нейтральный сайт |
| HTML отдаётся inline с того же домена (через S3 + nginx) | Для модерации: URL не меняется, страница выглядит как обычный сайт |
Опция
disableTrackWhiteList: Если включена — событияSOURCE_FILTERдля кликов, ушедших на White Page, не записываются в ClickHouse. Полезно когда нужно исключить мусорный трафик из статистики.
Bridge Page: Для трафика из in-app WebView (FB/Instagram/TikTok/Telegram) трекер автоматически определяет WebView и отдаёт Bridge Page вместо PWA. Bridge Page кикает пользователя во внешний браузер:
Android →
intent://scheme → ChromeiOS →
x-safari-https://→ SafariЭто нужно потому, что in-app WebView видит DOM/redirect-цепочку PWA, что может триггернуть блокировку.
Потоки (Flows) и веса
Внутри Stream Set каждому потоку (Flow) назначается вес — число, определяющее долю трафика. По умолчанию вес = 100.
Пример:
Flow А — "1win оффер" — вес 70 → получает 70% кликов
Flow Б — "parimatch" — вес 30 → получает 30% кликов
Веса могут быть любыми числами — трекер автоматически нормализует их в проценты. Выбор Flow происходит случайно с учётом весов (pickWeighted).
Структура Flow
Каждый Flow содержит:
Параметр | Описание |
|---|---|
| Привязанная CPA-сеть (обязательно) |
| Оффер внутри CPA-сети (обязательно) |
| Поток (Flow) в CPA-сети — URL оффера |
| Привязанное PWA (опционально) |
| Тип PWA: |
| Привязанный лендинг (опционально) |
| Использовать лендинг в режиме PWA (без отдельной PWA-страницы) |
| Страница после PWA-подписки, перед редиректом на оффер |
| Вес потока (default 100) |
| Активен ли поток (default true) |
Sticky Flow (прилипающий поток)
Sticky Flow решает важную проблему A/B тестирования: один пользователь не должен видеть два разных варианта.
Как работает:
При первом визите трекер выбирает Flow (по фильтрам и весам)
Выбор сохраняется в cookie
sf_{campaignId}(формат:setId:flowId[:clickId])При повторном визите трекер читает cookie и отдаёт тот же Flow
Cookie имеет практически бесконечный срок жизни
Настройки Sticky Flow:
Параметр | Что делает |
|---|---|
| Включает/выключает Sticky Flow |
| Сохраняет исходный clickId в cookie — повторный визит получает тот же clickId для атрибуции |
| Если |
Когда включать:
A/B тест двух PWA-дизайнов — один пользователь не должен видеть оба
Тест двух офферов — чтобы корректно сравнивать LTV
Когда важна консистентность опыта пользователя
A/B тестирование
Пошаговый сценарий A/B теста двух PWA:
Создай кампанию с одним Stream Set
Добавь два Flow с весами 50/50 (вес 100 и 100):
Flow А → PWA-1 (дизайн «бонус») → CPA-1 → Оффер-1
Flow В → PWA-2 (дизайн «игры») → CPA-2 → Оффер-2
Включи Sticky Flow — чтобы пользователь видел только один вариант
Запусти трафик из одного источника
Жди минимум 100+ установок на каждый Flow (чем больше — тем точнее результат)
Сравни метрики в статистике с group by
cmp_flow:click_to_instal_rate— какой PWA лучше конвертируетcpa_accept— где больше депозитовltv_per_ftd— где пользователи приносят больше в долгосроке
Сколько тестировать:
Минимум 3-5 дней (чтобы захватить разные дни недели)
Минимум 100 установок на каждый вариант для базовой статистики
Для LTV-сравнения — минимум 2-4 недели (иначе D1-7 будет неполным)
Пиксели в Stream Sets
К каждому Stream Set можно привязать пиксели (Facebook CAPI, TikTok Events API, HTTP Get):
Пиксель срабатывает на определённые события (установка PWA, регистрация, депозит)
Поддерживаемые события:
LAND_VIEW,LAND_CLICK,PWA_VIEW,PWA_INSTALL,NOTIFICATION_SUBSCRIBE,CPA_HOLD,CPA_ACCEPT,CPA_REDEP,CPA_DECLINE,CPA_TRASHНастраивается маппинг: событие трекера → событие пикселя
Почему привязка на уровне Stream Set:
Разные источники трафика требуют разных пикселей (FB CAPI для FB-трафика, TikTok Events API для TikTok)
Один Stream Set = один источник = один пиксель — чисто и не конфликтует
Pixel Override через URL: Если в трекинговую ссылку добавить ?pixel=fb_pixel_id,tiktok_pixel_id, эти пиксели переопределят пиксели из настроек Stream Set. Полезно для динамической привязки пикселей без изменения кампании.
Как трекер обрабатывает клик: шаг за шагом
Приходит клик по трекинговой ссылке кампании
Трекер генерирует
event_click_id(UUID), определяет параметры: страна, устройство, user-agent, IP, ASN, проксиIn-app WebView check: Если клик из WebView (FB/Instagram/TikTok/Telegram) — отдаёт Bridge Page для кика во внешний браузер
Проверяет Sticky Flow cookie (
sf_{campaignId}):Cookie есть → восстанавливает сохранённый Flow (и clickId если
stickyFlowKeepClickId)Cookie нет → переходит к фильтрам
Применяет bot-фильтрацию
Последовательно проверяет Stream Sets сверху вниз (applySetFilters)
Находит первый подходящий Stream Set (все фильтры совпали по режиму AND/OR)
Внутри Stream Set выбирает Flow по весам (pickWeighted)
Сохраняет Sticky Flow cookie (если включён)
Фиксирует событие
SOURCE_CLICKс полными параметрами кампанииРедиректит пользователя: Лендинг → PWA → URL оффера (с paramTemplate)
Если ни один Stream Set не подошёл:
Фиксируется
SOURCE_FILTER(еслиdisableTrackWhiteList = false)Пользователь перенаправляется на White Page
Рекомендованные фильтры
Для Facebook-трафика
Stream Set #1 (основной):
applyMode: AND
├─ user_bot IN [0] ← исключить ботов
├─ user_device IN [mobile] ← только мобильный
├─ user_os IN [Android] ← Android (iOS обычно отдельной кампанией)
└─ fbclid EXIST ← только трафик с FB (есть fbclid)
Для TikTok-трафика
Stream Set #1:
applyMode: AND
├─ user_bot IN [0]
├─ user_device IN [mobile]
└─ ext_click_id EXIST ← есть внешний click_id от TikTok
Универсальный (anti-fraud)
Любой Stream Set:
├─ user_bot IN [0] ← люди
├─ user_proxy IN [0] ← без прокси (опционально)
└─ user_device IN [mobile] ← мобилка
Частые вопросы
Q: Почему один клик попал в "не тот" поток?
Если Sticky Flow выключен — это нормально. Распределение по весам — случайное. При весах 50/50 конкретный клик с равной вероятностью попадёт в любой Flow. Чтобы пользователь всегда попадал в один Flow — включи Sticky Flow. Проверить распределение можно через статистику с group by cmp_flow.
Q: Можно ли изменить веса потоков без остановки кампании?
Да. Изменения в Stream Sets применяются мгновенно — новые клики будут использовать обновлённые веса. Уже записанные события не меняются. Изменения делаются в настройках кампании → Stream Set → редактирование весов Flow.
Q: Почему трафик идёт на White Page, хотя я создал Stream Set для этого трафика?
Типичные причины:
Порядок Stream Sets — другой Stream Set выше по списку перехватывает трафик (проверь приоритет)
Режим AND не совпадает — одно из условий AND не выполнено. Пример: фильтр требует
user_device = mobile, а пришёл десктопНеправильные значения — фильтр
user_country IN [UK]не сработает дляGB(ISO-код Великобритании =GB, неUK)Фильтр EXIST не сработал — например
fbclid EXIST, а трафик не из FB
Q: Как сделать так чтобы бот не попал на оффер?
Добавь фильтр user_bot IN [0] (значение обязательно строка "0") во все Stream Sets. Adset.Pro определяет ботов через MaxMind + User-Agent анализ. Бот-клики будут уходить на White Page.
Q: Что такое landingAsPwa и когда использовать?
Если landingAsPwa = true, лендинг используется как PWA-страница — без отдельной PWA-конструкции. Пользователь видит лендинг, ему предлагается «Add to Home Screen», и после установки click_id передаётся на оффер. Удобно для быстрого запуска без создания отдельного PWA.
