Логистика: калькулятор маржи (MVP)
MVP за ~5 часов подтвердил ценность мгновённого расчёта маржи и предотвратил ~200 ч ненужной разработки. Дальше — pivot к калькулятору ценообразования (MVP v2).
За ~5 часов собран MVP расчёта маржи и статуса сделки («выгодно/убыточно») прямо во время диалога с клиентом. Это сэкономило ~200 часов разработки «не той» аналитической фичи и подсветило продуктовый вектор — калькулятор ценообразования (MVP v2).
Контекст
Экспедитору нужен мгновенный ответ «выгодно/убыточно» без Excel и долгих расчётов — прямо в звонке или чате. Ошибка в 1–2 параметрах быстро «съедает» маржу, поэтому важно видеть и абсолютную маржу (₽), и маржинальность (%).
Задача
Проверить гипотезу: достаточно ли простого калькулятора маржи, чтобы закрывать типовые запросы и ускорять принятие решения, не уходя в перегруженную аналитику.
Моя роль
- Провёл 3 быстрых интервью (дискавери) с экспедиторами.
- Сформулировал минимальные поля ввода и бизнес-формулы.
- Реализовал MVP на Streamlit и прогнал демо на реальных сценариях.
- Зафиксировал инсайты и оформил требования к MVP v2.
Данные и подготовка
Источники — ввод пользователя (ставка клиента, ставка перевозчика, доп. расходы). Никаких интеграций на первом шаге: приоритизируем скорость проверки ценности.
Показать технические детали (формулы/Streamlit)
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 000 | 70 000 | 3 000 | 12 000 | 14.12% | ✅ выгодно |
B: рискованная скидка | 50 000 | 49 000 | 2 000 | −1 000 | −2.00% | ❌ убыточно |
C: срочная поставка | 120 000 | 98 000 | 5 000 | 17 000 | 14.17% | ✅ выгодно |
Интерфейс показывает обе метрики (₽ и %) и явный статус сделки — этого оказалось достаточно для принятия решения «здесь и сейчас».
Методология (простыми словами)
- Дискавери: короткие интервью + наблюдение за текущим процессом расчёта в Excel/чате.
- MVP: один экран, три поля, два авто-показателя (₽ и %), статус «выгодно/убыточно».
- Критерии успеха: понятность без инструкций, расчёт за секунды, отсутствие «возврата в Excel» в типовых кейсах.
Результаты → решение
Гипотеза подтверждена: «быстрая оценка» закрывает частые кейсы без больших интеграций.
Инсайт: чаще нужно не проверить маржу, а собрать правильную цену с нуля (параметры тарифа, сезонность, SLA) → pivot к MVP v2.
Рекомендации:
- Зафиксировать MVP v1 как инструмент экспресс-оценки (полевое использование).
- Спроектировать MVP v2: калькулятор ценообразования с пресетами и экспортом КП.
- Метрики мониторинга: доля кейсов, решённых без Excel; ошибки ввода; частота использования пресетов.
Риски/ограничения
- Формулы и надбавки различаются по клиентам/договорам → нужны пресеты и права редактирования.
- Рыночная волатильность (топливо/сезонность) → требуется параметризация и версии тарифов.
- Человеческий фактор: ошибки ручного ввода без валидаций.
Что дальше (MVP v2)
- Конструктор цены: плечо/тип груза, надбавки, ограничения, SLA.
- Пресеты и аудит: сохранение/редактирование шаблонов, лог действий.
- Экспорт КП в 1 клик (PDF/HTML), истории расчётов, права/роли.
Стек и запуск
Ниже — краткие шаги для воспроизведения результатов. Для менеджеров этого блока можно не касаться — он для инженера/аналитика.
Показать шаги запуска (локально)
# 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 и постоянной поддержке.