Вебхук для лидов и встреч: заявки в Zapier, Make, n8n или вашу CRM
Вебхук для лидов и встреч
Вебхук сразу отправляет каждую новую заявку на выбранный вами адрес. Лиды и встречи попадают прямо в Zapier, Make, n8n или вашу собственную CRM, например чтобы создать тикет или отправить письмо отделу продаж.
Вебхук доступен с тарифа Стандартный, подробности на странице тарифов.
Настройка
- Откройте Панель управления → ваш ассистент → Функции.
- Выберите в списке Передавать автоматически (группа Привлекать клиентов). Там находится блок Вебхук.
- Введите адрес, например URL «Catch Hook» из Zapier, и нажмите Сохранить.
- Скопируйте Секретный ключ. Он показывается только один раз. Кнопка Новый ключ при необходимости создает новый.
- Выберите, что передавать: Новые заявки на контакт, Новые встречи или и то, и другое.
- Кнопка Проверить отправляет на ваш адрес тестовый запрос.
Адрес должен начинаться с https://, быть доступен из интернета и использовать порт 443 или 8443. Адреса внутри вашей сети (например localhost или 192.168.…) не принимаются.
События
| Событие | Когда |
|---|---|
lead.created | Сохранен лид: из чата, телефонного звонка или формы Action Bar. |
booking.created | Создана запись на встречу. |
Пример: новый лид
{
"id": "7a05fd6b-3b54-4235-b76e-7695c4ab13a3",
"event": "lead.created",
"createdAt": "2026-10-23T15:11:28.895Z",
"data": {
"leadId": "51f7f1e3-3e2f-471b-ade6-90959a5d3724",
"source": "chat",
"name": "Анна Иванова",
"email": "anna@example.com",
"phone": "+7 495 000-00-00",
"interest": "Расчет стоимости теплового насоса",
"language": "ru",
"fields": { "Компания": "ООО Пример" },
"sessionId": "861f9c24-11ab-4352-b326-5670b0196fc0",
"createdAt": "2026-10-23T15:11:28.742Z"
}
}
source принимает значения chat, phone или form. Поля без значения не передаются. В fields находятся ваши дополнительные данные, ключом служит их название. При запросе обратного звонка добавляется callback с day и time, у формы добавляется formName.
Пример: новая встреча
{
"id": "0c8f2d0e-6f1a-4a43-9a0b-2f9a3c1d5e77",
"event": "booking.created",
"createdAt": "2026-10-23T15:20:04.112Z",
"data": {
"bookingId": "e3f82cb1-4f6a-4d6e-9c55-0d1a2b3c4d5e",
"source": "card",
"appointmentType": { "id": "consultation", "title": "Бесплатная консультация", "durationMinutes": 30 },
"start": "2026-10-28T14:00",
"end": "2026-10-28T14:30",
"startUtc": "2026-10-28T11:00:00.000Z",
"endUtc": "2026-10-28T11:30:00.000Z",
"timezone": "Europe/Moscow",
"name": "Иван Петров",
"email": "ivan@example.com",
"fields": { "Компания": "ООО Пример" },
"createdAt": "2026-10-23T15:20:04.050Z"
}
}
start и end указаны по местному времени в timezone, startUtc и endUtc это те же моменты в UTC. source принимает значения card (запись через карточку встречи в чате), chat или phone. Поля без значения не передаются: name (если имя не спрашивали или его не указали), email, phone, note (цель встречи), meetingLink (ссылка на видеозвонок, только при Google Calendar) и sessionId. В fields находятся ответы на дополнительные данные из функции Запись на встречи, ключом служит их название.
Заголовки
| Заголовок | Содержимое |
|---|---|
X-Webhook-Id | Уникальный ID доставки, совпадает с полем id. По нему удобно отсеивать дубликаты. |
X-Webhook-Event | lead.created или booking.created |
X-Webhook-Timestamp | Время отправки в секундах с 1970 года |
X-Webhook-Signature | sha256= плюс HMAC-SHA256 от timestamp.rawBody с вашим секретным ключом |
Проверка подписи
Проверяйте подпись, прежде чем использовать данные. Берите исходное тело запроса без изменений, а не заново сериализованный JSON.
Node.js:
import { createHmac, timingSafeEqual } from 'node:crypto'
export function isValidWebhook(rawBody, headers, secret) {
const timestamp = headers['x-webhook-timestamp']
const expected = 'sha256=' + createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest('hex')
const received = String(headers['x-webhook-signature'] || '')
const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) < 300
return fresh && received.length === expected.length && timingSafeEqual(Buffer.from(received), Buffer.from(expected))
}
PHP:
$raw = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_WEBHOOK_TIMESTAMP'] ?? '';
$received = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $raw, $secret);
if (!hash_equals($expected, $received) || abs(time() - (int) $timestamp) > 300) {
http_response_code(401);
exit;
}
$event = json_decode($raw, true);
В Zapier или Make проверку подписи можно пропустить, если адрес остается в секрете.
Ответ и повторные попытки
- Ответьте статусом 2xx, как только приняли данные. Тело вашего ответа мы не читаем.
- Мы ждем ответа не дольше 5 секунд.
- При тайм-ауте, ошибке сети, статусе 429 или 5xx мы повторяем отправку через 1 и через 5 секунд, то есть всего не больше трех попыток.
- При других ошибках (например 404) повторных попыток нет. Перенаправления не выполняются.
- Результат последней доставки виден в панели управления в строке Последняя передача.
Если ваша система не отвечает, лид не теряется: он всегда сначала сохраняется в разделе «Лиды» панели управления.
