Инженерия

Как использовать Webhooks для синхронизации кандидатов со Slack и HubSpot

ClarityHire Team(Editorial)4 min read

Что на самом деле делает 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. Нормально неделю. Больно потом, потому что каждый новый соискатель пингует всех.

Паттерн, который выдерживает испытание:

  1. Маршрутизация по вакансии. Сопоставьте каждую вакансию с каналом Slack (#hiring-backend, #hiring-design). Получайте webhook в крошечной serverless функции, посмотрите маршрут вакансии → канала, публикуйте там. Пятистрочная функция.
  2. Потокированные обновления по кандидату. Публикуйте событие application.submitted как топ-уровневое сообщение. Публикуйте последующие события (test.completed, interview.scheduled) как ответы в том же потоке. Теперь каждый канал читается как временная шкала по кандидату.
  3. Одна кнопка действия. Добавьте кнопку действия Slack, которая ссылается на профиль кандидата в ATS. Не пытайтесь принимать решение в Slack; делайте это там, где находятся данные.

Причина поставить крошечную функцию посередине (вместо прямого использования встроенного входящего webhook Slack) в том, чтобы проверить подпись HMAC, посмотреть состояние и не утечь URL Slack в конфигурацию всего ATS организации.

Паттерн 2 — Синхронизация контактов HubSpot

Ценность HubSpot в трубе найма — то же самое, что в трубе продаж: ведение записи о каждом человеке, когда-либо взаимодействовавшем с организацией, помеченного по этапу жизненного цикла. Кандидаты на должность — люди, на которых вы можете снова выйти через три года.

  1. application.submitted → создание/обновление контакта HubSpot. Установите этап жизненного цикла на Other или пользовательский этап Candidate. Прикрепите исходную вакансию как свойство.
  2. candidate.hired → обновление жизненного цикла на Customer/Employee. Подавляет повторяющиеся маркетинговые письма людям, которые теперь работают у вас.
  3. 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, делайте обработчики идемпотентными, подтверждайте быстро и ставьте в очередь. Всё остальное масштабируется из этой базы.

ats webhooksslack уведомления о кандидатахhubspot ats синхронизацияавтоматизация наймаwebhook интеграция

Похожие статьи