Что такое time to value и почему эта метрика важна?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Time to Value (TTV) - критическая метрика Product Analytics
Time to Value это время от момента, когда пользователь впервые использует продукт, до момента, когда он получает ощутимую ценность. Это может быть первая успешная покупка, завершение проекта, экономия денег, или любой другой значимый результат.
ТТВ часто недооценивают, но это одна из самых важных метрик для успеха продукта и удержания пользователей.
Почему TTV важна
Статистика:
- Если TTV > 7 дней: 50% пользователей уходят до получения ценности
- Если TTV < 24 часа: retention в 3x лучше
- Каждый дополнительный день TTV снижает retention на 5-10%
- Пользователи, получившие ценность, имеют 8x лучшее LTV
Примеры TTV в разных продуктах
Slack:
- TTV: успешно пригласить команду и отправить первое сообщение
- Типичное время: 15-30 минут
- Падение: если TTV > 1 часа, 70% заходят только один раз
Notion:
- TTV: создать первую таблицу и отсортировать записи
- Типичное время: 20-40 минут
- Проблема: интерфейс сложный, многие не получают TTV
Stripe:
- TTV: провести первый платеж
- Типичное время: 5-10 минут после разработки интеграции
- Ключевой момент, дальше пользователь расширяет интеграцию
Figma:
- TTV: создать первый дизайн и открыть в реальном времени с коллегой
- Типичное время: 30-60 минут
Как определить TTV для твоего продукта
Метод 1: Анализ когорт
-- Для каждого пользователя найти дни до первого significant action
WITH first_significant_action AS (
SELECT
user_id,
MIN(created_at) as signup_date,
MIN(CASE WHEN event_type IN ('purchase', 'export', 'share') THEN created_at END) as first_value_date
FROM events
GROUP BY user_id
),
ttv_calculated AS (
SELECT
user_id,
(first_value_date - signup_date)::int as ttv_days,
CASE
WHEN (first_value_date - signup_date)::int <= 1 THEN 'Same day'
WHEN (first_value_date - signup_date)::int <= 7 THEN 'Within a week'
WHEN (first_value_date - signup_date)::int <= 30 THEN 'Within a month'
ELSE 'After month'
END as ttv_bucket,
first_value_date IS NOT NULL as received_value
FROM first_significant_action
)
SELECT
ttv_bucket,
COUNT(*) as user_count,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ttv_days) as median_ttv_days,
ROUND(COUNT(CASE WHEN received_value THEN 1 END) * 100.0 / COUNT(*), 2) as pct_received_value
FROM ttv_calculated
GROUP BY ttv_bucket
ORDER BY median_ttv_days;
Метод 2: Retention анализ
-- Пользователи с быстрым TTV имеют лучше retention
WITH user_ttv AS (
SELECT
user_id,
(first_value_date - signup_date)::int as ttv_days
FROM first_significant_action
),
retention AS (
SELECT
ut.user_id,
CASE
WHEN ut.ttv_days <= 1 THEN 'Quick (< 1 day)'
WHEN ut.ttv_days <= 7 THEN 'Normal (1-7 days)'
ELSE 'Slow (> 7 days)'
END as ttv_category,
MAX(CASE WHEN last_active_date >= NOW() - INTERVAL '30 days' THEN 1 ELSE 0 END) as active_30d
FROM user_ttv ut
LEFT JOIN users u ON ut.user_id = u.user_id
GROUP BY ut.user_id, ut.ttv_days
)
SELECT
ttv_category,
COUNT(*) as users,
ROUND(AVG(active_30d) * 100, 2) as retention_30d_pct
FROM retention
GROUP BY ttv_category
ORDER BY retention_30d_pct DESC;
Отличие TTV от Aha-moment
TTV (Time to Value):
- Когда пользователь впервые получает ценность
- Может быть объективным: сделал покупку, сохранил файл
- Может быть длительным: 1 день, 1 неделя
- Важен для retention
Aha-moment:
- Когда пользователь понимает ценность
- Более субъективный: осознание
- Обычно быстрее: несколько часов
- Важен для эмоциональной связи
Пример:
- TTV: первая покупка на Etsy (день 3)
- Aha-moment: понимание, что можно продавать свои изделия (час 1)
Как улучшить TTV
Шаг 1: Сократить путь к ценности
# Анализ пути пользователя
# Событие 1: signup → минут
# Событие 2: profile_complete → минут
# Событие 3: connect_payment → минут
# Событие 4: first_purchase → минут
# Где больше всего теряется время? Оптимизировать это
df['step_duration'] = df.groupby('user_id')['created_at'].diff()
print(df.groupby('event_type')['step_duration'].mean())
# Если connect_payment занимает 30 минут, это узкое место
Шаг 2: Улучшить онбординг
-- Сравнить TTV для разных онбординг версий
WITH onboarding_test AS (
SELECT
user_id,
onboarding_version, -- A/B test версия
(first_value_date - signup_date)::int as ttv_days
FROM users u
LEFT JOIN first_significant_action f ON u.user_id = f.user_id
)
SELECT
onboarding_version,
COUNT(*) as users,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY ttv_days) as median_ttv,
PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY ttv_days) as p90_ttv
FROM onboarding_test
GROUP BY onboarding_version;
-- Версия B имеет медиану 2 дня vs 5 дней в версии A
-- Внедри версию B для всех
Шаг 3: Синхронизировать TTV с маркетингом
# Если TTV = 5 дней, email цепочка должна быть на 4-5 дней
# День 0: Welcome + быстрый старт
# День 1: Первые шаги, most important feature
# День 2: Покажи примеры successful cases
# День 3: Персональные советы
# День 4: Давай скидку / вызови в демо
# День 5: Спроси обратную связь
Практические примеры улучшения TTV
Пример 1: Slack
Проблема: TTV было 3 часа, люди уходили Решение:
- Автоматически пригласить с email
- Создать первый канал автоматически
- Предложить готовые шаблоны сообщений
Результат: TTV сократилось до 15 минут, retention +40%
Пример 2: Notion
Проблема: TTV = 1.5 часа, много людей не добирались Решение:
- Добавить guided tour
- Предложить шаблоны
- Simplify для новичков
Результат: TTV = 20 минут для 70% новых пользователей
Пример 3: Figma
Проблема: TTV = 1 час (нужно создать дизайн) Решение:
- Стартовый шаблон при signup
- Готовые UI кит
- Instant collaboration (no setup)
Результат: TTV = 2 минуты до первого collaboration
Метрики, связанные с TTV
1. Speed to First Milestone
-- Время до первого milestone для разных когорт
SELECT
DATE_TRUNC('week', signup_date) as signup_week,
AVG((first_milestone_date - signup_date)::int) as avg_days_to_milestone,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY (first_milestone_date - signup_date)::int) as median
FROM users
WHERE first_milestone_date IS NOT NULL
GROUP BY DATE_TRUNC('week', signup_date)
ORDER BY signup_week DESC;
2. Activation Rate (% who got value)
SELECT
DATE_TRUNC('week', signup_date) as cohort,
COUNT(DISTINCT user_id) as cohort_size,
COUNT(DISTINCT CASE WHEN first_value_date IS NOT NULL THEN user_id END) as activated,
ROUND(
COUNT(DISTINCT CASE WHEN first_value_date IS NOT NULL THEN user_id END) * 100.0 /
COUNT(DISTINCT user_id),
2
) as activation_rate
FROM users
GROUP BY DATE_TRUNC('week', signup_date)
ORDER BY cohort DESC;
3. TTV Distribution
# Виз распределение TTV
import matplotlib.pyplot as plt
ttv_distribution = df['ttv_days'].value_counts().sort_index()
plt.figure(figsize=(12, 6))
plt.hist(df['ttv_days'], bins=50, edgecolor='black')
plt.axvline(df['ttv_days'].median(), color='red', linestyle='--', label=f'Median: {df["ttv_days"].median():.0f} days')
plt.xlabel('Days to Value')
plt.ylabel('Number of Users')
plt.title('Time to Value Distribution')
plt.legend()
plt.show()
Чек-лист для анализа TTV
- Определено, что является значимой ценностью для твоего продукта
- Выбран одно-два key события для TTV
- Рассчитано TTV для всех пользователей
- Найдена корреляция между TTV и retention
- Выявлены узкие места в пути к ценности
- A/B тест для улучшения TTV запущен
- Метрика TTV отслеживается еженедельно
- Установлен target TTV (например, < 24 часов)
- Монитор: растет ли % пользователей, получивших ценность
Time to Value это не vanity метрика, а фундаментальный показатель здоровья продукта.