Webhooks nutzen, um Bewerberinnen mit Slack und HubSpot zu synchronisieren
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.scheduledundinterview.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:
- 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. - Threaded Updates pro Bewerberin. Poste das initiale
application.submittedEvent 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. - 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.
application.submitted→ HubSpot-Kontakt erstellen/aktualisieren. Setze Lifecycle-Stage auf Other oder eine benutzerdefinierte Candidate-Stage. Hänge die Quellstelle als Eigenschaft an.candidate.hired→ Lifecycle auf Customer/Employee aktualisieren. Unterdrücke wiederkehrende Marketing-Emails an Leute, die jetzt für dich arbeiten.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.