Как настроить webhook-интеграцию с Trigly
Входящие и исходящие webhooks: события, payload, HMAC-подпись, retry policy. Интеграция Trigly с любым сервисом.
Что такое webhooks и зачем они нужны
Webhooks (вебхуки) — это механизм уведомлений в реальном времени: когда в одной системе происходит событие, она автоматически отправляет HTTP-запрос в другую систему. В отличие от polling (опроса API каждые N секунд), webhooks работают мгновенно и не создают лишней нагрузки.
В контексте маркетинговой автоматизации webhooks нужны для:
- Синхронизации с CRM: когда клиент открыл письмо — обновить карточку в CRM
- Аналитики: передавать события доставки в BI-систему или Google Analytics
- Автоматизации: запускать процессы в вашем бэкенде (обновление заказа, начисление бонусов)
- Мониторинга: получать оповещения о проблемах доставки в Slack или Telegram
- Интеграции с провайдерами: принимать статусы доставки от UniSender, SMS.ru, Telegram
Trigly поддерживает два типа webhooks: исходящие (Trigly отправляет данные вам) и входящие (внешние сервисы отправляют данные в Trigly).
Типы webhooks в Trigly
Исходящие (Trigly → ваш сервер)
Trigly отправляет POST-запрос на ваш URL, когда происходит одно из поддерживаемых событий:
Почтовые события:
email.sent— письмо передано почтовому серверуemail.delivered— письмо доставлено в почтовый ящик получателяemail.opened— получатель открыл письмо (трекинговый пиксель)email.clicked— получатель кликнул ссылку в письме
SMS-события:
sms.sent— SMS отправлено провайдеруsms.delivered— SMS доставлено на телефон
Кампании:
campaign.completed— кампания завершила отправку всем получателям
CDP-события:
customer.created— создан новый контактcustomer.updated— обновлён профиль контакта
Входящие (внешний сервис → Trigly)
Trigly принимает webhooks от провайдеров каналов доставки через публичные эндпоинты (не требуют JWT):
- UniSender (
POST /hooks/email/unisender) — bounce, complaint, unsubscribe. Trigly автоматически добавляет адрес в suppression list и помечает контакт как отписавшегося. - Универсальный bounce (
POST /hooks/email/bounce) — hard bounce создаёт SuppressionEntry, spam complaint устанавливает unsubscribe. - Telegram (
POST /hooks/telegram/{org_id}) — входящие сообщения,/startс deep link для привязкиtelegram_chat_id, нажатия callback-кнопок. Подробнее в руководстве по Telegram. - SMS.ru (
POST /hooks/sms/status) — статусы доставки: 103 = доставлено, 104/105 = ошибка → автоматический retry.
Настройка исходящих webhooks
Шаг 1: Создайте endpoint на вашем сервере
Ваш сервер должен:
- Принимать POST-запросы
- Отвечать кодом 200 (или 2xx) в течение 10 секунд
- Проверять HMAC-подпись (рекомендуется)
Пример endpoint на Python (FastAPI):
from fastapi import FastAPI, Request, HTTPException
import hmac
import hashlib
WEBHOOK_SECRET = "your_secret_from_trigly"
@app.post("/webhook/trigly")
async def handle_trigly_webhook(request: Request):
body = await request.body()
signature = request.headers.get("X-Trigly-Signature")
expected = hmac.new(
WEBHOOK_SECRET.encode(),
body,
hashlib.sha256
).hexdigest()
if not hmac.compare_digest(signature, expected):
raise HTTPException(status_code=401)
data = await request.json()
event = data["event"]
if event == "email.opened":
# Обновить CRM
pass
elif event == "campaign.completed":
# Отправить отчёт
pass
return {"status": "ok"}
Шаг 2: Зарегистрируйте webhook в Trigly
- Перейдите в раздел Кампании, затем Webhooks, нажмите "Создать"
- Укажите URL:
https://your-server.com/webhook/trigly - Выберите Events: типы событий, которые вас интересуют
- Trigly автоматически сгенерирует Secret для HMAC-SHA256 подписи
- Сохраните webhook. При желании можно привязать его к конкретной кампании (поле
campaign_id) или оставить глобальным (null)
Webhook сохраняется в таблице campaign_webhooks и становится активным немедленно.
Шаг 3: Проверьте подпись
Каждый исходящий запрос от Trigly подписывается HMAC-SHA256 с использованием вашего Secret. Подпись передаётся в заголовке X-Trigly-Signature.
Алгоритм проверки:
- Прочитайте тело запроса как bytes
- Вычислите HMAC-SHA256(secret, body)
- Сравните с значением заголовка
X-Trigly-Signature - Если не совпадает — отклоните запрос (401/403)
Проверка подписи защищает от подделки: злоумышленник не может отправить фальшивый webhook на ваш URL, потому что не знает Secret.
Формат Payload
Все исходящие webhooks используют единый формат JSON:
{
"event": "email.opened",
"timestamp": "2026-03-20T10:30:00Z",
"data": {
"campaign_id": "550e8400-e29b-41d4-a716-446655440000",
"customer_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"message_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
}
Поля в data зависят от типа события:
email.*— содержатcampaign_id,customer_id,message_id, дляclickedтакжеurlcampaign.*— содержатcampaign_id,total_sent,total_delivered,total_failedcustomer.*— содержатcustomer_id,email,changes(для update)
Retry Policy
Trigly использует надёжную политику повторных попыток для исходящих webhooks:
- Первая попытка — немедленно при возникновении события
- Вторая попытка — через 30 секунд (exponential backoff)
- Третья попытка — через 2 минуты
Webhook считается неуспешным, если:
- Сервер вернул код ответа не из диапазона 2xx
- Сервер не ответил в течение 10 секунд (timeout)
- Соединение не установлено (DNS error, connection refused)
Если webhook непрерывно fail более 10 раз подряд, Trigly автоматически деактивирует его (поле is_active = false) и отправляет уведомление администратору. Это защита от бесконечных retry на неработающий сервер.
Для реактивации: исправьте проблему на вашем сервере, перейдите в Кампании, затем Webhooks, и включите webhook обратно.
Входящие webhooks от провайдеров
Настройка UniSender
- В личном кабинете UniSender перейдите в Настройки уведомлений
- Укажите URL:
https://your-trigly-domain.com/hooks/email/unisender - Выберите события: bounce, complaint, unsubscribe
- UniSender начнёт отправлять уведомления в Trigly
При получении события Trigly автоматически:
- bounce → создаёт
SuppressionEntryв стоп-листе - complaint → suppression + устанавливает
is_unsubscribed = true - unsubscribe → suppression + unsubscribe
Настройка Telegram
Настраивается автоматически при подключении бота в настройках каналов. Trigly вызывает setWebhook с URL /hooks/telegram/{org_id}. Подробнее: руководство по Telegram-боту.
Настройка SMS.ru
В личном кабинете SMS.ru укажите callback URL: https://your-trigly-domain.com/hooks/sms/status. SMS.ru будет отправлять статусы доставки (103 = доставлено, 104 = не доставлено, 105 = ошибка). При ошибке доставки Trigly создаёт запись в FailedMessage для автоматического retry.
Типичные ошибки
-
Медленный обработчик. Если ваш сервер обрабатывает webhook дольше 10 секунд, Trigly считает это timeout и ретраит. Решение: принимайте webhook, сразу отвечайте 200, а обработку выполняйте асинхронно (через очередь).
-
Отсутствие проверки подписи. Без верификации HMAC-SHA256 любой может отправить фальшивый POST на ваш URL. Всегда проверяйте
X-Trigly-Signature. -
Не идемпотентный обработчик. Из-за retry один и тот же webhook может прийти дважды. Ваш обработчик должен быть идемпотентным — используйте
message_idкак ключ дедупликации. -
HTTP вместо HTTPS. Trigly передаёт данные клиентов в webhook payload. Используйте только HTTPS для защиты данных в transit.
-
Игнорирование деактивации. Если webhook деактивирован (10+ последовательных ошибок), это значит, что вы теряете события. Настройте мониторинг на вашей стороне и быстро реагируйте на проблемы.
Best practices
- Быстрый ответ: отвечайте 200 мгновенно, обрабатывайте асинхронно
- Проверяйте подпись: HMAC-SHA256 верификация обязательна для production
- Дедупликация: используйте
message_idдля защиты от дублей при retry - Логируйте всё: сохраняйте полный payload для отладки
- Мониторинг: настройте алерт на деактивацию webhook
- HTTPS only: никогда не используйте HTTP для production webhook URL
Ожидаемые метрики
- Latency доставки webhook: менее 500ms (при стабильном сервере)
- Success rate: 99%+ при правильной настройке
- Retry utilization: менее 5% запросов требуют retry
- Средний объём: 500-5000 webhook-событий в день на каждые 100 000 отправленных сообщений
FAQ
Можно ли отправлять webhooks в Slack или Telegram? Да, Trigly отправляет стандартный POST с JSON body. Для Slack создайте Incoming Webhook в настройках workspace. Для Telegram используйте промежуточный сервер (например, AWS Lambda), который преобразует payload в формат Telegram Bot API.
Как тестировать webhooks в разработке? Используйте сервисы типа webhook.site или ngrok для получения webhooks на локальный сервер. Создайте webhook в Trigly с URL от ngrok, запустите тестовую кампанию и проверьте входящие запросы.
Что произойдёт, если мой сервер был недоступен несколько часов? Trigly выполняет 3 retry с exponential backoff. Если все 3 попытки неуспешны, webhook-событие теряется. Для критичных интеграций рекомендуем дублировать данные через REST API — периодически запрашивать статусы кампаний и сообщений.
Готовы интегрировать Trigly с вашими системами? Создайте аккаунт и настройте первый webhook за 5 минут.