Инструменты для продавцов
«Брошенные корзины» — платный продукт inSales для продавцов
Аналитика, история корзин, фильтры и ручные, массовые и автоматические напоминания в админке inSales. Был единственным frontend-разработчиком; у продукта 200+ активных платных подписчиков.
- 200+ активных платных подписчиков на сентябрь 2026 года
- 15% клиентов одного магазина вернулись и завершили покупку, по кейсу inSales (май 2025)
It has already generated approximately twice the revenue needed to cover its development costs.
- Моя роль
- Единственный frontend-разработчик: требования, контракты API, разработка, релиз
- Период
- Октябрь 2024 – апрель 2025
- Навыки

На этой странице
Задача
Пока покупатель не оформил заказ, у магазина нет карточки заказа, с которой можно работать. Но товары уже выбраны, и продавцу полезно знать, что именно человек положил в корзину, на какую сумму и менялся ли состав. «Брошенные корзины» — платный продукт inSales, который позволяет с этим что-то сделать: найти незавершённые покупки зарегистрированных покупателей, изучить их и написать покупателю прямо из админки.
В продукте собраны аналитика, таблица корзин с фильтрами, детали и история корзины, история коммуникаций, шаблоны сообщений с предпросмотром и платный доступ. Всё это связано между собой: фильтр определяет получателей массовой рассылки, выбранная корзина даёт данные для предпросмотра, отправка обновляет таблицу и историю.
Моя роль
Был единственным frontend-разработчиком, работал с backend-разработчиком, продакт-менеджером, дизайнером и QA. Поначалу задача во многом состояла из макетов. Я превратил их в технические требования: сущности, состояния, пограничные случаи и структуру JSON для каждого блока — согласовал с дизайнером и backend-разработчиком. Дальше разбил работу на задачи, сделал интерфейс, расписал сценарии для QA и довёл раздел через ревью до релиза. Хранение корзин, расчёт аналитики и отправку по расписанию делает backend. Основная разработка шла с октября 2024 по апрель 2025 года итерациями, параллельно с другими задачами.
Что я сделал
Корзина — это история, а не строка таблицы
Покупатель может уйти, вернуться и поменять состав. Это одна корзина с несколькими сохранёнными версиями, а не две потерянные продажи. Модель мы согласовали вместе: сессия корзины, версия, актуальная версия, оформленный заказ и сообщения, привязанные к конкретной версии. В таблице номер корзины стабильный и не меняется при каждом обновлении, в деталях видны 10 последних версий. Один товар может лежать в корзине дважды с разными опциями, поэтому строки истории я различал по ключу позиции, а не по id товара.
Сообщение показывает корзину на момент отправки
Если открыть сообщение из истории, интерфейс показывает состав корзины на момент отправки, а не текущий. Если подставить туда последнюю версию, история общения с покупателем исказится. Статусы «не отправлено», «ошибка» и «отправлено» в истории тоже различаются. После успешной отправки таблица и детали корзины перезагружаются, чтобы статус на экране не опережал сервер.
Экран обновляет только последний ответ
Продавец печатает в поиске, листает страницы, открывает одну корзину за другой, не дожидаясь ответов. Запоздавший ответ на старый запрос не должен затирать свежие результаты. Я помечал поисковые запросы идентификаторами и отбрасывал устаревшие ответы, отменял загрузку дровера через AbortController при закрытии и перестал рендерить закрытые дроверы, чтобы скрытая панель не реагировала на изменения данных. Поиск, фильтры, пагинация и открытая корзина хранятся в URL: после перезагрузки или по присланной ссылке открывается тот же экран.

Настройки напоминаний: когда корзина считается брошенной, затем задержка и шаблон для каждого канала.
У доступа больше двух состояний
Одного признака «подписка есть» не хватало. Сервер отдаёт состояние пробного периода и его окончание, просрочку оплаты, счета, цену и остаток сообщений, и от этого зависят баннеры, кнопки и настройки. После запуска пробного периода настройки становятся доступны сразу. Платёжный компонент создаётся только при открытии диалога оплаты, чтобы скрытое окно не запускало свои операции.
Три способа отправки и один процесс работы с шаблоном
Продавец может написать одному покупателю, выбрать корзины на нескольких страницах для массового письма или SMS либо настроить автоматические напоминания по каждому каналу. Перед массовой отправкой форма показывает, у скольких выбранных покупателей нет нужного контакта, и предлагает их отфильтровать. Действие «выбрать вообще все корзины» мы сознательно не стали делать: оно могло дать большую нагрузку. Шаблоны редактируются в нашем общем редакторе на Monaco, а предпросмотр подставляет в Liquid товары, количество и суммы выбранной корзины.

Результат
- У продукта 200+ активных платных подписчиков (на сентябрь 2026 года). Базовая цена — 1 000 ₽ в месяц после 7-дневного пробного периода.
- В кейсе, опубликованном в мае 2025 года, inSales сообщает, что ретаргетинг по брошенным корзинам принёс одному магазину, «Хайтед», 100–350 тыс. ₽ в месяц, а 15% клиентов возвращаются и завершают покупку. Это результат одного магазина, а не средний по платформе, и он не сводится к работе frontend.
- Аналитику выпустили в октябре 2024 года, остальной frontend доделали и выпустили к апрелю 2025-го.
- Раздел адаптирован под десктоп и мобильные, а доработки date picker, фильтра и таблицы вошли в общий UI kit.