Кейсы 6 мин чтения

Каталог косметики: пустая витрина, 591 товар и связь с кассой

Сеть магазинов косметики: каталог заполнен, а сайт показывает демо-товары в долларах. Две причины пустой витрины, разметка 591 товара, фильтр по бренду и связь кассы с сайтом без платного посредника. Остатки пока честно помечены как непроверенные.

кейсинтернет-магазининтеграция с кассойкаталог товаров

Коротко (TL;DR)

  • Сеть магазинов косметики, сайт на конструкторе. Каталог был заполнен, а витрина показывала демо-товары с ценами в долларах. Нашёл две причины: не тот источник у блока магазина и 591 товар, поштучно выключенный в видимости.
  • Разметил товары скриптом-классификатором и загрузил обратно CSV-импортом: 25 разделов по типу средства и фильтр «Бренд».
  • Связал кассу с сайтом по стандарту CommerceML без платного складского сервиса. Сопоставил 356 пар карточек, на витрине 853 товара, 640 из них синхронизируются с кассой.
  • Передача остатков пока не проверена: две ручные выгрузки дали «Обновлено: 0», автоотправка ещё не включена.

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

Задача

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

Первая — чтобы витрина вообще показывала свои товары. Каталог внутри конструктора был заполнен, но на странице магазина висели образцы, которые конструктор ставит по умолчанию, и цены стояли в долларах.

Вторая — навигация. Покупатель косметики ищет либо по типу средства (крем, сыворотка, шампунь), либо по бренду. Нужно было меню по типу средства и фильтр по бренду.

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

Что я сделал

Сначала разобрался, почему витрина пустая. Причин нашлось две, и каждая по отдельности давала тот же симптом. У блока магазина в настройках стоял источник «каталог-пример» — блок честно показывал демо-данные и не смотрел на настоящий каталог. А все 591 товар были выключены в видимости, причём поштучно, у каждой карточки. Даже если бы источник был верный, витрина осталась бы пустой. Валюту переключил с долларов на рубли.

Поштучное выключение — главная ловушка таких историй. Включать 591 карточку руками долго и легко пропустить часть. Поэтому массовое включение и выключение сделал скриптом, который работает прямо на странице конструктора в браузере и проходит по карточкам сам.

Дальше разметка. У товаров не было ни раздела по типу средства, ни бренда в отдельном поле. Выгрузил каталог, прогнал через скрипт-классификатор, который по данным карточки определяет тип средства и бренд, и загрузил обратно CSV-импортом конструктора. Так появились 25 разделов меню по типу средства и фильтр «Бренд» на витрине.

Одним разделом не ограничился. Товары, которые уже лежали в разделах по бренду, получили второй раздел — по типу средства. Так одна и та же сыворотка находится и через бренд, и через меню «Сыворотки».

Касса и сайт

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

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

Что было сложно

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

Второе — названия. В кассе и на сайте один товар часто записан по-разному: другой порядок слов, объём с пробелом и без, сокращения. Точное совпадение нашлось у 286 пар, ещё 70 пар сошлись по близости. Пары по близости — самое уязвимое место: именно здесь ошибка может тихо уехать на витрину.

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

Что получилось

ЧтоЦифра
Товаров в исходном каталоге591
Разделов по типу средства25
Брендовых товаров со вторым разделом по типу247 из 248
Товаров с заполненным брендом394 из 591
Сопоставлено пар карточек касса — сайт356 (286 точно, 70 по близости)
Карточек кассы с добавленными разделом и брендом560
Товаров на витрине сейчас853
Из них синхронизируются с кассой640

Витрина показывает свои товары в рублях, меню собрано по типу средства, фильтр по бренду работает. Бренд заполнен не у всех: у 197 товаров поле пока пустое, наугад я его не подставлял.

Честно про то, что не закрыто. Передача остатков из кассы на сайт не проверена. Я сделал две ручные выгрузки, и обе вернули «Обновлено: 0» — то есть ни одной позиции остаток не поменял. Автоматическая отправка по расписанию ещё не включена. Пока не увижу, что остатки реально меняются на витрине, считать эту часть работающей нельзя.

Что дальше

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

Второе — довести бренды у оставшихся товаров и решить судьбу 213 карточек, которые пока не связаны с кассой.

Частые вопросы

Почему сайт показывал демо-товары, если каталог заполнен?

У блока магазина был выбран источник «каталог-пример», а все настоящие товары были выключены в видимости. Любой из этих двух сбоев сам по себе давал пустую витрину, поэтому чинить нужно было оба.

Зачем скрипт-классификатор, если можно разметить руками?

Руками 591 товар размечается долго и неровно: к середине внимание падает. Скрипт размечает по одним правилам. Бренд получили 394 товара, у остальных поле пока пустое — лучше пустое, чем заполненное догадкой.

Обязательно ли платить за складской сервис, чтобы связать кассу и сайт?

Не всегда. В этом проекте касса и сайт обмениваются данными по стандарту CommerceML напрямую. Посредник нужен, когда складская логика сложнее, чем передать карточки и остатки.

Остатки уже обновляются автоматически?

Нет, и это прямо указано как непроверенное. Две ручные выгрузки вернули «Обновлено: 0», автоотправка не включена. Это следующий шаг.

Почему публикацию нажимает владелец?

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

Коротко о главном

Пустая витрина при заполненном каталоге почти никогда не означает, что сайт надо переделывать. Здесь причина была в двух настройках. Основная работа началась после них: разметка 591 товара, 25 разделов, фильтр по бренду и связь с кассой без лишнего посредника.

Самое трудное в таких проектах — не код, а сверка: касса и сайт называют один товар по-разному, и без аккуратного сопоставления разметка теряется при первой же выгрузке. И честность про хвосты: остатки пока не подтверждены, и я не называю эту часть готовой.

Если у вас магазин на конструкторе, каталог не показывается как надо или касса живёт отдельно от сайта, я разберу причину и свяжу их. Напишите в Telegram, MAX или VK.

Услуги по теме

Что я делаю для бизнеса

  • Боты в Telegram, MAX, VK
  • Автоматизация процессов и CRM
  • Аналитика и дашборды
  • Сайты и лендинги под ключ

Бесплатно: чек-лист «Готов ли ваш бизнес к 152-ФЗ»

12 пунктов, которые проверяют готовность за час: данные, согласия, уведомление в РКН, локализация, защита. Отметьте, что уже сделано, и увидите дыры, за которые сейчас штрафуют.

Готовы обсудить вашу задачу?

Бесплатная консультация — разберём, как внедрить это в вашем бизнесе под ключ. Без форм, пишите напрямую.

Пишу о разработке, ИИ и законах для бизнеса

Разборы, кейсы и практика — без воды. Выходит регулярно, читать 3–5 минут.

Готовые решения под ключTurnkey solutionsSoluciones llave en mano交钥匙解决方案Түлхүүр гардуулах шийдэл 451 готовых IT-решений для бизнеса451 ready-made IT solutions for business451 soluciones IT listas para empresas451 个面向企业的现成 IT 解决方案Бизнест зориулсан 451 бэлэн IT шийдэл Автоматизация, боты, AI, 152-ФЗ и платформы · бесплатная консультацияAutomation, bots, AI, data privacy and platforms · free consultationAutomatización, bots, IA, privacidad de datos y plataformas · consulta gratis自动化、机器人、AI、数据合规与平台 · 免费咨询Автоматжуулалт, бот, AI, өгөгдлийн хамгаалалт ба платформ · үнэгүй зөвлөгөө Смотреть каталогView catalogVer catálogo查看目录Каталог үзэх