Как посчитать contribution margin в SQL

Проверь себя · 1/3разбор после ответа
У вас есть таблицы users(email) и marketing_signups(email). В одной системе email сохраняется как Ivan@Example.com, в другой — ivan@example.com. Какой подход в JOIN чаще всего решает проблему без изменения данных в таблицах?

Что такое contribution margin

Contribution margin (вклад на покрытие) — выручка минус переменные расходы. Показывает, сколько каждая продажа приносит для покрытия фиксированных расходов и формирования прибыли.

В отличие от gross margin (где вычитают cost of goods sold), contribution margin вычитает только переменные расходы — те, что меняются прямо пропорционально объёму.

На собесе аналитика contribution margin спрашивают в продуктовых и финтех-командах. Метрика помогает решать, какие продукты или сегменты прибыльны, а какие тянут компанию вниз.

Формула

Contribution Margin = Revenue - Variable Costs
Contribution Margin Ratio = Contribution Margin / Revenue

Переменные расходы включают:

  • 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. Низкий CM 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.

Закрепи формулу contribution margin в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать contribution margin в Telegram

Что считать переменными расходами

Это самый частый вопрос на собесе. Гид:

  • Точно переменные: процессинг платежей (% от транзакции), доставка, COGS физического товара, API-расходы (за вызов), реферальные выплаты, скидки
  • Полу-переменные: поддержка (зависит от объёма, но не пропорционально), serverless-инфраструктура
  • Точно фиксированные: зарплаты команды, офис, маркетинг (как бюджет, а не как фактор конверсии), R&D

Главный принцип: переменный расход — то, что увеличивается с каждой проданной единицей. Если расход не меняется при +1 продаже — он фиксированный.

Частые ошибки

Включать фиксированные расходы. Зарплата команды поддержки — это фиксированный расход (не зависит от каждой продажи), даже если поддержка работает с клиентами. Не включайте её в переменные расходы.

Игнорировать платёжный процессинг. В России комиссия эквайринга 1.5-3%. На большом объёме это ощутимо.

Не учитывать скидки. Если выручка считается по списочной цене без вычета купонов — CM завышен.

Делить на ноль. Если в сегменте 0 выручки (все клиенты ушли в отток) — NULLIF.

Считать только агрегаты. «У нас CM 30% в среднем» — без разреза по продуктам/сегментам это маскирует проблемы. Один продукт может быть -10%, другой +60% — среднее не показывает.

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

FAQ

Чем CM отличается от gross margin?

Gross margin вычитает COGS (себестоимость товара). Contribution margin вычитает все переменные расходы, включая те, что не входят в COGS (процессинг, доставку). Поэтому CM почти всегда меньше или равна gross margin.

Какой CM ratio считать хорошим?

Зависит от индустрии. У SaaS — 70-90%, потому что переменных расходов мало. У маркетплейса — 10-30%, так как большая часть выручки уходит продавцам. У физического ритейла — 30-50%.

Это официальная информация?

Нет. Статья основана на индустриальных практиках.