Webhooks
SalonAI отправляет события на внешние URL через интеграцию с n8n. Каждый webhook — это отдельный канал с собственным URL и (опционально) токеном аутентификации.
Архитектура доставки
Событие в Django
│
▼
_call_n8n(payload)
├── 1. HTTP POST → webhook_url (таймаут connect: N8N_WEBHOOK_CONNECT_TIMEOUT_SECONDS)
├── 2. Ошибка / таймаут → _n8n_backoff_after_attempt(attempt) → retry
├── 3. SSL-ошибка → логируется (N8N_WEBHOOK_SSL_VERIFY=false отключает проверку)
└── 4. Финальный ответ → extract_n8n_text_answer(response)
Механизм retry (backoff): при временной ошибке сервер ждёт экспоненциально нарастающее время между попытками (_n8n_backoff_after_attempt). Число попыток зависит от типа события.
Все настроенные вебхуки
| Назначение | ENV-переменная URL | Токен |
|---|---|---|
| Биржа смен (анализ) | N8N_EXCHANGE_ANALYSIS_WEBHOOK_URL | N8N_EXCHANGE_ANALYSIS_WEBHOOK_TOKEN |
| Технолог | N8N_TECHNOLOGIST_WEBHOOK_URL | N8N_TECHNOLOGIST_WEBHOOK_TOKEN |
| Синдикат | N8N_SYNDICATE_WEBHOOK_URL | N8N_SYNDICATE_WEBHOOK_TOKEN |
| YClients-события | N8N_YCLIENTS_WEBHOOK_URL | — |
| Владелец / Админ | N8N_OWNER_ADMIN_WEBHOOK_URL | — |
| Лидогенерация (outreach) | N8N_CONTACT_OUTREACH_DRAFT_WEBHOOK_URL | N8N_CONTACT_OUTREACH_DRAFT_WEBHOOK_TOKEN |
| Отчёт партнёра | N8N_PARTNER_REPORT_WEBHOOK_URL | — |
Если ENV-переменная не задана или пустая — соответствующий webhook не вызывается, Django пропускает отправку.
События YClients (N8N_YCLIENTS_WEBHOOK_URL)
Отправляются из сервиса imports-service в процессе синхронизации:
event_type | Когда |
|---|---|
yclients.bundle.chunk | Получена очередная порция данных из YClients |
yclients.bundle.complete | Вся пачка данных успешно загружена |
yclients.bundle.fetched | (fallback) Если тип не определён явно |
События биржи смен (N8N_EXCHANGE_ANALYSIS_WEBHOOK_URL)
Отправляются при событиях в модуле exchange:
| Событие | Описание |
|---|---|
| Новая задача на анал из | ExchangeTask создана |
| Результат анализа | FingerAnalysis завершён |
| Оценка задачи | TaskReview добавлен |
События интерактивных цепочек Cindy
Внутренние события диалога (модель InteractiveEvent):
event_type | Описание |
|---|---|
created | Цепочка создана |
sent | Элемент отправлен клиенту |
answered | Клиент ответил на элемент |
free_text | Клиент написал свободный текст вместо выбора |
cancelled | Цепочка отменена |
chain_completed | Цепочка завершена полностью |
channel_fallback | Канал не поддерживает интерактив — деградация до текста |
События outreach (N8N_CONTACT_OUTREACH_DRAFT_WEBHOOK_URL)
event_type | Описание |
|---|---|
CANDIDATE_DRAFT | Составлен черновик контакта |
CANDIDATE_STATUS_SENT | Статус кандидата изменён на «отправлен» |
MENTOR_ASSIGN | Назначен наставник |
OPERATOR_OUTREACH | Оператор вышел на связь |
SLOT_RANK | Ранжирование слота |
SLOT_DRAFT | Черновик слота |
Общий формат события
{
"event": "record.created",
"timestamp": "2026-08-01T10:30:00Z",
"data": {
"record_id": 1001,
"client_id": 42,
"master_id": 5,
"date": "2026-08-05",
"time": "14:00"
}
}
Для n8n-событий с AI-анализом дополнительно может присутствовать run_id — идентификатор запуска в n8n.
Конфигурация SSL
По умолчанию SSL-проверка включена. Если n8n работает с самоподписанным сертификатом:
N8N_WEBHOOK_SSL_VERIFY=false
При ошибке SSL Django логирует: SSL to n8n failed (heavy JSON ~%s KB, nginx body limit, or bad TLS on path).
Подключение
Для настройки webhook-адресов обратитесь к команде SalonAI: info@salonai.ru