Aller au contenu principal

É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).

Format de payload différent

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 :

  1. Accédez à Paramètres → Webhooks
  2. Créez ou éditez un webhook
  3. 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()
});
}

Prochaines étapes​