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

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

Что такое 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

Variable 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 (или отрицательный) — продукт убыточен на каждой продаже.

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

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%.

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

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