Как посчитать Market Saturation Rate в SQL
sales с колонками category и amount. Какой запрос корректен?Содержание:
Зачем Saturation Rate
Saturation rate (насыщение рынка) показывает, какую долю доступного рынка вы уже заняли. Представьте бизнес, который растёт на 5% в год и при этом уже охватил 80% всего потенциального спроса (TAM, Total Addressable Market). Насыщение 80% означает, что потолок близко: даже идеальный продукт не найдёт новых клиентов там, где их физически не осталось. Без выхода в новые географии или сегменты рост неизбежно замедлится.
Аналитику эта метрика нужна, чтобы вовремя предупредить бизнес: «в текущем рынке расти почти некуда, пора смотреть на экспансию». Именно поэтому saturation rate любят спрашивать на продуктовых и growth-собеседованиях — она проверяет, понимаете ли вы разницу между «растём в числах» и «растём относительно рынка».
Формула
Saturation Rate = customers / TAM × 100%TAM (Total Addressable Market) — это оценка полного числа потенциальных клиентов, которых теоретически можно привлечь. Проблема в том, что TAM почти никогда не дан в готовом виде: его оценивают либо снизу вверх (bottom-up, суммируя достижимые сегменты), либо сверху вниз (top-down, беря общий размер категории и отрезая долю). От качества этой оценки напрямую зависит, будет ли ваш saturation rate осмысленным.
Базовый расчёт
Допустим, есть таблица customers(user_id, country) и ручная оценка TAM по странам. Считаем долю занятого рынка в каждой стране:
WITH customer_count AS (
SELECT
country,
COUNT(DISTINCT user_id) AS customers
FROM customers
WHERE active = TRUE -- считаем только активных, а не всех когда-либо
GROUP BY country
),
tam AS (
-- Ручная оценка TAM по каждой стране
SELECT * FROM (VALUES
('RU', 5000000),
('KZ', 500000),
('BY', 300000),
('UA', 800000)
) AS t(country, total_addressable)
)
SELECT
c.country,
c.customers,
t.total_addressable AS tam,
c.customers::NUMERIC * 100 / NULLIF(t.total_addressable, 0) AS saturation_pct
FROM customer_count c
JOIN tam t ON t.country = c.country
ORDER BY saturation_pct DESC;NULLIF(t.total_addressable, 0) защищает от деления на ноль, если по какой-то стране TAM не задан. Результат сразу отсортирован: сверху окажутся рынки, где расти почти некуда.
По гео
Чтобы понять динамику, полезно считать накопленную клиентскую базу по кварталам и странам. Оконная функция SUM(...) OVER (PARTITION BY country ORDER BY quarter) даёт нарастающий итог:
SELECT
DATE_TRUNC('quarter', signup_date) AS quarter,
country,
COUNT(*) AS new_customers,
SUM(COUNT(*)) OVER (
PARTITION BY country
ORDER BY DATE_TRUNC('quarter', signup_date)
) AS cumulative_customers
FROM users
WHERE signup_date >= '2024-01-01'
GROUP BY 1, 2
ORDER BY 2, 1;Теперь совмещаем накопленную базу с TAM, чтобы получить насыщение на каждый квартал:
WITH cumulative AS (
SELECT
DATE_TRUNC('quarter', signup_date) AS quarter,
country,
SUM(COUNT(*)) OVER (PARTITION BY country ORDER BY DATE_TRUNC('quarter', signup_date)) AS cum_customers
FROM users
GROUP BY 1, 2
),
tam AS (
SELECT * FROM (VALUES ('RU', 5000000), ('KZ', 500000)) AS t(country, total)
)
SELECT
c.quarter,
c.country,
c.cum_customers,
t.total AS tam,
c.cum_customers::NUMERIC * 100 / NULLIF(t.total, 0) AS saturation_pct
FROM cumulative c
JOIN tam t ON t.country = c.country
ORDER BY c.country, c.quarter;Тренд
Сама по себе цифра насыщения мало что говорит — важнее, как быстро она растёт. Если прирост в процентных пунктах от квартала к кварталу замедляется, это сигнал приближения к потолку. Считаем изменение через LAG:
SELECT
quarter,
country,
saturation_pct,
LAG(saturation_pct) OVER (PARTITION BY country ORDER BY quarter) AS prev_saturation,
saturation_pct - LAG(saturation_pct) OVER (PARTITION BY country ORDER BY quarter) AS saturation_growth_pp
FROM (
-- сюда подставляем предыдущий запрос с saturation_pct
) x
ORDER BY country, quarter;Замедление прироста (saturation_growth_pp падает от квартала к кварталу) — это и есть приближение к насыщению. Обратный сигнал — ускорение — говорит, что рынок ещё не исчерпан и стоит наращивать привлечение.
Как это спрашивают на собесе
«Как понять, что бизнесу пора выходить на новые рынки?» Сильный ответ — показать не абсолютный рост, а рост относительно TAM. Если saturation rate в основном рынке уже высокий и прирост в п.п. замедляется, органический потолок близко, и дальнейшие инвестиции в привлечение дают всё меньше отдачи.
«Чем saturation rate отличается от простого роста числа клиентов?» Число клиентов может расти, а насыщение при этом почти не двигаться, если рынок сам растёт быстрее. И наоборот: рост замер, но насыщение подскочило — рынок сжимается. Проговорить эту развязку между абсолютом и долей — то, чего ждёт интервьюер. Прогнать такие продуктовые вопросы с разбором можно в Карьернике.
«Вы получили saturation 120%, что не так?» Это не рост, а ошибка в оценке TAM: занижен знаменатель. Нужно пересмотреть market sizing, а не радоваться цифре.
Частые ошибки
TAM тяжело определить. TAM — это всегда оценка, а не факт. Комбинируйте несколько источников (отраслевые отчёты, bottom-up по сегментам, top-down по категории) и сверяйте их между собой, иначе весь расчёт насыщения строится на песке.
Путать SAM и TAM. TAM — весь теоретический рынок. SAM (Serviceable Addressable Market) — та часть, которую вы реально можете обслуживать с вашим продуктом и географией. На практике для saturation rate чаще берут SAM: он честнее отражает потолок.
Активные против накопленных клиентов. Если в числитель класть всех клиентов за всю историю, включая отток, насыщение будет завышено. Для честной картины считайте активную базу.
Считать TAM статичным. Рынок меняется со временем: появляются новые пользователи, растёт проникновение категории. Обновляйте оценку TAM хотя бы раз в год, иначе тренд насыщения врёт.
Считать любые 50% насыщения «много». Это зависит от индустрии. В узкой нише 50% — это почти потолок, в массовом рынке — ещё огромный простор для роста. Всегда интерпретируйте цифру в контексте рынка.
Связанные темы
- Как посчитать CAC в SQL
- Как посчитать new users в SQL
- Как посчитать growth rate в SQL
- Как посчитать MAU в SQL
FAQ
Откуда брать TAM?
Из отраслевых отчётов (Statista, IDC, локальные аналитические агентства) или считая самостоятельно. Bottom-up: суммируете достижимые сегменты снизу вверх. Top-down: берёте общий размер категории и умножаете на реалистичную долю проникновения. Лучший вариант — посчитать обоими способами и сверить: если оценки сильно расходятся, где-то ошибка в допущениях.
Saturation больше 100% — это баг?
Почти всегда да, но не в коде, а в данных: TAM занижен. Насыщение физически не может превысить 100% — это значит, что клиентов у вас больше, чем вы насчитали потенциальных. Нужно пересмотреть оценку рынка, а не запрос.
Насыщение замедлилось — что делать бизнесу?
Есть три классических направления. Первое — экспансия в новые географии и вертикали, где насыщение ещё низкое. Второе — рост ARPU (выручки на пользователя) на текущей базе через апсейл и новые тарифы. Третье — запуск новой продуктовой линейки, которая открывает свой TAM.
Как считать saturation rate для B2B?
В B2B считайте в компаниях или аккаунтах, а не в отдельных пользователях. TAM в B2B — это число целевых компаний на рынке (например, все ритейлеры с оборотом выше порога), а не число сотрудников в них.
Чем SAM отличается от SOM и что брать в знаменатель?
TAM — весь теоретический рынок, SAM (Serviceable) — та часть, которую вы реально можете обслуживать, SOM (Serviceable Obtainable Market) — доля, которую реалистично занять в обозримом горизонте. Для оценки потолка берите SAM. Для растущего стартапа, который планирует ближайшие 1–2 года, полезнее ориентироваться на SOM: он не даёт обмануться недостижимо большим TAM.