Купоны - типы, выпуск пачкой, применение и проверка
Разбираем купоны: как они связаны с правилами корзины, чем отличаются типы и почему покупатель видит «купон принят», а сумма не меняется.
Решение
Создаём купон к правилу корзины:
use Bitrix\Sale\Internals\DiscountCouponTable;
DiscountCouponTable::add([ 'DISCOUNT_ID' => $ruleId, // купон всегда привязан к правилу 'COUPON' => 'SPRING2026', 'TYPE' => DiscountCouponTable::TYPE_BASKET_ROW, 'ACTIVE' => 'Y',]);Купон сам по себе скидки не даёт: он включает привязанное правило. Отсюда первое следствие: если правило выключено или его условия не выполняются, принятый купон не изменит сумму ни на копейку.
Выбираем тип купона:
// TYPE_ONE_ORDER - сгорает после одного заказа// TYPE_ONE_TIME - одноразовый, сгорает после применения// TYPE_BASKET_ROW - действует многократноprintf("тип=%s осталось=%s\n", $coupon['TYPE'], $coupon['USE_COUNT'] ?? '-');// у одноразовых счётчик применений и решает, жив ли ещё код// тип купона задаётся при выпуске и позже не меняетсяТип купона решает судьбу кода сразу после его первого использования. Многоразовый код годится для публичной акции, одноразовый - для рассылки и извинений перед покупателем, и путать их дорого: публичный одноразовый купон достанется одному человеку.
Выпускаем пачку кодов:
for ($i = 0; $i < 500; $i++) { DiscountCouponTable::add([ 'DISCOUNT_ID' => $ruleId, 'COUPON' => 'NY' . strtoupper(bin2hex(random_bytes(4))), 'TYPE' => DiscountCouponTable::TYPE_ONE_ORDER, 'ACTIVE_TO' => (new \Bitrix\Main\Type\DateTime())->add('+30 days'), ]);}Пачку кодов создают скриптом и сразу со сроком действия. Срок здесь не формальность: акция без даты окончания живёт вечно и всплывает через год в самый неподходящий момент.
Применяем купон из кода и проверяем результат:
\Bitrix\Sale\DiscountCouponsManager::init();$applied = \Bitrix\Sale\DiscountCouponsManager::add($code);$order->doFinalAction(true); // пересчёт корзины с купонамиprintf("принят=%s итог=%.2f\n", $applied ? 'да' : 'нет', $order->getPrice());Принятый купон и сработавшая скидка - это разные события. Первое означает, что код известен и не сгорел, второе - что условия правила выполнились на текущем составе корзины, и разбор жалоб начинается именно с этого различия.
Купон живёт в сеансе покупателя только до оформления заказа. Покупатель, вернувшийся через неделю с той же корзиной, купона там уже не увидит, и это нормальное поведение, а не потеря данных.
Выпущенные коды стоит держать в одном месте вместе с их назначением и сроком. Через полгода никто не помнит, что за код с непонятным названием даёт минус тридцать процентов, и выключить его страшнее, чем оставить.
Условия правила стоит писать так, чтобы их можно было объяснить любому покупателю. Скидка, не сработавшая из-за незаметного условия, воспринимается как обман магазина, а не как честное ограничение акции.
Типичные проблемы
Купон принят, а сумма прежняя.
Правило, к которому привязан этот купон, выключено либо его условия не выполняются. Купон только включает правило, а саму скидку считает оно.
Публичный код сработал один раз.
Выбран одноразовый тип купона вместо многоразового. Тип и решает, сгорает ли код сразу после применения.
Акция продолжает действовать после окончания.
У выпущенных купонов не задан срок действия. Без даты окончания код живёт совершенно бессрочно.
Купон пропал из корзины сам.
Он хранится в сеансе покупателя только до оформления заказа. Новый сеанс на сайте начинается уже без него.
Скидка применилась дважды.
Купон включил правило, которое и так срабатывало по своим условиям. Правила складываются, если это не запрещено настройкой.
Частые вопросы
Можно ли выдать купон конкретному покупателю?
Да, типом «на одного покупателя» либо условием правила по группе. Второй способ надёжнее: код невозможно передать другому.
Как посмотреть, кто использовал купон?
По заказам, в которых он применён: связь хранится вместе с заказом. Отдельного журнала использования нет.
Работает ли купон на странице товара?
Скидку от купона считает корзина, поэтому в карточке она не показывается. Показать её там можно только своим расчётом.
Сколько купонов можно применить к заказу?
Столько, сколько принято правилами. Обычно это ограничивают одним, иначе покупатели складывают акции неожиданным образом.
Смежное
-
Цены, скидки и купоны - оглавление подтемы
-
Правила работы с корзиной: условия, порядок, отладка - что именно считает скидку
-
Скидка на отдельную позицию в корзине - скидка без купона
-
Рассылка с нуля: сегмент, письмо, отправка, отписка - куда уходят выпущенные коды
-
Бонусные баллы: внутренний счёт, начисление и частичная оплата - другой способ вознаграждать покупателя
-
Каталог и продажи - устройство магазина целиком
-
Путь цены: от типа цены до суммы в корзине - почему купон зависит от правила корзины
-
Скидки из кода: создание, поля, перенос между стендами - как включить купоны у скидки из кода
-
Скидка не применилась в корзине - принятый купон против сработавшей скидки