É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.no_show
Déclenché quand un rendez-vous est marqué comme non honoré par le staff (utilisateur absent).
Payload :
{
"id": "evt_jkl012",
"type": "appointment.no_show",
"created": "2026-01-25T15:00:00Z",
"data": {
"object": {
"id": 12345,
"departmentId": 5,
"dateTime": "2026-01-25T14:30:00",
"status": "NO_SHOW",
"name": "Jean Dupont",
"phone": "+224621234567"
}
}
}
Cas d'usage :
- Enregistrer un rendez-vous manqué dans vos statistiques
- Libérer le créneau
- Notifier l'équipe
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
SLOT_AVAILABILITY_CHANGED
Déclenché quand la disponibilité d'un créneau change (création, annulation ou reprogrammation d'un rendez-vous sur ce créneau).
Contrairement aux événements appointment.* ci-dessus, cet événement n'est pas enveloppé dans {id, type, created, data: {object}} : le payload est directement l'objet ci-dessous. Le header X-Moncreneau-Event contient le nom brut de l'événement (SLOT_AVAILABILITY_CHANGED), pas une variante en minuscules avec points.
Payload :
{
"departmentId": 5,
"departmentName": "Service de Passeports",
"slotTime": "2026-01-25T14:30:00",
"available": true,
"remainingSlots": 3,
"maxPerSlot": 5
}
Cas d'usage :
- Rafraîchir un calendrier de disponibilités affiché en temps réel
- Libérer une file d'attente/notification "créneau disponible" côté utilisateur
- Synchroniser un système de réservation tiers
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.no_show':
return handleAppointmentNoShow(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()
});
}