Як працює роутинг трафіку в кампаніях
Що таке роутинг і навіщо він потрібен
Роутинг — це механізм, який вирішує, що показати кожному конкретному користувачу, який клікнув по трекінговому посиланню.
Бізнес-завдання роутингу:
Гео-розподіл: ллєш з 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.
