w-funnel/docs/SOULMATE_AB_QUICK_REFERENCE.md
2025-10-23 21:16:09 +02:00

7.0 KiB
Raw Permalink Blame History

Быстрая справка: AB-тесты Soulmate

🧪 Два AB-теста

1 soulmate-onboarding-image

┌──────────────────────────────────────────┐
│ Экран:  onboarding (1-й экран)           │
│ URL:    /soulmate/onboarding             │
│ Когда:  Сразу при входе в воронку        │
│ Timing: ~420ms после загрузки            │
│                                          │
│ Тестирует:                               │
│ • v0 = дефолтное изображение             │
│ • v1 = альтернативное изображение (PNG)  │
│ • v2 = видео (MP4)                       │
│                                          │
│ JSON: variants блок                      │
└──────────────────────────────────────────┘
           │
           ▼ GA impression событие
           
window.gtag("event", "experiment_impression", {
  feature: "soulmate-onboarding-image",
  treatment: "v1"
});

2 soulmate-trial-grid

┌──────────────────────────────────────────┐
│ Экран:  email (19-й экран)               │
│ URL:    /soulmate/email                  │
│ Когда:  При достижении email экрана      │
│ Timing: ~120ms после перехода            │
│                                          │
│ Тестирует:                               │
│ • coupon = переход на экран с купоном    │
│ • grid   = переход на выбор тарифов      │
│                                          │
│ JSON: navigation.rules блок              │
└──────────────────────────────────────────┘
           │
           ▼ GA impression событие
           
window.gtag("event", "experiment_impression", {
  feature: "soulmate-trial-grid",
  treatment: "grid"
});

📍 Где в коде

// src/components/funnel/FunnelRuntime.tsx (строки 103-150)

// Определяем флаги текущего экрана
const currentScreenFlags = useMemo(() => {
  const flags = new Set<string>();
  
  // Из variants
  currentScreen.variants?.forEach((variant) => {
    if (condition.unleashFlag) flags.add(condition.unleashFlag);
  });
  
  // Из navigation.rules
  currentScreen.navigation?.rules?.forEach((rule) => {
    if (condition.unleashFlag) flags.add(condition.unleashFlag);
  });
  
  return Array.from(flags);
}, [currentScreen]);

// Отправляем impression когда экран виден
useEffect(() => {
  currentScreenFlags.forEach((flag) => {
    const variant = activeVariants[flag];
    sendUnleashImpression(flag, variant); // ← ОТПРАВКА
  });
}, [currentScreenFlags, activeVariants]);

⏱️ Timeline полной воронки

┌─────────────────────────────────────────────────────────┐
│ T+0      Открытие /soulmate/onboarding                  │
├─────────────────────────────────────────────────────────┤
│ T+420ms  ✅ IMPRESSION #1                               │
│          feature: soulmate-onboarding-image             │
│          treatment: v1                                  │
└─────────────────────────────────────────────────────────┘
                        │
                        │ Пользователь проходит 18 экранов
                        ▼
┌─────────────────────────────────────────────────────────┐
│ T+5min   Достижение /soulmate/email                     │
├─────────────────────────────────────────────────────────┤
│ T+5m     ✅ IMPRESSION #2                               │
│ +120ms   feature: soulmate-trial-grid                   │
│          treatment: grid                                │
└─────────────────────────────────────────────────────────┘

🔍 Быстрая проверка

Console (Development mode)

// При загрузке onboarding экрана:
[Unleash Impression]  Sent successfully:
{ feature: "soulmate-onboarding-image", variant: "v1" }

// При достижении email экрана:
[Unleash Impression]  Sent successfully:
{ feature: "soulmate-trial-grid", variant: "grid" }

Network Tab

POST /g/collect?...
  &en=experiment_impression
  &ep.feature=soulmate-onboarding-image
  &ep.treatment=v1

POST /g/collect?...
  &en=experiment_impression
  &ep.feature=soulmate-trial-grid
  &ep.treatment=grid

Session Storage

sessionStorage = {
  "unleash_impression_soulmate-onboarding-image_v1": "true",
  "unleash_impression_soulmate-trial-grid_grid": "true"
}

📊 Сравнение

Test #1 Test #2
Флаг soulmate-onboarding-image soulmate-trial-grid
Экран onboarding (1-й) email (19-й)
URL /soulmate/onboarding /soulmate/email
В JSON variants navigation.rules
Тестирует Медиа-контент Навигацию
Когда При входе в воронку Почти в конце воронки

Главное

  1. Оба флага загружаются сразу (preload) для быстрых переходов
  2. Impression отправляются последовательно - только когда пользователь видит экран
  3. Защита от дубликатов через sessionStorage работает автоматически
  4. Один и тот же код отправляет события для обоих тестов

📚 Детальная документация

  • SOULMATE_AB_TESTS_TIMELINE.md - полный анализ с диаграммами
  • GA_AB_TEST_ANALYSIS.md - техническая документация
  • GA_AB_TEST_EXAMPLES.md - примеры и сценарии