Surrika

Точка заказа по артикулам на основе скорости продаж

Точка заказа показывает остаток, при котором пора заказывать новую партию. Она складывается из спроса за время поставки и страхового запаса. Для артикулов с разной скоростью продаж уровни получаются разными.

Продажи и ассортимент

Как считать

  1. Собираю продажи по дням и артикулам за год.
  2. Считаю средний дневной спрос и стандартное отклонение дневных продаж.
  3. Добавляю к спросу на срок поставки страховой запас.
  4. Сравниваю расчетный уровень с последним остатком на складе.
  5. Показываю артикулы, где остаток ниже уровня, и величину дефицита в штуках.

Расчет на выгрузках магазина

Пример посчитан на выгрузках вымышленного мебельного магазина: продажи сайта и трех маркетплейсов, реклама, сделки CRM и остатки за 2024-2025 годы.

Как по каждому артикулу понять, когда пора заказывать новую партию, если продажи идут с разной скоростью? Хочу видеть точку заказа и текущий остаток в одном отчете.

Остаток и точка заказа по артикулам

SQL, по которому посчитано

WITH params AS (
  SELECT
    date_trunc('month', max(date)) - INTERVAL '11 months' AS start_date,
    max(date) AS end_date
  FROM sales
),
calendar AS (
  SELECT CAST(unnest(generate_series(start_date, end_date, INTERVAL '1 day')) AS DATE) AS date
  FROM params
),
sku_list AS (
  SELECT DISTINCT sku
  FROM sales
  WHERE date >= (SELECT start_date FROM params)
),
daily_sales AS (
  SELECT
    c.date,
    s.sku,
    COALESCE(SUM(s2.units), 0) AS units
  FROM calendar c
  CROSS JOIN sku_list s
  LEFT JOIN sales s2
    ON s2.sku = s.sku
   AND s2.date = c.date
  GROUP BY c.date, s.sku
),
sales_stats AS (
  SELECT
    sku,
    AVG(units) AS avg_daily_units,
    COALESCE(STDDEV_SAMP(units), 0) AS stddev_daily_units
  FROM daily_sales
  GROUP BY sku
),
stock_latest AS (
  SELECT sku, category, units AS stock_qty
  FROM stock
  WHERE date = (SELECT max(date) FROM stock)
),
calc AS (
  SELECT
    st.sku,
    sl.category,
    sl.stock_qty,
    st.avg_daily_units,
    1.65 * st.stddev_daily_units * SQRT(30) AS safety_stock_units,
    st.avg_daily_units * 30 + 1.65 * st.stddev_daily_units * SQRT(30) AS reorder_point_units
  FROM sales_stats st
  JOIN stock_latest sl ON sl.sku = st.sku
)
SELECT
  sku,
  category,
  CAST(ROUND(stock_qty, 0) AS INTEGER) AS stock_qty,
  ROUND(avg_daily_units, 2) AS avg_daily_units,
  CAST(ROUND(safety_stock_units, 0) AS INTEGER) AS safety_stock_units,
  CAST(ROUND(reorder_point_units, 0) AS INTEGER) AS reorder_point_units,
  CAST(ROUND(reorder_point_units - stock_qty, 0) AS INTEGER) AS deficit_units
FROM calc
WHERE stock_qty < reorder_point_units
ORDER BY deficit_units DESC
LIMIT 30

Где взять данные для точки заказа по артикулам

Цифры для точки заказа берут из выгрузок продаж и остатков. Продажи по артикулам есть в отчете кабинета площадки и в учетной системе сайта. Для склада берите последнюю инвентаризацию. Средний остаток за месяц сглаживает дефицит и скрывает нехватку.

Как учесть страховой запас по продажам

Страховой запас закрывает колебания дневных продаж за время поставки. Его считают по стандартному отклонению дневных продаж и коэффициенту уровня сервиса. При редких продажах одного артикула отклонение по дням с продажами завышает запас, поэтому в расчет включают дни без продаж с нулем.

Как рассчитать точку заказа и не завысить запас

Средний дневной спрос умножают на срок поставки в днях и прибавляют страховой запас. В примере срок поставки 30 дней и коэффициент запаса 1.65. Если поставщик везет 45 дней, подставьте 45, иначе заказ сработает поздно. Точка заказа не равна минимальному остатку. Минимальный остаток задает владелец. Точка заказа зависит от скорости продаж и срока поставки.

Что делать с артикулами ниже точки заказа

Артикулы с остатком ниже точки заказа попадают в заказ поставщику. Сначала закрывают позиции с наибольшим дефицитом в штуках. Если дефицит возник из-за разовой акции, проверьте, повторится ли спрос, прежде чем увеличивать заказ. Для товаров с редкими продажами точку заказа пересматривают раз в месяц, иначе запас будет лежать без движения.

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

Скорость продаж по выручке

Выручка растет при повышении цены, поэтому точка заказа в рублях не совпадет с числом штук для заказа. Средний дневной спрос считайте в штуках, а деньги оставьте для оценки замороженного остатка.

Остаток без резервов и товаров в пути

Если из остатка не вычесть заказы, которые уже обещаны покупателям, точка заказа сработает поздно. Прибавьте к доступному остатку партии в пути и вычтите резервы.

Один срок поставки для всех артикулов

У разных поставщиков срок отличается, поэтому общая точка заказа искажает приоритет. Задайте срок по каждому артикулу или хотя бы по категории.

Вопросы

Что делать, если продаж за год не было?

Для нового артикула историю заменяют планом продаж или данными аналога. Без спроса точку заказа не считают.

Можно ли считать точку заказа по категории?

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

Почему точка заказа выше текущего остатка, а товар не заканчивается?

Страховой запас и срок поставки могут давать высокий уровень. Проверьте, не завышено ли стандартное отклонение из-за одного крупного заказа.

Посчитайте это на своих выгрузках

Бросьте выгрузки на доску Surrika и задайте вопрос обычными словами. Ответ придет графиком, а под ним будет SQL, по которому он посчитан.

14 дней бесплатно, карта не нужна.

По теме

Все задачи