Условие
Elfsight — конструктор виджетов для сайтов. Ключевой бизнес-процесс — оформление первой платной подписки: регистрация → создание виджета → выбор тарифного плана → оплата.
Задача: построить (1) подробный CJM для сценария «оформление первой платной подписки до момента оплаты» и (2) event-tracking plan, который команда разработки может однозначно внедрить, плюс приоритизация событий.
Решение
1. Скелет CJM (этапы)
| Этап | User-action | Touchpoint | Painpoints | KPI этапа |
|---|---|---|---|---|
| Awareness | Поиск/реклама → Landing | Web | Невнятный value-prop | Visitors → Sign-up CR |
| Sign-up | Регистрация (email / SSO Google) | Web | Verification required, OAuth-fail | Sign-up CR |
| Onboarding | Knowing «как сделать виджет» | App | Слишком много опций; не нашёл нужный widget | Time-to-first-action |
| Widget creation | Выбор типа → конфигурация → preview | App | Сложный конструктор; preview ломается | Widget save rate |
| Embed | Получение кода → вставка на сайт | App + Site владельца | Не понятно как вставить | Embed rate |
| Plan selection | Видит лимит free-плана → открывает upgrade page | App | Плата кажется завышенной | Pricing page CR |
| Checkout | Email → Card → Confirm | Stripe page | Card declined, 3DS | Checkout CR |
| Activation (paid) | Возврат после оплаты | App | Не пришло подтверждение | Activation rate |
2. Event-tracking plan
Принципы:
- Один event = одно действие пользователя + контекст в properties.
- Согласованный naming:
noun_verb(e.g.,widget_created). - Identify-call с user_id сразу после sign-up (объединяет анонимный путь).
| # | Event | Trigger | Properties | Priority |
|---|---|---|---|---|
| 1 | page_view |
загрузка страницы | url, referrer, utm_* | P1 |
| 2 | signup_started |
клик «Sign up» | source (organic/paid), method (email/google) | P0 |
| 3 | signup_completed |
успешная регистрация | user_id, method | P0 |
| 4 | email_verified |
подтверждение email | user_id | P1 |
| 5 | widget_template_viewed |
открытие галереи шаблонов | user_id | P2 |
| 6 | widget_template_selected |
клик по шаблону | user_id, widget_type | P0 |
| 7 | widget_config_changed |
изменение настройки в редакторе | user_id, widget_type, field_changed | P2 |
| 8 | widget_preview_viewed |
открытие preview | user_id, widget_type | P2 |
| 9 | widget_saved |
сохранение виджета (FREE plan ok) | user_id, widget_id, widget_type | P0 |
| 10 | embed_code_copied |
копирование embed-кода | user_id, widget_id | P1 |
| 11 | pricing_page_viewed |
открыта страница тарифов | user_id, source | P0 |
| 12 | plan_selected |
клик по плану | user_id, plan, billing_period | P0 |
| 13 | checkout_started |
открытие модалки оплаты | user_id, plan, price | P0 |
| 14 | checkout_payment_method_added |
добавлена карта | user_id | P1 |
| 15 | checkout_completed |
оплата прошла | user_id, plan, price, currency, transaction_id | P0 |
| 16 | checkout_failed |
ошибка оплаты | user_id, plan, error_code | P1 |
| 17 | subscription_active |
подписка активирована (server-side) | user_id, plan | P0 |
Приоритизация (логика)
P0 = без них нельзя посчитать основную воронку «sign-up → paid». Если выпустить релиз без P0, аналитика слепа.
P1 = атрибуция, источники, ошибки — нужны для оптимизации, но не для базового measurement.
P2 = детализация (что именно настроил пользователь) — нужны позже, для понимания «глубины» использования.
Порядок мышления
- Воронку «от регистрации до paid» — обязательно мериется → P0.
- Что должны видеть стейкхолдеры (sales/growth)? Источники, partner attribution, ошибки → P1.
- Что нужно продакту через 3 месяца для гипотез? Глубокая телеметрия → P2.
Подводные камни
- Anonymous → identified: до
signup_completedпользователь — анон. Объединение черезanonymous_id/distinct_idобязательно (иначе воронка «split user»). - Server-side vs client-side для денежных событий:
subscription_activeиcheckout_completedдублировать на сервере — иначе AdBlock/race-condition теряет деньги. checkout_failedбез user_id (если оплата на отдельном Stripe-домене): нужен сквозной session_id.- PII в properties: не передавать email/phone в analytics — GDPR.
- Перегруз событиями:
widget_config_changedна каждый keystroke = миллионы строк. Дебаунс или агрегация в начале/конце редактирования. - Документация = source of truth: tracking plan живёт в Notion/Mixpanel Lexicon, не в head у аналитика.
Эталонный ответ
CJM — 8 этапов от awareness до activation. Tracking plan — 17 ключевых событий, P0 (воронка-минимум: sign-up, widget_saved, plan_selected, checkout_completed, subscription_active), P1 (атрибуция, ошибки), P2 (глубокая UX-телеметрия).