Événements webhook
Liste complète des événements webhook disponibles avec leurs payloads.
Types d'événements
appointment.created
Déclenché quand un nouveau rendez-vous est créé.
Payload :
{
"id": "evt_abc123",
"type": "appointment.created",
"created": "2026-01-21T14:30:00Z",
"data": {
"object": {
"id": 12345,
"departmentId": 5,
"department": {
"id": 5,
"name": "Service de Passeports",
"organization": {
"id": 1,
"name": "Ministère de l'Intérieur"
}
},
"dateTime": "2026-01-25T14:30:00",
"status": "SCHEDULED",
"name": "Jean Dupont",
"phone": "+224621234567",
"email": "jean.dupont@example.gn",
"qrCode": "https://moncreneau.gn/qr/12345",
"createdAt": "2026-01-21T14:30:00Z",
"creditsUsed": 1
}
}
}
Cas d'usage :
- Envoyer un SMS de confirmation
- Créer une entrée dans votre CRM
- Notifier l'équipe d'un nouveau RDV
appointment.updated
Déclenché quand un rendez-vous est modifié (date, heure, informations).
Payload :
{
"id": "evt_def456",
"type": "appointment.updated",
"created": "2026-01-22T10:15:00Z",
"data": {
"object": {
"id": 12345,
"departmentId": 5,
"dateTime": "2026-01-26T10:00:00",
"status": "SCHEDULED",
"name": "Jean Dupont",
"phone": "+224621234567",
"updatedAt": "2026-01-22T10:15:00Z",
"changes": {
"dateTime": {
"from": "2026-01-25T14:30:00",
"to": "2026-01-26T10:00:00"
}
}
}
}
}
Cas d'usage :
- Envoyer une notification de changement
- Mettre à jour les calendriers
- Logger les modifications
appointment.cancelled
Déclenché quand un rendez-vous est annulé.
Payload :
{
"id": "evt_ghi789",
"type": "appointment.cancelled",
"created": "2026-01-23T16:45:00Z",
"data": {
"object": {
"id": 12345,
"departmentId": 5,
"dateTime": "2026-01-25T14:30:00",
"status": "CANCELLED",
"name": "Jean Dupont",
"phone": "+224621234567",
"cancelledAt": "2026-01-23T16:45:00Z",
"cancelledBy": "user",
"cancelReason": "Empêchement de dernière minute",
"creditsRefunded": 1
}
}
}
Cas d'usage :
- Notifier l'utilisateur de l'annulation
- Libérer le créneau
- Rembourser/créditer l'utilisateur
appointment.validated
Déclenché quand un rendez-vous est validé par le staff (présence confirmée).
Payload :
{
"id": "evt_jkl012",
"type": "appointment.validated",
"created": "2026-01-25T14:35:00Z",
"data": {
"object": {
"id": 12345,
"departmentId": 5,
"dateTime": "2026-01-25T14:30:00",
"status": "VALIDATED",
"name": "Jean Dupont",
"phone": "+224621234567",
"validatedAt": "2026-01-25T14:35:00Z",
"validatedBy": {
"id": 42,
"name": "Agent Martin"
}
}
}
}
Cas d'usage :
- Marquer le rendez-vous comme honoré
- Générer une facture
- Mettre à jour les statistiques
appointment.completed
Déclenché quand un rendez-vous est marqué comme terminé.
Payload :
{
"id": "evt_mno345",
"type": "appointment.completed",
"created": "2026-01-25T15:00:00Z",
"data": {
"object": {
"id": 12345,
"departmentId": 5,
"dateTime": "2026-01-25T14:30:00",
"status": "COMPLETED",
"name": "Jean Dupont",
"phone": "+224621234567",
"completedAt": "2026-01-25T15:00:00Z",
"duration": 30,
"notes": "Document délivré"
}
}
}
Cas d'usage :
- Envoyer un email de satisfaction
- Archiver le dossier
- Demander un avis
Filtrer les événements
Lors de la configuration d'un webhook depuis le dashboard, sélectionnez uniquement les événements nécessaires pour optimiser les performances et réduire le trafic réseau.
Depuis l'interface web :
- Accédez à Paramètres → Webhooks
- Créez ou éditez un webhook
- Cochez uniquement les événements pertinents pour votre application
Gestion des événements
Router par type
function handleWebhook(event) {
switch (event.type) {
case 'appointment.created':
return handleAppointmentCreated(event.data.object);
case 'appointment.cancelled':
return handleAppointmentCancelled(event.data.object);
case 'appointment.validated':
return handleAppointmentValidated(event.data.object);
default:
console.log(`Événement non géré: ${event.type}`);
}
}
Idempotence
Utilisez l'ID d'événement pour éviter les doublons :
async function processWebhook(event) {
// Vérifier si déjà traité
const exists = await db.webhookEvents.findOne({
eventId: event.id
});
if (exists) {
console.log(`Événement ${event.id} déjà traité`);
return;
}
// Traiter l'événement
await processEvent(event);
// Marquer comme traité
await db.webhookEvents.create({
eventId: event.id,
processedAt: new Date()
});
}