Если промокод применяется несколько раз одним пользователем, проблема обычно не в самой форме ввода, а в серверной логике применения скидки. Особенно опасны повторные клики, неоплаченные заказы, отмены и прямые API-запросы.

Проверка должна происходить на backend в момент расчета заказа и перед оплатой. Фронтенд может показывать подсказку, но не должен быть источником истины.

Коротко: что делать

  • Проверить, где фиксируется факт использования промокода
  • Посмотреть статусы заказов, которые считаются использованными
  • Проверить повторный запрос применения промокода
  • Проверить сценарии отмены, возврата и неоплаты
  • Найти заказы, где скидка применена несколько раз

Основные причины

Повторное применение часто связано с тем, что система считает промокод использованным слишком поздно или не учитывает пользователя.

  • Нет уникального ограничения на пользователь + промокод
  • Скидка хранится только в корзине, а не в заказе
  • Неоплаченный заказ не блокирует повторное применение
  • API применения промокода не идемпотентен
  • Отмена заказа возвращает промокод без проверки бизнес-правила

Пошаговая диагностика

Диагностика начинается с истории заказов: нужно понять, где именно промокод повторился и при каком статусе.

  • Найти все применения одного промокода одним пользователем
  • Сравнить время создания корзины, заказа и оплаты
  • Проверить endpoint применения и пересчета корзины
  • Проверить уникальные индексы и транзакции
  • Проверить, можно ли повторить ошибку двойным кликом

Как исправить проблему

Исправление должно защищать расчет скидки от повторов, параллельных запросов и ручного изменения данных на фронтенде.

  • Добавить серверную проверку лимита использования
  • Сделать применение промокода идемпотентным
  • Использовать транзакцию при фиксации скидки
  • Развести статусы: зарезервирован, использован, отменен, возвращен
  • Добавить тесты на повторный клик и повторный API-запрос

Безопасный план решения

Сначала исправьте будущие применения, затем отдельно разберите старые заказы. Не стоит массово пересчитывать историю без понимания бухгалтерских последствий.

Чего не стоит делать

  • Не доверять сумме скидки с frontend
  • Не удалять промокод из заказа вручную без пересчета итогов
  • Не блокировать все отмены, если бизнес допускает возврат промокода
  • Не исправлять только кнопку, оставляя API открытым

Что подготовить перед исправлением

  • Правила промокода
  • Примеры заказов с повтором
  • Схема корзины и заказов
  • Код расчета скидок или доступ к проекту

FAQ

Можно ли ограничить промокод одним использованием?

Да, но ограничение должно быть на сервере и учитывать статусы заказа.

Что делать с неоплаченными заказами?

Нужно решить, резервируют они промокод или нет. Это влияет на повторное применение.

Почему двойной клик дает двойную скидку?

Скорее всего, нет идемпотентности или транзакционной проверки при применении промокода.

Когда стоит обратиться за помощью

Обратиться стоит, если промокоды влияют на выручку, партнерские акции или массовые продажи. Ошибка в скидках быстро становится финансовой.

Итог

Начните с проверки backend-лимитов и истории применения. Если нужно исправить промокоды, статусы и транзакции, можно написать в Telegram @rabotator_support.