Adset.ProAdset.ProKnowledge base
Home/Навчальні матеріали/Як працює роутинг трафіку в кампаніях

Як працює роутинг трафіку в кампаніях

Що таке роутинг і навіщо він потрібен

Роутинг — це механізм, який вирішує, що показати кожному конкретному користувачу, який клікнув по трекінговому посиланню.

Бізнес-завдання роутингу:

  • Гео-розподіл: ллєш з 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

Параметри події трекера

user_country, user_device, user_os, user_browser, user_lang, user_bot

HEADERS

HTTP-заголовки запиту

accept-language, user-agent (сирі значення)

QUERY

GET-параметри URL

utm_source, utm_campaign, fbclid, sub1..10, ext_click_id

DATE

Час і дата кліка

Дні тижня, години (тимчасовий розклад)

DATA

Дані з зовнішніх джерел

IP, регіон, ASN-організація, проксі-тип

Оператори фільтрів

Оператор

Логіка

Приклад

IN

Значення входить у список

user_country IN [UA, KZ, UZ]

NOT_IN

Значення НЕ входить у список

user_country NOT_IN [US, GB]

BETWEEN

В діапазоні (для чисел/часу)

hour BETWEEN [9, 21]

EXIST

Поле існує і не порожнє

fbclid EXIST (є мітка від FB)

NOT_EXIST

Поле відсутнє

fbclid NOT_EXIST

Практичні приклади фільтрів

Тільки мобільний 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

Тип

Як працює

Коли використовувати

NONE

Клік без роутингу отримує 404

Коли немає необхідності в фільтрації

URL

Редирект 302 на зовнішній URL

Простий варіант: посилання на нейтральний сайт

SYSTEM

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 → Chrome

  • iOS → 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-мережа (обов'язково)

offer

Офер всередині CPA-мережі (обов'язково)

flow

Потік (Flow) в CPA-мережі — URL офера

pwa

Прив'язане PWA (опціонально)

pwaType

Тип PWA: internal (конструктор Adset.Pro) / external (зовнішній сервіс) / ios_app

landing

Прив'язаний лендинг (опціонально)

landingAsPwa

Використовувати лендинг в режимі PWA (без окремої PWA-сторінки)

postlanding

Сторінка після PWA-підписки, перед редиректом на офер

weight

Вага потоку (default 100)

isActive

Активний чи потік (default true)

Sticky Flow (прилипаючий потік)

Sticky Flow вирішує важливу проблему A/B тестування: один користувач не повинен бачити два різних варіанти.

Як працює:

  • При першому візиті трекер вибирає Flow (за фільтрами і вагами)

  • Вибір зберігається в cookie sf_{campaignId} (формат: setId:flowId[:clickId])

  • При повторному візиті трекер читає cookie і віддає той же Flow

  • Cookie має практично безкінечний термін життя

Налаштування Sticky Flow:

Параметр

Що робить

stickyFlow

Включає/вимикає Sticky Flow

stickyFlowKeepClickId

Зберігає вихідний clickId в cookie — повторний візит отримує той же clickId для атрибуції

stickyFlowSkipInactive

Якщо true — використовує збережений Flow навіть якщо він деактивований (isActive = false). Якщо false — скине cookie і перераховує Flow

Коли включати:

  • A/B тест двох PWA-дизайнів — один користувач не повинен бачити обидва

  • Тест двох оферів — щоб коректно порівнювати LTV

  • Коли важлива консистентність досвіду користувача


A/B тестування

Покроковий сценарій A/B тесту двох PWA:

  1. Створи кампанію з одним Stream Set

  2. Додай два Flow з вагами 50/50 (вага 100 і 100):

    • Flow А → PWA-1 (дизайн «бонус») → CPA-1 → Офер-1

    • Flow В → PWA-2 (дизайн «ігри») → CPA-2 → Офер-2

  3. Включи Sticky Flow — щоб користувач бачив тільки один варіант

  4. Запусти трафік з одного джерела

  5. Чекай мінімум 100+ установок на кожен Flow (чим більше — тим точніше результат)

  6. Порівняй метрики в статистиці з 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. Корисно для динамічної прив'язки пікселів без зміни кампанії.


Як трекер обробляє клік: крок за кроком

  1. Приходить клік по трекінговому посиланню кампанії

  2. Трекер генерує event_click_id (UUID), визначає параметри: країна, пристрій, user-agent, IP, ASN, проксі

  3. In-app WebView check: Якщо клік з WebView (FB/Instagram/TikTok/Telegram) — віддає Bridge Page для кика у зовнішній браузер

  4. Перевіряє Sticky Flow cookie (sf_{campaignId}):

    • Cookie є → відновлює збережений Flow (і clickId якщо stickyFlowKeepClickId)

    • Cookie немає → переходить до фільтрів

  5. Застосовує bot-фільтрацію

  6. Послідовно перевіряє Stream Sets зверху вниз (applySetFilters)

  7. Знаходить перший підходящий Stream Set (всі фільтри співпали за режимом AND/OR)

  8. Всередині Stream Set вибирає Flow за вагами (pickWeighted)

  9. Зберігає Sticky Flow cookie (якщо включений)

  10. Фіксує подію SOURCE_CLICK з повними параметрами кампанії

  11. Редиректить користувача: Лендинг → 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 для цього трафіку?

Типові причини:

  1. Порядок Stream Sets — інший Stream Set вище по списку перехоплює трафік (перевір пріоритет)

  2. Режим AND не співпадає — одна з умов AND не виконана. Приклад: фільтр вимагає user_device = mobile, а прийшов десктоп

  3. Неправильні значення — фільтр user_country IN [UK] не спрацює для GB (ISO-код Великобританії = GB, не UK)

  4. Фільтр 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.