Engineering

Webhooks nutzen, um Bewerberinnen mit Slack und HubSpot zu synchronisieren

ClarityHire Team(Editorial)4 min read

Was ein ATS-Webhook wirklich tut

Ein Webhook ist ein Hook, den das ATS auslöst, wenn etwas passiert — eine Bewerberin bewirbt sich, eine Test ist bewertet, ein Interview ist gebucht. Das ATS sendet ein kleines JSON-Payload an eine URL, die du bereitstellst. Dein Code liest es und macht etwas Downstream: in Slack posten, einen HubSpot-Kontakt erstellen, eine Greenhouse-Stage aktualisieren, einen Zap triggern.

Webhooks sind günstig, push-basiert und event-shaped. Du fragst nicht ab. Du reimplementierst nicht das Datenmodell. Du reagierst.

Die Events, die man zuerst anbinden sollte

Elf Events feuern auf der Webhook-Oberfläche von ClarityHire, aber nur eine Handvoll zählt am ersten Tag:

  • application.submitted — neue Bewerberin in der Pipeline. Das Slack-Benachrichtigungs-Event.
  • test.completed — Bewertung ist bewertet. Das „benachrichtige den Recruiter"-Event.
  • test.passed / test.failed — Auto-Advance / Auto-Archivierungs-Trigger.
  • interview.scheduled und interview.completed — Kalender- und CRM-Sync.
  • candidate.stage_changed — das „sage HubSpot, dass der Lead heiß wird"-Event.
  • candidate.hired — schließe die Schleife mit Finance / IT Provisioning.

Binde application.submitted und candidate.stage_changed zuerst an. Alles andere kann warten, bis du gelernt hast, welche Benachrichtigungen dein Team wirklich haben will.

Muster 1 — Slack-Bewerberinnen-Alerts

Die naive Version: ein Webhook → eine Incoming Webhook URL in Slack → eine flache Nachricht in #hiring. Okay für eine Woche. Schmerzhaft danach, weil jede neue Bewerberin alle benachrichtigt.

Das Muster, das sich bewährt:

  1. Nach Job routen. Jede Stelle einem Slack-Channel mappen (#hiring-backend, #hiring-design). Empfange den Webhook in einer winzigen Serverless-Funktion, suche das Job → Channel Mapping, poste dort. Fünf-Zeilen-Funktion.
  2. Threaded Updates pro Bewerberin. Poste das initiale application.submitted Event als Top-Level-Nachricht. Poste spätere Events (test.completed, interview.scheduled) als Replies im selben Thread. Jetzt liest sich jeder Channel wie eine Pro-Bewerberin-Timeline.
  3. Ein actionable Button. Füge einen Slack-Action-Button hinzu, der zum Bewerberin-Profil im ATS verlinkt. Versuche nicht, die echte Entscheidung in Slack zu treffen; mach es dort, wo die Daten sind.

Der Grund, eine kleine Funktion dazwischen zu setzen (anstelle von Slack's nativem Incoming Webhook direkt zu nutzen) ist, dass du die HMAC-Signatur verifizieren, State suchen, und eine Slack-URL nicht an die ganze ATS-Config deiner Organisation leaken kannst.

Muster 2 — HubSpot-Kontakt-Sync

Der Wert von HubSpot in einer Recruiting-Pipeline ist derselbe wie in einer Sales-Pipeline: halte einen Datensatz über jede Person, die jemals mit deiner Organisation interagiert hat, gekennzeichnet nach Lifecycle-Stage. Recruiting-Leads sind Leute, die du in drei Jahren re-engagieren könntest.

  1. application.submitted → HubSpot-Kontakt erstellen/aktualisieren. Setze Lifecycle-Stage auf Other oder eine benutzerdefinierte Candidate-Stage. Hänge die Quellstelle als Eigenschaft an.
  2. candidate.hired → Lifecycle auf Customer/Employee aktualisieren. Unterdrücke wiederkehrende Marketing-Emails an Leute, die jetzt für dich arbeiten.
  3. application.rejected → tag für Talent-Rediscovery. Ein „abgelehnt, aber qualifiziert"-Tag ist der einzige höchste ROI-Tag in einer HubSpot/ATS-Bridge. Sechs Monate später, wenn du ein ähnliches Req hast, fragt dein Sourcer das Tag ab.

Nutze HubSpot's Batch API für die Writes, wenn du in irgendeinem Scale bist. Single-Contact Writes sind okay zum Starten, schmerzhaft bei 50 reqs/min.

Die Stolperfallen, die dich in Production treffen

  • Verifiziere die HMAC-Signatur auf jedem Request. Die Webhook-URL ist internet-zugänglich. Wenn du nicht verifizierst, kann jeder, der deine URL findet, deinen Slack-Channel spammen. ClarityHire's Webhooks versenden mit einem Signing Secret pro Endpoint — nutze es.
  • Mache Handler idempotent. Webhooks werden auf Non-2xx-Responses neu versucht. Dein Handler wird dasselbe Event mehr als einmal sehen. Schlüssel deine Downstream-Aktionen auf der Event ID, nicht auf der Empfangszeit.
  • Antworte 2xx schnell, dann mache die Arbeit. Ein Webhook-Handler, der 30 Sekunden braucht, um HubSpot zu rufen, bevor er 200 zurückgibt, wird timeout und neu versucht. Bestätige zuerst, queue die Arbeit, mache sie async.
  • Logge Delivery, separat vom Acting. Das ATS wird dir ein Delivery-Log geben; baue dein eigenes auch. Wenn etwas fehlt, braucht die Frage „hat das ATS es gesendet, haben wir es empfangen, haben wir darauf reagiert" drei separate Antworten.

Wie ClarityHire's Webhook-Layer verkabelt ist

/dashboard/webhooks lässt dich einen Endpoint pro Organisation registrieren, wähle welche Events abonniert werden, setze Custom Headers, und sehe das Per-Delivery-Log mit HMAC-Signatur, Payload, Response-Code und Replay-Button. Fehlgeschlagene Deliveries werden mit exponentiellem Backoff neu versucht. Für leichtere Integrationen kannst du auch durch Zapier routen oder die nativen Slack + HubSpot Connectors nutzen und den Custom Endpoint komplett überspringen.

TL;DR

Starten mit zwei Events (application.submitted, candidate.stage_changed), ein Slack-Channel pro Job, und ein HubSpot-Contact-Sync-Flow. Verifiziere HMAC, mache Handler idempotent, bestätige schnell und queue. Alles andere skaliert von dieser Basis aus.

ats webhooksslack bewerberinnen-benachrichtigungenhubspot ats synchiring-automatisierungwebhook-integration