Как интернет-магазин сам обновляет цены от поставщика
Даниил Кулешов, фулстек-разработчик ·
Если в магазине больше сотни товаров, а цены и наличие задаёт поставщик, ручное обновление быстро становится отдельной работой. Менеджер сверяет прайс, правит карточки, что-то пропускает — и покупатель видит цену, которой уже нет, или заказывает товар, которого нет на складе.
В интернет-магазине кондиционеров КлиматТех эту работу делает сервер. Каждую ночь он забирает каталог у двух поставщиков и обновляет ~1100 товаров, а остатки сверяет каждые 4 часа. Менеджер утром открывает админку, и каталог уже актуален.
Что обновляется само, а что остаётся за менеджером
Сам обновляется весь товар: название, описание, характеристики, фото, цена и остатки. Новые позиции поставщика появляются на сайте автоматически — если их категория включена для продажи.
За менеджером остаётся:
- Ручная цена. Если цену товара выставили в админке вручную, синхронизация её не меняет.
- Акции. Распродажу включает менеджер. Синхронизация снимает её только в одном случае: рекомендованная цена упала так, что «акция» стала дороже обычной цены.
- Отметка «Хит», если её поставили вручную.
Наличие и пропавшие товары
- Товар есть на складе поставщика — на сайте «Есть в наличии».
- Нет на складе — «Под заказ». Товар не скрывается, его можно заказать.
- Товар пропал из выгрузки поставщика — сайт снимает его с продажи. Вернулся — включает снова. От «короткой» выгрузки, когда поставщик по ошибке прислал половину каталога, стоит защита.
- У товара нет рекомендованной цены — он снимается с продажи: посчитать цену не из чего.
Как это работает
- Ночью по расписанию запускается задача на сервере (cron в NestJS): в 02:00 — один поставщик, в 03:00 — другой, чтобы синхронизации не пересекались. Остатки — каждые 4 часа.
- Сервер забирает данные по API поставщиков.
- Сопоставляет позиции с товарами в базе по коду товара у поставщика; запасной ключ — код номенклатуры.
- Считает цену: рекомендованная розничная цена поставщика +10%, с округлением вверх до десятков.
- Записывает каждый товар отдельной транзакцией. Товар либо обновляется целиком — цена, остатки, фото и характеристики, — либо не меняется вовсе. Ошибка в одном товаре не останавливает остальные.
- Выгружает каталог в Яндекс Товары, чтобы цены в поиске Яндекса совпадали с сайтом.
Если поставщик не ответил
- Синхронизация не прошла целиком — цены остаются вчерашними, а администратор и менеджеры получают уведомление в админке и в MAX.
- Часть товаров обновилась с ошибками — приходит уведомление со счётом: сколько обновлено, сколько с ошибкой.
- Поставщик не вернул остаток по товару — товар пропускается. Остаток не обнуляется, так что «нет в наличии» по ошибке не появится.
- Если закупочная цена поставщика поднялась выше цены на сайте, менеджеры получают предупреждение. Оно повторяется после каждой синхронизации, пока цену не поправят.
Что это даёт бизнесу
- Менеджеру не нужно вносить цены и остатки вручную.
- Покупатель видит актуальную цену и наличие — меньше отказов при звонке «а такого уже нет».
- Заявка с сайта сразу приходит менеджерам в MAX с составом заказа и остатками, так что перезвонить можно за минуты.
- Каталог в Яндекс Товарах обновляется вместе с сайтом.
Руководитель КлиматТех так описал результат: «Получили… интеграцию с поставщиком, которая всё обновляет сама».
Что нужно, чтобы сделать так же
- Доступ к данным поставщика: API или регулярная выгрузка (XML, YML, CSV) по постоянной ссылке. Если поставщик присылает только PDF или письма, автоматизировать сложнее — это обсуждаем отдельно.
- Однозначный код товара, по которому позиция у поставщика совпадает с карточкой на сайте.
- Правило цены: по какой формуле считать цену для покупателя от цены поставщика.
Итог
Автообновление цен — серверная задача, которая каждый день экономит менеджеру время и избавляет покупателя от неактуальных цен.