Webhook des contacts
Propriétaires et administrateurs ayant une adresse e-mail vérifiée. Paramètres de l’organisation → Intégrations → Webhook des contacts envoie chaque nouveau contact d’un formulaire de contact à une adresse, par exemple un déclencheur Zapier, Make ou n8n, ou votre propre serveur. Les contacts restent aussi dans Statistiques → Contacts. Avec Envoyer aussi les ouvertures et fins de lecture des liens personnels, il signale aussi les liens personnels.
L’adresse
L’adresse doit utiliser HTTPS sur le port par défaut et être accessible depuis Internet. Les adresses qui pointent vers un réseau privé sont refusées et les redirections ne sont pas suivies : saisissez l’adresse finale. Décocher Envoyer les nouveaux contacts suspend l’envoi sans supprimer l’adresse ; les contacts reçus entre-temps ne sont pas envoyés plus tard, et les nouvelles tentatives en attente reprennent dès que vous la recochez.
Envoyer un événement de test envoie une fois un contact d’exemple, sans nouvelle tentative, et affiche le résultat sous Envois récents.
Ce qui est envoyé
Chaque nouveau contact est envoyé en JSON :
{
"id": "6c0a4f8e-…",
"event": "lead.created",
"createdAt": "2026-10-25T12:00:00Z",
"organization": { "id": "…", "name": "Northstar Studio" },
"demo": { "id": "…", "title": "Approve a release", "url": "https://demo-creator.com/demo/…" },
"lead": {
"id": "…",
"name": "Grace Hopper",
"email": "grace@example.com",
"screen": "start",
"language": "en"
}
}
screen vaut start ou end selon l’écran dont le formulaire a été envoyé, et language est la langue de démo choisie par le lecteur, ou vide. Les événements de test ont "event": "webhook.test", "demo": null et un contact d’exemple. Chaque requête porte aussi les en-têtes X-Demo-Creator-Event, X-Demo-Creator-Delivery (même valeur que id) et X-Demo-Creator-Signature.
Les événements des liens personnels, recipient.opened et recipient.completed, sont envoyés une fois par lien et contiennent un objet recipient au lieu de lead :
{
"event": "recipient.opened",
"recipient": {
"id": "…",
"name": "Grace Hopper",
"email": "grace@example.com",
"firstViewedAt": "2026-10-25T12:00:00Z",
"views": 1,
"completedAt": null
}
}
Vérifier la signature
X-Demo-Creator-Signature ressemble à t=1792931200,v1=5f2b…. Calculez un HMAC-SHA256 de l’horodatage, d’un point et du corps brut de la requête, avec le Secret de signature comme clé, et comparez-le à v1 en temps constant. Refusez les requêtes dont l’horodatage date de plus de cinq minutes.
import { createHmac, timingSafeEqual } from 'node:crypto';
function verify(rawBody, header, secret) {
const { t, v1 } = Object.fromEntries(header.split(',').map((part) => part.split('=')));
const expected = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300;
return (
fresh &&
v1?.length === expected.length &&
timingSafeEqual(Buffer.from(v1), Buffer.from(expected))
);
}
Renouveler le secret signe immédiatement les requêtes avec un nouveau secret : mettez votre récepteur à jour juste après.
Envoi et nouvelles tentatives
Une réponse avec un statut 2xx compte comme livrée. Tout autre statut, l’absence de réponse en 10 secondes ou l’absence de connexion entraîne de nouvelles tentatives après 1 minute, 5 minutes, 30 minutes, 2 heures et 6 heures ; l’envoi apparaît ensuite en échec. Une nouvelle tentative après une réponse perdue peut répéter un contact : utilisez id pour ignorer les doublons.
Un contact dont la démo est mise à la corbeille avant l’envoi n’est pas envoyé, et Supprimer le webhook annule les envois encore en attente. Les 20 derniers envois sont listés ; les envois terminés sont supprimés après 30 jours.