Скидки и купоны

Одновременное применение купонов и накопительных скидок на InSales для CrowdGames. Формула: (Цена - Купон) - Накопительная скидка. API интеграция.

Задача

CrowdGames — интернет-магазин на InSales, где одновременно работают две независимые механики лояльности: разовые купоны на скидку и накопительные скидки, привязанные к группе клиента. Штатное поведение платформы устроено так, что при оформлении заказа применяется только одна скидка — наибольшая из доступных. Если покупатель вводил купон, накопительная скидка его группы игнорировалась, и наоборот. Для постоянной аудитории CrowdGames это выглядело как обман ожиданий: клиент с уже заработанным процентом не получал никакой дополнительной выгоды от промо-купона.

Магазину требовалось складывать обе скидки в рамках одного заказа и делать это по строго определённому порядку расчёта, а не «как получится». Порядок здесь принципиален: от него напрямую зависит итоговая сумма, поэтому логику нужно было зафиксировать один раз и держать одинаковой сразу в трёх местах — в живой корзине, в уже оформленном заказе и в статистике. Любое расхождение между тем, что видит покупатель, и тем, что попадает в заказ, для магазина недопустимо.

Формула расчёта

(Цена товара - Купон) - Накопительная скидка

Сначала от цены товара вычитается сумма купона, и только затем от уже уменьшенной суммы считается процент накопительной скидки группы клиента. Такой порядок выбран осознанно: купон работает как фиксированное списание с цены, а накопительный процент — как надбавка лояльности поверх акции, а не наоборот. Это исключает ситуацию, когда процент «съедает» часть выгоды купона или когда две скидки начинают конкурировать за одну и ту же базу расчёта.

Пример

Товар стоит 1000₽. Купон дает скидку 200₽. Цена после купона: 800₽. Накопительная скидка клиента: 10%. Итоговая цена: 800₽ - 80₽ = 720₽. Клиент сэкономил 280₽.

Как устроен расчёт

InSales самостоятельно не умеет складывать эти скидки, поэтому весь расчёт вынесен во внешнее приложение, которое обращается к API InSales. Встроенные скидки магазина мы отключили — иначе платформа продолжала бы подставлять собственную «максимальную» скидку и конфликтовать с нашей логикой. После доработки единственным источником итоговой цены остаётся внешняя система. Приложение пересчитывает корзину при каждом значимом действии покупателя: добавлении товара, его удалении, изменении количества и вводе купона. Пока идёт пересчёт, кнопка «Оформить» блокируется, а рядом показывается индикатор загрузки — так покупатель физически не может отправить заказ со «старой», ещё не пересчитанной суммой.

  • Внешнее приложение — расчет скидок через API InSales
  • Отключение стандартных скидок — работает только внешняя система
  • Автоматический пересчет — при добавлении/удалении товаров, вводе купона
  • Интерфейс управления — добавление/удаление купонов, статистика использования
  • UX улучшения — индикатор загрузки, блокировка кнопки "Оформить" на время пересчета

Купоны и учёт накопительных скидок

Купонами администратор управляет из отдельного интерфейса: их можно добавлять и удалять, а по каждому купону видна статистика использования. Данные о применённом купоне записываются прямо в поле заказа, поэтому по конкретной покупке всегда понятно, какой купон сработал и какая накопительная скидка легла поверх него. Всю статистику применения можно выгрузить в таблицу — это даёт CrowdGames возможность оценивать эффективность акций, сопоставлять их с накопительными процентами разных групп клиентов и настраивать скидки гибко, не трогая код магазина.

Технические детали

  • JavaScript + API InSales + PHP
  • Размещено на VPS клиента
  • Подключено через "Расширения" в InSales
  • Запись данных о купонах в поле заказа
  • Выгрузка статистики в таблицу

Результат

  • Одновременное применение купонов и накопительных скидок
  • Формула расчета: (Цена - Купон) - Накопительная скидка
  • Интерфейс управления купонами
  • Статистика использования
  • Гибкая настройка скидок

Технологии

InSales API InSales JavaScript PHP Купоны Скидки E-commerce