Всё течёт, всё изменяется. Особенно информация — она очень быстро устаревает. В e‑com неактуальные данные о товарах могут сильно подпортить клиентский опыт. Если удовлетворенность пользователей — важный фокус вашей работы, мне есть чем поделиться:)
Всем привет! Я Григорий Фрольцов, Product Lead машинного обучения в команде контента в СберМаркете. В этой статье я расскажу, какие «сюрпризы» могут происходить с данными об ассортименте, а также о том, с помощью каких продуктовых решений мы эти сложности решаем. Цель моей работы — добиваться максимально актуальной информации на витринах сервиса: с помощью ML и не только.
Расскажу про типовые и нетиповые проблемы. Опишу, какие инструменты используем, чтобы минимизировать рассинхрон в передаче знаний между оффлайн‑точкой и онлайн‑площадкой для торговли. Если вы аналитик или биздев в e‑com, продакт‑менеджер интернет‑магазина или работаете над эффективностью операций, точно найдёте для себя интересный инсайты.
Боль в актуальности ассортимента
У товаров и услуг есть свойство заканчиваться и становиться неактуальным. Заканчиваются билеты на концерт, мороженое, сумки из новой коллекции, шампуни по акции к 8 марта. Если ассортимент вашего сервиса — это миллионы позиций, то таких случаев может накопиться несколько тысяч в час. Клиент оплатил товар, но тот закончился на складе: дальше следуют отмены, задержки, возвраты — всё это негативно влияет на клиентский опыт.
СберМаркет — сервис доставки из магазинов и ресторанов, и, как вы можете догадаться, продукты на полках в торговых зала не исключение. Поэтому вопрос прогнозирования актуальности ассортимента для нас крайне важен. Чтобы комплексно рассмотреть его, попробуем учесть потребности всех наших типов клиентов: покупателей, ритейлеров, сборщиков, курьеров и производителей.
Обмен информацией между поставщиком и СберМаркетом: что может пойти не так
Доступность товаров на витрине зависит от информации от ритейлеров. Продавец передает информацию об ассортименте через API или другим способом, включая текущую цену, остаток товара, описание и характеристики в зависимости от категории. Частота обмена информацией сейчас занимает в среднем 15–60 минут.
Первый вопрос: как понять, какие товары можно показать пользователю на онлайн‑витрине, а какие нельзя (по «документам» они есть, но это драматически расходится с реальностью)? Это зависит от внутренних систем учета розничных продавцов.
Существует понятие «распределительного центра», промежуточной точки между производителем и товарной полкой в магазине, откуда товары доставляются в магазин.
Некоторые ритейлеры считают в своих учетных системах, что товары переходят на баланс магазина в момент выезда из распределительного центра. Хотя эти товары должны пройти путь доставки, разгрузки, приемки по накладным и выкладки на полки. Именно здесь возможны варианты, когда ритейлер считает, что товар уже находится в магазине. Не очень много ритейлеров умеют учитывают товар в наличии, когда он действительно находится на полках магазина.
Поэтому информация о наличии товаров от розничных продавцов не всегда соответствует фактическому наличию товара на полке в торговом зале. Как тогда регулировать, какие товары показывать на онлайн‑витрине, а какие нет?
Между «целостностью» и «доступностью»
Что произойдет, если мы будем показываем все товары, наличие которых заявляет нам ритейлер?
Разберем кейс: готовка супа. Пользователь выбирает продукты для приготовления борща и оформляет заказ, ожидая доставку через определенное время. Однако часть товаров оказывается недоступной. В результате борщ может «остаться» без свеклы и лука, а пользователь будет недоволен.
Как быть в случае, когда часть товаров в корзине оказалась недоступной для сборки? В СберМаркете есть функционал, позволяющий сборщику связаться с клиентом и согласовать отмену или замену товара. Так же клиент может выбрать опцию, при которой его не будут тревожить звонками и привезут только то, что было в наличии — на недоступные товары будет автоматически оформлен возврат.
Но по факту в 2024 году, клиенты привыкли к высокому уровню сервиса и то, что оплаченный заказ может приехать не полностью, может стать для них потрясением. Поэтому целостность заказа напрямую влияет на впечатление о сервисе.
Представим обратную ситуацию: мы отображаем в приложении только те товары, в наличии которых уверены на 200%. Тогда возникает другая проблема — доступность. Есть вероятность, что мы заблокируем слишком много товаров и покупатель, пришедший за ингредиентами для борща, не найдёт ни свеклу, ни лук и не оформит заказ, хотя в магазине на полке они лежали.
Поэтому сталкиваемся с бизнес‑задачей: максимизация прибыли и лояльности клиентов, при этом сохранение баланса между наличием товаров на витрине и долей отмен/замен в заказах.
Как в СберМаркете работает актуализация
Первый этап — отсеиваем товары с неактуальными ценами
Для начала важно понять, насколько полная информация у нас есть о товаре: это карточка товара с фотографией, описанием и характеристиками. Также у нас есть актуальные данные о наличии товара (стоке) и цене, полученные в последнем обмене информацией с ритейлером.
Если сток не меняется и цена не обновляется, то можем ли мы показывать этот товар? Если цена не была получена в последнем обмене, мы считаем ее равной нулю. Так проходит первый этап проверки, который занимает несколько секунд.
Второй этап — формируем оффер
Делаем «проливку» информации по мастер‑системам СберМаркета. Каждый товар проходит стандартизацию для окончательного отображения на витрине в виде оффера. Оффер — это товарное предложение, у которого заполнена карточка товара, имеется актуальная цена и актуальный сток.
Пример оффера:
Сок «Добрый»
Вид: яблочный
Объем: 2 литра
Местоположение: м. Маяковская
Цена: 120 рублей
Остаток: 10 штук
Таким образом, на втором этапе мы обрабатываем информацию о товаре, приводим ее к стандартному виду и создаем офферы, которые будут отображаться на витрине для пользователей.
Третий этап — прогоняем через ML-модель
Чтобы определить, какие товары показывать пользователям, мы используем модель машинного обучения out‑of‑stock. Наша задача — прогнозировать наличие товара на полке в момент его сборки. Если товар будет заказан через 2–4 часа, мы постараемся предоставить актуальную информацию о наличии.
Мы получаем эту информацию на основе исторических данных об отменах и заменах товаров, а также их периодичности у каждого ритейлера. Можем проводить анализ в различных разрезах: по категориям, магазинам и времени суток. Учитываем сезонность заказов в течение года (например, больше заказов мороженого летом), внутри месяца (больше заказов в выходные дни, что может привести к тому, что товары быстрее закончатся) и внутри дня (пик покупок после 17:00). Если товар был перемещен на акционный стеллаж, он заканчивается еще быстрее. Проблема здесь заключается в том, что товар перемещен на новое место. Мы стараемся заранее узнавать о таких акциях в диалоге с ритейлерами, особенно перед праздниками.
Мы научились предсказывать ассортимент на основе разницы в наличии товаров в данных, предоставленных ритейлерами в разное время.
Задача модели машинного обучения — показывать в приложении только те товары, которые точно будут собраны. Модель запускается каждый час. В настоящее время мы обрабатываем около 300 миллионов SKU, каждый час анализируется примерно 75 миллионов SKU.
Четвертый этап — транслируем данные на витрину
Этот этап включает в себя следующие шаги:
Актуализация витрины. Витрина нашего приложения обновляется, и все пользователи видят актуальную информацию о доступных товарах.
Пользовательский опыт. Когда пользователь заходит в приложение, он начинает собирать свой заказ, применяет бонусы, выбирает удобное время доставки и оплачивает корзину. Если заказ сделан на будущую дату, пользователь может вернуться к нему для внесения изменений.
Ожидание доставки. После оформления заказа пользователь считает, что остается только ждать его доставки.
Процесс сборки заказа. Заказ назначается сборщику, который ходит по магазину и собирает все товары, указанные в корзине. Он также взвешивает весовые товары, например, яблоки по 250 рублей за килограмм. При этом точный вес может немного отличаться. Для пользователя процесс выглядит следующим образом: сумма денег холдируется на карте, затем блокировка снимается и списывается реальная сумма за товары.
Когда товары отсутствуют, у нас есть несколько опций:
Позвонить и задать вопросы. В этом случае есть несколько возможных сценариев. Например, пользователь может добавить мясо в заказ, но его нет в наличии, и пользователь может попросить сборщика добавить вместо него таблетки для посудомойки. Мы не обучаем модель машинного обучения на таких случаях и исключаем их из рассмотрения.
Не звонить и подобрать замену. Мы не звоним пользователю, а выбираем альтернативный товар, который похож на то, что он хотел купить.
Не звонить и удалить из заказа. Не звоним пользователю и просто удаляем отсутствующий товар из его заказа.
Когда сборка заказа завершена, наша задача прогнозирования наличия товаров также завершается.
Нестандартные ситуации
Важно отметить, что мы не можем контролировать уровень запасов и цены у ритейлера. Наша задача заключается в использовании инструментов для минимизации негативного влияния на пользовательский опыт.
Ниже набор кейсов, что может пойти не так, от сборки до доставки и как мы адаптируем работу модели, делая выводы из таких ситуаций.
Принудительный сток
У нас есть понятие «принудительного стока», к которому относятся товары собственного производства, например, выпечка, кулинария и готовая еда — все, что готовится прямо в магазине.
Проблема: Идеально было бы передавать информацию по мере готовности этих товаров. Однако у ритейлеров нет точного графика производства, есть только план ассортимента, часто без указания количества.
Решение: Мы учимся предсказывать такой ассортимент на основе успешных сборок. В настоящее время модель находится в стадии тестирования, и в скором времени мы сможем делать и такие прогнозы.
Локоть выкладки
Так мы называем время между приготовлением товара собственного производства и его доступностью к сборке.
Проблема: Иногда сток может быть передан как положительный: например, слойка показывается как доступная к заказу в 9 утра. Однако на самом деле она еще горячая и только ожидает выкладки на прилавок.
Поэтому в приложении она доступна для заказа, но сборщик её не увидит и случится отмена. В результате мы блокируем товар, предполагая, что из‑за отмены товара в действительности на полке нет.
Решение: Наша модель не реагирует на одно событие об отмене, так как мы допускаем возможность ошибки из‑за человеческого фактора во время сборки/доставки. Сейчас мы учитываем, что есть группы товаров, для которых необходимо установить паузу с момента приготовления до момента фактической доступности.
Устаревание фото
Проблема: Внешний вид товара — это переменная, которая тоже иногда меняется. Был недавно кейс, когда пакетированные соки поменяли цвета своих упаковок из‑за недостатка краски.
Когда пользователь добавил яркую упаковку сока в корзину, сборщик увидел в заказе 1 литр красного томатного сока и его фотографию в каталоге СберМаркета. Однако, когда сборщик не нашел такую упаковку, он пометил его как недоступный в приложении. Таким образом, мы понимаем, что фактически товара нет на полке в магазине, и блокируем его. Затем ритейлер связывается с нами и сообщает о наличии товара, но сборщики не подтверждают это.
Решение: Чтобы справиться с этой проблемой, мы периодически (несколько раз в неделю или по требованию), проверяем актуальность каталогов. Собираем данные обо всех случаях отмены и замены товаров, которые превышают типичные показатели. Затем мы находим отдельные случаи, которые составляют всего 0.001% от общего числа товаров в каталоге. Это обычно несколько сотен SKU. Для них запрашиваем новое фото товара и обновляем информацию на витрине в течение нескольких секунд.
Выявление несоответствий на этапе доставки
О некоторых типах недостоверности информации о товаре удаётся выяснить лишь на этапе доставки. Вот несколько примеров:
Несоответствие характеристик товара. Товар не соответствует ожиданиям пользователя по определенным характеристикам, потому что производитель что‑то поменял.
Шринкфляция продукта. Объем или размер товара уменьшается, несмотря на то, что цена остается прежней. Например, бутылка молока может уменьшиться с 1 литра до 900 мл. Чаще всего клиент узнаёт об этом именно на этапе доставки, так как при заказе мог не обратить на это должного внимания.
Решение: Иногда мы узнаём о таких кейсах благодаря прямому фидбэку от клиентов. Но регулярные аудиты информации о каждом товаре позволяют минимизировать такие случаи. А ещё мы мониторим топ отмененных товаров и проводим расследование, не связано ли это с ошибками в описании.
Выводы
Машинная модель out‑of‑stock (OOS) — не волшебная таблетка. OOS не лечит причины, а минимизирует последствия и негативный клиентский опыт. Мы используем модели прогнозирования, потому что понимаем, насколько сложна задача управления ассортиментной матрицей и товарными остатками у ритейлеров.
Наша цель — обеспечить более позитивный опыт покупателей, минимизируя проблемы, связанные с качеством товаров и актуальностью информации о доступности. Надеюсь, описанные здесь подходы и инструменты помогут вам в этом непростом деле.
Product&data команда Купера (ex СберМаркет) ведет соцсети с новостями и анонсами. Если хочешь узнать, что под капотом высоконагруженного e-commerce, следи за нами в Telegram и на YouTube. А также слушай подкаст «Для tech и этих» от наших it-менеджеров.