Перейти к содержимому
  • заказная разработка
  • кейс
  • Parfumart
  • архитектура

От падающего сайта до x2 заказов: история Parfumart

· 10 мин · 4 просмотра ·

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

От падающего сайта до x2 заказов: история Parfumart
// содержание

В первой статье я назвал 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: 2012 — магазин открывается, первая версия сайта; 2018 — новая версия на CodeIgniter; июль 2022 — я прихожу как DevOps: nginx, переезд в Yandex Cloud, SEO; декабрь 2023 — старт активной разработки на Symfony и React; август 2024 — релиз новой версии и редиректы со старой; 2025 — переезд фронта на Next.js; 2026 — новая админка.
От старого сайта к новой архитектуре

Что появилось в новом Parfumart

Порядок в заказах

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

Основной путь заказа: новый, принят, подтверждён, упаковывается, упакован, доставляется, ожидает получения, доставлен, получен. После статуса «Подтверждён» цена товара зафиксирована.
Основной путь заказа: статусы идут по порядку

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

Телефония в админке

Мы встроили АТС прямо в админку. При входящем звонке менеджер сразу видит, кто звонит и какие у клиента заказы, и может ответить на вопрос без долгих поисков. А ещё телефония даёт картину по качеству и статистике разговоров: видно, где сервис проседает и куда смотреть, чтобы сделать его лучше.

Свои рассылки вместо сторонней CDP

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

Лояльность и промокоды

Промокодов раньше не было вообще, а скидки менеджеры считали вручную. Теперь в магазине гибкая система лояльности и промокоды, которые считаются автоматически и одинаково для всех.

Ещё у Parfumart есть мобильное приложение. Зачем оно интернет-магазину и что даёт, расскажу в отдельной статье.

Самое сложное — люди

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

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

Команда: небольшая, но не про «писать код»

Всё это сделала небольшая команда. Бэкенд, DevOps и руководство разработкой — на мне. Ещё в команде два фронтенд-разработчика и QA, который заодно помогает вести проект. В этом году к нам присоединился мобильный разработчик.

Главное, что я ценю в нашей работе: мы не просто пишем код по задачам, а занимаемся разработкой продукта. Решаем проблемы бизнеса, ищем, где магазин теряет деньги, и предлагаем, что с этим сделать.

Свежий пример. Всё началось с одного заказа: клиент заплатил за доставку 187 ₽, а транспортная компания выставила нам 413 ₽. Можно было поправить цифру в одном заказе и закрыть задачу. Вместо этого мы разобрали, откуда разница, и нашли сразу четыре причины: сайт всегда считал доставку из одного города, хотя часть товаров отправляется из другого, не учитывался НДС и сбор за объявленную стоимость, а в одной интеграции терялась ставка налога. Потом посчитали масштаб по всем заказам: магазин терял на доставке в среднем около 300 ₽ с каждой посылки. В итоге поправили расчёт, добавили город отправки поставщикам и вывели результат по доставке в финансовую сводку, чтобы такие потери было видно сразу.

Вторая наша опора — строгие рабочие процессы. Каждая задача живёт в трекере, каждая доработка идёт в отдельной ветке и собирается на собственном тестовом стенде. QA проверяет её по чеклисту, находит ошибки, мы их исправляем, и только потом изменение попадает к покупателям. В той же задаче про доставку на проверке нашлись три ошибки, и ни одна из них не дошла до прода.

Два фронта и две админки

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

Поэтому вторая итерация фронта — на Next.js с серверным рендерингом. Активно писать её начали в октябре 2025 года, а в декабре, когда закончился сезон самых активных заказов и можно было спокойно выкатывать крупные изменения, сайт переехал на новый фронт. Страницы приходят в браузер уже собранными, их одинаково хорошо видят и покупатели, и поисковые роботы. Подробнее о том, почему это важно, я писал в статье про устройство этого блога.

Похожая история случилась с админкой. Первую версию на React мы начали в 2023 году и делали её так, чтобы как можно быстрее закрыть потребности магазина: без админки интернет-магазин просто не может работать, а ресурсов на оптимизацию тогда не хватало. За три года в неё вложили около 1600 коммитов, и со временем стало видно, что она работает медленнее, чем нужно менеджерам.

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

Немного цифр из git, чтобы было понятно, сколько работы стоит за этой историей:

ЧастьНачалиКоммитов
Бэкенд на Symfonyсентябрь 2022~1 800
Первая админка на React2023~1 600
Фронт на Next.jsоктябрь 2025~1 700
Новая админкамай 2026~250

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

Сейчас весь проект живёт в Yandex Cloud и разнесён по отдельным сервисам.

Было: один сервер с CodeIgniter, где сайт, админка, логика и база данных живут вместе. Стало: фронт на Next.js, админка, телефония, рассылки и мобильное приложение работают поверх бэкенда на Symfony, база данных и файлы — в отдельных сервисах Yandex Cloud.
Было и стало: один сервер против отдельных сервисов

Результаты

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

Что бы я сделал иначе

Сразу взял бы серверный рендеринг. Не обязательно Next.js: фреймворк зависит от задачи и ресурсов команды. Но промежуточная версия на чистом React стоила нам времени, которое можно было потратить на развитие магазина.

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

Итог

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

Если ваш магазин сейчас живёт в похожем хаосе — сайт падает, разработчика не поймать, а каждая доработка ломает что-то ещё, — напишите мне. Разберём, с чего начать.

Чтобы не пропустить статью про мобильное приложение, подписывайтесь на канал в Telegram или Max.

// поделиться

  • Telegram
Владислав Писарев

Владислав Писарев

Технический директор в ИН-ЖИР. Помогаю компаниям строить надёжные продукты и команды. Обо мне

обсудить проект