# Маршрутизация воронок в witlab-funnel ## Оптимизированный процесс открытия воронки ### Проблема (до оптимизации) При переходе по `/soulmate`: 1. Загружалась страница `[funnelId]/page.tsx` 2. Проверялась база данных (медленно) 3. Делался client/server redirect на `/soulmate/onboarding` 4. **Метрики фиксировали загрузку промежуточной страницы** ### Решение (после оптимизации) #### 1. Server-side redirects (next.config.ts) ```typescript async redirects() { return [ { source: '/soulmate', destination: '/soulmate/onboarding', permanent: false // 307 redirect }, // ... автоматически генерируется для всех воронок из BAKED_FUNNELS ]; } ``` **Преимущества:** - ✅ Редирект на уровне CDN/сервера (мгновенный) - ✅ Нет промежуточной загрузки страницы - ✅ Метрики видят только финальный URL `/soulmate/onboarding` - ✅ Query параметры сохраняются автоматически #### 2. Frontend-only режим (buildVariant.ts) ```typescript // В frontend-only режиме БД вообще не проверяется if (IS_FRONTEND_ONLY_BUILD) { return null; // Сразу используем BAKED_FUNNELS } ``` **Преимущества:** - ✅ Нет обращений к MongoDB в production - ✅ Быстрая загрузка (только статика) - ✅ Не нужен backend для работы воронок ## Поток открытия воронки (оптимизированный) ### Frontend-only режим (production) ``` Пользователь → /soulmate ↓ [Server-side redirect] // Мгновенно, без загрузки страницы ↓ /soulmate/onboarding ↓ Рендер первого экрана ↓ 📱 Пользователь видит контент ``` **Время:** ~100-200ms (только загрузка и рендер экрана) ### Full-system режим (dev/admin) ``` Пользователь → /soulmate ↓ [Server-side redirect проверяет наличие в BAKED_FUNNELS] ↓ Есть в BAKED_FUNNELS? ├─ Да → Redirect на /soulmate/onboarding └─ Нет → [funnelId]/page.tsx → Проверка БД → Redirect ↓ /soulmate/onboarding ↓ Загрузка из БД или BAKED_FUNNELS ↓ Рендер первого экрана ``` ## Ключевые файлы ### 1. next.config.ts - Генерирует server-side redirects из `BAKED_FUNNELS` - Работает на этапе build-time - Редиректы происходят на уровне CDN/сервера ### 2. src/lib/runtime/buildVariant.ts - Определяет режим сборки: `frontend` или `full` - `IS_FRONTEND_ONLY_BUILD` - флаг для проверки режима ### 3. src/app/[funnelId]/page.tsx - Fallback для воронок из БД (не в BAKED_FUNNELS) - В frontend-only режиме БД не проверяется - Используется только в full-system режиме ### 4. src/lib/funnel/bakedFunnels.ts - Автогенерируется из JSON файлов - Содержит все статические воронки - Используется для генерации redirects ## Режимы сборки ### Frontend-only (production) ```bash FUNNEL_BUILD_VARIANT=frontend npm run build ``` **Характеристики:** - Нет обращений к MongoDB - Только статические воронки из BAKED_FUNNELS - Максимальная скорость загрузки - Деплой на CDN/static hosting ### Full-system (dev/staging) ```bash FUNNEL_BUILD_VARIANT=full npm run build ``` **Характеристики:** - Поддержка MongoDB - Воронки из БД + BAKED_FUNNELS - Админка для редактирования - Требует backend сервер ## Метрики ### До оптимизации ``` Pageview: /soulmate ← Промежуточная загрузка Pageview: /soulmate/onboarding ← Финальная страница ``` ### После оптимизации ``` Pageview: /soulmate/onboarding ← Только финальная страница ``` **Результат:** Метрики чистые, без артефактов промежуточных загрузок. ## Query параметры (UTM и др.) Server-side redirects **автоматически сохраняют** все query параметры: ``` /soulmate?utm_source=google&utm_campaign=test ↓ редирект /soulmate/onboarding?utm_source=google&utm_campaign=test ``` ## Производительность ### Метрики загрузки | Этап | До оптимизации | После оптимизации | |------|----------------|-------------------| | Time to First Byte (TTFB) | ~300-500ms | ~50-100ms | | First Contentful Paint (FCP) | ~800-1200ms | ~200-400ms | | Промежуточные загрузки | 1 | 0 | | Обращения к БД | 1-2 | 0 (frontend-only) | ### CDN/Edge Network Server-side redirects работают на уровне CDN: - Vercel Edge Functions - Cloudflare Workers - AWS CloudFront Functions - Nginx/Apache rewrites ## Добавление новой воронки ### 1. Создайте JSON файл ```json // funnels/my-funnel.json { "meta": { "id": "my-funnel", "firstScreenId": "welcome" }, "screens": [...] } ``` ### 2. Запустите скрипт генерации ```bash npm run bake-funnels ``` ### 3. Пересоберите проект ```bash npm run build ``` **Результат:** Redirect автоматически создается в next.config.ts: ``` /my-funnel → /my-funnel/welcome ``` ## Отладка ### Проверка redirects ```bash # В dev режиме npm run dev curl -I http://localhost:3000/soulmate # Должно быть: # HTTP/1.1 307 Temporary Redirect # Location: /soulmate/onboarding ``` ### Проверка режима сборки ```typescript console.log(IS_FRONTEND_ONLY_BUILD); // true или false console.log(BUILD_VARIANT); // "frontend" или "full" ``` ### Логи redirects В консоли при сборке: ``` ✓ Compiled successfully ✓ Generated redirects: - /soulmate → /soulmate/onboarding - /soulmate-small → /soulmate-small/onboarding ``` ## Best Practices 1. **Всегда используйте firstScreenId** в meta воронки 2. **Frontend-only для production** - максимальная производительность 3. **Full-system только для dev/admin** - когда нужна БД 4. **Не удаляйте [funnelId]/page.tsx** - нужен для fallback 5. **Query параметры сохраняются** - не нужно их передавать вручную ## Troubleshooting ### Redirect не работает - Проверьте что воронка есть в BAKED_FUNNELS - Убедитесь что firstScreenId указан - Пересоберите проект: `npm run build` ### Метрики показывают промежуточную загрузку - Проверьте что redirects настроены в next.config.ts - Убедитесь что используется production build - Проверьте что CDN/хостинг поддерживает redirects ### Воронка из БД не открывается - Убедитесь что режим сборки `full` - Проверьте что MongoDB доступна - Проверьте логи в консоли сервера