Перейти к содержимому
ATLASBIP Business Intelligence Partners
ATLASBIP Business Intelligence Partners

Премиальная парфюмерия · E-commerce · Бэк-офис для ритейла

Molecion Платформа интернет-магазина с автозагрузкой прайс-листа поставщика

Самым сложным был не магазин

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

Ключевые факты о проекте

Тип проекта
Клиентский проект
Платформы
Витрина · Устанавливаемое PWA · Бэк-офис
Языки
Азербайджанский · Английский · Русский

Статус

Статус Создано, протестировано и готово к развёртыванию

molecion.az · скоро открытие

Каталог и движок цен уже работают на собственных данных бизнеса. Публичный запуск ждёт съёмку продукции и домен.

01 Проблема

Одно неверное сопоставление — одна неверная цена

Каталог парфюмерного магазина — это не список товаров. Это список объёмов: один и тот же аромат как 30, 50, 90 и тестер, и часто дважды, потому что парфюмерная и туалетная вода — два разных аромата с одним названием. Каждая строка нового прайс-листа должна найти ровно один из этих объёмов — или ни одного.

Который из ~1 600 объёмов это?

Вручную работа, которую никто не доводит до конца

  1. Розничная цена — это не наценка

    Закупка приходит в долларах, а магазин продаёт в манатах. Переоценка — это цепочка: курс, коэффициент, а затем маржа, которая отличается по бренду, по объёму и по закупке.

  2. Каталог — это объёмы, а не товары

    ~1 100 ароматов превращаются в ~1 600 флаконов и тестеров. Строка попадает ровно в один из них — или это что-то новое.

  3. Единственный ключ — напечатанное название

    Поставщик пишет то, что может прочитать человек, и в своём написании. Каталог пишет тот же аромат иначе. Общего кода между ними нет.

  4. Неверное сопоставление проходит бесшумно

    Ничего не падает, ошибка не появляется. Просто один парфюм стоит в магазине по цене другого, пока кто-нибудь это не заметит.

  5. Базы товаров не существовало

    У бизнеса были прайс-лист и фотографии — ни брендов, ни объёмов, ни описаний, ничего, на чём можно построить магазин.

Наше правило дизайна

Ни одна цена не меняется, пока её не увидит человек. Задача импорта — подготовить решение, а не принять его.

Каталог, который мы собрали и загрузили

  • 125 Брендов в каталоге
  • ≈ 1 100 Ароматов
  • ≈ 1 600 Объёмов и тестеров
  • 1 992 Нот в библиотеке
  • 3 Языка

У каждого аромата в нём есть полный профиль запаха: аккорды, трёхуровневая пирамида нот и профиль «когда носить».

02 Как читается строка

Строка читается справа налево

Строка поставщика — это один текст: бренд, название, концентрация, пол, объём. Если читать её слева направо, она ломается на первом же парфюме, в названии которого есть слово Parfum. Поэтому парсер начинает с конца, где порядок полей известен точно, и снимает поля с хвоста, пока не останется одно название.

  1. Объём

    90ML 90 мл

    Последнее надёжное поле — и то, которое потом решает, обновить цену или добавить новый флакон.

  2. Пол

    L Женский

    Буква или слово, всегда между концентрацией и объёмом. «Pour Femme» принадлежит названию и остаётся в нём.

  3. Концентрация

    EDP Eau de Parfum

    Снимается ровно один токен и только с конца. Слово концентрации, стоящее левее, — часть названия.

  4. Название

    NUIT LE PARFUM Nuit Le Parfum

    Всё, что выжило после разбора, и есть название — вместе с тем Parfum, который всегда был его частью.

Слева направо та же строка рассыпается

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

  • Конец строки — её надёжная часть

    Поставщики по-разному пишут название. Но порядок объёма, пола и концентрации они не меняют.

  • Один токен, один раз

    Второй проход съел бы название, потому что названия законно содержат слова концентраций. Парсер снимает одно и останавливается.

  • Подарочный набор — не флакон

    Строка, описывающая два флакона в одной коробке, — это другой товар, а не объём. Она откладывается в сторону и попадает в отчёт.

03 Правило идентичности

Четыре поля — это один аромат

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

Четыре поля решают, какой это аромат. Пятое — какой это флакон.

  1. Тот же объём 90 мл

    Обновить эту цену

    В каталоге есть этот аромат в этом флаконе. Строка обновляет ровно этот вариант и ничего больше.

  2. Новый объём 30 мл

    Добавить этот объём

    Аромат есть, а такого флакона нет. Он становится новым объёмом под тем же ароматом и наследует его профиль.

Одна буква разницы — и во флаконе другой парфюм

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

Для информации
В каталоге есть тот же бренд и название с другой концентрацией
Нужно ваше решение
Nuit Le Parfum · EDT

Скрытого ключа нет

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

Цена такого решения честная: когда поставщик переименовывает аромат, строка приходит как новая, и владелец один раз связывает её вручную.

  1. Сопоставление по коду, который никто не может прочитать

  2. Сопоставление по пяти полям, которые прочитает каждый

    • Бренд
    • Название
    • Концентрация
    • Пол
    • Объём

04 Сначала проверка, потом применение

Ничего не записывается, пока вы не подтвердите

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

Прайс-лист поставщика получен Демо-прайс 07

  1. Дороже

    Сопоставлено, и дороже, чем в прошлый раз.

  2. Дешевле

    Сопоставлено, и дешевле.

  3. Новый аромат

    В каталоге нет. Приходит как неопубликованный черновик.

  4. Новый объём

    Аромат в магазине есть, а такого флакона нет.

  5. Нет в прайс-листе

    Есть в каталоге, отсутствует в файле. Попадает в отчёт, но не меняется.

  6. Без изменений

    Тот же аромат, та же закупка. Показано, но не записано.

  7. Пропущено

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

  • Устаревшая проверка не может записать цену

    При применении сервер снова читает прайс-лист, пересчитывает разницу и записывает только те строки, которые вы выбрали. Проверка, открытая час назад, не перенесёт в магазин старую цифру.

  • Копейки — это не изменение цены

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

  • Цена, выставленная вручную, остаётся ручной

    Там, где владелец назначил цену флакона сам, импорт обновляет закупку и оставляет розничную цену там, куда её поставили.

  • Отсутствие — не решение

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

05 Импорт, который учится

Одна и та же кривая строка не спросит дважды

Поставщик пишет название бренда по-своему, сокращает концентрацию, которую никто раньше не встречал, или печатает строку, которую парсер вообще не может прочитать. Владелец разбирается с ней один раз на экране проверки. Это решение сохраняется как правило, и следующий прайс-лист применяет его ещё до того, как строку кто-нибудь увидит.

Нужно ваше решение

ATELIER DEMO VITRINE DEMO EDP L 100ML TESTER

  • Исправить эту строку
  • Сопоставить с другим ароматом
  • Всегда пропускать эту строку
  • Отменить моё решение

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

  • Исправляйте там, где нашли

    Каждая строка открывается рядом с тем, с чем она сопоставилась. Исправление делается там же, тот же файл сразу анализируется заново, а ответ сохраняется.

  • Половинчатое исправление — всё ещё проблема

    Если после исправления объём или концентрация по-прежнему нечитаемы, строка возвращается к тем, что ждут решения.

  • Точность, которая накапливается

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

  • Любое правило обратимо

    Удалите его — и импорт вернётся к своему обычному чтению этой строки. Неверное решение стоит одного клика, а не пересборки.

06 Как закупка становится ценой

От закупки в долларах до розничной цены

Закупка поставщика — это ещё не цена. Она становится ценой через цепочку, которой управляет владелец: курс, коэффициент, а затем самое точное правило маржи, подходящее этому флакону, — его бренд, его объём и диапазон закупки, в который он попадает. Движок считает это по всему каталогу у вас на глазах, прежде чем сдвинется хотя бы одна цена.

Цепочка

  1. Закупка поставщика USD

    •••

    Как прочитано из прайс-листа, до цента.

  2. Курс ×

    •••

    Курс маната, который задаёт владелец.

  3. Коэффициент ×

    •••

    Всё остальное между ценой в прайс-листе и полкой в Баку.

  4. Себестоимость AZN

    •••

    Цифра, от которой отсчитывается маржа.

  5. Маржа +

    •••

    Из того единственного правила, которое подходит флакону лучше всех.

  6. Розничная цена AZN

    •••

    То, что видит покупатель, округлённое до маната.

Побеждает самое точное правило

Правило — это набор условий, соединённых через И: этот бренд, и этот объём, и этот диапазон закупки. Одному флакону могут подходить несколько; его забирает правило с наибольшим числом условий, а из двух одинаково точных побеждает более новое.

  1. Правило-победитель Условий 3/3

    • Бренд Maison Demo
    • Объём 90 мл
    • Диапазон Один диапазон

    Маржа •••

  2. Тоже подходит Условий 2/3

    • Бренд Maison Demo
    • Объём Любой
    • Диапазон Один диапазон

    Маржа •••

  3. Тоже подходит Условий 1/3

    • Бренд Maison Demo
    • Объём Любой
    • Диапазон Любой

    Маржа •••

  4. Тоже подходит Условий 0/3

    • Бренд Любой
    • Объём Любой
    • Диапазон Любой

    Маржа •••

Когда не подходит ни одно правило, применяется маржа по всему каталогу.

Диапазоны закупки

Сами диапазоны, их границы и их маржа — коммерческие данные ритейлера. Они нарисованы без значений, потому что здесь важна форма, а не цифры.

Сначала предпросмотр, потом применение

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

Две кнопки, потому что сохранить правило и переоценить ~1 600 флаконов никогда не должно быть одним и тем же кликом.

У каждой цены есть история

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

Когда Аромат Было Стало Причина
12.09 Nuit Le Parfum 90 мл ••• ••• Применена стратегия
12.09 Nuit Le Parfum 30 мл ••• ••• Применена стратегия
11.09 Vitrine Demo 100 мл ••• ••• Применена стратегия
04.09 Absolu Demo 75 мл ••• ••• Применена стратегия

07 Магазин и бэк-офис

Витрина на трёх языках

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

Витрина Molecion: подсвеченные полки с флаконами, золотая монограмма и фирменный пакет на чёрном мраморе.
  • Мужские ароматы на чёрном мраморе Мужские
  • Женские ароматы на чёрном мраморе Женские
  • Унисекс-ароматы на чёрном мраморе Унисекс
Настоящая витрина — собственный первый экран бренда и блоки категорий: так магазин представляет себя.

Витрина

Каталог
  • Фильтры по бренду, полу, концентрации и цене
  • Нечёткий поиск — три буквы находят флакон
  • Плитка и список
  • Фильтры как нижняя панель на телефоне
Страница товара
  • Выбор объёма и тестера
  • Основные аккорды
  • Трёхуровневая пирамида нот
  • Когда носить
  • О бренде
Покупка
  • Избранное
  • Корзина
  • Заказ без регистрации
  • Выбор доставки и оплаты
  • Подтверждение заказа
Приложение, а не узкая страница
  • Устанавливаемое PWA
  • Мобильная оболочка с пятью вкладками
  • Работает на слабой связи
  • Блог и информационные страницы

Запах — это данные, а не картинка

Аккорды, трёхуровневая пирамида нот и профиль «когда носить» хранятся для каждого аромата и собираются из библиотеки в 1 992 ингредиента. Именно это позволяет покупателю сравнить два флакона, а не читать два абзаца, в которых оба раза написано «элегантный».

Здесь профиль нарисован шрифтом и полосами: это структурированные данные, поэтому показать их можно как угодно.

Четырнадцать разделов, у каждого своё право

Всё, что нужно, чтобы вести магазин, и ничего, до чего дотянется тот, кому этого не давали.

Товары
Редактор из семи вкладок: основное, объёмы и цены, галерея с квадратной обрезкой, ноты, аккорды, когда носить, текст для поиска.
Бренды
Бренды со своим логотипом, историей и страницей.
Ноты
Библиотека из 1 992 ингредиентов, из которой собирается каждая пирамида.
Аккорды
Словарь аккордов, у каждого свой цвет.
Заказы
Заказы с сайта и по телефону в одной книге, со статусами и работой с оплатой.
Покупатели
История, собранная по номеру телефона из каждого заказа, которую позже можно объединить с аккаунтом.
Сообщения
Входящие из формы обратной связи: новые, прочитанные, с ответом, в архиве.
Блог
Статьи с категориями и черновиками.
Скидки
Кампании по бренду, полу или флакону, в заданном окне дат, с нижней границей прибыли.
Ценовая стратегия
Курс, коэффициент и правила маржи с живым предпросмотром.
Прайс-лист
Импорт, его экран проверки, его правила и каждый прошлый запуск.
Главная страница
Текстовые блоки и слоты для изображений на главной.
Переводы
Тексты товаров и слова интерфейса на всех трёх языках.
Настройки
Данные магазина, стоимость доставки, способы оплаты и аккаунты сотрудников.

Одна работа — один вид

Права выдаются раздел за разделом, и одно и то же право закрывает и пункт меню, и действие за ним. Ассистент, которого взяли фотографировать флаконы, получает товары и больше ничего — ни закупок, ни маржи, ни прайс-листа.

Переводы принадлежат владельцу

Тексты товаров и слова интерфейса редактируются из бэк-офиса в два слоя, поэтому четвёртый язык — это ввод данных, а не релиз. Все 1 992 названия нот пришли машинным черновиком и помечены как черновики, чтобы человек их правил, а не печатал.

Контент
Тексты об ароматах и брендах, на каждом языке, поверх английской основы.
Интерфейс
Кнопки, подписи и тексты баннеров — меняются без вмешательства в код.
Запасной вариант
Всё непереведённое показывается на английском, поэтому пустых мест не бывает.

08 Как это устроено

Одно развёртывание, и данные никуда не уходят

Витрина, бэк-офис и API — одна разворачиваемая единица, и на пути запроса нет ни одного стороннего сервиса. Ничего о покупателе, закупке или марже не покидает сервер, на котором она работает.

Одна команда, одна платформа
Магазин, бэк-офис и API поставляются вместе, одним образом, и одна команда поднимает всю платформу на любом обычном сервере.
Данные переживают переустановку
Каталог и загруженные изображения живут вне приложения, поэтому пересборка оставляет их точно такими, какими они были. Резервные копии снимаются автоматически.
Никаких сторонних сервисов в работе
Ни аналитики, ни трекеров, ни внешних API за загрузкой страницы. Приватность здесь архитектурная, а не страница политики.
Тесты там, где это деньги
Парсер, сопоставление, набор изменений и цепочка расчёта цены — чистые модули с юнит-тестами. Набор тестов проверен мутациями: два правила сломали намеренно, чтобы убедиться, что он поймает настоящую регрессию.
Изображения, о которых никто не думает
Каждая загрузка проверяется, поворачивается, ограничивается по размеру и пересжимается на сервере в WebP для веба — один файл на слот.

Безопасность

  • Права выдаются по разделам
  • Сессии входа, которые владелец может отозвать
  • Проверка на сервере на каждой границе
  • Загрузки пересжимаются, а не принимаются на веру
  • Форматированный текст очищается перед сохранением
  • Каждое изменение цены записывается
  • Никаких сторонних сервисов на пути запроса

Три типа пользователей

  • Владелец

    Держит все разделы: курс, коэффициент, правила маржи, одобрение импорта и последнее слово по спорной строке.

  • Сотрудник

    Держит выданные ему разделы и не видит больше ничего — ни в меню, ни через действие за ним.

  • Покупатель

    Смотрит, ищет, сохраняет избранное и оформляет заказ без регистрации, а потом узнаётся по номеру телефона.

Наша роль

Что сделала Atlas BIP

  1. Собрали каталог, которого не было

    Мы превратили собственный прайс-лист бизнеса в структурированный каталог, а затем дали каждому аромату полный профиль из библиотеки в 1 992 ингредиента.

  2. Спроектировали работу с прайс-листом

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

  3. Создали движок цен

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

  4. Спроектировали и собрали витрину

    Магазин на трёх языках с мобильной оболочкой как у приложения — чёрное с золотом на кремовой бумаге — и с профилем аромата в центре.

  5. Сделали бэк-офис и упаковали платформу

    Четырнадцать разделов с правами доступа, слой переводов, редактируемый владельцем, серверный конвейер изображений и развёртывание одной командой, после которого данные остаются на месте.

Технологии

Современный стек

Приложение
  • TypeScript
  • React
  • Next.js
  • Tailwind CSS
Витрина
  • PWA
  • Service worker
  • Server components
Данные
  • Prisma
  • SQL
  • Zod
Медиа
  • Sharp
  • WebP
Качество
  • Vitest

Вопросы и ответы

Что спрашивают ритейлеры

Можете автоматизировать наш прайс-лист поставщика?

Да, и обычно это первое, что стоит построить. Мы начинаем с вашего настоящего прайс-листа и вашего настоящего каталога, письменно согласуем, что именно делает две строки одним товаром, а затем создаём импорт, который показывает, что подорожало, что подешевело, что появилось и что исчезло, — и не записывает ничего, пока вы не подтвердите.

Как вы гарантируете, что цена не того товара никогда не изменится?

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

Магазин Molecion уже открыт?

Нет, и мы не будем описывать его так, будто он открыт. Molecion создан, протестирован и готов к развёртыванию: каталог и движок цен уже работают на собственных данных бизнеса, а публичный запуск ждёт съёмку продукции и домен molecion.az.

Смогут ли наши сотрудники вести магазин, не звоня вам каждую неделю?

Для этого и нужен бэк-офис. Тексты товаров, бренды, библиотеки нот и аккордов, содержание главной страницы, настройки доставки и оплаты, кампании, правила цен и все три языка редактируются в панели, а права доступа оставляют каждому человеку только его работу. Новое написание у поставщика — это правило, которое кто-то вводит, а не релиз.

Можете создать такое же для нашего магазина?

Да. Витрина — это простая половина; половина, от которой зависит, можно ли магазину доверять, — это цены и приём данных от поставщика. Мы начинаем оттуда, согласуем с вами денежные правила и строим магазин вокруг них — на инфраструктуре, которая принадлежит вам.

Ваш проект

Следующая система — ваша

Расскажите, как сегодня в компании движутся заказы, деньги и документы. Мы ответим в течение 24 часов — с вопросами и конкретным планом.

Бренды, ароматы и строки прайс-листа на этих экранах придуманы. Закупки, маржа, курс и цены — коммерческие данные ритейлера, и они скрыты везде.

Вернуться к началу