Локально отлаживать вебхуки сложно, потому что RevRoute должен достучаться до вашего эндпоинта из публичного интернета. Здесь — самая быстрая схема настройки и куда смотреть, когда что-то идёт не так.
Отправка тестового события из дашборда
Никаких тулзов не нужно, чтобы проверить, что вебхук доступен:
Откройте вебхук
Зайдите в Настройки → Вебхуки и кликните на нужный вебхук.
Выберите событие
Нажмите Отправить тестовое событие, выберите триггер (например lead.created) и нажмите Отправить.
Посмотрите доставку
Откройте вкладку Логи. Для каждой доставки видны тело запроса, статус ответа, тело ответа и round-trip duration. Кликните по строке, чтобы посмотреть сырой payload и заголовки.
Тестовые события содержат реалистичные, но фейковые данные — в аналитике и партнёрских дашбордах они не появятся.
Туннелирование на localhost через ngrok
Чтобы тестировать против реального dev-сервера, выставьте его в интернет через ngrok :
# в одном терминале — ваше приложение
pnpm dev # слушает http://localhost:3000
# в другом терминале — туннель
ngrok http 3000ngrok напечатает публичный HTTPS-URL вида https://1a2b-203-0-113-42.ngrok-free.app. Используйте этот URL (плюс ваш путь) как webhook URL в RevRoute:
https://1a2b-203-0-113-42.ngrok-free.app/api/webhooks/revrouteURL ngrok меняется при каждом перезапуске туннеля на бесплатном плане. Используйте reserved domain (платный план), если не хотите обновлять URL вебхука постоянно.
У ngrok есть встроенный инспектор запросов на http://127.0.0.1:4040 — вы видите точный запрос, который пришёл от RevRoute, и можете повторить его без обращения к дашборду. Это самый быстрый dev-цикл.
Альтернативные туннели
- Cloudflare Tunnel — бесплатно, без регистрации
- tailscale funnel — если уже используете Tailscale
- localtunnel —
npx localtunnel --port 3000
Принцип одинаковый: получить https://-URL, вставить его в настройки вебхука.
Логи и ретраи
Каждая попытка доставки хранится 30 дней во вкладке Логи вебхука.
| Колонка | Значение |
|---|---|
| Status | HTTP-статус от вашего эндпоинта (- = timeout или DNS-ошибка) |
| Attempt | Номер попытки — 1 это исходная доставка |
| Duration | Время от отправки запроса до получения ответа |
| Event | Триггер (lead.created и т.д.) |
Кликните на строку, чтобы посмотреть сырой запрос/ответ. Кнопка Replay отправит тот же payload без ожидания следующего ретрая.
Типичные ошибки
| Симптом | Самая частая причина |
|---|---|
Connection refused | dev-сервер не запущен или ngrok-туннель умер |
401 invalid signature | Тело распарсилось до хэширования — см. Проверка подписи |
Timeout (10s) | Эндпоинт делает тяжёлую работу синхронно — перенесите в очередь |
404 not found | Несовпадение пути URL (например /webhook vs /webhooks) |
| Вебхук автоматически отключился | 20+ подряд неудач — почините эндпоинт, затем включите его обратно |
Быстрая проверка через curl
Можно сэмулировать запрос RevRoute локально без ngrok:
SECRET="whsec_..."
BODY='{"id":"evt_test","event":"lead.created","createdAt":"2026-05-15T12:00:00Z","data":{}}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$SECRET" -hex | awk '{print $2}')
curl -X POST http://localhost:3000/api/webhooks/revroute \
-H "Content-Type: application/json" \
-H "Revroute-Signature: $SIG" \
--data-raw "$BODY"Это самый быстрый способ протестировать код проверки подписи в изоляции.
Перед продакшеном
Перед включением в production убедитесь:
- URL эндпоинта
https://с валидным сертификатом - Проверка подписи включена, секрет лежит в secrets manager
- Обработчик возвращает
2xxв течение ~1 секунды, тяжёлое уходит в очередь - Есть алертинг на 4xx/5xx в логах
- Существует staging-вебхук на pre-prod окружение
См. также: Обзор вебхуков и страницу Вебхук не срабатывает.