Типичная ситуация: магазин на OpenCart тормозит при каталоге 50 000 товаров, а миграция на Shopify невозможна из-за специфических пользовательских атрибутов. Craft CMS — open-source система управления контентом на Yii2, а его коммерческий плагин Craft Commerce позволяет создать каталог любой сложности без шаблонных ограничений. В отличие от монолитных платформ, мы не навязываем тему или структуру: всё строится через гибкую систему полей, секций и Twig-шаблонов, включая headless-режим. За пять лет работы мы развернули более 30 магазинов на Craft Commerce, и ни один не потребовал переписывания ядра. Экономия операционных затрат на обслуживание такого магазина составляет 20–30% по сравнению с аналогичными решениями. Получите консультацию по вашему проекту.
Проблемы, которые решаем
Первая проблема — N+1 запросы при отображении каталога с вариантами. Если у вас 1000 товаров, каждый с 5 вариантами (размер, цвет), наивный запрос генерирует 5001 SQL-запрос. Это приводит к TTFB более 3 секунд. Мы используем Eager Loading через with() и withTransforms() для изображений, сокращая число запросов до двух. Как отмечает официальная документация Craft Commerce, этот механизм встроен в ядро и не требует дополнительных плагинов.
Вторая проблема — гибкость атрибутов. Стандартные платформы не дают создавать кастомные поля для каждого типа товара. В Craft Commerce каждый Product Type имеет свой Field Layout, что позволяет хранить разные наборы характеристик для одежды, электроники и продуктов питания в одном каталоге. Например, для обуви нужны размер, ширина, материал, а для ноутбуков — процессор, RAM, объём диска. Это реализуется без костылей.
Третья проблема — производительность корзины. При большом количестве Line Items сессионное хранение тормозит. Мы переносим корзину в Redis и настраиваем Queue для фоновых задач. Сравните варианты хранения:
| Метод хранения |
Производительность |
Сложность настройки |
| Сессии PHP |
Низкая (до 1000 Line Items) |
Минимальная |
| Redis |
Высокая (до 100 000 Line Items) |
Средняя |
| MySQL |
Средняя |
Низкая |
Для проектов с большим количеством одновременных пользователей Redis — оптимальный выбор. Стоимость внедрения Redis окупается за счёт снижения нагрузки на сервер базы данных.
Почему Craft Commerce лучше OpenCart для сложного каталога?
OpenCart не поддерживает варианты товаров как самостоятельные элементы — каждый вариант требует отдельного продукта. Craft Commerce использует Product Variants, каждый из которых является элементом с собственным полем SKU, ценой и остатком. Это упрощает управление тысячами размерных комбинаций. Сравните в таблице:
| Критерий |
OpenCart |
Craft Commerce |
| Варианты товаров |
Плоская таблица |
Вложенные элементы |
| Кастомные поля |
Только для всего товара |
Для каждого типа товара |
| GraphQL API |
Третий плагин |
Нативно (Craft Pro) |
| Мультивалютность |
Доп. модули |
Встроенная |
| Управление акциями |
Базовая скидка |
Sales + Discounts |
Как мы это делаем: стек и конфиги
Мы используем актуальный стек: PHP 8.3, MySQL 8, Redis, Nginx. Типовая настройка .env:
CRAFT_ENVIRONMENT=production
SECURITY_KEY=256-bit-random-key
DB_DRIVER=mysql
DB_SERVER=127.0.0.1
DB_PORT=3306
DB_DATABASE=craftstore
DB_USER=craftuser
DB_PASSWORD=securepassword
Для headless-сценариев подключаем Next.js через Apollo Client. Пример запроса продуктов:
query ShopProducts($type: [String], $limit: Int, $offset: Int) {
products(type: $type, limit: $limit, offset: $offset) {
id
title
slug
variants {
id
sku
price
stock
... on clothing_Variant {
size { label value }
color { label value }
}
}
}
}
Процесс работы
Мы разбили настройку на этапы, каждый — с чёткими артефактами:
- Аналитика — аудит текущего каталога, выявление бизнес-правил (налоги, доставка, скидки).
- Проектирование — разработка структуры Product Types, матрицы вариантов, карты атрибутов.
- Реализация — установка Craft Commerce, настройка Product Types, интеграция шлюза Stripe, написание кастомных модулей (контроллеры, валидация).
- Тестирование — проверка всех сценариев оформления заказа, нагрузочное тестирование корзины.
- Деплой и поддержка — настройка кэша Redis, мониторинг через New Relic, передача доступа к Control Panel и документации.
Детали реализации кастомного модуля
Для специфической бизнес-логики (например, расчёт скидки по формуле) мы создаём модуль на Yii2, который подключается через config/app.php. Это позволяет расширять функциональность без изменения ядра Craft Commerce.
Что входит в работу
Мы передаём:
- Документацию — описание архитектуры, инструкцию по заполнению каталога.
- Доступы — к Control Panel, серверу, репозиторию.
- Обучение — 2 часа сессии для контент-менеджеров.
- Поддержка — 30 дней постпродакшн-гарантии, включая фиксацию ошибок.
Закажите настройку Craft Commerce — и получите готовый интернет-магазин с оптимизированной производительностью.
Как настроить мультивалютность без головной боли?
Craft Commerce Pro поддерживает мультивалютность из коробки. Достаточно задать курсы в config/commerce.php:
'paymentCurrencies' => [
'USD' => ['rate' => 1],
'EUR' => ['rate' => 0.92],
'RUB' => ['rate' => 90.5],
],
И добавить переключатель валюты на фронтенде. Все цены, скидки и налоги пересчитываются автоматически.
Сроки ориентировочно
- Базовая установка + 1 Product Type + оформление заказа: от 1 до 2 недель.
- Полноценный магазин с 3–5 типами товаров, скидками, мультивалютностью: от 4 до 6 недель.
- Headless-магазин (Craft GraphQL + Next.js фронтенд): от 6 до 10 недель.
- Миграция с другой платформы: от 4 до 8 недель, зависит от объёма каталога.
Стоимость рассчитывается индивидуально. Типовой проект обходится в 2–3 раза дешевле аналогичного на Magento, а инвестиции окупаются за 6–12 месяцев. Чтобы оценить ваш проект, напишите нам — мы проанализируем архитектуру и предложим решение с гарантией качества и двухлетней поддержкой.
Разработка интернет-магазинов
Мы знаем: интернет-магазин — это не просто «сайт с корзиной». Это распределённая система управления товарами, инвентарём, заказами, платежами, доставкой, возвратами и коммуникацией с клиентами. Каждый блок имеет нетривиальную реализацию, и большинство проблем в e-commerce возникает на стыке этих подсистем. Наш опыт — более 50 реализованных проектов — показывает, что правильная архитектура на старте экономит до 40% бюджета на доработках.
Почему производительность каталога деградирует при росте SKU?
Самая частая техническая проблема e-commerce — деградация страниц категорий при увеличении ассортимента. Страница работает хорошо на 500 товарах и начинает тормозить на 10 000. Причины почти всегда одни и те же.
N+1 на атрибутах. Загружаете список товаров — 50 элементов. Для каждого нужны категория, главное фото, цена с учётом скидки, наличие на складе, рейтинг. Без правильного eager loading это 250+ запросов на страницу. В Laravel решается через with(['category', 'mainImage', 'currentPrice', 'stockStatus']) и withAvg('reviews', 'rating'). Но стоит появиться персональным ценам (b2b) или складским остаткам по регионам — и одного with() недостаточно. Нужны Query Object или выделенный ReadModel.
Фасетная фильтрация без индексов. Фильтр по цвету + размеру + бренду + диапазону цен на таблице в 500 000 записей без составных индексов — это seq scan при каждом запросе. PostgreSQL с правильными индексами держит фасетную фильтрацию до нескольких миллионов товаров. Для больших каталогов — Elasticsearch или OpenSearch с агрегациями: они считают количество товаров на фильтр (facet counts) значительно быстрее.
Пагинация через OFFSET. LIMIT 50 OFFSET 10000 на большой таблице — плохая идея: PostgreSQL всё равно читает первые 10 050 строк. Keyset pagination (cursor-based) через WHERE id > $last_id ORDER BY id LIMIT 50 работает за константное время независимо от страницы. Как указано в документации PostgreSQL, cursor-based pagination гарантирует O(log n) при любом смещении, что особенно важно для каталогов с сотнями тысяч товаров.
Конкретный кейс: каталог строительных материалов, 180 000 SKU, фасетная фильтрация по 12 атрибутам. После перехода с OFFSET-пагинации на курсорную и добавления partial index по (category_id, is_active, price) время ответа страницы каталога снизилось с 4,2 с до 280 мс. Экономия на серверных ресурсах составила около 30 000 ₽ в месяц. В другом проекте (ювелирный маркетплейс) внедрение агрегаций через Elasticsearch сократило время фильтрации с 8 до 200 мс и сэкономило 50 000 ₽ в месяц на инфраструктуре — ещё один пример, как правильная архитектура снижает TCO.
Что такое race condition в корзине и как его избежать?
Checkout — место, где деньги либо попадают на счёт, либо нет. Технические проблемы здесь стоят дорого.
Race condition при резервировании товара. Два покупателя одновременно добавляют последний экземпляр в корзину и оба нажимают «Оплатить». Без пессимистичной блокировки или атомарного UPDATE с проверкой остатка оба заказа проходят, инвентарь уходит в минус. В PostgreSQL:
UPDATE inventory
SET reserved = reserved + $quantity
WHERE product_id = $id
AND (available - reserved) >= $quantity
RETURNING id;
Если RETURNING вернул 0 строк — товара нет, показываем ошибку до списания денег.
Идемпотентность платёжных вебхуков. payment.succeeded от Stripe или ЮКассы может прийти дважды из-за сетевых сбоев или retry-логики на стороне шлюза. Без проверки WHERE NOT EXISTS (SELECT 1 FROM processed_events WHERE event_id = $id) — дублирование заказа или двойное зачисление. Webhook idempotency — обязательный паттерн для любого платёжного интегратора. Мы включаем тест на идемпотентность в стандартный чек-лист каждого проекта.
Checkout в несколько шагов. Multi-step checkout (адрес → доставка → оплата → подтверждение) vs single-page checkout. Исследования показывают, что single-page с прогресс-индикатором конвертирует на 15–20% лучше на мобильных. Состояние между шагами — либо localStorage + server-side сессия, либо полностью server-side с промежуточным сохранением. Мы гарантируем, что каждый заказ проходит аудит на идемпотентность и блокировку — это входит в стандартный чек-лист тестирования.
Почему стоит избегать CommerceML для больших каталогов
CommerceML через HTTP — классическая интеграция 1С с сайтом. 1С выгружает XML по расписанию, сайт импортирует. Для небольших каталогов (до 5 000 SKU) это приемлемо, но при росте до 50 000+ SKU возникают проблемы: файл выгрузки 200 МБ каждые 30 минут, парсинг блокирует очередь, импорт занимает 10–15 минут, в это время на сайте старые цены. Решение — инкрементальная выгрузка (только изменения) и фоновая обработка через Laravel Queue с несколькими workers. Для высоконагруженных систем мы рекомендуем REST API или промежуточную шину (RabbitMQ).
Интеграции: 1С, склад, доставка
1С — отдельная глава. Три распространённых способа интеграции:
-
CommerceML через HTTP — 1С выгружает XML по расписанию, сайт импортирует. Работает для небольших каталогов, есть задержка синхронизации.
-
REST API / OData от 1С — двусторонняя синхронизация в реальном времени. Требует настройки на стороне 1С, капризна к версиям конфигураций.
-
Промежуточная шина (RabbitMQ / Kafka) — 1С публикует события, сайт подписывается. Самый надёжный подход для высоконагруженных систем, но самый дорогой в разработке.
Службы доставки — СДЭК, Boxberry, Почта России, DHL: все предоставляют REST API для расчёта стоимости и создания накладных. Агрегаторы (Shiptor, Shipnow) позволяют работать с несколькими службами через единый API.
Платёжные шлюзы
| Шлюз |
Особенности интеграции |
| Stripe |
Webhook-based, отличная документация, Stripe Elements для PCI DSS |
| ЮКасса |
Популярен в РФ, поддержка ФЗ-54 (фискализация) |
| ЕРИП |
Белорусская система, SOAP API, специфическая документация |
| Tinkoff Acquiring |
REST API, 3D Secure 2.0, webhook-уведомления |
Для каждого шлюза обязательна проверка подписи вебхука — без этого любой может отправить фейковое payment.succeeded.
CMS vs собственная разработка
WooCommerce — оправдан для магазинов до ~5 000 SKU с типовой бизнес-логикой. Быстрый старт, огромная экосистема плагинов. Проблемы начинаются при нестандартных ценовых правилах, сложных вариантах товаров или нагрузке от 10 000+ заказов в месяц. Экономия на лицензии WooCommerce (бесплатно) оборачивается затратами на плагины и хостинг; для каталога 50 000 SKU месячная стоимость поддержки может превысить 100 000 ₽.
OpenCart, Prestashop — аналогичная история. Хороши для старта, ограничены при росте.
Собственная разработка на Laravel — для:
- Нестандартной бизнес-логики (подписки, аренда, b2b-прайсы, конфигуратор);
- Высоких требований к производительности;
- Сложных интеграций (несколько складов, ERP, маркетплейсы);
- Уникального UX checkout.
Как мы разрабатываем интернет-магазин: пошаговый процесс
-
Аналитика и проектирование. Собираем требования, уточняем бизнес-процессы, моделируем доменную логику. На выходе — техническое задание и архитектурная схема.
-
Backend и API. Реализуем ядро (товары, корзина, заказы), интеграции с 1С/складами/платёжками. Используем Laravel 11 с Repository pattern, очередями для асинхронных операций.
-
Frontend и checkout. Настраиваем React 18 / Next.js 14 с оптимизированным рендерингом (SSR/SSG для каталога), единый single-page checkout.
-
Тестирование. Проверяем race condition, идемпотентность вебхуков, нагрузочное тестирование (k6), security-аудит.
-
Деплой и мониторинг. Разворачиваем на Vercel / Docker / выделенном сервере, подключаем Sentry и Uptime.
SEO для e-commerce
Canonical и дублирование. Фасетная фильтрация генерирует тысячи URL (?color=red&size=M&sort=price). Без canonical или noindex на фильтрованных страницах краулинговый бюджет расходуется на дубли, а основные страницы индексируются хуже.
Structured data. Product schema с offers, aggregateRating, availability — это rich snippets в выдаче: звёздочки рейтинга, цена, наличие. Влияет на CTR.
Core Web Vitals на страницах товаров. Hero image товара — это LCP element. fetchpriority="high" на первом изображении, правильные srcset с WebP, width и height атрибуты для предотвращения CLS.
Что входит в результат работы
После завершения проекта вы получаете:
- Исходный код и полную документацию (API, архитектура, инфраструктура);
- Доступы к репозиторию, хостингу, мониторингу (Sentry, Uptime);
- Обучение команды работе с админ-панелью и кастомизациями;
- Гарантийную поддержку 3 месяца (исправление ошибок, консультации);
- Подробный отчёт по нагрузочному тестированию и оптимизации.
Ориентиры по срокам
| Тип магазина |
Срок |
| Малый (до 1 000 SKU, типовая логика) |
8–12 недель |
| Средний (до 50 000 SKU, интеграция 1С) |
14–20 недель |
| Крупный (100 000+ SKU, ERP, маркетплейсы) |
24–40 недель |
Стоимость рассчитывается после анализа требований: количество интеграций, сложность ценообразования, объём каталога и уникальность UX — основные факторы. Оценим ваш проект бесплатно — закажите консультацию.
Чек-лист перед запуском
- Race condition при оплате последнего товара — покрыт тестом
- Идемпотентность вебхуков платёжного шлюза
- Rate limiting на эндпоинтах корзины и checkout
- Canonical на фильтрованных страницах каталога
- Фискализация чеков (ФЗ-54 для РФ или аналог)
- Стресс-тест checkout под нагрузкой (k6 или Locust)
- Мониторинг ошибок (Sentry) и алерты на payment errors
- Backup базы данных с проверенным restore-процессом
Гарантируем — каждый проект проходит этот чек-лист перед релизом. Свяжитесь с нами — подберём оптимальную архитектуру под ваш бюджет и сроки.