Meta Ads · UTM атрибуция и Pixel
Что прописать в каждом объявлении Meta Ads, чтобы воронка видела источник каждого лида до уровня кампания × ад-сет × креатив. Плюс настройка Pixel и Conversion API.
Аудитория: медиабайер/маркетолог, настраивающий рекламу. Этот документ — единственное, что нужно открыть при создании кампании.
⚙️ Технический as-built CAPI и Pixel-стека (May 2026) —
24-tracking-runbook.md. Раздел “Conversion API (CAPI)” ниже описывал план; runbook описывает уже задеплоенную реализацию (Make scenario id 4743595, 3 HTTP-модуля, backfill-скрипт, верификация).
1. Что ловит наша воронка (что приходит в payload)
Каждая заявка приходит на Make webhook с этим набором:
| Поле в payload | Откуда берётся | Пример |
|---|---|---|
attribution.utm_source | URL-параметр ?utm_source= | facebook |
attribution.utm_medium | URL-параметр ?utm_medium= | paid_social |
attribution.utm_campaign | URL-параметр ?utm_campaign= | bp-kz-cold-stage1 |
attribution.utm_content | URL-параметр ?utm_content= | ad-vid-objection-15s |
attribution.utm_term | URL-параметр ?utm_term= | adset-realestate-women-30-45 |
attribution.fbclid | Meta добавляет авто | IwAR... |
attribution.gclid | Google Ads добавляет авто (не нужно для Meta) | — |
attribution.yclid | Яндекс Директ добавляет авто | — |
tier | Из лендинга (/ = standard, /vsl = vip, etc.) | standard |
country | Из лендинга (/kg* = KG, остальное = KZ) | KZ |
variant_id | Стабильный id лендинга для A/B | home |
→ Всё это первое касание (first-touch merge): если человек переходит по рекламе, а потом ходит по сайту, его исходные UTM не теряются.
2. URL-параметры — что вставлять в каждое объявление
В Meta Ads Manager у каждого объявления есть поле «URL parameters» (на уровне Ad, не Campaign).
🟢 Рекомендуемый формат (вставить как есть)
utm_source={{site_source_name}}&utm_medium=paid_social&utm_campaign={{campaign.id}}&utm_content={{ad.id}}&utm_term={{adset.id}}
Что подставит Meta автоматически:
{{site_source_name}}→facebook/instagram/messenger/audience_network(в зависимости от того, где увидел объявление){{campaign.id}}→ ID кампании (стабильный, не меняется при ребрендинге названия){{adset.id}}→ ID ад-сета{{ad.id}}→ ID конкретного креативаfbclid→ Meta добавит автоматически в конец, не вписывать руками
Почему ID, а не имена ({{campaign.name}}):
- ID — стабильны навсегда; имена меняются ад-менеджерами и ломают историю
- ID не содержат кириллицы / пробелов / спецсимволов — не нужно URL-encode
- В отчётах Make/Sheet всё-равно строим JOIN на ID, имена тянем из Meta API при разборе
🟡 Альтернатива — читаемые имена
Если хочешь, чтобы в Slack-уведомлении сразу было понятно, какая кампания
сработала (а не 120203...), используй {{campaign.name}} — но только при
условии что имена кампаний латиницей и без пробелов:
utm_source={{site_source_name}}&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{adset.name}}
Тогда строго соблюдать соглашение по неймингу (см. ниже).
3. Соглашение по неймингу кампаний/ад-сетов/креативов
Если используешь {{*.name}}, держи имена в этом формате — иначе UTM придёт
сломанным.
Кампания
bp-{country}-{stage}-{tier}
country:kz/kgstage:cold(холодная аудитория) /warm(ретаргет) /lookalike/intereststier:standard/vip/exclusive/magnet
Примеры:
bp-kz-cold-standard— Казахстан, холодная, на/bp-kg-cold-vip— Кыргызстан, холодная, на/kg/vslbp-kz-warm-exclusive— Казахстан, ретаргет, на/exclusivebp-kz-cold-magnet— Казахстан, холодная, на/guide
Ад-сет
{icp}-{age}-{gender}
icp: ICP сегмент (напримерrealestate/services/wholesale/b2b)age:25-34/30-45/35-55gender:m/w/all
Примеры:
realestate-30-45-w— риелторы, 30-45 лет, женщиныservices-25-40-all— услуги, 25-40 лет, все
Креатив (Ad)
{format}-{hook}-{duration}s
format:vid/img/carouselhook: короткий ярлык крючка (objection/result/case/painloss)duration: для видео — секунды (15/30/45)
Примеры:
vid-objection-15s— видео про возражение, 15 секimg-case-static— статичная картинка с кейсомvid-result-30s— видео про результат
4. Карта «кампания → лендинг → tier»
| Кампания | Лендинг | tier (auto) | Mechanism |
|---|---|---|---|
bp-kz-cold-standard | https://x5.karada.kz/ | standard | quick-lead |
bp-kz-cold-vip | https://x5.karada.kz/vsl | vip | registration |
bp-kz-cold-exclusive | https://x5.karada.kz/exclusive | exclusive | application |
bp-kz-cold-magnet | https://x5.karada.kz/guide | lead_magnet | lead-magnet |
bp-kg-cold-standard | https://x5.karada.kz/kg | standard | quick-lead |
bp-kg-cold-vip | https://x5.karada.kz/kg/vsl | vip | registration |
bp-kg-cold-exclusive | https://x5.karada.kz/kg/exclusive | exclusive | application |
bp-kg-cold-magnet | https://x5.karada.kz/kg/guide | lead_magnet | lead-magnet |
(Стейджинг: karadabp.flowleads.dev для тестов перед запуском.)
5. Meta Pixel — настройка
Где живёт ID
src/config/analytics.ts→metaPixel.id- В сборке Pixel загружается через GTM (не отдельным скриптом), так что мы не катим деплой каждый раз когда меняется тег.
Что должно работать на старте
- PageView — авто (Meta базовый Pixel)
- ViewContent — на любом лендинге (
/,/vsl, …) - Lead — на
/thank-you(по событиюgenerate_lead) - CompleteRegistration — на
/thank-youеслиfunnel_mechanism == 'registration' - SubmitApplication — на
/thank-youеслиfunnel_mechanism == 'application' - InitiateCheckout — клик по апсейлу (
lead_upsellсобытие)
Все эти события уже летят в dataLayer — нужно только подцепить теги в GTM.
GTM конфигурация (что добавить)
| GTM Tag | Trigger | Pixel Event | Параметры |
|---|---|---|---|
| Meta · PageView | All Pages | PageView | — |
| Meta · ViewContent | All Pages | ViewContent | content_category={{tier}} content_name={{variant_id}} |
| Meta · Lead | DataLayer event generate_lead | Lead | value={{tier_price}} currency=KZT/KGS |
| Meta · CompleteReg | generate_lead + funnel_mechanism = registration | CompleteRegistration | — |
| Meta · Application | generate_lead + funnel_mechanism = application | SubmitApplication | predicted_ltv={{lead_score}} |
| Meta · Upsell | DataLayer event lead_upsell | InitiateCheckout | value={{delta_amount}} |
Custom Audiences для ретаргета (создать в Meta после первой недели трафика)
| Аудитория | Правило | Применение |
|---|---|---|
| Все посетители 30д | All site visitors | Базовый ретаргет |
| Видели VSL 30д | URL contains /vsl AND no Lead event | Видеошум ретаргет (только видео-формат) |
| Видели /exclusive не подали | URL contains /exclusive AND no Lead | Премиум-ретаргет на VIP-downsell |
| Лиды Стандарт 14д | Lead event AND tier=standard | VIP-апсейл ретаргет |
| Лиды VIP 14д | Lead event AND tier=vip | Exclusive-апсейл ретаргет (узкая) |
| Лиды любые 90д | Lead event | Исключить из всех cold-кампаний |
| Lookalike Лиды 1-3% | LAL от «Лиды любые 90д» | Scaling кампании (когда наберём 500+ лидов) |
Conversion API (CAPI) — серверная отправка
Когда подключим: после подтверждения работы пиксель-side (1-2 дня после запуска).
Архитектура:
Form submit → Make webhook → [новый HTTP-модуль] →
POST https://graph.facebook.com/v19.0/{pixel_id}/events
user_data: { em: sha256(email), ph: sha256(phone), fbc: fbclid... }
custom_data: { value, currency, content_category }
event_id: {{submission_id}} ← дедуп с пиксель-событием
Что нужно:
pixel_id(тот же что в GTM)access_token— Meta Events Manager → Settings → Conversions API → Generate access token- В Make добавим один HTTP-модуль, шлющий это параллельно с Slack/Sheet.
Дедуп: клиентский пиксель и CAPI шлют одно событие с одинаковым
event_id (= наш submission_id). Meta дедуплицирует — Lead будет один,
но если пиксель потерян (iOS 14+, adblock) — CAPI всё равно сработает.
6. Тестовые UTM-ссылки (для QA)
Дай команде эти ссылки — каждая проверяет один сегмент атрибуции.
# Стандарт · KZ · все UTM заполнены
https://karadabp.flowleads.dev/?utm_source=facebook&utm_medium=paid_social&utm_campaign=qa-kz-cold-standard&utm_content=qa-ad-1&utm_term=qa-adset-1
# VIP · KZ · с fbclid
https://karadabp.flowleads.dev/vsl?utm_source=facebook&utm_medium=paid_social&utm_campaign=qa-kz-cold-vip&utm_content=qa-ad-2&utm_term=qa-adset-2&fbclid=IwAR_test_fbclid_123
# Exclusive · KZ
https://karadabp.flowleads.dev/exclusive?utm_source=facebook&utm_medium=paid_social&utm_campaign=qa-kz-cold-exclusive&utm_content=qa-ad-3&utm_term=qa-adset-3
# Lead-magnet · KZ
https://karadabp.flowleads.dev/guide?utm_source=facebook&utm_medium=paid_social&utm_campaign=qa-kz-cold-magnet&utm_content=qa-ad-4&utm_term=qa-adset-4
# Стандарт · KG (другой регион)
https://karadabp.flowleads.dev/kg?utm_source=facebook&utm_medium=paid_social&utm_campaign=qa-kg-cold-standard&utm_content=qa-ad-5&utm_term=qa-adset-5
# Без UTM (direct/organic — проверяем что не ломается)
https://karadabp.flowleads.dev/
После каждой подачи формы — открой Google Sheet (Leads tab), последняя строка должна содержать UTM_source/medium/campaign и т.д.
7. Чек-лист перед запуском кампаний
- Pixel ID получен и вставлен в
analytics.ts(или GTM-переменную) - GTM-теги Meta созданы (Lead, ViewContent — минимум)
- В каждом объявлении прописан URL parameters по шаблону
- Имена кампаний/ад-сетов/креативов по соглашению
- Тестовая ссылка проходит до Sheet с правильным UTM
- Пиксель видит события в Meta Events Manager → Test Events
- CAPI access token получен (опционально для старта, обязательно через неделю)