Интернет-магазин клиента с каталогом на 20 000 SKU тормозил при каждом запросе. OpenCart-инсталляция на shared-хостинге с PHP 7.4 отдавала страницу каталога за 5 секунд — LCP составлял 8 секунд, половина пользователей уходили до загрузки. После миграции на PostgreSQL 15 с JSONB-атрибутами и подключения Elasticsearch 8.x время падения до 200 мс, CLS упал с 0.35 до 0.02. Так рождается правильный интернет-магазин — не шаблон, а архитектура, где каждая деталь влияет на скорость и конвейер заказов.
Разработка начинается не с выбора цвета кнопок, а с бизнес-модели: управление складом, ценообразование, логистика, маркетинг — всё должно быть согласовано до строки кода. Неправильный выбор стека на старте экономит время, но через год превращается в технический долг. Мы проводим бесплатный аудит и предлагаем оптимальные решения.
Каждый интернет-магазин требует индивидуального подхода: модель данных, интеграции, нагрузка. Универсальных решений не существует. Получите консультацию по вашему проекту — оценим архитектуру и подберём стек.
Как выбрать стек технологий для интернет-магазина?
Выбор стека решается исходя из трёх факторов: объём каталога, сценарии интеграций, планируемая нагрузка. Типовые варианты:
| Сценарий | Стек | Обоснование |
|---|---|---|
| До 1 000 SKU, B2C, быстрый старт | Shopify + кастомный фронт на Next.js | Shopify берёт на себя платежи, хостинг, PCI DSS. Подписка от $29/мес. |
| 1 000–50 000 SKU, сложные фильтры | Laravel/Django + React/Vue, Elasticsearch | Гибкость в модели данных, полнотекстовый поиск. Лицензия Elastic Platinum ~$2000/год. |
| Высоконагруженный маркетплейс | Microservices, Kafka, отдельные сервисы корзины/заказов | Масштабирование по компонентам. |
| B2B с личными кабинетами и прайс-листами | Custom ERP-интеграция, контрактные цены | Стандартные решения не закрывают логику ролей. |
Для большинства проектов среднего размера оптимален монолит с чёткими границами модулей — быстрее в разработке, проще в поддержке.
Почему модель данных каталога критична?
Модель данных каталога определяет всё остальное. Распространённая ошибка — делать таблицу products с колонками color, size, material напрямую. Это работает до первого нестандартного товара. Правильный подход: EAV (Entity-Attribute-Value) или JSONB-атрибуты в PostgreSQL. Пример схемы:
products (id, sku, slug, base_price, status) product_variants (id, product_id, sku, price_delta, stock) variant_attributes (variant_id, attribute_id, value) attributes (id, name, type, filterable, sortable) Для каталогов с разнородными товарами (электроника + одежда + мебель) используем product types — каждый тип задаёт собственный набор атрибутов. Именно так работает Akeneo PIM, который подключается при каталогах от 10 000 SKU.
Поиск и фильтрация
Стандартный SQL-поиск LIKE '%запрос%' не годится даже для каталога на 500 позиций — нет релевантности, морфологии, синонимов. Опции:
- PostgreSQL FTS с
ts_vector— подходит до ~5 000 товаров, настройка под русский язык через ispell или hunspell - Elasticsearch — full-featured: нечёткий поиск, буст по полям, синонимы, перколятор для «похожих товаров». Согласно Elasticsearch Reference, агрегации позволяют вычислять количество документов для каждого значения фильтра.
- Typesense — проще в эксплуатации, хорошо для небольших команд
Фильтры по атрибутам строим через агрегации Elasticsearch: пользователь видит только те значения фильтров, которые дадут ненулевой результат. Это faceted search — стандарт для ecommerce.
Как реализовать faceted search
- Определите атрибуты товаров, которые будут фильтрами (цена, бренд, размер).
- Создайте mapping для индекса с корректными типами (keyword, float).
- Проиндексируйте товары с их атрибутами.
- Выполните агрегации по каждому фильтру в одном запросе.
- На фронтенде отобразите агрегированные значения и обновляйте результаты при выборе фильтров.
Корзина и чекаут
Корзина — место, где теряется 60–80% конверсии. Критичные решения:
- Гостевая корзина хранится в Redis с TTL 30 дней, при авторизации мержится с серверной. Без гостевой корзины регистрация становится барьером.
- Чекаут в один экран статистически лучше многошагового для B2C. Для B2B наоборот — нужны шаги: реквизиты, адрес доставки, одобрение менеджера.
- Расчёт доставки в реальном времени: API СДЭК, Boxberry, Nova Poshta, DHL. Ставки зависят от веса, габаритов, точки отправления — вычисляется на лету, не хранится в таблице.
- Платёжный шлюз: Stripe для международных, CloudPayments / ЮKassa для РФ/СНГ, Fondy / WayForPay для Украины. Интеграция идёт через webhook-подтверждения, статус заказа меняется только после верификации подписи. Комиссия Stripe — 2.9% + 30¢ за транзакцию.
Управление заказами
Жизненный цикл заказа — конечный автомат (state machine). Состояния: draft → pending_payment → paid → processing → shipped → delivered → completed. Плюс боковые ветки: cancelled, refunded, on_hold. Библиотеки: winzou/state-machine для Laravel, xstate если часть логики на фронте. Каждый переход состояния — событие, которое тригерит уведомления (email, SMS, push), обновление склада, запись в лог.
Интеграции
Типовой набор для полноценного магазина:
- 1С / МойСклад / Retailio — синхронизация остатков и цен через очередь (RabbitMQ/Redis Queue) с интервалом 5–15 минут
- CRM (AmoCRM, HubSpot) — автоматическая передача заказов и лидов
- Email-маркетинг (Klaviyo, Mailchimp, Sendpulse) — триггерные цепочки: брошенная корзина, постпродажа, реактивация
- Аналитика: GA4 с Enhanced Ecommerce + серверный GTM для точных данных без влияния блокировщиков рекламы
Детальная схема интеграции с 1С
Для обмена данными с 1С используем CommerceML (cml) — XML-формат. Создаётся очередь RabbitMQ, куда 1С отправляет изменения. Consumer на PHP/Laravel разбирает XML и обновляет базу. Обратная синхронизация заказов в 1С — через REST API. Все операции логируются для отладки.Производительность и SEO
Страницы каталога должны кешироваться. Стратегия: stale-while-revalidate — отдаём кеш немедленно, обновляем в фоне. Redis для серверного кеша, CDN (Cloudflare) для статики. SEO-специфика ecommerce:
- Канонические URL для страниц с фильтрами — без этого поисковики видят тысячи дублей
- hreflang для мультиязычных магазинов
- Schema.org разметка: Product, Offer, AggregateRating — влияет на rich snippets
- Пагинация через rel="next"/"prev" или бесконечная прокрутка с SSR-рендером первого экрана
Что входит в работу
- Техническое задание с описанием функциональности и интеграций
- Прототипирование интерфейсов (Figma)
- Разработка бэкенда с модулями каталога, корзины, заказов, личного кабинета
- Фронтенд на современном стеке (React/Vue) с адаптивной вёрсткой
- Интеграции с платёжными системами, службами доставки, складскими системами
- Тестирование (unit, интеграционное, нагрузочное)
- Деплой на продакшн и настройка мониторинга
- Документация по администрированию
- Поддержка после запуска (гарантия на исправление ошибок в течение месяца)
Сроки и этапы
Типовой интернет-магазин среднего масштаба (1 000–10 000 SKU, стандартный чекаут):
| Этап | Длительность |
|---|---|
| Аналитика и проектирование | 2–3 недели |
| Бэкенд: каталог + корзина + заказы | 4–6 недель |
| Фронтенд | 4–6 недель |
| Интеграции (1С, платёжка, доставка) | 2–4 недели |
| Тестирование и запуск | 1–2 недели |
Итого: 12–20 недель для полноценного проекта без готовых шаблонов. Проекты на Shopify с минимальными кастомизациями — 4–8 недель. Ключевой принцип: интернет-магазин запускается не тогда, когда готово всё, а когда готово достаточно для первых продаж. Остальное — итерации. Свяжитесь с нами для обсуждения деталей.







