Как посчитать contribution margin в SQL
Содержание:
Что такое contribution margin
Contribution margin (вклад на покрытие) — выручка минус переменные расходы. Показывает, сколько каждая продажа приносит для покрытия фиксированных расходов и формирования прибыли.
В отличие от gross margin (где вычитают cost of goods sold), contribution margin вычитает только переменные расходы — те, что меняются прямо пропорционально объёму.
На собесе аналитика contribution margin спрашивают в продуктовых и финтех-командах. Метрика помогает решать, какие продукты или сегменты прибыльны, а какие тянут компанию вниз.
Формула
Contribution Margin = Revenue - Variable Costs
Contribution Margin Ratio = Contribution Margin / RevenueVariable costs включают:
- COGS (cost of goods sold) для физических товаров
- Платёжный процессинг (комиссии Stripe, ЮKassa)
- Доставка
- Поддержка пропорциональная объёму
- API-расходы за каждый вызов (если используете AI/ML-сервисы)
SQL: contribution margin по продуктам
-- orders: order_id, product_id, revenue
-- variable_costs: order_id, cost
SELECT
p.product_name,
SUM(o.revenue) AS revenue,
SUM(vc.cost) AS variable_costs,
SUM(o.revenue - vc.cost) AS contribution_margin,
ROUND(SUM(o.revenue - vc.cost)::NUMERIC / NULLIF(SUM(o.revenue), 0), 3) AS cm_ratio
FROM orders o
JOIN products p USING (product_id)
JOIN variable_costs vc USING (order_id)
WHERE o.order_date >= '2026-01-01'
GROUP BY p.product_name
ORDER BY contribution_margin DESC;Результат — таблица продуктов с CM и CM ratio. Низкий ratio (или отрицательный) — продукт убыточен на каждой продаже.
SQL: по сегментам клиентов
Часто полезнее считать CM не по продукту, а по сегменту клиентов:
WITH customer_revenue AS (
SELECT
customer_id,
SUM(revenue) AS total_revenue,
SUM(variable_cost) AS total_variable_cost,
SUM(revenue - variable_cost) AS contribution_margin
FROM orders
WHERE order_date >= '2026-01-01'
GROUP BY customer_id
),
segments AS (
SELECT
customer_id,
CASE
WHEN total_revenue > 100000 THEN 'enterprise'
WHEN total_revenue > 10000 THEN 'mid_market'
ELSE 'smb'
END AS segment
FROM customer_revenue
)
SELECT
s.segment,
COUNT(DISTINCT s.customer_id) AS customers,
SUM(cr.total_revenue) AS revenue,
SUM(cr.contribution_margin) AS total_cm,
ROUND(AVG(cr.contribution_margin), 0) AS avg_cm_per_customer,
ROUND(SUM(cr.contribution_margin)::NUMERIC / NULLIF(SUM(cr.total_revenue), 0), 3) AS cm_ratio
FROM segments s
JOIN customer_revenue cr USING (customer_id)
GROUP BY s.segment
ORDER BY total_cm DESC;На собесе попросят интерпретировать: «Если у enterprise CM ratio 65%, у smb 30%, что делать?» Ответ: продавать больше enterprise или поднимать цены/сокращать переменные расходы для smb.
Что считать переменными расходами
Это самый частый вопрос на собесе. Гид:
- Точно переменные: процессинг платежей (% от транзакции), доставка, COGS физического товара, API-расходы (за вызов), referral payouts, скидки
- Полу-переменные: support (зависит от объёма, но не пропорционально), serverless infrastructure
- Точно фиксированные: зарплаты команды, офис, маркетинг (как budget, не как conversion-фактор), R&D
Главный принцип: variable cost — то, что увеличивается с каждой проданной единицей. Если расход не меняется при +1 продаже — он фиксированный.
Частые ошибки
Включать фиксированные расходы. Зарплата команды поддержки — это фиксированный расход (не зависит от каждой продажи), даже если поддержка работает с клиентами. Не включайте в variable cost.
Игнорировать платёжный процессинг. В России комиссия эквайринга 1.5-3%. На большом объёме это ощутимо.
Не учитывать скидки. Если выручка считается по списочной цене без вычета купонов — CM завышен.
Делить на ноль. Если в сегменте 0 revenue (все clients churned) — NULLIF.
Считать только агрегаты. «У нас CM 30% в среднем» — без разреза по продуктам/сегментам это маскирует проблемы. Один продукт может быть -10%, другой +60% — среднее не показывает.
FAQ
Чем CM отличается от gross margin?
Gross margin вычитает COGS (себестоимость товара). Contribution margin вычитает все variable costs, включая non-COGS (процессинг, доставка). CM ≤ gross margin почти всегда.
Какой CM ratio считать хорошим?
Зависит от индустрии. SaaS — 70-90% (мало variable costs). Маркетплейс — 10-30% (большая часть выручки идёт продавцам). Физический ритейл — 30-50%.
Это официальная информация?
Нет. Статья основана на индустриальных практиках.