«Делазия» — поставщик промышленной электроники и оборудования. Пришли за онлайн-каталогом на 600 000+ позиций с фокусом на поиск: покупатель ищет по партномеру и артикулу, а не по названию категории.
Запустили первую версию меньше чем за 3 месяца: древовидный каталог, поиск, фильтры по свойствам, карточка товара с похожими позициями, формы заявок.
База — MongoDB: у каждой категории свой набор характеристик, и жёсткая схема тут только мешает. Бэкенд — Symfony, фронтенд — Nuxt с серверным рендерингом ради индексации. Впервые взяли Nuxt UI Pro: готовые компоненты ускорили сборку, тёмная тема досталась из коробки.
MVP оказался не финалом, а первой третью работы. Полтора года мы достраивали каталог до полноценной торговой площадки — ниже то, что появилось после запуска.
Поиск по 600 тысячам позиций переехал на Typesense: полнотекстовый, с частичными совпадениями, опечатками и сортировкой по релевантности. Ищет по названию, производителю и партномеру — тому, чем оперирует снабженец. Индекс обновляется очередью, а не на каждом сохранении.
Категории, товары, фильтры и бренды закешированы в Redis, кеш сбрасывается точечно при правке в админке. Фильтрация перешла на предрассчитанные коды свойств — на такой базе это разница между «полсекунды» и «страница думает».
Покупатель часто идёт не от категории, а от производителя. Поэтому появился отдельный слой: справочник на 1 419 брендов, страница каждого бренда с его категориями и количеством товаров, своя карта сайта и метатеги.
Дальше — контентный блок на странице бренда. Мы сделали модель данных, API с постоянным ключом, валидацию и компонент вёрстки, а тексты и логотипы «Делазия» наполняет сама, своими агентами, в своём темпе. Хранится структура, а не HTML: дизайн меняется в одном компоненте, а не в полутора тысячах записей, и в страницу не попадает чужая разметка.
Выгрузка приходит на английском, а у части позиций описания нет вовсе. Для поиска это мёртвый вес: страница без текста не ранжируется.
Сгенерировали 274 978 русских описаний. Первые полторы тысячи — через LLM-агентов, дальше переключились на детерминированный шаблонный генератор: он берёт тип товара, категорию, производителя, артикул и полезные параметры. Так быстрее и дешевле, чем гонять модель на каждую из 275 тысяч карточек, и результат предсказуем.
Каждая волна шла с бэкапом затронутых товаров, автоматической валидацией и контрольным прогоном после импорта. Пустых описаний в базе не осталось.
Цены поставщиков приходят в валюте. По расписанию забираем курс, пересчитываем в рубли и показываем цену с честной оговоркой: она действует на дату выгрузки, точная — по запросу. Где цены нет, вместо неё «Цена по запросу», а не ноль.
Запрос отправляется прямо с карточки, с прикреплением спецификации в Excel или CSV — снабженцу не нужно переносить позиции руками.
Заголовки, описания и alt-тексты генерируются по шаблонам из данных товара, адреса товаров переехали на человекопонятные с 301-редиректами со старых, добавлена микроразметка товаров и брендов, а в карте сайта — реальная дата изменения. Отдельно собирается YML-фид для Яндекс.Директа.
Вместе с этим появилась и админка, без которой сначала обходились: вход по JWT, редактирование SEO-полей и текстов, скрытие категорий, загрузка выгрузки через форму.
Главная, контакты, доставка и оплата, возврат, оферта, отзывы, частые вопросы и реквизиты — обычные страницы, без которых B2B-сайту не верят. Тёмная тема, бесконечная подгрузка вместо пагинации, коллтрекинг.
Nuxt 4, Vue 3, TypeScript, Nuxt UI Pro, Symfony 7, MongoDB, Typesense, Redis
600 000+
Товарных позиций
3 мес
До запуска MVP
1 419
Брендов
со своими страницами
275 000
Описаний товаров
сгенерировали на русском
Персональные цены, остатки, резерв товара, договоры и счета. Оптовые продажи переезжают из почты и мессенджеров в систему.