Sovrano: ML‑Driven 30‑Day Preseller Planner with Per‑Shop Pricing

Nightly retrain at 21:00 • Route & capacity aware • Acceptance‑based pricing

← Back to Home

1) What we’re building

An ML‑assisted planner that produces a rolling 30‑day plan for presellers:

  • Assign presellers to shops per day (geo/time aware; in‑person vs phone).
  • Recommend products per shop with expected units and margin.
  • Suggest a price per product per shop within margin bounds.
  • Continuously learn from outcomes and adjust the next plan.

What you will see

  • Year view (month‑by‑month): expected revenue, expected purchases, additional investments needed, and other KPIs for each month.
  • Click a month → day‑by‑day plan with expected sales per shop and visit type.
  • Click a shop → product‑level details: quantities, recommended prices, acceptance probability, expected margin.
  • Go back in time → see historical recommendations/expectations vs reality (actuals), for coaching and model improvement.

SLA: Generated nightly after 21:00 retrain; ad‑hoc on demand.

ML‑ассистент формирует скользящий 30‑дневный план для пресейлеров:

  • Назначение визитов по дням с учетом географии/времени (очно/по телефону).
  • Рекомендации товаров по каждой точке с ожидаемыми продажами и маржой.
  • Предложение цены по товару и магазину в допустимых пределах.
  • Непрерывное обучение по результатам и корректировка следующего плана.

Что вы увидите

  • Вид на год (помесячно): ожидаемая выручка, закупки, требуемые дополнительные инвестиции и другие KPI по каждому месяцу.
  • Клик по месяцу → поминутный план на каждый день с ожидаемыми продажами по магазинам и типам визитов.
  • Клик по магазину → детализация по товарам: количества, рекомендуемые цены, вероятность принятия, ожидаемая маржа.
  • История → рекомендации/ожидания vs фактические результаты для обучения команды и модели.

SLA: Ночной прогон после 21:00; по запросу — генерация на лету.

2) Business constraints & assumptions

  • Preseller workday: 8 hours; visit: 10–20 min; commute: 10–20 min.
  • Phone visits up to 20% per agent (lower conversion, no travel).
  • Pricing bounds: min = cost×1.30; max = retail (shop‑specific).
  • Objective: maximize expected gross margin with coverage/travel/relationship constraints.
  • Рабочий день пресейлера: 8 ч; визит: 10–20 мин; переезды: 10–20 мин.
  • Доля телефонных визитов — до 20% (ниже конверсия, без переездов).
  • Границы цены: минимум = себестоимость×1.30; максимум = розница магазина.
  • Цель: максимизация валовой маржи при ограничениях покрытия/переездов/отношений.

4) Model architecture & pipeline

Layer A – Acceptance

Shop×product purchase probability & expected quantity; GBM or logistic+regression heads.

Layer B – Price

Price in [min,max] maximizing margin×acceptance; grid/hill‑climb.

Layer C – Visit score

Value of visiting shop minus travel/effort + relationship/coverage bonuses.

Layer D – Routing

Greedy scheduler with region buckets & time windows; phone ≤20%.

Nightly 21:00 Pipeline

  1. ETL → MLDEVDB (raw→ods→mart).
  2. Train acceptance & pricing; persist artifacts.
  3. Generate 30‑day plan → mart.Plan_PresellerVisits.
  4. Publish JSON/CSV & update Power BI.

Слой A – Принятие

Вероятность покупки и ожидаемое количество по «магазин×товар»; GBM или логистическая + регрессия.

Слой B – Цена

Цена в пределах [min,max] для максимума маржи×принятия; сетка/хилл‑клаймб.

Слой C – Оценка визита

Ожидаемая ценность визита минус затраты на дорогу + бонусы за отношения/покрытие.

Слой D – Маршрутизация

Жадный планировщик по кластерам регионов и окнам времени; телефон ≤20%.

Ночной пайплайн 21:00

  1. ETL → MLDEVDB (raw→ods→mart).
  2. Обучение принятия и цены; сохранение артефактов.
  3. Генерация 30‑дневного плана → mart.Plan_PresellerVisits.
  4. Публикация JSON/CSV и обновление Power BI.

5) APIs & Ops

Planned APIs

  • POST /ml/plan/generate → generate & persist plan
  • GET /ml/plan/status → last run, coverage, travel
  • GET /ml/plan/day/{date}
  • GET /ml/price/suggest (shopId, productId)

Ops

  • Scheduler: retrain → /ml/plan/generate.
  • Log metrics to logs/ and ref.TrainingHistory.

Планируемые API

  • POST /ml/plan/generate → генерация и запись плана
  • GET /ml/plan/status → время последнего прогона, покрытие, переезды
  • GET /ml/plan/day/{date}
  • GET /ml/price/suggest (shopId, productId)

Операции

  • Планировщик: retrain → /ml/plan/generate.
  • Метрики в logs/ и ref.TrainingHistory.

6) Acceptance criteria

Data

Non‑zero rows in mart.vw_SalesDetail; lineage checks consistent.

Models

Stable/improving R²/MAE; calibrated acceptance probabilities.

Plan Quality

8h/day, ≤20% phone, travel bands respected, priority coverage, GM uplift ≥ baseline.

Pricing

Within min/max; acceptance‑aware; limited price jumps unless justified.

Данные

Ненулевые строки в mart.vw_SalesDetail; согласованная линия происхождения.

Модели

Стабильные/улучшающиеся R²/MAE; калиброванные вероятности принятия.

Качество плана

8 ч/день, ≤20% телефоном, соблюдение коридоров по переездам, приоритетное покрытие, прирост GM ≥ базе.

Цены

В пределах min/max; учитывают принятие; без резких скачков без обоснования.

7) Implementation steps (7–10 days)

  1. Views & ETL for Visits, Merchandising, ShopPriceBands.
  2. Feature builder for acceptance & price sensitivity.
  3. Train acceptance + price optimizer; persist artifacts.
  4. Greedy scheduler with regions & time windows; phone allocation.
  5. Expose /ml/plan/generate and status endpoints.
  6. Unit/integration tests on synthetic + sampled data.
  7. Extend 21:00 scheduler, log metrics, Power BI view for plan.
  1. Представления и ETL для Visits, Merchandising, ShopPriceBands.
  2. Фичебилдер для принятия и чувствительности к цене.
  3. Обучение принятия + ценовой оптимизатор; сохранение артефактов.
  4. Жадный планировщик по регионам и окнам времени; доля телефоний.
  5. Эндпоинты: /ml/plan/generate и статус.
  6. Юнит/интеграционные тесты на синтетике и семплах.
  7. Расширить 21:00 планировщик, логирование метрик, Power BI представление.

3) Questions for the business

  1. Preseller roster, home regions, availability, blackout dates.
  2. Geo granularity (lat/lon vs region/city) & time windows.
  3. Phone visit share per agent (default 20%).
  4. Travel time rules and bottlenecks by hour/region.
  5. Product constraints (packs, promos, price floors above +30%).
  6. Shop‑specific retail prices vs regional averages; MAP policies.
  7. Outcome labels source (purchase y/n, reason codes).
  8. Merchandising data location and cadence.
  9. Coverage targets and priority tiers.
  10. KPI weights: GM vs revenue vs coverage (defaults below).
  11. Plan consumption format (DB schema/JSON/CSV).
  12. SLA window and cut‑off time for next‑day distribution.
  1. Состав пресейлеров, базовые регионы, график, стоп-даты.
  2. Гео‑детализация (координаты или район/город) и окна времени.
  3. Доля телефонных визитов на агента (по умолчанию 20%).
  4. Правила по времени в пути и узкие места по часам/районам.
  5. Ограничения по продуктам (упаковки, промо, ценовые минимумы >+30%).
  6. Розничные цены по магазину или средние по региону; MAP‑политики.
  7. Где хранятся метки результата (покупка да/нет, причины).
  8. Где и как часто фиксируется мерчандайзинг.
  9. Цели по покрытию и приоритетные уровни.
  10. Веса KPI: маржа vs выручка vs покрытие (значения по умолчанию ниже).
  11. Формат потребления плана (схема БД/JSON/CSV).
  12. Окно SLA и крайнее время для рассылки плана на завтра.

Real‑Time Progress & KPI Controls

Program Progress

Backend API
ML Service
Frontend Touch
Integration
Frontend Desktop

Planning & Pricing KPIs

Weight50%
Plan horizon
20%
Weight50%
Weight50%
Per shop in‑person
Weight50%
Between shops
Weight60%
Per preseller
Weight60%
Default price floor
50%
30%
20%

Need a tailored setup for your region?

We’ll tune planning windows, travel bands, and KPI weights to your enterprise. Your 1C remains the backup system—zero migration risk.