Кейс: Зоомагазин с заказом на самовывоз

Единица работы — заказ на самовывоз, а не сообщение с сайта и не корзина. Покупатель оформляет набор, сотрудник проверяет полку, замена уходит по ссылке, в сборку попадает только подтверждённый состав.

Карточка проекта

Отрасль
Розница зоотоваров с заказом на самовывоз
Основной рынок
Минск
Масштаб
~800 товарных позиций; заказы через сайт, телефон и сообщения; продавцы, один из которых в смене отвечает за сборку онлайн-заказов
Основная проблема
Заявка живёт в сообщении, замена — в чате или на бумаге, сборщик видит исходный список, у заказа нет единой подтверждённой версии
Ключевое решение
Заказ на самовывоз: исходный выбор, проверка позиций, предложения, подтверждённый состав, ответственный и история
Основные пользователи
Покупатель, сотрудник смены, администратор каталога
Первая версия
Пилот в одной торговой точке; без вымышленного календарного срока
Технологический стек
Laravel-монолит, Blade + Livewire + Alpine.js, MySQL, очередь в БД — без Next.js, Redis и S3
Статус проекта
Внедрён

Отрасль и клиент

Рынок и задача

Покупатель собирает привычный набор: корм, наполнитель и лакомства. В каталоге всё выглядит доступным, но после отправки заказа сотрудник обнаруживает, что нужного объёма корма уже нет на полке. Он предлагает другую упаковку по телефону, покупатель просит оставить только наполнитель, а сборщик продолжает работать по первоначальному списку.

Для зоомагазина в Минске собрали контур примерно на 800 товарных позиций. Заказы приходят с сайта, по телефону и в сообщениях. В торговой точке работают продавцы, один из которых в смене отвечает за сборку онлайн-заказов. Цель продукта — связать оформление самовывоза с проверкой наличия, согласованием изменений и выдачей актуальной версии заказа.

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

Сроки годности партий закрывает учёт сроков годности в зоотоварах. Здесь другой контур той же ниши: от оформления до выдачи подтверждённого состава. Соседний зооретейл без самовывоза с полки — магазин инструментов для груминга: там связка «машинка — нож — насадка», здесь заказ корма и наполнителя до выдачи в точке.

Масштаб первой версии

Позиции каталога~800
ГородМинск
Каналсамовывоз
Пилотодна точка
ПоказательЗначение
ГеографияМинск
Активные позиции~800
Каналы заказасайт, телефон, сообщения
Роли первой версиипокупатель, сотрудник смены, администратор каталога
Основной процесскаталог → заказ на самовывоз → проверка полки → замена → сборка → выдача
Контур пилотаодна торговая точка, онлайн-самовывоз через новую очередь

Сообщение с сайта не равно подтверждённому составу: нужна одна версия заказа от оформления до выдачи.

Роли

Покупатель

Выбирает товары в каталоге, указывает телефон и время самовывоза, отвечает на предложение замены по ссылке.

Результат

Видит номер заказа и статус «Проверяем наличие», не перечисляет состав заново по телефону.

Сотрудник смены

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

Результат

Работает с тем же списком, что видит покупатель; в сборку берёт только подтверждённый состав.

Администратор каталога

Приводит к единым названиям варианты, веса и категории, загружает ассортимент и остатки из учётной системы.

Результат

Каталог остаётся ориентиром, окончательное наличие подтверждается проверкой на полке.

Как было

Заявка приходит отдельным сообщением

Запрос с сайта попадает сотруднику отдельным сообщением. Он сверяет позиции с учётной системой, затем проверяет полку: данные об остатках могут отставать от покупок в торговом зале. Если товара нет, сотрудник звонит покупателю и записывает замену в переписке или на бумаге. Другой сотрудник при сборке может не увидеть это уточнение.

Почему чаще обновлять витрину недостаточно

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

Центральная сущность системы — не сообщение с сайта и не корзина, а заказ на самовывоз.

До сервиса замена живёт в чате или на бумаге, а сборщик видит исходный список

Решение

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

Покупатель выбирает товары в публичном каталоге и отправляет заказ. Система сразу показывает, что доступность требует подтверждения магазином: даже свежая выгрузка остатков не учитывает товар, который в эту минуту берут с полки в торговом зале. Сотрудник получает заказ в рабочей очереди, проверяет позиции и физически откладывает доступные товары. Если чего-то нет, он предлагает замену или удаление позиции. Покупатель подтверждает изменение через ссылку в сообщении; только после этого обновлённый состав становится заданием на сборку.

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

Как устроен новый путь

  1. Покупатель фильтрует каталог, кладёт варианты в корзину и оформляет самовывоз: телефон и удобное время.
  2. После отправки появляется номер заказа и статус «Проверяем наличие».
  3. Сотрудник видит заказ в очереди, проверяет полку и отмечает каждую позицию: отложить, предложить замену или удалить.
  4. Спорная позиция не попадает в лист сборки, пока покупатель не ответил по ссылке.
  5. Если ответа нет к моменту сборки, заказ возвращается сотруднику как исключение: молчание не считается согласием.
  6. Сборщик работает по подтверждённому составу, затем отмечает готовность к выдаче.

Путь покупателя

Каталог отвечает на практический вопрос «подходит ли мне этот товар?». В категории кормов покупатель фильтрует позиции по животному, типу корма, возрастной группе и размеру упаковки. В карточке видит вариант товара, его характеристики и пометку «Наличие подтвердим после оформления». Корзина сохраняет выбранные варианты, а при оформлении покупатель указывает телефон и удобное время самовывоза.

После отправки появляется номер заказа и статус «Проверяем наличие». Покупателю не приходится заново перечислять товары при звонке: сотрудник работает с тем же списком. Карточка заказа ведёт процесс, а не витрина — тот же принцип держит заказ цветов сотрудникам: там поздравление до вручения, здесь самовывоз до выдачи.

Каталог индексируется и фильтруется, но наличие на витрине не обещает товар на полке

Рабочая очередь магазина

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

В карточке сотрудник отмечает фактическое наличие каждой позиции. Если товар найден и отложен, он получает статус «Зарезервировано». Если отсутствует, сотрудник выбирает «Предложить замену» или «Удалить позицию». Система сохраняет первоначальный и предложенный состав раздельно.

Состояние очередиЧто делает сотрудник
Проверяем наличиеСверяет позиции с полкой и откладывает доступное
Ожидает ответа покупателяНе собирает спорную позицию, пока нет решения по ссылке
Готов к сборкеСобирает только подтверждённый состав, а не исходную корзину
Готов к выдачеОтмечает выдачу покупателю
ИсключениеСвязывается с покупателем и фиксирует результат разговора в карточке

В заказе № 1048 три позиции: корм, наполнитель и лакомства. Наполнитель и лакомства отложены, корм нужного объёма отсутствует. Очередь показывает «Ожидает ответа покупателя» и время самовывоза. После согласия покупателя сборщик видит уже подтверждённый состав, а не исходную корзину.

Согласование замены без потери контекста

Если сотрудник предлагает другой вариант корма, покупателю приходит сообщение со ссылкой на короткую страницу решения. Там указано, какой товар был выбран, какой предложен взамен и что изменилось в характеристиках упаковки. Действия однозначны: «Подтвердить замену» или «Убрать товар из заказа». Произвольная замена без ответа покупателя запрещена.

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

Заказ № 1048: покупатель видит исходный выбор, предложенную упаковку и два однозначных действия

Что система проверяет сама

Готовность только после решения по каждой позиции

Заказ нельзя отметить готовым, пока каждая позиция не отложена, подтверждённо заменена или удалена по решению покупателя.

Замена веса или вида — только с согласием

Предложение другого веса или вида товара всегда требует явного ответа. Сходство названий не запускает автоматическую замену.

Очередь и статус выдачи

Новый заказ попадает в очередь проверки. Статус «Готов к выдаче» появляется только после отметки сборщика.

История с участником и временем

Все изменения состава записываются с временем и участником, чтобы следующий сотрудник видел актуальное решение.

Остатки как ориентир каталога

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

Без автоматических ветрекомендаций

Сотрудник может показать характеристики товаров, но подбор корма по состоянию здоровья животного остаётся за покупателем и специалистом.

MVP

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

В первой версии

Каталог с вариантами товаров и фильтрами
Корзина и оформление самовывоза
Рабочая очередь сотрудника
Проверка наличия и откладывание товара
Согласование замены по ссылке
Сборка и выдача по подтверждённому составу
История заказа
Уведомления о необходимости ответа и готовности

Осознанно отложено

Личный кабинет с повтором заказа
Доставка
Программа лояльности
Автоматические рекомендации

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

UX, стек и план

Индексируемый каталог и рабочие экраны Livewire

Публичный каталог и внутренние рабочие экраны собираются на Blade, Livewire и Alpine.js: здесь нужны фильтры, формы, статусы и таблицы, но нет сложного совместного редактора или клиентского состояния, оправдывающего отдельное frontend-приложение. Категории остаются полноценными страницами для поиска; решение принимается в заказе.

Архитектура

Продукту достаточно одного Laravel-приложения в форме модульного монолита. MySQL хранит товары, варианты, заказы, решения по заменам и историю статусов. Планировщик забирает подготовленную выгрузку ассортимента и остатков из учётной системы. Небольшие фоновые задания через database queue отправляют сообщения и повторяют отправку при временном сбое.

Client

  • Blade
  • Livewire
  • Alpine.js
  • индексируемый каталог
  • рабочие экраны

Категории и карточки отдаются сервером и открываются поисковым системам. Livewire обновляет корзину, очередь сотрудника и страницу решения по замене без отдельного SPA.

Laravel

  • модульный монолит
  • сессии
  • ссылка на замену

Сотрудники входят по обычным сессиям Laravel. Ссылка для ответа покупателя ограничена конкретным заказом и сроком действия. Правила состава живут в одном приложении.

MySQL

  • товары и варианты
  • заказы
  • решения по заменам
  • история статусов

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

Queue

  • Laravel Jobs
  • очередь в БД
  • планировщик
  • сообщения

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

Infrastructure

  • один сервер
  • Nginx
  • PHP-FPM
  • worker
  • резервные копии

Для первой версии достаточно одного сервера. Отдельный поисковый движок, Redis, WebSocket, S3 и мобильное приложение не добавляются.

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

Ядро пилота — монолит, Blade/Livewire, MySQL и очередь в базе. Импорт остатков — ориентир каталога, не обещание наличия

Пилот в одной точке

Внедрение начинается с подготовки каталога: сотрудники приводят к единым названиям варианты, веса и категории, затем загружают ассортимент и остатки из учётной системы. На первой неделе работы заказы на самовывоз проходят через новую очередь в одной точке. Ответственный за смену ежедневно сверяет спорные случаи с фактически выданными заказами. После исправления карточек товаров и правил замены магазин переносит в систему весь поток онлайн-самовывоза.

данные весь поток
  1. подготовка
    1

    Нормализация каталога

    Единые названия вариантов, весов и категорий. Ассортимент и остатки загружаются из учётной системы.

  2. пилот
    2

    Одна торговая точка

    Онлайн-самовывоз идёт через новую очередь. Ответственный за смену сверяет спорные случаи с фактически выданными заказами.

  3. расширение
    3

    Весь поток самовывоза

    После исправления карточек и правил замены магазин переносит в систему весь онлайн-самовывоз.

Метрики

Пилот сравнивает заказы до и после внедрения. Исходные значения фиксируются на пилоте; проценты «стало» заранее не задаём. Целевой ориентир — чтобы каждый заказ, переданный в сборку, имел подтверждённый состав и видимое следующее действие.

МетрикаСостояние доЦелевое состояниеКак измеряется
Время от заявки до подтверждённого составаразмазано по звонку, чату и бумагесократить за счёт одной карточки заказа и ссылки на решениеОт оформления самовывоза до версии, по которой можно собирать
Доля замен с явным ответом покупателязамена живёт в переписке или на бумагезамена зафиксирована решением в карточкеЗаказы, где предложенная замена получила «подтвердить» или «убрать»
Уточнения состава у коллег при сборкесборщик спрашивает, какой список актуальныйсборка идёт по подтверждённому составу без устного пересказаСколько раз сборщику приходится уточнять список у коллег

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

Риски и выводы

Риски

РискВероятностьВлияниеСнижение
Неточные исходные остаткиВысокаяВысокоеСайт не обещает наличие до проверки сотрудником; остатки остаются ориентиром каталога
Обход карточки через телефонСредняяВысокоеКороткий сценарий фиксации телефонного ответа; сборка только по подтверждённому составу
Покупатель не открыл сообщение вовремяСредняяСреднееЗаказ остаётся в очереди исключений и требует ручного контакта; молчание не считается согласием

Как меняется заказ

До

  • заявка приходит сообщением;
  • остатки сверяют с полкой вручную;
  • замену записывают в чат или на бумагу;
  • сборщик видит исходный список;
  • подтверждённой версии заказа нет;
  • состав при выдаче может не совпасть с сайтом.

После

  • предмет работы — заказ на самовывоз;
  • каталог честно говорит, что наличие подтвердят;
  • замена уходит покупателю по ссылке;
  • молчание не считается согласием;
  • сборщик видит подтверждённый состав;
  • история решений остаётся в карточке.

Изменение для магазина состоит в том, что заявка перестаёт быть сообщением, которое нужно пересказывать следующему сотруднику. Она становится заказом с проверенным составом, историей решений и понятным состоянием — от оформления до выдачи.

Обратная связь после внедрения

Сжатая цитата из обратной связи после пилотного внедрения. Название компании и имя не указаны из‑за NDA.

«Раньше бывало: человек оформил заказ, приехал, а одного корма уже нет. Вроде мелочь, но клиенту всё равно неприятно. Сейчас сначала собираем заказ и уже потом сообщаем, что можно забирать.»

Управляющий магазином

Обсудить проект

Нужен похожий контур — обсудим. Услуги на Laravel · Каталог решений.

Связаться