# 📊 Анализ Google Analytics и AB-тестов в witlab-funnel ## 🎯 Краткий ответ ### Когда отправляется impression событие AB-теста? **✅ В момент когда пользователь попадает на экран с AB-тестом** - НЕ при загрузке всей воронки - НЕ при инициализации Unleash - Именно при рендеринге конкретного экрана в `FunnelRuntime` ### Где происходит отправка? **Файл:** `src/components/funnel/FunnelRuntime.tsx` (строки 136-150) ```typescript useEffect(() => { if (currentScreenFlags.length === 0) return; currentScreenFlags.forEach((flag) => { const variant = activeVariants[flag]; sendUnleashImpression(flag, variant); // ← ЗДЕСЬ }); }, [currentScreenFlags, activeVariants]); ``` ### Формат события в GA ```javascript window.gtag("event", "experiment_impression", { app_name: "witlab-funnel", feature: "trial-button-test", treatment: "v1" }); ``` --- ## 🏗️ Архитектура ### Иерархия компонентов ``` app/[funnelId]/layout.tsx ├─ UnleashProvider (Unleash SDK) │ └─ PixelsProvider │ ├─ GoogleAnalytics ← загружает gtag.js │ └─ PageViewTracker │ └─ FunnelUnleashWrapper ← собирает все флаги воронки ├─ FlagVariantFetcher[] ← загружает варианты └─ FunnelRuntime ← отправляет impression когда экран виден ``` --- ## ⏱️ Timeline событий ``` T+0ms Пользователь открывает /funnel/payment T+100ms GoogleAnalytics загружает gtag.js T+200ms FunnelUnleashWrapper сканирует воронку Находит флаги: ["trial-button-test", "payment-variant"] T+300ms Unleash SDK возвращает варианты: • trial-button-test → "v1" • payment-variant → "v2" T+400ms FunnelRuntime монтируется currentScreen = "payment" currentScreenFlags = ["trial-button-test"] T+420ms useEffect срабатывает ✅ sendUnleashImpression("trial-button-test", "v1") ✅ window.gtag("event", "experiment_impression", {...}) T+421ms Событие отправлено в Google Analytics ``` **При переходе на следующий экран:** ``` T+0ms Клик "Continue" → переход на /funnel/gender T+100ms currentScreen = "gender" currentScreenFlags = ["payment-variant"] T+120ms ✅ sendUnleashImpression("payment-variant", "v2") ✅ Второе событие отправлено ``` **При возврате назад:** ``` T+0ms Клик "Back" → возврат на /funnel/payment T+100ms currentScreen = "payment" currentScreenFlags = ["trial-button-test"] T+120ms sendUnleashImpression проверяет sessionStorage ❌ Уже отправлялось - пропускаем ``` --- ## 🔧 Ключевые компоненты ### 1. Инициализация Google Analytics **Файл:** `src/components/analytics/GoogleAnalytics.tsx` ```typescript