Qu'est-ce qu'un webhook ?
Un webhook est un appel HTTP sortant émis par un système A quand un événement se produit, et reçu par un système B. C'est l'inverse du polling : c'est la source qui notifie la destination, dès que l'événement a lieu.
Pourquoi le webhook bat le polling
- Latence quasi-nulle : la propagation est instantanée
- Pas de charge inutile : aucune requête tant qu'il n'y a pas d'événement
- Mieux pour le SEO : Google reçoit les nouveaux biens immédiatement
- Mieux pour la conversion : les biens premium se vendent vite
Sécurité : signer le payload
Un webhook public est une porte d'entrée potentielle. Pour s'assurer que l'appel vient bien du CRM, on signe le payload avec une clé secrète partagée (HMAC-SHA256 typiquement).
import crypto from 'crypto'
export function verifyWhiseSignature(
payload: string,
signature: string,
secret: string,
): boolean {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex')
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature),
)
}Idempotence
Un webhook peut être réémis (par le CRM en cas d'erreur) ou rejoué (par malveillance). Il faut traiter les événements de manière idempotente : si l'événement avec id X arrive deux fois, on ne fait l'action qu'une fois.
- Stocker les event_id reçus dans une table
- Refuser silencieusement les doublons
- Conserver l'historique pour audit
Retries et dead-letter
Quand votre endpoint est temporairement indisponible, le CRM ne doit pas perdre l'événement. Bonne pratique : retry exponentiel (1 min, 5 min, 30 min, 2h, 12h, 24h) avec dead-letter en cas d'échec définitif.
Ts-Immo et les webhooks
Ts-Immo expose un endpoint /v1/gateway/webhooks/{provider}/{gatewayId} qui reçoit les événements Sweepbright et Whise, vérifie la signature, déduplique et propage vers vos sites WordPress / Next.js connectés.