← Назад к вопросам

Как оценить эффективность акции "2 товара по цене 1"?

2.0 Middle🔥 61 комментариев
#Аналитика и метрики

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Оценка эффективности акции "2 товара по цене 1"

В розничной торговле такие акции широко распространены, но их эффективность не всегда очевидна. Data Engineer часто получает задачу подготовить данные для расчёта ключевых показателей.

Основные метрики эффективности

1. Прирост объёма продаж (Volume Lift)

Самая основная метрика — сколько дополнительных единиц товара продано благодаря акции?

WITH promo_sales AS (
    SELECT 
        product_id,
        SUM(quantity) as promo_quantity,
        SUM(amount) as promo_revenue
    FROM sales
    WHERE promo_id = 'buy2get1' 
    AND sale_date BETWEEN '2024-01-01' AND '2024-01-31'
    GROUP BY product_id
),
baseline_sales AS (
    SELECT 
        product_id,
        SUM(quantity) as baseline_quantity,
        SUM(amount) as baseline_revenue
    FROM sales
    WHERE promo_id IS NULL
    AND sale_date BETWEEN '2023-12-01' AND '2023-12-31'
    GROUP BY product_id
)
SELECT 
    p.product_id,
    b.baseline_quantity,
    p.promo_quantity,
    p.promo_quantity - b.baseline_quantity as quantity_lift,
    ROUND(100.0 * (p.promo_quantity - b.baseline_quantity) / b.baseline_quantity, 2) as lift_percent
FROM promo_sales p
JOIN baseline_sales b ON p.product_id = b.product_id
ORDER BY lift_percent DESC;

Интерпретация: Если lift_percent = 50%, значит продажи выросли на 50%. Нужно учитывать сезонность.

2. Увеличение выручки (Revenue Impact)

WITH metrics AS (
    SELECT 
        CASE WHEN promo_id = 'buy2get1' THEN 'promo' ELSE 'baseline' END as period,
        SUM(amount) as revenue,
        SUM(quantity) as quantity
    FROM sales
    WHERE sale_date BETWEEN '2024-01-01' AND '2024-01-31'
    GROUP BY period
)
SELECT 
    MAX(CASE WHEN period = 'baseline' THEN revenue END) as baseline_revenue,
    MAX(CASE WHEN period = 'promo' THEN revenue END) as promo_revenue,
    ROUND(100.0 * (MAX(CASE WHEN period = 'promo' THEN revenue END) - MAX(CASE WHEN period = 'baseline' THEN revenue END)) / MAX(CASE WHEN period = 'baseline' THEN revenue END), 2) as revenue_change_percent
FROM metrics;

Важно: выручка может упасть даже если объём вырос.

3. Маржинальность (Margin)

Прибыль — главный показатель, не выручка.

WITH promo_margin AS (
    SELECT 
        SUM(amount) as promo_revenue,
        SUM(amount * (1 - cost_percent / 100.0)) as promo_profit
    FROM sales
    WHERE promo_id = 'buy2get1'
    AND sale_date BETWEEN '2024-01-01' AND '2024-01-31'
),
baseline_margin AS (
    SELECT 
        SUM(amount) as baseline_revenue,
        SUM(amount * (1 - cost_percent / 100.0)) as baseline_profit
    FROM sales
    WHERE promo_id IS NULL
    AND sale_date BETWEEN '2023-12-01' AND '2023-12-31'
)
SELECT 
    p.promo_profit - b.baseline_profit as profit_change
FROM promo_margin p, baseline_margin b;

4. Привлечение новых клиентов (New Customer Acquisition)

WITH promo_customers AS (
    SELECT DISTINCT customer_id
    FROM sales
    WHERE promo_id = 'buy2get1'
    AND sale_date BETWEEN '2024-01-01' AND '2024-01-31'
),
prior_customers AS (
    SELECT DISTINCT customer_id
    FROM sales
    WHERE sale_date < '2024-01-01'
)
SELECT 
    COUNT(DISTINCT pc.customer_id) as total_promo_customers,
    COUNT(DISTINCT CASE WHEN pr.customer_id IS NULL THEN pc.customer_id END) as new_customers,
    ROUND(100.0 * COUNT(DISTINCT CASE WHEN pr.customer_id IS NULL THEN pc.customer_id END) / COUNT(DISTINCT pc.customer_id), 2) as new_customer_percent
FROM promo_customers pc
LEFT JOIN prior_customers pr ON pc.customer_id = pr.customer_id;

5. Среднее значение чека (Average Order Value)

SELECT 
    CASE WHEN promo_id = 'buy2get1' THEN 'With Promo' ELSE 'Without Promo' END as scenario,
    COUNT(DISTINCT order_id) as orders,
    ROUND(SUM(amount) / COUNT(DISTINCT order_id), 2) as aov,
    ROUND(SUM(quantity) / COUNT(DISTINCT order_id), 2) as avg_items_per_order
FROM sales
WHERE sale_date BETWEEN '2024-01-01' AND '2024-01-31'
GROUP BY CASE WHEN promo_id = 'buy2get1' THEN 'With Promo' ELSE 'Without Promo' END;

6. Каннибализация (Cannibalization)

Критична для покупателей, которые всё равно купили бы товар, только без скидки.

WITH current_year AS (
    SELECT product_id, SUM(quantity) as qty_2024
    FROM sales
    WHERE sale_date BETWEEN '2024-01-01' AND '2024-01-31'
    GROUP BY product_id
),
prior_year AS (
    SELECT product_id, SUM(quantity) as qty_2023
    FROM sales
    WHERE sale_date BETWEEN '2023-01-01' AND '2023-01-31'
    GROUP BY product_id
)
SELECT 
    p.product_id,
    ROUND(p.qty_2023 * 1.1, 0) as expected_qty,
    c.qty_2024,
    c.qty_2024 - ROUND(p.qty_2023 * 1.1, 0) as incremental_sales
FROM prior_year p
JOIN current_year c ON p.product_id = c.product_id;

ROI от скидки

Какой ROI от затрат на скидку?

WITH calculations AS (
    SELECT 
        SUM(amount) as total_revenue,
        SUM(quantity * unit_cost) as total_cost,
        SUM(discount_amount) as total_discount
    FROM sales
    WHERE promo_id = 'buy2get1'
    AND sale_date BETWEEN '2024-01-01' AND '2024-01-31'
)
SELECT 
    total_revenue,
    total_discount,
    total_revenue - total_cost - total_discount as net_profit,
    ROUND((total_revenue - total_cost - total_discount) / total_discount, 2) as roi
FROM calculations;

Практический пример

Акция: 2 товара по цене 1 на кетчуп, март 2024

Объём:

  • Без акции (февраль): 1,000 шт/день
  • С акцией (март): 1,500 шт/день
  • Прирост: +50%

Выручка:

  • Без акции: 50,000 руб/день
  • С акцией: 60,000 руб/день
  • Прирост: +20%

Прибыль:

  • Без акции: 15,000 руб/день (30% маржа)
  • С акцией: 12,000 руб/день (20% маржа)
  • Изменение: -3,000 руб/день (убыток!)

Новые клиенты:

  • 40% покупателей — новые
  • Нужно проверить LTV

Вывод: Акция привлекает объём и новых клиентов, но убыточна краткосрочно.

Ключевые показатели

Что обязательно считать:

  1. Volume Lift % — объём вырос?
  2. Revenue Impact % — выручка вырос?
  3. Margin Change — прибыль изменилась?
  4. New Customer % — какой % новых клиентов?
  5. Cannibalization % — каннибализация других товаров?
  6. ROI — каждый рубль скидки приносит сколько рублей прибыли?

ROI интерпретация:

  • ROI > 2.0 = хорошо
  • ROI 1.0 - 2.0 = маржинально
  • ROI < 1.0 = убыток

Инструменты

Обязательно:

  1. Контрольная группа (A/B тест) — наиболее точно
  2. Аналогичный период в прошлом году
  3. Учёт сезонности и трендов
  4. Длительный период отслеживания (1-2 месяца минимум)
  5. Отслеживание повторных покупок

Ошибки аналитиков:

  • Считать только краткосрочный эффект
  • Не учитывать каннибализацию
  • Не проверять качество новых клиентов
  • Использовать неправильный контроль

Итоговый чеклист

Eсли на все вопросы ДА — акция успешна:

  • Объём продаж выросли?
  • Выручка выросла?
  • Прибыль выросла?
  • Привлечены новые клиенты?
  • Каннибализация минимальна?
  • ROI от скидки > 1.5?
Как оценить эффективность акции "2 товара по цене 1"? | PrepBro