Внешние сервисы иногда отправляют один и тот же вебхук дважды — например, если ваш сервер ответил медленно и не подтвердил получение вовремя. Без защиты это создаёт дубли заказов, писем или записей в CRM.
Идемпотентный ключ — основной инструмент
Большинство сервисов передают в вебхуке уникальный идентификатор события. Перед обработкой проверяйте, не встречался ли этот ID раньше — если встречался, просто подтвердите получение (200 OK) и ничего не делайте повторно.
Где хранить список обработанных ID
Для небольшого объёма подойдёт таблица в базе данных с уникальным индексом на ID события — попытка вставить дубль вызовет ошибку, которую легко обработать как «уже было». Для высокой нагрузки быстрее подходит Redis с истечением срока хранения через несколько дней.
Отвечайте быстро, обрабатывайте отдельно
Сначала быстро подтвердите получение вебхука (200 OK), а тяжёлую обработку вынесите в очередь — если сервис не получает быстрый ответ, он с большей вероятностью решит, что запрос не дошёл, и отправит повтор.
Проверяйте подпись, если сервис её предоставляет
Многие сервисы подписывают вебхуки секретным ключом — проверка подписи защищает не только от дублей, но и от поддельных запросов, которые кто-то мог отправить на ваш адрес напрямую.



