Перейти к основному содержимому

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_URLN8N_EXCHANGE_ANALYSIS_WEBHOOK_TOKEN
ТехнологN8N_TECHNOLOGIST_WEBHOOK_URLN8N_TECHNOLOGIST_WEBHOOK_TOKEN
СиндикатN8N_SYNDICATE_WEBHOOK_URLN8N_SYNDICATE_WEBHOOK_TOKEN
YClients-событияN8N_YCLIENTS_WEBHOOK_URL
Владелец / АдминN8N_OWNER_ADMIN_WEBHOOK_URL
Лидогенерация (outreach)N8N_CONTACT_OUTREACH_DRAFT_WEBHOOK_URLN8N_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
warning

При ошибке SSL Django логирует: SSL to n8n failed (heavy JSON ~%s KB, nginx body limit, or bad TLS on path).


Подключение

Для настройки webhook-адресов обратитесь к команде SalonAI: info@salonai.ru