В первой статье я назвал Parfumart проектом, которым горжусь больше всего, и обещал рассказать его историю отдельно. Рассказываю: с чего всё начиналось, как мы переписали магазин с нуля и что это дало бизнесу.
Каким я застал магазин
Parfumart — интернет-магазин парфюмерии с долгой историей: он работает с 2012 года. Первая версия сайта прожила до 2018-го, но её копии, к сожалению, не сохранились. В 2018 году магазин переехал на новую версию, написанную на PHP-фреймворке CodeIgniter, который уже тогда считался устаревшим. Её я и застал летом 2022 года. Жил он почему-то на поддомене new.parfumart.ru, а с основного домена стоял редирект.
Проблем хватало:
- Сайт регулярно падал. Веб-сервер был настроен неудачно, PHP съедал всю память, и магазин переставал открываться.
- Разработчика было сложно поймать. Он работал по ночам, а днём, когда что-то ломалось и нужно было быстро починить, был недоступен.
- Код жил своей жизнью. Версия на сервере не совпадала с той, что лежала в репозитории. Первым делом пришлось просто забрать код с сервера, чтобы понимать, что на самом деле работает.
- Админка без правил. Она показывала данные и позволяла делать с ними что угодно: перевести заказ в любой статус, поменять цену в любой момент. Отсюда постоянные ошибки менеджеров и злоупотребления.
Сначала потушить пожар
Я пришёл в проект как DevOps. Задача была простая и срочная: чтобы сайт перестал падать.
- Заменил Apache на nginx и настроил всё заново. Сайт стал заметно стабильнее.
- Перенесли магазин с VPS в Yandex Cloud и разнесли сайт и базу данных по отдельным машинам. Приложение стало работать быстрее, а сбой в одной части перестал ронять всё сразу.
- Взялись за SEO. В тот же год трафик вырос примерно вдвое, ещё на старом движке.
После этого Леонид предложил мне возглавить разработку. Задач впереди было много, и стало понятно, что дальше латать старый сайт нельзя.
Почему переписали с нуля
Развитию магазина мешало всё сразу: устаревший фреймворк, архитектура, где почти вся логика лежала в нескольких огромных файлах, и привычка к хаосу. С таким фундаментом каждая новая функция стоила дороже предыдущей, а любое изменение могло сломать что-то в другом месте.
Мы решили не ремонтировать старый дом, а построить новый рядом:
- бэкенд на Symfony — каталог, заказы, оплата, интеграции, вся логика магазина;
- фронт отдельным приложением, сначала на React;
- новая админка под реальные процессы магазина.
При этом мы не бросили работающий магазин. Пока писалась новая версия, старый сайт продолжал жить и развиваться: мы его поддерживали и, насколько позволял старый движок, добавляли новые функции. Только в 2023 году в старый репозиторий ушло больше 400 коммитов. Бизнес не должен простаивать, пока разработчики строят что-то новое: магазин каждый день принимает заказы, и ему нужно расти уже сейчас, а не после релиза.
Активная разработка новой версии началась в декабре 2023 года, а в августе 2024-го она вышла на прод. Старый сайт ещё какое-то время работал параллельно с новым, а потом мы перевели все старые адреса на новые через редиректы, чтобы не потерять позиции в поиске. Чтобы полностью повторить функционал старого сайта и закрыть проблемы, которые на нём не решались, понадобилось чуть больше года.

Что появилось в новом Parfumart
Порядок в заказах
Раньше менеджер мог перевести заказ в любой статус и поменять что угодно в любой момент. Теперь заказ проходит статусы последовательно, и на каждом этапе можно менять только то, что имеет смысл менять. Например, стоимость товара после подтверждения заказа зафиксирована.

Кроме основного пути есть отдельные ветки на случай, когда что-то идёт не по плану: отмена, частичный выкуп, возврат отправления. И у каждой свои правила, а не «поставь любой статус вручную».
Телефония в админке
Мы встроили АТС прямо в админку. При входящем звонке менеджер сразу видит, кто звонит и какие у клиента заказы, и может ответить на вопрос без долгих поисков. А ещё телефония даёт картину по качеству и статистике разговоров: видно, где сервис проседает и куда смотреть, чтобы сделать его лучше.
Свои рассылки вместо сторонней CDP
Раньше для рассылок магазин платил за сторонний сервис клиентских данных. Сейчас у нас свой функционал, который закрывает большую часть его возможностей, и по некоторым позициям обходится примерно в 30 раз дешевле.
Лояльность и промокоды
Промокодов раньше не было вообще, а скидки менеджеры считали вручную. Теперь в магазине гибкая система лояльности и промокоды, которые считаются автоматически и одинаково для всех.
Ещё у Parfumart есть мобильное приложение. Зачем оно интернет-магазину и что даёт, расскажу в отдельной статье.
Самое сложное — люди
С Леонидом мы почти всегда были на одной волне. А вот с менеджерами шла настоящая борьба. Их позицию можно понять: раньше было можно всё, а теперь система ограничивает, и это воспринимается как недоверие.
Честно скажу, эта борьба в каком-то виде продолжается до сих пор. Но сейчас менеджеры понимают, зачем нужны ограничения, а ошибок стало в разы меньше. Хороший пример того, как мы ищем баланс между удобством менеджеров и порядком в данных, — история с логами заказа.
Команда: небольшая, но не про «писать код»
Всё это сделала небольшая команда. Бэкенд, DevOps и руководство разработкой — на мне. Ещё в команде два фронтенд-разработчика и QA, который заодно помогает вести проект. В этом году к нам присоединился мобильный разработчик.
Главное, что я ценю в нашей работе: мы не просто пишем код по задачам, а занимаемся разработкой продукта. Решаем проблемы бизнеса, ищем, где магазин теряет деньги, и предлагаем, что с этим сделать.
Свежий пример. Всё началось с одного заказа: клиент заплатил за доставку 187 ₽, а транспортная компания выставила нам 413 ₽. Можно было поправить цифру в одном заказе и закрыть задачу. Вместо этого мы разобрали, откуда разница, и нашли сразу четыре причины: сайт всегда считал доставку из одного города, хотя часть товаров отправляется из другого, не учитывался НДС и сбор за объявленную стоимость, а в одной интеграции терялась ставка налога. Потом посчитали масштаб по всем заказам: магазин терял на доставке в среднем около 300 ₽ с каждой посылки. В итоге поправили расчёт, добавили город отправки поставщикам и вывели результат по доставке в финансовую сводку, чтобы такие потери было видно сразу.
Вторая наша опора — строгие рабочие процессы. Каждая задача живёт в трекере, каждая доработка идёт в отдельной ветке и собирается на собственном тестовом стенде. QA проверяет её по чеклисту, находит ошибки, мы их исправляем, и только потом изменение попадает к покупателям. В той же задаче про доставку на проверке нашлись три ошибки, и ни одна из них не дошла до прода.
Два фронта и две админки
Первую версию фронта мы сделали одностраничным приложением на React. Для покупателя оно работало быстро: страницы переключались мгновенно. Но у такого подхода есть цена: без серверного рендеринга поисковикам и нейросетям сложно прочитать сайт, а значит, сложно продвигаться.
Поэтому вторая итерация фронта — на Next.js с серверным рендерингом. Активно писать её начали в октябре 2025 года, а в декабре, когда закончился сезон самых активных заказов и можно было спокойно выкатывать крупные изменения, сайт переехал на новый фронт. Страницы приходят в браузер уже собранными, их одинаково хорошо видят и покупатели, и поисковые роботы. Подробнее о том, почему это важно, я писал в статье про устройство этого блога.
Похожая история случилась с админкой. Первую версию на React мы начали в 2023 году и делали её так, чтобы как можно быстрее закрыть потребности магазина: без админки интернет-магазин просто не может работать, а ресурсов на оптимизацию тогда не хватало. За три года в неё вложили около 1600 коммитов, и со временем стало видно, что она работает медленнее, чем нужно менеджерам.
В мае 2026 года мы начали новую админку с нуля: оптимизированную, с новым сетевым слоем и новым интерфейсом, который сразу понравился всем, кто с ним работает. Здесь отдельное спасибо старшему фронтенд-разработчику команды: новая админка во многом появилась по собственной инициативе этого человека, и это пример работы на результат, а не на часы. В августе она стала основной, а дальше выходила новыми версиями почти каждую неделю: с конца августа до начала ноября — двенадцать релизов. У каждого есть журнал изменений, написанный человеческим языком, чтобы менеджеры понимали, что поменялось в их рабочем месте.
Немного цифр из git, чтобы было понятно, сколько работы стоит за этой историей:
| Часть | Начали | Коммитов |
|---|---|---|
| Бэкенд на Symfony | сентябрь 2022 | ~1 800 |
| Первая админка на React | 2023 | ~1 600 |
| Фронт на Next.js | октябрь 2025 | ~1 700 |
| Новая админка | май 2026 | ~250 |
И это без мобильного приложения и сервиса доставки. Самым активным для бэкенда оказался не год запуска, а 2026-й: магазин живёт, и продукт продолжает расти вместе с ним.
Сейчас весь проект живёт в Yandex Cloud и разнесён по отдельным сервисам.

Результаты
- Конверсия выросла примерно с 0,7% до 1,2%. Из каждой тысячи посетителей теперь покупают не семь человек, а двенадцать.
- Заказов стало больше чем вдвое по сравнению с 2022 годом.
- Ошибок менеджеров — в разы меньше.
- Сайт работает стабильно, без падений, с которых всё начиналось.

Что бы я сделал иначе
Сразу взял бы серверный рендеринг. Не обязательно Next.js: фреймворк зависит от задачи и ресурсов команды. Но промежуточная версия на чистом React стоила нам времени, которое можно было потратить на развитие магазина.
Хотел бы, чтобы бизнес больше прислушивался к разработке. Понятно, что главная цель интернет-магазина — зарабатывать деньги, и ни одна функция или ограничение не должны этому мешать. Но если бы нам раньше давали вводить больше функций и правил, к сегодняшним результатам мы пришли бы быстрее.
Итог
Parfumart прошёл путь от сайта, который падал и держался на одном недоступном разработчике, до продукта со своей архитектурой, телефонией, рассылками и программой лояльности. Главное, что я вынес из этой истории: технические решения окупаются, но только если за проектом есть хозяин, который отвечает за систему целиком.
Если ваш магазин сейчас живёт в похожем хаосе — сайт падает, разработчика не поймать, а каждая доработка ломает что-то ещё, — напишите мне. Разберём, с чего начать.
Чтобы не пропустить статью про мобильное приложение, подписывайтесь на канал в Telegram или Max.




