продуктproduct-market-fitметрики

Product-Market Fit: как измерить по данным, а не на ощупь

2026-07-11 12 мин

Product-market fit измеряется не по внутреннему ощущению «кажется, зашло», а по трём независимым сигналам в данных: retention-кривая выходит на горизонтальное плато (часть когорты остаётся с продуктом и не отваливается в ноль), опрос Шона Эллиса даёт долю ответов «очень расстроюсь без продукта» выше порога примерно в 40%, и появляется органический рост — новые пользователи приходят без платного маркетинга. Если хотя бы retention-плато и опрос сходятся, у продукта есть фит. Если retention падает в ноль, а опрос показывает 15% — фита нет, сколько бы ни рос трафик. Ниже разберу, как аналитик собирает каждый из этих сигналов руками, на реальных таблицах.

Что такое product-market fit на языке данных?

PMF — это состояние, когда продукт решает настоящую проблему настоящего сегмента, и это видно по поведению, а не по словам. Марк Андриссен когда-то описал его как «рынок тянет продукт из рук команды»: серверы падают от нагрузки, поддержка не справляется, деньги приходят быстрее, чем вы успеваете нанимать. Это красивая метафора, но аналитику с ней работать нельзя — её не положишь в дашборд.

Поэтому мы переводим ощущение в измеримые прокси. Их три семейства: удержание (люди возвращаются сами), сентимент (люди говорят, что им нужен продукт) и приток (люди приводят других). Ни один сигнал по отдельности не является доказательством. Высокий NPS при нулевом retention — это вежливость, а не фит. Хороший retention при полном отсутствии органики — возможно, вы просто нашли узкую нишу и упёрлись в её потолок. PMF живёт на пересечении, и наша задача — измерить каждую ось честно.

Важно держать в голове, что фит не бинарен и не навсегда. Он существует для конкретного сегмента в конкретный момент. Продукт может иметь фит для аналитиков в финтехе и не иметь его для маркетологов в ретейле. Поэтому все метрики ниже я всегда режу по сегментам, а не смотрю в среднем по больнице.

Почему retention-плато — главный сигнал PMF?

Потому что удержание невозможно подделать. Пользователь голосует за продукт не отзывом, а тем, что открывает его снова через неделю, когда никто не напоминает. Ключевое слово здесь — плато. Любая retention-кривая падает в первые периоды: часть людей заходит из любопытства и не возвращается, это нормально. Вопрос в том, куда кривая приходит.

Без фита кривая асимптотически стремится к нулю: через 8-10 недель от когорты не остаётся почти никого. С фитом кривая после первоначального спада выходит на горизонтальную полку — например, 25-30% пользователей стабильно возвращаются неделя за неделей и дальше уже почти не убывают. Эта полка и есть ядро, ради которого стоит масштабироваться. Высота плато зависит от типа продукта: для ежедневного инструмента здоровым будет одно значение, для сервиса, которым пользуются раз в месяц, — совсем другое. Форма важнее абсолютной цифры: есть ли полка вообще.

Строим кривую по когортам. Возьмём таблицу событий events с полями user_id и event_time и посчитаем weekly retention.

with cohorts as (
  select
    user_id,
    date_trunc('week', min(event_time)) as cohort_week
  from events
  group by user_id
),
activity as (
  select
    c.cohort_week,
    floor(
      extract(epoch from e.event_time - c.cohort_week) / (7 * 86400)
    ) as week_number,
    e.user_id
  from cohorts c
  join events e on e.user_id = c.user_id
)
select
  cohort_week,
  week_number,
  count(distinct user_id) as active_users
from activity
group by cohort_week, week_number
order by cohort_week, week_number;

Дальше делим active_users каждой недели на размер когорты в нулевую неделю — получаем долю вернувшихся. Разложите это в матрицу «когорта × неделя» и посмотрите на любую строку: если числа в конце строки перестали падать и держатся на одном уровне — вот оно, плато. Потренироваться собирать такие запросы удобно в SQL-тренажёре, а разобрать когортный анализ по шагам можно в курсе SQL.

Как отличить настоящее плато от медленного оттока?

Глазами по одной когорте — обманчиво: шум маленькой выборки легко принять за полку. Я смотрю на две вещи. Первая — сравниваю несколько когорт подряд: если у когорт за разные месяцы полка встаёт примерно на одном уровне, это структурный сигнал, а не случайность. Вторая — считаю разницу удержания между соседними поздними неделями. Если между 8-й и 10-й неделей retention упал с 26% до 25% — это плато. Если с 26% до 19% — это всё ещё отток, просто замедленный, и полки нет.

select
  week_number,
  round(avg(retention), 3) as avg_retention,
  round(avg(retention) - lag(avg(retention)) over (order by week_number), 3) as weekly_drop
from weekly_retention
where week_number between 6 and 12
group by week_number
order by week_number;

Когда weekly_drop в поздних неделях колеблется около нуля — кривая легла на полку. Пока он стабильно отрицательный и заметный — рано праздновать. Тот же приём с lag() пригодится на собеседовании: оконные функции спрашивают почти всегда, типовые задачи стоит прорешать заранее.

Как измерить PMF опросом Шона Эллиса?

Шон Эллис предложил задавать пользователям один вопрос: «Насколько вы расстроитесь, если больше не сможете пользоваться продуктом?» с вариантами «очень расстроюсь», «немного расстроюсь», «не расстроюсь» и «уже не пользуюсь». Эмпирический порог фита — доля ответивших «очень расстроюсь» не ниже примерно 40%. Ниже — фита, скорее всего, ещё нет; выше — есть за что бороться.

Здесь есть ловушка, в которую попадают почти все. Опрашивать нужно не всех подряд, а активированных пользователей — тех, кто реально попробовал ядро продукта, скажем, совершил хотя бы 2-3 значимых действия за последние две недели. Если разослать опрос всей базе, включая тех, кто зашёл однажды и забыл, вы намеряете уныло низкий процент и сделаете неверный вывод. Мы измеряем фит для тех, кто продукт распробовал.

Считаем на данных опроса. Пусть ответы лежат в df с колонками user_id, answer и флагом активации.

active = df[df["is_activated"] == True]

counts = active["answer"].value_counts(normalize=True)
pmf_score = counts.get("very_disappointed", 0.0)

print(f"Активированных в опросе: {len(active)}")
print(f"Доля 'очень расстроюсь': {pmf_score:.1%}")
print("Фит есть" if pmf_score >= 0.40 else "Фита пока нет")

Одна цифра сама по себе мало что стоит. Ценность появляется, когда режем ответ по сегментам: роль, размер компании, канал привлечения. Часто выясняется, что в целом по продукту 32%, но в сегменте «аналитики в e-commerce» — 51%. Это и есть найденный фит: вот ваш сегмент, вот кого масштабировать. Разложить value_counts по группам легко в Python-тренажёре, а быстрые шпаргалки по pandas держу в справочнике.

Причём тут органический рост и NPS?

Органика — самый честный из внешних сигналов, потому что за неё никто не платит. Когда продукт решает проблему, люди рассказывают о нём сами, и доля новых пользователей из органических каналов растёт. Я смотрю не на абсолютное число регистраций, а на структуру притока: сколько процентов новых пользователей пришло без платного маркетинга.

select
  date_trunc('month', created_at) as month,
  round(
    100.0 * sum(case when channel in ('organic', 'referral', 'direct') then 1 else 0 end)
    / count(*), 1
  ) as organic_share_pct
from users
group by month
order by month;

Если organic_share_pct месяц от месяца растёт при неизменном рекламном бюджете — рынок начал тянуть продукт сам. Это ровно тот эффект, о котором говорил Андриссен, только выраженный числом.

NPS я держу как вспомогательный сигнал, а не как главный. Считается он просто: доля промоутеров (оценка 9-10) минус доля критиков (0-6).

select
  round(
    100.0 * (
      sum(case when score >= 9 then 1 else 0 end)
      - sum(case when score <= 6 then 1 else 0 end)
    ) / count(*), 1
  ) as nps
from nps_survey;

NPS полезен для отслеживания тренда во времени и для чтения открытых комментариев — там прячутся причины любви и боли. Но как метрика фита он слабее retention: люди легко ставят 9 из вежливости, а потом не возвращаются. Поэтому высокий NPS без плато на кривой удержания я считаю тревожным, а не радостным знаком.

Чем PMF отличается от активации?

Это разные вопросы, и путать их дорого. Активация отвечает на «понял ли пользователь ценность в первый раз» — дошёл ли он до aha-момента за первую сессию или первые дни. Product-market fit отвечает на «нужен ли этот продукт рынку в принципе, возвращаются ли люди снова и снова». Активация — про онбординг и первые минуты. Фит — про недели и месяцы.

Разница видна на кривой удержания. Провал в первые дни — это чаще всего проблема активации: люди приходят, но не понимают, зачем продукт, и отваливаются на пороге. Провал в форме плавного сползания к нулю после нормального старта — это уже проблема фита: люди распробовали, но продукт им по-настоящему не нужен. Лечатся эти болезни по-разному. Плохую активацию чиним онбордингом, подсказками, упрощением первого шага. Отсутствие фита онбордингом не спасёшь — тут менять надо сам продукт или искать другой сегмент.

Практический вывод: сначала убеждаемся, что активация в порядке (иначе замеры фита испорчены — вы опрашиваете людей, которые и до ядра не дошли), и только потом судим о PMF по удержанию активированных. Именно поэтому опрос Шона Эллиса шлём активированным, а retention-плато считаем по тем, кто прошёл первый барьер. Разбор этой логики на конкретных продуктах есть в бизнес-кейсах.

Как аналитику собрать все сигналы в одну картину?

Я свожу три оси на одну панель и смотрю на них вместе, а не по очереди. Ось удержания — есть ли плато и на какой высоте, отдельно по ключевым сегментам. Ось сентимента — процент «очень расстроюсь» среди активированных, тоже с разбивкой. Ось притока — доля органики в динамике и, как приятный бонус, скорость виральности, если пользователи приводят пользователей.

Дашборд, который реально помогает принимать решения, выглядит так: наверху retention-матрица по когортам, рядом одна большая цифра PMF-score с трендом за последние опросы, ниже — organic share по месяцам, и всё это с фильтром по сегменту. Когда по одному сегменту сходятся плато + опрос выше порога + растущая органика, вы нашли фит именно для него. Дальше стратегия простая: удвоить усилия на этот сегмент, а не размазывать ресурсы по всем.

Базовые метрики активности вроде DAU держу рядом как контекст — они показывают масштаб, но сами по себе про фит ничего не говорят: можно иметь растущий DAU за счёт платного трафика и дырявый retention. Абсолютные цифры без формы кривой обманывают.

С чего начать измерять PMF завтра?

Начните с retention-кривой — это самый дешёвый и самый честный замер. Возьмите таблицу событий, посчитайте weekly retention по когортам за последние 3-4 месяца, разложите в матрицу и просто посмотрите, есть ли полка. Одного этого хватит, чтобы понять, в какую сторону вы движетесь. Дальше добавьте опрос Шона Эллиса по активированным и следите за долей органики в притоке.

Главное — не искать одну волшебную цифру. PMF складывается из согласия нескольких независимых сигналов, каждый из которых можно посчитать SQL-запросом или парой строк на pandas. Умение аккуратно собрать эти сигналы отличает аналитика, которому доверяют продуктовые решения, от того, кто просто выгружает числа. На продуктовых собеседованиях про PMF, retention и разницу с активацией спрашивают постоянно — потренируйте формулировки в разделе вопросов.

Если хотите системно прокачать SQL и Python под продуктовую аналитику — от когортного retention до A/B-тестов, — в Pro-доступе открыты все задачи тренажёров, разбор бизнес-кейсов и AI-собеседования без ограничений. Это тот набор, который на практике и превращает «кажется, зашло» в измеримый, защищаемый на ревью вывод.

Считай метрики в тренажёре
Воронки, retention и юнит-экономика на SQL-задачах — бесплатно.
SQL-тренажёр →