Как ограничить промокод по сумме и товарам
Промокод в Тильде уже проходит серверную проверку и пересчитывает корзину, поэтому писать второй механизм скидки не нужно. Пользовательский код полезен только до активации: проверить минимальную сумму, наличие нужного товара или срок кампании и объяснить отказ рядом с полем. Правило «один раз на человека» браузер доказать не может — другой браузер, инкогнито и очистка данных делают посетителя новым.
Короткий ответ
Оставьте проверку кода и расчёт скидки Тильде. Модификация может добавить условия по текущей корзине: минимальную сумму, обязательный или запрещённый товар, период кампании. Неподделываемое «один раз на покупателя» требует сервера.
Разделите три разных ограничения
| Задача | Где решается |
|---|---|
| Код существует и ещё действителен | сервер промокодов Тильды |
| В корзине нужная сумма или товар | браузер до активации |
| Этот человек уже использовал код | сервер с историей покупателя |
Если смешать их в одном скрипте, он начнёт сам считать скидку и спорить с корзиной. После изменения количества, динамической скидки или доставки цифры разойдутся.
Что Тильда уже делает
Родное поле содержит .t-inputpromocode и кнопку .t-inputpromocode__btn.
Нажатие запускает t_input_promocode__applyPromoCode, а проверка уходит на
серверный адрес payment/promocode/ вместе с id проекта.
Успешный ответ попадает в window.tcart.promocode. Затем
tcart__calcPromocode пересчитывает итог с учётом обычной и динамической скидки.
Второй активный объект код не записывает — рантайм сообщает, что промокод уже был
активирован.
Отсюда правило для дизайнерского решения: не подменять эти шаги. Проверить своё условие, показать понятное объяснение и при успехе пропустить родную активацию.
Почему проверка в preview вводит в заблуждение
В режиме редактора и предварительного просмотра серверная функция выходит раньше запроса. В словаре рантайма даже есть отдельное сообщение: функциональность активации надо проверять после публикации.
Для теста создайте:
- отдельный промокод с небольшим лимитом;
- товар или набор товаров для тестовой корзины;
- опубликованную скрытую страницу;
- таблицу ожидаемых результатов.
Не проверяйте боевой код клиента десятком случайных заказов — вы потратите его общий лимит и смешаете тесты с реальными продажами.
Условия, которые можно проверить в браузере
Минимальная сумма
Перед активацией сравнить актуальную сумму товаров с порогом. Надо заранее решить, учитывается ли доставка и уже применённая динамическая скидка. Фраза «от 5000 ₽» без этого правила двусмысленна.
Наличие конкретного товара
Проверять uid или sku в window.tcart.products, а не видимый заголовок карточки.
Название клиент может изменить, идентификатор остаётся частью данных корзины.
Запрещённые сочетания
Например, код не действует одновременно с подарочным сертификатом. Отказ должен называть конкретную причину и способ продолжить: убрать позицию или оформить без промокода.
Период кампании
Дата в браузере подходит как дружелюбная предварительная проверка, но не как защита: часы пользователя можно изменить. Окончательный срок должен контролировать сервер, который выдаёт промокод.
Почему localStorage — не «один раз на человека»
Хранилище узнаёт браузер, а не человека. Ограничение исчезнет, если посетитель:
- откроет другой браузер или устройство;
- включит приватный режим;
- очистит данные сайта;
- оформит заказ от другого домена.
Такой флаг полезен против случайного повторного нажатия, но его нельзя продавать как защиту бюджета скидок. Для строгого правила нужна история заказов на сервере.
MOD-175 поэтому обещает только проверяемую часть: условия по корзине перед штатной серверной активацией. Расчёт скидки и идентификация покупателя в мод не входят.
Чек-лист сдачи акции клиенту
- Точный список разрешённых товаров зафиксирован по uid или sku.
- Указано, какая сумма сравнивается с порогом.
- Ошибка объясняет, что покупателю сделать дальше.
- Тест проведён на опубликованной странице.
- Клиент знает общий лимит и срок промокода.
- Правило «один раз» не заявлено без серверной проверки.
Так дизайнер сдаёт не поле с загадочным кодом, а воспроизводимый сценарий акции.