Webhook pour prospects et rendez-vous : envoyer les demandes vers Zapier, Make, n8n ou votre CRM

Webhook pour prospects et rendez-vous

Un webhook envoie immédiatement chaque nouvelle demande à l'adresse de votre choix. Les prospects et les rendez-vous arrivent directement dans Zapier, Make, n8n ou votre propre CRM, par exemple pour ouvrir un ticket ou prévenir votre équipe commerciale par e-mail.

Le webhook est disponible à partir du forfait Standard, voir la page des tarifs.

Configuration

  1. Ouvrez Tableau de bord → votre assistant → Fonctionnalités.
  2. Dans la liste, choisissez Transmettre automatiquement (groupe Gagner des clients). Vous y trouvez la section Webhook.
  3. Saisissez l'adresse, par exemple l'URL « Catch Hook » de Zapier, puis cliquez sur Enregistrer.
  4. Copiez la Clé secrète. Elle ne s'affiche qu'une seule fois. Nouvelle clé en crée une nouvelle si nécessaire.
  5. Choisissez ce qui doit être transmis : Nouvelles demandes de contact, Nouveaux rendez-vous ou les deux.
  6. Tester envoie une demande d'exemple à votre adresse.

L'adresse doit commencer par https://, être accessible publiquement et utiliser le port 443 ou 8443. Les adresses de votre réseau interne (par exemple localhost ou 192.168.…) sont refusées.

Événements

ÉvénementQuand
lead.createdUn prospect a été enregistré, depuis le chat, un appel téléphonique ou un formulaire de l'Action Bar.
booking.createdUn rendez-vous a été réservé.

Exemple : nouveau prospect

{
  "id": "7a05fd6b-3b54-4235-b76e-7695c4ab13a3",
  "event": "lead.created",
  "createdAt": "2026-10-23T15:11:28.895Z",
  "data": {
    "leadId": "51f7f1e3-3e2f-471b-ade6-90959a5d3724",
    "source": "chat",
    "name": "Camille Exemple",
    "email": "camille@example.com",
    "phone": "+33 1 23 45 67 89",
    "interest": "Devis pour une pompe à chaleur",
    "language": "fr",
    "fields": { "Entreprise": "Exemple SARL" },
    "sessionId": "861f9c24-11ab-4352-b326-5670b0196fc0",
    "createdAt": "2026-10-23T15:11:28.742Z"
  }
}

source vaut chat, phone ou form. Les champs sans valeur sont omis. fields contient vos informations supplémentaires, avec leur libellé comme clé. Une demande de rappel ajoute callback avec day et time, un formulaire ajoute formName.

Exemple : nouveau rendez-vous

{
  "id": "0c8f2d0e-6f1a-4a43-9a0b-2f9a3c1d5e77",
  "event": "booking.created",
  "createdAt": "2026-10-23T15:20:04.112Z",
  "data": {
    "bookingId": "e3f82cb1-4f6a-4d6e-9c55-0d1a2b3c4d5e",
    "source": "card",
    "appointmentType": { "id": "consultation", "title": "Consultation gratuite", "durationMinutes": 30 },
    "start": "2026-10-28T14:00",
    "end": "2026-10-28T14:30",
    "startUtc": "2026-10-28T13:00:00.000Z",
    "endUtc": "2026-10-28T13:30:00.000Z",
    "timezone": "Europe/Paris",
    "name": "Max Exemple",
    "email": "max@example.com",
    "fields": { "Entreprise": "Exemple SARL" },
    "createdAt": "2026-10-23T15:20:04.050Z"
  }
}

start et end sont exprimés en heure locale du fuseau timezone, startUtc et endUtc correspondent aux mêmes moments en UTC. source vaut card (réservé via la carte de rendez-vous dans le chat), chat ou phone. Les champs sans valeur sont omis : name (si le nom n'a pas été demandé ou pas indiqué), email, phone, note (l'objet), meetingLink (lien de visioconférence, uniquement avec Google Calendar) et sessionId. fields contient les réponses aux autres informations de Réserver des rendez-vous, avec leur libellé comme clé.

En-têtes

En-têteContenu
X-Webhook-IdIdentifiant unique de l'envoi, identique au champ id. Il permet de repérer les doublons.
X-Webhook-Eventlead.created ou booking.created
X-Webhook-TimestampHeure de l'envoi en secondes depuis 1970
X-Webhook-Signaturesha256= suivi du HMAC-SHA256 calculé sur timestamp.rawBody avec votre clé secrète

Vérifier la signature

Vérifiez la signature avant d'utiliser les données. Utilisez le corps brut de la requête tel quel, et non un JSON resérialisé.

Node.js :

import { createHmac, timingSafeEqual } from 'node:crypto'

export function isValidWebhook(rawBody, headers, secret) {
  const timestamp = headers['x-webhook-timestamp']
  const expected = 'sha256=' + createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest('hex')
  const received = String(headers['x-webhook-signature'] || '')
  const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) < 300
  return fresh && received.length === expected.length && timingSafeEqual(Buffer.from(received), Buffer.from(expected))
}

PHP :

$raw = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_WEBHOOK_TIMESTAMP'] ?? '';
$received = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $raw, $secret);

if (!hash_equals($expected, $received) || abs(time() - (int) $timestamp) > 300) {
    http_response_code(401);
    exit;
}
$event = json_decode($raw, true);

Dans Zapier ou Make, vous pouvez vous passer de la vérification de signature tant que l'adresse reste secrète.

Réponse et nouvelles tentatives

  • Répondez avec un statut 2xx dès que vous avez accepté les données. Nous ne lisons pas le contenu de votre réponse.
  • Nous attendons au maximum 5 secondes.
  • En cas de délai dépassé, d'erreur réseau, de statut 429 ou 5xx, nous réessayons après 1 puis après 5 secondes, donc trois fois au maximum.
  • Les autres erreurs (par exemple 404) ne sont pas retentées. Les redirections ne sont pas suivies.
  • Le Tableau de bord affiche le résultat du dernier envoi sous Dernier envoi.

Aucun prospect n'est perdu si votre système ne répond pas : il se trouve toujours d'abord dans le Tableau de bord Prospects.