Engineering

Cum să folosești webhook-uri pentru a sincroniza candidații cu Slack și HubSpot

ClarityHire Team(Editorial)5 min read

Ce face de fapt un webhook ATS

Un webhook este un cârlig pe care ATS-ul îl trage când se întâmplă ceva — un candidat se aplică, o testare este finalizată, o interviu este programată. ATS-ul trimite o mică sarcină JSON la o adresă URL pe care o furnizezi. Codul tău o citește și face ceva în aval: poștează pe Slack, creează un contact HubSpot, actualizează o etapă în Greenhouse, declanșează un Zap.

Webhook-urile sunt ieftine, bazate pe push, și orientate pe evenimente. Nu faci sondaje. Nu reimplementezi modelul de date. Reacționezi.

Evenimentele care merită să fie conectate mai întâi

Unsprezece evenimente se declanșează pe suprafața webhook a ClarityHire, dar doar câteva conteaza în prima zi:

  • application.submitted — nou candidat în pipeline. Evenimentul de notificare Slack.
  • test.completed — evaluarea este cotată. Evenimentul „notifică recruiterul".
  • test.passed / test.failed — declanșatoare pentru avansare automată / arhivare automată.
  • interview.scheduled și interview.completed — sincronizare calendar și CRM.
  • candidate.stage_changed — evenimentul „spune HubSpot-ului că lead-ul s-a încălzit".
  • candidate.hired — închide bucla cu finanțele / aprovizionarea IT.

Conectează application.submitted și candidate.stage_changed mai întâi. Totul restul poate aștepta până când ai învățat ce notificări vrea cu adevărat echipa ta.

Pattern 1 — Alerte candidați Slack

Versiunea naivă: un webhook → o adresă URL Incoming Webhook în Slack → un mesaj simplu în #hiring. Bine pentru o săptămână. Dureros după, pentru că fiecare nou candidat avizează pe toată lumea.

Pattern-ul care rezistă:

  1. Rutează după job. Mapează fiecare poziție la un canal Slack (#hiring-backend, #hiring-design). Primești webhook-ul într-o funcție serverless mică, cauți maparea job → canal, postezi acolo. Funcție de cinci linii.
  2. Actualizări filetate pe candidat. Poștează evenimentul inițial application.submitted ca mesaj de nivel superior. Poștează evenimente ulterioare (test.completed, interview.scheduled) ca răspunsuri în același fir. Acum fiecare canal citește ca o cronologie per candidat.
  3. Un buton acționabil. Adaugă un buton de acțiune Slack care se conectează la profilul candidatului în ATS. Nu încerca să faci decizia reală în Slack; fă-o acolo unde trăiesc datele.

Motivul pentru a pune o funcție mică în mijloc (în loc să folosești direct webhook-ul nativ de intrare al Slack) este că poți verifica semnătura HMAC, cauta starea, și nu divulga o adresă URL Slack la întreaga configurație ATS a organizației tale.

Pattern 2 — Sincronizare contact HubSpot

Valoarea HubSpot-ului într-un pipeline de recrutare este aceeași ca într-un pipeline de vânzări: mențineți un înregistrare a fiecărei persoane care a interacționat vreodată cu organizația ta, etichetată după etapa ciclului de viață. Lead-urile de recrutare sunt oameni pe care i-ai putea re-implica în trei ani.

  1. application.submitted → creare/actualizare contact HubSpot. Setează etapa ciclului de viață la Other sau o etapă Candidate personalizată. Atașează poziția de origine ca proprietate.
  2. candidate.hired → actualizează ciclul de viață la Customer/Employee. Suprimă emailurile de marketing recurente către persoanele care acum lucrează pentru tine.
  3. application.rejected → etichetează pentru redescoperire de talente. O etichetă „respingere dar calificat" este singura etichetă cu ROI cel mai înalt într-un bridge HubSpot/ATS. Șase luni mai târziu, când ai o cerere similară, sourcer-ul tău interoghez eticheta.

Utilizează API-ul batch al HubSpot pentru scrieri dacă ești la orice scală. Scriurile cu contact unic sunt bune pentru a începe, dureroase la 50 reqs/min.

Capcanele care te lovesc în producție

  • Verifică semnătura HMAC pe fiecare cerere. Adresa URL a webhook-ului este accesibilă pe internet. Dacă nu verifici, oricine găsește adresa ta URL poate spama canalul tău Slack. Webhook-urile ClarityHire vin cu o cheie de semnare secretă per endpoint — folosește-o.
  • Fă gesturile idempotente. Webhook-urile se încearcă din nou pe răspunsuri non-2xx. Gerul tău va vedea același eveniment mai mult de o dată. Cheie acțiunile tale în aval pe ID-ul evenimentului, nu pe ora recepției.
  • Răspunde 2xx rapid, apoi fă munca. Un gerant de webhook care durează 30 de secunde pentru a apela HubSpot înainte de a returna 200 va expira și va fi încercat din nou. Recunoaște mai întâi, pune la coadă munca, fă-o asincron.
  • Înregistrează livrarea, separat de acțiune. ATS-ul îți va da un jurnal de livrare; construiți și al tău. Când ceva lipsește, întrebarea „l-a trimis ATS-ul, l-am primit, am acționat" are nevoie de trei răspunsuri separate.

Cum este conectat nivelul webhook al ClarityHire

/dashboard/webhooks te permite să înregistrezi un endpoint per organizație, alegi care evenimente să te abonezi, să setezi anteturi personalizate, și să vizualizezi jurnalul pe livrare cu semnătură HMAC, sarcină, cod de răspuns și buton de reluare. Livrările eșuate se reîncearcă cu backoff exponențial. Pentru integrări mai ușoare, poți de asemenea să rutezi prin Zapier sau să folosești conectorii nativi Slack + HubSpot și să omiți complet endpoint-ul personalizat.

TL;DR

Începe cu două evenimente (application.submitted, candidate.stage_changed), un canal Slack per job, și un flux de sincronizare contact HubSpot. Verifică HMAC, fă gesturile idempotente, recunoaște rapid și pune la coadă. Totul restul se scalează de la acea bază.

ats webhooksnotificări candidați slacksincronizare ats hubspotautomatizare angajareintegrare webhook