all projects / case study 01
PandaSale — store migration to a new engine

Problem
The store has traded since 2013, and all that time the site sat on OpenCart 1.5.4.1: an engine without support, product matching to MoySklad by SKU that never worked for variants, and images kept on the server disk with no optimization. The move had to happen without losing SEO positions — about 3,000 products and 3,000 orders of history.
Solution
Migration to OpenCart 3.0.5 on a clean server (Nginx + PHP-FPM 8.3, MariaDB) with a custom theme and three modules: images stored in Yandex Object Storage with WebP generated in three sizes on product save; one-way stock and price sync from MoySklad by external code — including bundles with linked stock, where selling a booster writes off the display box; 301 redirects from the old URLs. Payments go through Ozon Pay, with 54-FZ fiscalization on their side.
Outcome
The new store opened at pandasale.ru: about 3,000 games in stock, two-hour delivery across Rostov, free shipping across Russia on orders over 5,000 ₽.
// before → after
Как мы это делали
Начали с дизайна: собрали макет магазина — главная, каталог, карточка товара, оформление заказа — и согласовали его целиком, до строчки кода. Дальше на основе макета написали кастомную тему OpenCart 3 с нуля, а не подгоняли покупной шаблон: так в вёрстке нет чужого наследия, а скорость страниц не упирается в лишние библиотеки.
Параллельно переносили данные: около 3000 товаров и 3000 заказов из OpenCart 1.5.4.1, с сохранением URL и 301-редиректами со старых адресов, чтобы не потерять позиции в поиске.
Затем закрыли модулями то, чего в OpenCart нет из коробки. Каждый написан под этот магазин и работает в проде.
Модули, которые мы для него написали
- Синхронизация с МойСклад — односторонняя выгрузка остатков и цен по external code. Главное отличие от типовых решений: правильно работают модификации и комплекты со связанными остатками, когда продажа бустера списывает дисплей.
- Облачные изображения — картинки уезжают в Yandex Object Storage, при сохранении товара автоматически создаются WebP трёх размеров. Диск сервера больше не забивается, страницы грузятся быстрее.
- Умный AJAX-фильтр — подбор по параметрам на странице категории без перезагрузки: число игроков, возраст, время партии, цена.
- Поиск с морфологией и ИИ — ищет с учётом словоформ и опечаток, понимает запросы вроде «игра для компании на вечер».
- Маркетплейсы — выгрузка каталога в Ozon и Яндекс Маркет и подтягивание заказов обратно в админку.
- Экспорт в Avito — генерация фида по требованиям площадки.
- AI-описания товаров — черновики описаний для карточек, чтобы не писать три тысячи текстов руками.
- Парсер поставщиков — забирает карточки товаров с сайтов поставщиков и раскладывает по полям каталога.
- Правила игр — PDF-правила к каждому товару, файлы лежат в облаке и отдаются на карточке.
- Хиты и новинки — витрины на главной, которые собираются автоматически по продажам и дате добавления.
- Определение города — подставляет город покупателя и корректные условия доставки.
- Аналитика посетителей — своя статистика в админке, без внешних счётчиков.
- Мульти-доставка — один метод доставки, отдающий несколько вариантов с разными сроками и ценой.
- Накопительная скидка — постоянная скидка, которая растёт от суммы покупок.
- Менеджер изображений и менеджер категорий — инструменты для админки: массовая работа с картинками и визуальная пересборка дерева категорий.
Что это дало
Магазин работает на поддерживаемом движке, товары и остатки приезжают из МойСклад автоматически, а редактор занимается контентом, а не ручным экспортом по ночам.