Как использовать Webhooks для синхронизации кандидатов со Slack и HubSpot
Что на самом деле делает webhook ATS
Webhook — это крючок, который ATS срабатывает, когда происходит что-то важное: подана заявка кандидата, пройден тест, назначено интервью. ATS отправляет небольшой JSON-payload на указанный вами URL. Ваш код читает его и выполняет что-то downstream: публикует в Slack, создаёт контакт HubSpot, обновляет этап Greenhouse, запускает Zap.
Webhooks дешевые, основаны на push и имеют событийную форму. Вы не опрашиваете. Вы не переделываете модель данных. Вы реагируете.
События, которые стоит подключить в первую очередь
На поверхности webhooks ClarityHire срабатывают одиннадцать событий, но только несколько имеют значение в первый день:
application.submitted— новый кандидат в трубе. Событие уведомления Slack.test.completed— оценка теста. Событие «пинга» рекрутеру.test.passed/test.failed— триггеры автоматического продвижения/архивирования.interview.scheduledиinterview.completed— синхронизация календаря и CRM.candidate.stage_changed— событие «сообщить HubSpot, что лид активизировался».candidate.hired— закрыть цикл с финансами/IT-обслуживанием.
Подключите application.submitted и candidate.stage_changed первыми. Всё остальное может подождать, пока вы поймёте, о каких уведомлениях на самом деле просит ваша команда.
Паттерн 1 — Slack уведомления о кандидатах
Наивный вариант: один webhook → один Incoming Webhook URL в Slack → плоское сообщение в #hiring. Нормально неделю. Больно потом, потому что каждый новый соискатель пингует всех.
Паттерн, который выдерживает испытание:
- Маршрутизация по вакансии. Сопоставьте каждую вакансию с каналом Slack (
#hiring-backend,#hiring-design). Получайте webhook в крошечной serverless функции, посмотрите маршрут вакансии → канала, публикуйте там. Пятистрочная функция. - Потокированные обновления по кандидату. Публикуйте событие
application.submittedкак топ-уровневое сообщение. Публикуйте последующие события (test.completed,interview.scheduled) как ответы в том же потоке. Теперь каждый канал читается как временная шкала по кандидату. - Одна кнопка действия. Добавьте кнопку действия Slack, которая ссылается на профиль кандидата в ATS. Не пытайтесь принимать решение в Slack; делайте это там, где находятся данные.
Причина поставить крошечную функцию посередине (вместо прямого использования встроенного входящего webhook Slack) в том, чтобы проверить подпись HMAC, посмотреть состояние и не утечь URL Slack в конфигурацию всего ATS организации.
Паттерн 2 — Синхронизация контактов HubSpot
Ценность HubSpot в трубе найма — то же самое, что в трубе продаж: ведение записи о каждом человеке, когда-либо взаимодействовавшем с организацией, помеченного по этапу жизненного цикла. Кандидаты на должность — люди, на которых вы можете снова выйти через три года.
application.submitted→ создание/обновление контакта HubSpot. Установите этап жизненного цикла на Other или пользовательский этап Candidate. Прикрепите исходную вакансию как свойство.candidate.hired→ обновление жизненного цикла на Customer/Employee. Подавляет повторяющиеся маркетинговые письма людям, которые теперь работают у вас.application.rejected→ помечание для переоткрытия таланта. Тег «отклонено, но квалифицировано» — это один из самых высокорентабельных тегов в мосте HubSpot/ATS. Через полгода, когда у вас возникает похожий запрос, ваш sourcer запрашивает тег.
Используйте API пакетных операций HubSpot для записей, если у вас какая-то масштабность. Записи для одного контакта нормальны в начале, болезненны при 50 req/min.
Подводные камни, которые наносят удар в production
- Проверяйте подпись HMAC в каждом запросе. URL webhook доступен в интернете. Если вы не проверите, любой, кто найдёт ваш URL, может спамить ваш канал Slack. Webhooks ClarityHire поставляются с подписанным секретом на конечную точку — используйте его.
- Делайте обработчики идемпотентными. Webhooks повторно отправляются при ответах, отличных от 2xx. Ваш обработчик увидит одно и то же событие более одного раза. Ключируйте действия downstream по ID события, а не по времени получения.
- Ответьте 2xx быстро, затем выполните работу. Обработчик webhook, который тратит 30 секунд на вызов HubSpot перед возвратом 200, превысит timeout и будет отправлен повторно. Подтвердите сначала, поставьте в очередь работу, выполняйте её асинхронно.
- Ведите журнал доставки отдельно от действия. ATS даст вам журнал доставки; постройте свой тоже. Когда что-то теряется, вопрос «отправила ли ATS, получили ли мы, действовали ли мы» требует трёх отдельных ответов.
Как подключен уровень webhook ClarityHire
/dashboard/webhooks позволяет вам регистрировать конечную точку на организацию, выбирать события для подписки, устанавливать пользовательские заголовки и просматривать журнал доставки с подписью HMAC, payload, кодом ответа и кнопкой повтора. Неудачные доставки повторяются с экспоненциальной задержкой. Для более простых интеграций вы также можете маршрутизировать через Zapier или использовать встроенные коннекторы Slack + HubSpot и пропустить пользовательскую конечную точку полностью.
TL;DR
Начните с двух событий (application.submitted, candidate.stage_changed), одного канала Slack на вакансию и одного потока синхронизации контактов HubSpot. Проверяйте HMAC, делайте обработчики идемпотентными, подтверждайте быстро и ставьте в очередь. Всё остальное масштабируется из этой базы.