Поток данных · где собираем что на каждом шаге
Визуальная карта: от клика по рекламе до сделки в amoCRM. На каждом
туч-поинте — что фиксируется, где хранится, куда передаётся. Если непонятно
«откуда у нас в Sheet оказался fbclid», ответ здесь.
Один взгляд на всё
┌─────────────────────────────────────────────────────────────────────┐
│ Meta Ads · KZ + KG │
│ URL parameters: utm_source / utm_medium / utm_campaign / │
│ utm_content / utm_term (+ fbclid auto) │
└─────────────────────────────────────┬───────────────────────────────┘
│ клик
▼
┌──────────────────────────────────────────────┐
│ Лендинг (8 вариантов × 2 региона) │
│ / /vsl /exclusive /guide /kg/* │
│ │
│ ─── На загрузке страницы (1 раз) ─── │
│ ◆ sessionStorage: utms × 5 │
│ ◆ sessionStorage: clickids (fb, g, y) │
│ ◆ sessionStorage: variant_id + experiment │
│ ◆ sessionStorage: session_id + landing_* │
│ ◆ localStorage: touch flag (first/return) │
│ ◆ GTM dataLayer: page_view + ab_variant │
│ ◆ Pixel: PageView (через GTM) │
│ ◆ Pixel: ViewContent (через GTM) │
└────────────────────┬─────────────────────────┘
│ скролл, клики
▼
┌─────────────────────────────────────────────────┐
│ Поведенческие события │
│ ◆ GTM: section_view (когда блок в viewport) │
│ ◆ GTM: scroll_depth (опционально) │
│ ◆ GTM: video_play / video_progress (на VSL) │
│ ◆ GTM: whatsapp_click │
└─────────────────────┬───────────────────────────┘
│ клик «Получить доступ»
▼
┌─────────────────────────────────────────────────┐
│ Открытие формы (click-pop modal) │
│ ◆ GTM: cta_click (cta_location, cta_label) │
│ ◆ GTM: form_view (форма попала во viewport) │
└─────────────────────┬───────────────────────────┘
│ начало заполнения
▼
┌─────────────────────────────────────────────────┐
│ Заполнение формы │
│ ◆ GTM: form_start (первый focus на поле) │
│ ◆ GTM: form_step (для multi-step / application)│
│ ◆ Валидация на стороне клиента (NAME_RE, │
│ EMAIL_RE, phone validator для +7/+996) │
│ ◆ Honeypot: hidden input `company_website` │
│ ◆ Cooldown check: 30 сек после прошлого submit │
└─────────────────────┬───────────────────────────┘
│ submit
▼
┌─────────────────────────────────────────────────────────┐
│ ConversionForm.handleSubmit() │
│ │
│ 1. scoreLead() для application — считает lead_score │
│ 2. qualified = (lead_score >= threshold) │
│ 3. storeOutcome() в sessionStorage (для /thank-you) │
│ 4. buildLeadPayload() — собирает JSON со всем │
│ 5. GTM: form_submit │
│ 6. submitLead() → POST на Make webhook │
│ 7. storeLastSubmission() — для one-click апсейла │
│ 8. GTM: form_success │
│ 9. redirect → /thank-you?v=...&sid=...&m=... │
└────────────────────────┬────────────────────────────────┘
│ POST https://hook.us1.make.com/...
▼
┌─────────────────────────────────────────────────────────┐
│ Make.com webhook (один URL) │
│ Router branches by event_type: │
│ ◆ default → Lead flow │
│ ◆ event_type == "upsell_click" → Upsell flow │
└────────────────────────┬────────────────────────────────┘
│ fan-out (параллельно)
┌───────────┬───────┴────────┬────────────┬───────────┐
▼ ▼ ▼ ▼ ▼
┌──────────┐ ┌─────────┐ ┌──────────────┐ ┌──────────┐ ┌────────────┐
│ Google │ │ Slack │ │ FlowLeads │ │ amoCRM │ │ Meta CAPI │
│ Sheet │ │ alert │ │ relay │ │ webhook │ │ POST event │
│ (Leads + │ │ (формат │ │ (HTTP) │ │ (NEW) │ │ (NEW) │
│ Upsells │ │ зависит │ │ │ │ │ │ dedup by │
│ tabs) │ │ от tier)│ │ │ │ │ │ event_id │
└──────────┘ └─────────┘ └──────────────┘ └──────────┘ └────────────┘
│
▼
Менеджер открывает Sheet или amoCRM →
видит контекст лида → звонит
│ redirect
▼
┌─────────────────────────────────────────────────────────┐
│ /thank-you │
│ Reads sessionStorage: │
│ ◆ kbp_session, kbp_outcome, kbp_last_submission │
│ ◆ kbp_utms, kbp_clickids, kbp_experiment │
│ │
│ ◆ GTM: generate_lead (ключевая конверсия) │
│ ◆ Pixel: Lead event (через GTM) │
│ ◆ Branching: показывает 1 из 5 блоков по mechanism + │
│ qualified flag │
│ │
│ Если quick-lead или registration: │
│ → виден one-click upsell CTA │
└────────────────────────┬────────────────────────────────┘
│ клик «Да, добавить VIP»
▼
┌─────────────────────────────────────────────────────────┐
│ src/scripts/upsell.ts │
│ 1. Читает kbp_last_submission (id + tier + name) │
│ 2. Собирает payload с event_type:"upsell_click", │
│ original_submission_id, tier_from, tier_to, │
│ delta_amount, delta_currency │
│ 3. POST на тот же Make webhook │
│ 4. GTM: lead_upsell │
│ 5. UI swap: кнопка → «✓ Принято, перезвоним» │
└─────────────────────────────────────────────────────────┘
Что фиксируется на каждом шаге (детально)
Шаг 1 · Клик по рекламе
| Что | Кто фиксирует | Где |
|---|
utm_source, utm_medium, utm_campaign, utm_content, utm_term | URL-параметры (Meta подставляет авто) | URL |
fbclid | Meta добавляет в URL автоматически | URL |
gclid | Google Ads (если будем) | URL |
yclid | Яндекс Директ (если будем) | URL |
Где они оседают: в sessionStorage сайта при первой загрузке через
src/conversion/attribution.ts → initAttribution().
Шаг 2 · Открытие лендинга (page_view)
| Что | Где |
|---|
variant_id (home / vsl / exclusive / guide / kg-*) | вшит в страницу при сборке |
experiment_id (karada-bp-2026q2) | константа в src/config/experiment.ts |
funnel_mechanism (quick-lead / registration / application / lead-magnet) | свойство страницы |
tier (standard / vip / exclusive / lead_magnet) | вычисляется из variant_id |
country (KZ / KG) | вычисляется из variant_id (kg-* → KG) |
session_id (UUID) | генерится один раз за сессию |
landing_path (/, /vsl…) | window.location.pathname |
referrer | document.referrer |
landing_timestamp (ISO) | момент захода |
touch (first-touch / second-touch) | по флагу в localStorage |
→ всё это идёт в sessionStorage одной транзакцией и в dataLayer
для GTM.
Шаг 3 · Поведение на странице
| Событие | Когда |
|---|
section_view | Когда секция (Hero, TrustBar, …) попадает в viewport |
cta_click | Любой клик на CTA с data-cta или data-modal-open |
whatsapp_click | Клик на WA-ссылку |
video_play / video_progress | На /vsl если есть видео |
Шаг 4 · Открытие формы
| Событие | Когда |
|---|
cta_click (cta_location: “hero”) | Клик на «Получить доступ» в hero |
Modal <dialog>.showModal() | Программно открывается |
form_view | Форма попадает в viewport (внутри modal) |
Шаг 5 · Заполнение формы
| Событие | Когда |
|---|
form_start | Первый focus на поле |
form_step (только для multi-step) | Переход на следующий шаг (для application) |
| Field validation (live) | На blur + на submit |
| Honeypot trigger | Если company_website field заполнен (бот) |
Шаг 6 · Submit
Что попадает в payload (полный JSON для Make):
{
"submission_id": "uuid-of-this-lead",
"session_id": "uuid-of-session",
"submitted_at": "2026-05-20T21:30:00.000Z",
"form_key": "karada_bp_lead",
"form_id": "modal", // или "hero" / "final" / "guide-modal"
"funnel_mechanism": "quick-lead", // или registration/application/lead-magnet
"funnel_step_reached": 1, // на каком шаге закончил
"tier": "standard", // standard/vip/exclusive/lead_magnet
"country": "KZ", // или KG
"lead": {
"name": "Иван Петров",
"phone": "+7 700 123 4567",
"email": "ivan@example.com",
"tier_interest": "vip", // если был выбор (registration)
"qualified": true, // только для application
"lead_score": 8 // только для application
},
"answers": { // mechanism-специфичные ответы
"niche": "Недвижимость",
"team_size": "10+",
"goal": "Удвоить продажи",
"urgency": "В течение недели"
},
"attribution": {
"experiment_id": "karada-bp-2026q2",
"variant_id": "home",
"tier": "standard",
"country": "KZ",
"utm_source": "facebook",
"utm_medium": "paid_social",
"utm_campaign": "120203456789",
"utm_content": "120203456790",
"utm_term": "120203456791",
"gclid": "",
"fbclid": "IwAR_actual_fbclid",
"yclid": "",
"landing_path": "/",
"page_path": "/",
"referrer": "https://www.instagram.com/",
"landing_timestamp": "2026-05-20T21:25:00.000Z",
"touch": "first-touch"
},
"meta": {
"site": "karada-bp",
"user_agent": "Mozilla/5.0 ...",
"screen": "1920x1080",
"honeypot_triggered": false
}
}
→ Один POST → один Make webhook → fan-out на 3-5 систем параллельно.
Шаг 7 · /thank-you
| Что | Откуда |
|---|
generate_lead событие в GTM | Из kbp_session + kbp_outcome |
Pixel Lead event | Через GTM-тег на generate_lead |
Pixel CompleteRegistration | Если mechanism = registration |
Pixel SubmitApplication | Если mechanism = application |
event_id для дедупа CAPI | = submission_id |
| Branching блок на странице | По funnel_mechanism + qualified |
| One-click upsell кнопка | Если mechanism = quick-lead или registration |
Шаг 8 · Upsell click (опционально)
| Что | Откуда |
|---|
Чтение kbp_last_submission | sessionStorage |
Новый submission_id для апсейл-события | crypto.randomUUID() |
original_submission_id | из kbp_last_submission.submission_id |
Payload с event_type: "upsell_click" | Собирается в upsell.ts |
| POST на тот же Make webhook | Make ветвит по event_type → Upsells tab |
lead_upsell event в GTM | С tier_from, tier_to, delta_amount |
Pixel InitiateCheckout | Через GTM |
| UI swap → confirmation pill | Кнопка disabled-ится, текст меняется |
Где живёт каждый кусок данных (storage map)
| Storage | Ключ | Содержит | Срок жизни |
|---|
sessionStorage | kbp_utms | 5 UTM-полей | Закрытие вкладки |
sessionStorage | kbp_clickids | gclid, fbclid, yclid | Закрытие вкладки |
sessionStorage | kbp_experiment | experiment_id, variant_id, funnel_mechanism | Закрытие вкладки |
sessionStorage | kbp_session | session_id, landing_path, referrer, landing_timestamp, touch | Закрытие вкладки |
sessionStorage | kbp_cooldown | timestamp последнего submit | Закрытие вкладки |
sessionStorage | kbp_outcome | qualified, lead_score, funnel_mechanism | Закрытие вкладки |
sessionStorage | kbp_last_submission | submission_id, tier, name, phone (для апсейла) | Закрытие вкладки |
localStorage | kbp_returning | флаг что был раньше (для touch) | Постоянно |
dataLayer | (массив) | Все события GTM | Загрузка страницы |
Pixel + GTM events map (после твоей привязки Pixel в GTM)
| Pixel event | Когда fires | Откуда в GTM |
|---|
PageView | Каждая загрузка страницы | Авто от Meta Pixel |
ViewContent | Каждая загрузка страницы | На page_view событие |
Lead | /thank-you загрузился | На generate_lead событие |
CompleteRegistration | /thank-you + mechanism = registration | На generate_lead + filter |
SubmitApplication | /thank-you + mechanism = application | На generate_lead + filter |
InitiateCheckout | Клик на upsell кнопку | На lead_upsell событие |
Purchase (позже) | После Продамус-оплаты | На сервер-событие из Продамус |
Дедуп с CAPI: event_id == submission_id. Когда подключим CAPI через Make,
оба источника (клиентский Pixel + серверный CAPI) шлют событие с одним
event_id, Meta дедуплицирует.
Точки контроля (где можно посмотреть что данные дошли)
- DevTools → Application → Session Storage — все
kbp_* ключи на сайте
- DevTools → Network — POST на
hook.us1.make.com/... после submit
- Make execution history — каждая заявка как execution с полным payload
- Google Sheet → Leads tab — каждая заявка как строка
- Slack #karada-leads — каждая заявка как сообщение
- GTM Preview Mode — все события dataLayer + теги что сработали
- Meta Events Manager → Test Events — Pixel-события в реальном времени
- amoCRM → Сделки (когда подключим) — лиды с UTM в полях
Связанные документы
/docs/14-meta-ads-attribution — что прописать в Meta Ads
/team/15-test-scenarios — как протестировать каждую точку
/team/16-amocrm-integration — что нужно от тех-спеца Карада
/team/13-tracking-events — справочник событий