Case · Ops

Логистика: калькулятор маржи (MVP)

MVP за ~5 часов подтвердил ценность мгновённого расчёта маржи и предотвратил ~200 ч ненужной разработки. Дальше — pivot к калькулятору ценообразования (MVP v2).

Роль: Product/TechТаймлайн: 1 неделя (дискавери → MVP → интервью)Статус: deliveredMVPStreamlitPythonProduct Discovery~200 ч экономии

За ~5 часов собран MVP расчёта маржи и статуса сделки («выгодно/убыточно») прямо во время диалога с клиентом. Это сэкономило ~200 часов разработки «не той» аналитической фичи и подсветило продуктовый вектор — калькулятор ценообразования (MVP v2).

Экономия: ~200 ч разработки

Демо (gif)

Контекст

Экспедитору нужен мгновенный ответ «выгодно/убыточно» без Excel и долгих расчётов — прямо в звонке или чате. Ошибка в 1–2 параметрах быстро «съедает» маржу, поэтому важно видеть и абсолютную маржу (₽), и маржинальность (%).

Задача

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

Моя роль

  • Провёл 3 быстрых интервью (дискавери) с экспедиторами.
  • Сформулировал минимальные поля ввода и бизнес-формулы.
  • Реализовал MVP на Streamlit и прогнал демо на реальных сценариях.
  • Зафиксировал инсайты и оформил требования к MVP v2.

Данные и подготовка

Источники — ввод пользователя (ставка клиента, ставка перевозчика, доп. расходы). Никаких интеграций на первом шаге: приоритизируем скорость проверки ценности.

Показать технические детали (формулы/Streamlit)
Бизнес-формулы (Python)
def margin(client_rate: float, carrier_rate: float, extra_costs: float) -> tuple[float, float, str]:
    m = client_rate - carrier_rate - extra_costs
    pct = (m / client_rate * 100.0) if client_rate else 0.0
    status = "выгодно" if m > 0 else "убыточно" if m < 0 else "в ноль"
    return m, pct, status
 
 
import streamlit as st
 
st.title("Калькулятор маржи")
client = st.number_input("Ставка клиента, ₽", min_value=0, value=85000, step=500)
carrier = st.number_input("Ставка перевозчика, ₽", min_value=0, value=70000, step=500)
extra   = st.number_input("Доп. расходы, ₽", min_value=0, value=3000,  step=100)
 
m, pct, status = margin(client, carrier, extra)
 
st.metric("Маржа, ₽", f"{m:,.0f}".replace(",", " "))
st.metric("Маржинальность, %", f"{pct:.2f}%")
st.subheader(("✅ " if m > 0 else "❌ " if m < 0 else "➖ ") + status)

Сводные сценарии (демо)

СценарийСтавка клиентаПеревозчикДоп. расходыМаржаМаржинальностьИндикатор
A: базовая заявка85 00070 0003 00012 00014.12%✅ выгодно
B: рискованная скидка50 00049 0002 000−1 000−2.00%❌ убыточно
C: срочная поставка120 00098 0005 00017 00014.17%✅ выгодно

Интерфейс показывает обе метрики (₽ и %) и явный статус сделки — этого оказалось достаточно для принятия решения «здесь и сейчас».

Методология (простыми словами)

  • Дискавери: короткие интервью + наблюдение за текущим процессом расчёта в Excel/чате.
  • MVP: один экран, три поля, два авто-показателя (₽ и %), статус «выгодно/убыточно».
  • Критерии успеха: понятность без инструкций, расчёт за секунды, отсутствие «возврата в Excel» в типовых кейсах.

Результаты → решение

Гипотеза подтверждена: «быстрая оценка» закрывает частые кейсы без больших интеграций.

Инсайт: чаще нужно не проверить маржу, а собрать правильную цену с нуля (параметры тарифа, сезонность, SLA) → pivot к MVP v2.

Рекомендации:

  • Зафиксировать MVP v1 как инструмент экспресс-оценки (полевое использование).
  • Спроектировать MVP v2: калькулятор ценообразования с пресетами и экспортом КП.
  • Метрики мониторинга: доля кейсов, решённых без Excel; ошибки ввода; частота использования пресетов.

Риски/ограничения

  • Формулы и надбавки различаются по клиентам/договорам → нужны пресеты и права редактирования.
  • Рыночная волатильность (топливо/сезонность) → требуется параметризация и версии тарифов.
  • Человеческий фактор: ошибки ручного ввода без валидаций.

Что дальше (MVP v2)

  • Конструктор цены: плечо/тип груза, надбавки, ограничения, SLA.
  • Пресеты и аудит: сохранение/редактирование шаблонов, лог действий.
  • Экспорт КП в 1 клик (PDF/HTML), истории расчётов, права/роли.

Стек и запуск

Ниже — краткие шаги для воспроизведения результатов. Для менеджеров этого блока можно не касаться — он для инженера/аналитика.

Показать шаги запуска (локально)
Локально: запуск MVP
# 1) создать окружение и активировать
python -m venv .venv && . .venv/Scripts/Activate.ps1  # Windows
# или:
python3 -m venv .venv && source .venv/bin/activate    # macOS/Linux
 
# 2) установить зависимости
pip install -r requirements.txt
 
# 3) запустить приложение
streamlit run app.py
Готовы подключиться

Нужно обсудить похожий кейс?

Расскажите коротко о задаче — вернёмся с предложением в течение дня. Открыты к пилотам, MVP и постоянной поддержке.