Задача
Aftermarket-каталог устроен так, что две внешне одинаковые детали различаются поколением автомобиля, годом выпуска, типом кузова или стороной установки. Покупатель, который выбрал не ту, узнаёт об этом на подъёмнике — и оформляет возврат. Магазину нужен был не поиск по названию, а инструмент, который сам отсекает несовместимое.
Второй слой задачи — разные покупатели. Один знает SKU и производителя, второй начинает с типа детали, третий знает только собственную машину. Все три пути должны приводить к одной товарной модели и одинаково корректной корзине.
Третий — данные. Каталоги поставщиков приходили с разными обозначениями одного и того же автомобиля и одной и той же детали, разными единицами измерения и написанием брендов. Объём и частота изменений исключали ручное ведение связей: нужна была массовая загрузка с проверкой.
Решение
Fitment как отдельная модель данных. Совместимость не хранилась строкой в заголовке товара. Отдельная структура связывала марку и модельное семейство, поколение или внутренний код автомобиля, тип кузова и модификацию, год или диапазон годов, дополнительные технические признаки, товар, вариант и категорию детали, а также ограничения, исключения и универсальную совместимость. Связь принципиально many-to-many: одна деталь подходит нескольким поколениям, одному автомобилю соответствуют товары из десятков категорий. Эти же данные использовались поиском, фильтрами, карточкой и импортом — то есть одна модель обслуживала весь магазин.
Автомобиль как контекст навигации. На главной работал двухшаговый подбор: автомобиль, затем тип детали, выдача строилась на пересечении условий. Выбранный автомобиль сохранялся как контекст: при переходах по каталогу выдача продолжала ограничиваться совместимыми товарами, пока пользователь не изменит или не сбросит выбор. Универсальные позиции обрабатывались отдельно, чтобы не выпадать из релевантной выдачи вместе с несовместимыми.
Динамические фасеты. Набор фильтров зависит от категории и фактически доступных товаров: совместимые автомобили и поколения, производитель, цена, цвет и материал, сторона установки, технические атрибуты категории, наличие. Фасеты показывают количество товаров и пересчитываются при сочетании условий, поэтому пользователь не собирает заведомо пустую комбинацию. Условия снимаются по одному или очищаются целиком.
Поиск поверх той же модели. Название и его часть, SKU, артикул производителя, бренд, тип детали, модель автомобиля и распространённые обозначения поколения, ключевые слова описания. Если автомобиль уже выбран, результаты дополнительно ограничиваются fitment-контекстом. Поиск и фасеты работают над одними данными, поэтому ответ не зависит от точки входа.
Нормализация и валидация импорта. Интеграционный слой приводил названия, единицы, бренды, поколения и диапазоны лет к внутреннему справочнику. На загрузке проверялись обязательные поля, дубли SKU, неизвестные автомобили, пересекающиеся диапазоны годов, некорректные категории, изображения и коммерческие данные. Ошибочная запись не попадала на витрину молча: она фиксировалась для разбора и повторной загрузки.
Совместимость в карточке — сразу двумя способами. Человеческим языком, с моделями и диапазонами лет, и структурированно. Покупатель проверяет fitment до оплаты, те же данные работают в фильтрах и передаются менеджеру при вопросе или возврате. Связанные товары дополняют установочный комплект, альтернативы дают другой бренд или ценовой уровень без нового поиска.
Исполнение заказа шире доставки. Кроме курьерской отправки — самовывоз онлайн-заказа из showroom, локальная выдача после подтверждения готовности, сервисные и установочные appointments, отдельная обработка крупногабаритных деталей, трек-номер и уведомления о статусе. Перед завершением checkout повторно проверялись цена, наличие и коммерческие ограничения, а повтор после ошибки оплаты не должен был создавать дубль заказа или списания.
Интеграции, которые можно перезапускать. Поставщицкие каталоги и массовый импорт, остатки, цены, платежи, финансирование покупки, расчёт налогов, службы доставки и трекинг, транзакционная почта, CRM, учёт, аналитика и рассылки. Обмены построены на управляемых заданиях с журналами: повторная синхронизация обновляет существующую запись, а не создаёт дубль, ошибка внешнего API сохраняется для диагностики и безопасного повторного запуска.
Пограничные случаи. Отдельно разбирались универсальные детали, несколько поколений с похожими названиями, неполные fitment-данные, пересекающиеся диапазоны годов, снятые с производства SKU и товары, которые не работают без дополнительных компонентов.
Результат
Большой технический каталог получил три понятных входа — автомобиль, бренд, тип детали, — и все три ведут к одной товарной модели и одинаково корректной корзине. Fitment и динамические фильтры сняли главный риск aftermarket-покупки: клиент видит совместимость до оплаты, а не после установки. Операционная команда получила один контур вместо разрозненных выгрузок: справочники автомобилей и поколений, связи товара с конфигурациями, категории и атрибуты, импорт, цены и остатки, заказы, отгрузки, самовывоз, отмены и возвраты, купоны и правила корзины, баннеры, страницы и рассылки. Права разделены между администраторами, catalog-менеджерами, специалистами по fitment, контент- и marketing-командой, обработкой заказов, складом и клиентским сервисом, а посадочные страницы по автомобилям и категориям одновременно работают как навигация, SEO-контент и вход в отфильтрованный каталог.