Как посчитать Market Saturation Rate в SQL

Проверь себя · 1/3разбор после ответа
Вы хотите вывести только те категории товаров, где суммарные продажи больше 10000. Таблица 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;
Закрепи формулу saturation rate в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать saturation rate в Telegram

Тренд

Сама по себе цифра насыщения мало что говорит — важнее, как быстро она растёт. Если прирост в процентных пунктах от квартала к кварталу замедляется, это сигнал приближения к потолку. Считаем изменение через 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% — это почти потолок, в массовом рынке — ещё огромный простор для роста. Всегда интерпретируйте цифру в контексте рынка.

Связанные темы

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.