Все материалы
Продуктовая аналитикаматериалсредний

Виральность продукта: K-фактор, формула и расчёт на данных

Виральность — способность продукта получать новых пользователей через действия нынешних. Формула коэффициента виральности (K-фактора), время цикла, расчёт на учебной базе в SQL, отличие от сетевого эффекта и типичные ошибки.

КейсПрактика14 октября 2026 г.17 мин

На планёрке звучит: «Запустили приглашения, виральность выросла, реклама скоро не понадобится». В отчёте за этим стоит одно число — в канале referral стало больше регистраций. Сколько приглашений отправлено, сколько из них принято и пришли бы эти люди без приглашения, отчёт не говорит. Ниже — как устроен K-фактор, что он обещает при значениях меньше и больше единицы и что из этого удаётся посчитать на реальной таблице событий, а что нет.

Коротко

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

  • K = число приглашений на пользователя × конверсия приглашения в регистрацию.
  • При K меньше 1 каждое поколение приглашённых меньше предыдущего, и рост затухает. Тысяча привлечённых превращается в 1000 / (1 − K) пользователей — и на этом всё.
  • При K больше 1 поколения растут сами. Так бывает редко и недолго: аудитория, которой ещё можно отправить приглашение, заканчивается.
  • Время цикла — от регистрации человека до регистрации приглашённого им — определяет скорость. При K больше 1 оно стоит в показателе степени.
  • K считают по когортам и только по подтверждённым парам «кто пригласил — кто пришёл». Доля канала referral даёт лишь верхнюю оценку.
  • Приглашённых проверяют на активацию, удержание и оплату: регистрация по приглашению ещё не пользователь.

Что такое виральность: два смысла одного слова

Словом «виральность» называют две разные вещи. В соцсетях это свойство публикации: ролик или пост расходится через репосты и рекомендации дальше подписчиков автора. Там считают охват, долю просмотров не от подписчиков, число репостов на тысячу показов.

Виральность продукта — свойство самого продукта и метрика роста. Человек пользуется сервисом, в ходе работы зовёт коллегу, отправляет счёт клиенту или делится ссылкой на отчёт — и часть получателей регистрируется. Дальше речь только об этом смысле. Единица измерения здесь не просмотр, а новый зарегистрированный пользователь, у которого известен пригласивший.

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

Коэффициент виральности: формула K-фактора

K-фактор, он же виральный коэффициент, отвечает на вопрос: сколько новых пользователей приводит один пользователь. В классической записи это произведение двух величин. В таком виде формулу разбирает Дэвид Скок в статье о вирусном маркетинге, и она стала стандартной.

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

Пример с условными числами. В когорте 2 000 человек, за 28 дней они отправили 3 000 приглашений, из них 450 закончились регистрацией. Приглашений на пользователя — 3 000 / 2 000 = 1,5. Конверсия — 450 / 3 000 = 15%. K = 1,5 × 0,15 = 0,225. Тот же ответ даёт прямое деление: 450 новых на 2 000 старых. Два множителя нужны для работы: первый зависит от того, насколько легко и уместно пригласить, второй — от того, что видит получатель.

K-фактор
K = приглашений на пользователя × конверсия приглашения в регистрацию

Оба множителя — по одной когорте и в одном окне наблюдения. Приглашения делятся на всех пользователей когорты.

Что значит K больше и меньше единицы

Проще всего считать поколениями. Нулевое поколение — люди, которых привели реклама, поиск и партнёры. Первое — те, кого пригласило нулевое. Второе — приглашённые первого. Каждое следующее поколение равно предыдущему, умноженному на K.

Возьмём 1 000 стартовых пользователей и K = 0,5. Поколения: 1 000, 500, 250, 125, 63 — ряд убывает вдвое на каждом шаге. Накопленный итог: 1 000, 1 500, 1 750, 1 875, 1 938 и дальше всё ближе к 2 000, но не выше. Предел считается по формуле суммы геометрической прогрессии: 1 000 / (1 − 0,5) = 2 000. При K = 0,25 потолок ещё ближе — 1 333: вся виральность добавляет треть к тому, что принесли другие каналы.

При K = 1 каждое поколение равно предыдущему: 1 000 человек приводят 1 000, те — ещё 1 000. Рост линейный и не останавливается, пока держится K. При K = 1,2 поколения растут: 1 000, 1 200, 1 440, 1 728, 2 074. Накопленный итог к шестому поколению — 12 916 против 1 984 при K = 0,5.

На практике K больше 1 встречается на коротких отрезках: при запуске, в узком сообществе, после удачной механики. Дальше приглашения начинают попадать к тем, кто уже зарегистрирован или уже отказался, и конверсия падает. Поэтому полезнее читать K меньше единицы без разочарования. K = 0,25 значит, что каждый оплаченный пользователь приходит с бесплатной добавкой в треть пользователя. В расчёте стоимости привлечения это снижает эффективный CAC в 1,33 раза — заметно, но рекламу не заменяет.

Накопленное число пользователей по поколениям приглашений при разных K

Условный пример: 1 000 стартовых пользователей. При K < 1 кривая упирается в потолок 1 000 / (1 − K), при K = 1 растёт линейно, при K > 1 ускоряется.

K = 0,25K = 0,5K = 1,0K = 1,2

Время цикла виральности: почему оно важнее, чем кажется

На графике выше по горизонтали — поколения, а не дни. Сколько длится одно поколение, K не говорит. Это отдельная величина — время цикла виральности: сколько проходит от регистрации человека до регистрации того, кого он пригласил. В неё входят три отрезка: от регистрации до отправки приглашения, от отправки до того, как получатель его увидел, и от просмотра до регистрации.

Число поколений за срок равно длине срока, делённой на время цикла. Подставим в тот же пример с K = 1,2 и тысячей стартовых пользователей срок 30 дней. При цикле в 10 дней успевают пройти три поколения, накопленный итог — 5 368. При цикле в 3 дня проходят десять поколений, и итог — 32 150. K не изменился, продукт получил в шесть раз больше пользователей. Скок делает из этого главный вывод своей статьи: сокращение цикла влияет на рост сильнее, чем увеличение K, потому что время цикла стоит в показателе степени.

При K меньше единицы эффект скромнее, но он есть. С K = 0,5 потолок равен 2 000 при любом цикле. При цикле в 3 дня за месяц набирается 1 999, при цикле в 10 дней — 1 875. Долгий цикл не отнимает пользователей, он отодвигает их за горизонт планирования.

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

Накопленный итог через n поколений
N = N₀ × (K^(n+1) − 1) / (K − 1), где n = срок / время цикла

N₀ — стартовые пользователи. При K < 1 и большом n формула сходится к N₀ / (1 − K). При K = 1 итог равен N₀ × (n + 1).

Виды виральности: что именно измерять

Формула одна, а «приглашение» в разных продуктах выглядит по-разному. От механики зависит, какое событие считать приглашением и откуда брать конверсию. Классический пример демонстрационной механики — строка со ссылкой на регистрацию, которую почтовый сервис Hotmail в 1996 году начал добавлять в конец каждого исходящего письма: отправитель ничего не делал специально, продукт рекламировал себя при обычном использовании.

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

Вид виральности, пример механики и что измерять
ВидПример механикиЧто измерять
Встроенная: продукт требует второго участникаПриглашение коллеги в рабочее пространство, совместный документ, счёт клиентуПриглашений на пользователя когорты, конверсию приглашения, долю приглашённых, ставших активными
Демонстрационная: результат работы виден снаружиПодпись в письме, публичная ссылка на отчёт, водяной знак на экспортеПросмотры внешних страниц на автора, конверсию просмотра в регистрацию
Стимулированная: награда за приглашениеРеферальная программа с бонусом одному или обоимДолю участников, стоимость награды на привлечённого, удержание и оплату приглашённых
Сарафанная: человек рассказывает самРекомендация в разговоре или в профессиональном чатеОтветы на вопрос «откуда узнали» при регистрации; K напрямую не считается
Контентная: пользователи создают страницы, которые находят другиеОтзывы, публичные профили, шаблоныРегистрации с пользовательских страниц на одного автора

Как посчитать приглашения на пользователя в SQL

Теперь к данным. Учебная база «Маяк» — это сервис отчётов: пользователи регистрируются, создают рабочие пространства и отчёты, часть платит. В таблице events есть событие invite_sent, в таблице users — канал привлечения, одно из значений которого referral. Этого хватает на первый множитель K и на верхнюю оценку второго.

Первый запрос считает три величины по когортам месяца регистрации: долю пользователей, отправивших хотя бы одно приглашение, число приглашений на пользователя и на приглашающего. В этой базе приглашение всегда приходится на следующий день после регистрации, поэтому в расчёт взяты когорты до 28 августа: у пользователей 29 августа этот день ещё не закончился.

Результат ровный: приглашают 24,4% июньской когорты, 24,9% июльской и 24,7% августовской, в целом 1 131 человек из 4 575. Каждый приглашающий отправил ровно одно приглашение, поэтому приглашений на пользователя — 0,247. Разница между «на пользователя» и «на приглашающего» здесь четырёхкратная: 0,247 против 1,00. Подставьте в формулу второе число вместо первого — и K вырастет в четыре раза без единого нового пользователя.

Доля приглашающих и число приглашений на пользователя по когортам месяца регистрации
with cohort as (
  select
    u.user_id,
    substr(cast(date_trunc('month', u.signup_date) as varchar), 1, 7) as signup_month,
    count(e.event_id) as invites
  from users as u
  left join events as e
    on e.user_id = u.user_id
   and e.event_name = 'invite_sent'
  where u.signup_date <= date '2026-08-28'
  group by u.user_id, date_trunc('month', u.signup_date)
)
select
  coalesce(signup_month, 'все') as signup_month,
  count(*) as users,
  count(*) filter (where invites > 0) as inviters,
  sum(invites) as invites,
  round(cast(100.0 * count(*) filter (where invites > 0) / count(*) as numeric(18, 6)), 1) as inviters_pct,
  round(cast(1.0 * sum(invites) / count(*) as numeric(18, 6)), 3) as invites_per_user,
  round(cast(1.0 * sum(invites) / count(*) filter (where invites > 0) as numeric(18, 6)), 2) as invites_per_inviter
from cohort
group by rollup (signup_month)
order by signup_month;

Сколько регистраций даёт канал referral

Второй запрос смотрит с другой стороны — на тех, кто пришёл. Он считает долю канала referral в регистрациях каждого месяца.

В июне по рекомендации пришли 292 человека из 1 042 — 28,0%. В июле — 352 из 1 676, 21,0%. В августе — 393 из 1 895, 20,7%. За весь период — 1 037 из 4 613, или 22,5%. Абсолютное число растёт, а доля падает: остальные каналы росли быстрее. Доля канала снижается, когда маркетинг увеличивает закупку, хотя пользователи приглашают не хуже прежнего: по первому запросу доля приглашающих все три месяца держится около 24–25%.

Доля канала referral в регистрациях по месяцам
with monthly as (
  select
    substr(cast(date_trunc('month', signup_date) as varchar), 1, 7) as signup_month,
    channel
  from users
)
select
  coalesce(signup_month, 'все') as signup_month,
  count(*) as signups,
  count(*) filter (where channel = 'referral') as referral_signups,
  round(cast(100.0 * count(*) filter (where channel = 'referral') / count(*) as numeric(18, 6)), 1) as referral_pct
from monthly
group by rollup (signup_month)
order by signup_month;

Верхняя оценка K и чего не хватает в данных

Соблазнительно закончить расчёт так: приглашений отправлено 1 135, из канала referral пришли 1 037 человек, значит, конверсия приглашения 91%, а K = 0,247 × 0,91 ≈ 0,22. Третий запрос показывает, почему так делать нельзя. Он ставит рядом приглашения, отправленные в календарном месяце, и регистрации из канала referral за тот же месяц.

В июне отправлено 238 приглашений, а из канала referral зарегистрировались 292 человека — «конверсия» 122,7%. В июле и августе — 84,0% и 82,2%, за весь период — 91,4%. Больше ста процентов конверсия быть не может, а восемьдесят с лишним для приглашения по почте или ссылке — число неправдоподобное. Вывод один: канал referral и событие invite_sent описывают разные множества. В канал попадают и те, кто пришёл по совету без всякого приглашения в продукте, а часть приглашений могла уйти уже зарегистрированным коллегам.

Честный результат на этой базе — верхняя граница. Конверсия приглашения не превышает 100%, поэтому K не больше числа приглашений на пользователя: K ≤ 0,247. Даже при таком потолке тысяча привлечённых пользователей превращается самое большее в 1 000 / (1 − 0,247) ≈ 1 328. Настоящее значение ниже, и насколько — база не говорит: в ней нет связи «кто кого пригласил».

Не хватает одного из двух: поля invited_by в таблице users или отдельной таблицы приглашений, где у каждой строки есть отправитель, время отправки и, если приглашение принято, идентификатор зарегистрировавшегося. Со второй таблицей видны и непринятые приглашения, поэтому конверсия считается напрямую. Запрос ниже — образец для такой схемы: K получается по когортам, с единым окном в 28 дней и только из подтверждённых пар. На учебной базе он не выполнится: таблицы invites в ней нет.

Приглашения и регистрации из канала referral по календарным месяцам: «конверсия», которой не бывает
with invites as (
  select
    substr(cast(date_trunc('month', event_time) as varchar), 1, 7) as month,
    count(*) as invites_sent
  from events
  where event_name = 'invite_sent'
  group by 1
),
referrals as (
  select
    substr(cast(date_trunc('month', signup_date) as varchar), 1, 7) as month,
    count(*) as referral_signups
  from users
  where channel = 'referral'
  group by 1
)
select
  coalesce(i.month, 'все') as month,
  sum(i.invites_sent) as invites_sent,
  sum(r.referral_signups) as referral_signups,
  round(cast(100.0 * sum(r.referral_signups) / sum(i.invites_sent) as numeric(18, 6)), 1) as implied_conversion_pct
from invites as i
join referrals as r on r.month = i.month
group by rollup (i.month)
order by month;
codeОбразец для схемы с таблицей invites (в учебной базе её нет, запрос не выполняется)
-- invites: invite_id, inviter_id, sent_at, invitee_user_id (NULL, пока не принято), accepted_at
select
  date_trunc('week', u.signup_date) as cohort_week,
  count(distinct u.user_id) as users,
  count(i.invite_id) as invites,
  count(i.invitee_user_id) filter (
    where i.accepted_at < i.sent_at + interval '28 days'
  ) as accepted,
  1.0 * count(i.invite_id) / count(distinct u.user_id) as invites_per_user,
  1.0 * count(i.invitee_user_id) filter (
    where i.accepted_at < i.sent_at + interval '28 days'
  ) / nullif(count(i.invite_id), 0) as invite_conversion,
  1.0 * count(i.invitee_user_id) filter (
    where i.accepted_at < i.sent_at + interval '28 days'
  ) / count(distinct u.user_id) as k_factor
from users as u
left join invites as i
  on i.inviter_id = u.user_id
 and i.sent_at < u.signup_date + interval '28 days'
where u.signup_date < current_date - interval '56 days'  -- только зрелые когорты
group by 1
order by 1;

Удерживаются ли приглашённые: сравнение каналов

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

Запрос берёт когорты до 26 июля включительно — у них есть полные пять недель наблюдения — и считает три доли: создали хотя бы один отчёт, открыли приложение на 28–34-й день, сделали хотя бы один платёж. Создание отчёта здесь — рабочее приближение к активации.

В учебной базе канал referral лучший по всем трём: отчёт создали 45,7% против 43,9% у organic и 23,6% у paid_search, на пятой неделе вернулись 59,8% против 52,4% и 33,0%, заплатили 31,0% против 28,4% и 11,4%. Для расчёта роста это значит, что регистрация по рекомендации здесь ценнее регистрации из платного поиска: на сотню пришедших она даёт почти втрое больше платящих. В другом продукте картина может быть обратной, особенно при денежной награде за приглашение. Поэтому рядом с K показывают K «по качеству»: сколько активированных или платящих пользователей приводит один пользователь.

Активация, возврат на пятой неделе и оплата по каналам, когорты до 26 июля
with cohort as (
  select
    u.user_id,
    u.channel,
    exists (
      select 1 from events as e
      where e.user_id = u.user_id and e.event_name = 'report_created'
    ) as activated,
    exists (
      select 1 from events as e
      where e.user_id = u.user_id
        and e.event_name = 'app_open'
        and cast(e.event_time as date) - u.signup_date between 28 and 34
    ) as back_week5,
    exists (
      select 1 from payments as p
      where p.user_id = u.user_id
    ) as paid
  from users as u
  where u.signup_date <= date '2026-07-26'
)
select
  channel,
  count(*) as users,
  round(cast(100.0 * count(*) filter (where activated) / count(*) as numeric(18, 6)), 1) as activated_pct,
  round(cast(100.0 * count(*) filter (where back_week5) / count(*) as numeric(18, 6)), 1) as back_week5_pct,
  round(cast(100.0 * count(*) filter (where paid) / count(*) as numeric(18, 6)), 1) as paid_pct
from cohort
group by channel
order by paid_pct desc;

Чем виральность отличается от сетевого эффекта и реферальной программы

Виральность и сетевой эффект часто идут парой, но отвечают на разные вопросы. Виральность — про привлечение: как продукт получает новых пользователей. Сетевой эффект — про ценность: продукт становится полезнее для каждого, когда пользователей больше. Мессенджер без собеседников бесполезен, маркетплейс без продавцов пуст.

Одно без другого встречается постоянно. Одиночная игра с кнопкой «поделиться результатом» может расходиться быстро, но новые игроки не делают её лучше для прежних: виральность есть, сетевого эффекта нет. Сервис объявлений с каждым продавцом полезнее покупателю, но приходят туда из поиска, а не по приглашениям: сетевой эффект есть, виральности почти нет. Измеряются они тоже по-разному: виральность — K-фактором и временем цикла, сетевой эффект — тем, как удержание и частота использования зависят от размера сети вокруг пользователя.

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

Типичные ошибки при расчёте виральности

Почти все ошибки с K-фактором завышают его.

  • Считать K по всем пользователям без когорт. Приглашения за месяц делят на всю накопленную базу, включая тех, кто ушёл год назад, или, наоборот, смешивают в конверсии свежие приглашения, на которые ещё не успели ответить. Правильная единица — когорта с одинаковым окном наблюдения, а знаменатель — вся когорта, не только приглашавшие: в примере выше эта подмена меняет 0,247 на 1,00.
  • Не вычитать органику. Канал referral, промокод друга, переход по общей ссылке записывают в виральность целиком, хотя часть этих людей уже искала продукт. На учебной базе это видно по «конверсии» выше 100%. Чистый эффект механики показывает только эксперимент: части пользователей приглашение не предлагают и сравнивают число регистраций вокруг них.
  • Принимать разовый всплеск за K. Рассылка «пригласите коллег» или упоминание у блогера дают неделю с высоким числом, которое переносят в модель роста как постоянное. K — свойство обычного поведения когорты, а не кампании.
  • Игнорировать удержание приглашённых. Регистрация по приглашению, после которой человек не создал ни одного отчёта, увеличивает K и уменьшает конверсию в активацию. Считайте K и по активированным.
  • Считать одного приглашённого дважды. Человеку пришли три приглашения от трёх коллег — регистрация одна, а в наивном расчёте три «успеха». Нужно правило атрибуции: первое или последнее приглашение.
  • Ставить K целью без ограничителей. Команда быстро находит способ отправлять больше приглашений: импорт адресной книги, предвыбранные галочки. Приглашений на пользователя становится больше, конверсия падает, жалобы на спам растут. Рядом с K держат конверсию приглашения и долю отписок.

Частые вопросы о виральности

Какой K-фактор считается хорошим?

Общей нормы нет: значение зависит от механики, окна наблюдения и того, что считается приглашением. Полезнее сравнивать K своих когорт между собой и переводить его в усиление 1 / (1 − K): K = 0,2 добавляет к каждому привлечённому четверть пользователя, K = 0,5 — одного.

Может ли K быть больше 1 долго?

На ограниченной аудитории — нет. Чем большая её часть уже зарегистрирована, тем чаще приглашения уходят знакомым с продуктом людям, и конверсия падает. Устойчивый K выше единицы означал бы, что продукт за несколько циклов исчерпает свой рынок.

Чем K-фактор отличается от доли реферального канала?

K — отношение новых пользователей к тем, кто их привёл, по подтверждённым парам. Доля канала — отношение к общему числу регистраций, и она меняется, когда меняются другие каналы. На учебной базе доля упала с 28,0% до 20,7%, хотя приглашать стали не реже.

Как связаны виральность и стоимость привлечения?

При K меньше 1 каждый оплаченный пользователь приводит ещё K / (1 − K) пользователей без оплаты, поэтому эффективный CAC равен обычному, умноженному на (1 − K). Это верно, только если приглашённые платят и удерживаются не хуже.

Итог

Виральность продукта измеряется двумя числами — K-фактором и временем цикла — и проверяется третьим: качеством приглашённых. K меньше единицы не провал, а нормальное состояние: это множитель к остальным каналам, и его вклад считается как 1 / (1 − K). Доверять стоит только K, собранному по когортам из подтверждённых пар «пригласил — пришёл»; всё остальное, включая долю канала referral, — верхняя оценка.

Если виральность входит в дерево метрик продукта, раскладывайте её на три ветви: приглашений на пользователя, конверсию приглашения и долю приглашённых, дошедших до активации. Запросы из статьи выполняются на учебной базе, с которой работает Симулятор SQL-аналитика: там метрики тоже считают по таблицам продукта, а не по готовым отчётам.

Продолжить чтение
Вся библиотека
Продуктовая аналитика24 сентября 2026 г.12 мин
Шкала от нуля до десяти, разделённая на три цветных участка

NPS: что это, как посчитать индекс и где он вводит в заблуждение

NPS (Net Promoter Score) — индекс готовности рекомендовать продукт: доля промоутеров минус доля критиков. Формула, пример расчёта, погрешность, SQL-запрос, сравнение по сегментам и частые ошибки.

Читать материал
Продуктовая аналитика14 октября 2026 г.18 мин
Пять столбцов разной высоты, два правых выделены цветом

CSAT и CES: формулы, пример расчёта и ловушки опросных метрик

CSAT — доля клиентов, довольных конкретным опытом; CES — оценка усилий, которых стоило решение вопроса. Формулы, расчёт на примере, доверительный интервал, отличие от NPS и ошибки чтения.

Читать материал