Избранные проекты
Назад к проектам

Инструменты для продавцов

«Брошенные корзины» — платный продукт inSales для продавцов

Аналитика, история корзин, фильтры и ручные, массовые и автоматические напоминания в админке inSales. Был единственным frontend-разработчиком; у продукта 200+ активных платных подписчиков.

  • 200+ активных платных подписчиков на сентябрь 2026 года
  • 15% клиентов одного магазина вернулись и завершили покупку, по кейсу inSales (май 2025)

It has already generated approximately twice the revenue needed to cover its development costs.

Упоминается в 3 рекомендациях: Egor, Andrey, Dmitry

Моя роль
Единственный frontend-разработчик: требования, контракты API, разработка, релиз
Период
Октябрь 2024 – апрель 2025
Навыки
  • Vue.js
  • JavaScript
  • Data Visualization
  • REST APIs
  • Front-End Development
  • State Management
  • Responsive Web Design
  • Requirements Analysis
  • Technical Documentation
  • Vue Router
  • Monaco Editor
  • E-Commerce Development
  • Software Architecture
  • ApexCharts
  • Software as a Service (SaaS)
Дровер «Детали корзины» в админке inSales: три товара, сумма корзины, кнопка оформления заказа и пустая история коммуникаций
На этой странице

Задача

Пока покупатель не оформил заказ, у магазина нет карточки заказа, с которой можно работать. Но товары уже выбраны, и продавцу полезно знать, что именно человек положил в корзину, на какую сумму и менялся ли состав. «Брошенные корзины» — платный продукт 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.

Написать мне

Ищете senior frontend-разработчика?

Готов к удалённой работе и релокации. Напишите мне или запишитесь на звонок.

Написать мне