Aller au contenu

Catalogue des événements

Voici les types d’événements auxquels vous pouvez vous abonner. Chaque événement utilise l’enveloppe standard ; les exemples ci-dessous montrent l’enveloppe complète avec un data.object représentatif.

Gérez les types d’événements inconnus avec souplesse — de nouveaux types peuvent être ajoutés au fil du temps.

ÉvénementQuand il se déclenche
reservation.createdUne réservation est créée — son status est confirmed (auto-confirmée) ou pending (en attente d’approbation).
reservation.confirmedUne réservation en attente est approuvée par la suite. Les réservations auto-confirmées ne déclenchent pas cet événement.
reservation.declinedUne réservation en attente est refusée.
reservation.updatedLes détails d’une réservation changent (taille du groupe, date, notes, …).
reservation.partially_seatedUne partie du groupe, mais pas la totalité, a été installée.
reservation.seatedLe groupe a été installé.
reservation.completedLa réservation est terminée (le groupe est parti).
reservation.cancelledLa réservation est annulée.
reservation.no_showLe groupe ne s’est pas présenté.
guest.createdUne fiche client est créée.
guest.updatedLes détails d’un client changent.
guest.deletedUn client est supprimé (par ex. effacement pour protection des données).
feedback.receivedUn client soumet un avis après une visite.

Le data.object de chaque événement de réservation est une réservation complète, dans la même forme que celle renvoyée par la référence de l’API (en anglais) — l’instantané complet de la ressource, pas un diff.

Seul reservation.updated porte data.previous_attributes ; les autres événements de réservation l’omettent. Lorsqu’il est présent, previous_attributes ne contient que les champs modifiés parmi party_size, service_date, guest_notes, internal_notes et guest (le client précédent sous forme de simple identifiant gst_). Les changements d’horaire sont reflétés dans les starts_at / ends_at de l’instantané, pas dans previous_attributes.

Une réservation est créée (via le widget, le back-office, une intégration, etc.). Cet événement se déclenche pour chaque nouvelle réservation — vérifiez data.object.status pour les distinguer : confirmed signifie qu’elle a été auto-confirmée à la création (sans étape d’approbation ; cas typique du back-office et des réservations par défaut), tandis que pending signifie qu’elle nécessite une approbation et émettra ensuite reservation.confirmed ou reservation.declined.

{
"id": "evt_1K8xQ2m4Vd0pErJ7sN1aZ9bQ",
"object": "event",
"type": "reservation.created",
"created": "2026-06-20T09:04:18Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "reservation",
"id": "resv_8xKQ2m4Vd0pErJ7sN1aZ9bQ",
"status": "pending",
"source": "widget",
"booking_channel": "website_widget",
"party_size": 4,
"actual_party_size": null,
"service_date": "2026-06-27",
"starts_at": "2026-06-27T20:00:00+02:00",
"ends_at": "2026-06-27T22:00:00+02:00",
"guest_notes": "Window table if possible",
"internal_notes": null,
"guest": "gst_3Td9Lp0WqZ",
"tables": [],
"created_at": "2026-06-20T11:04:18+02:00",
"updated_at": "2026-06-20T11:04:18+02:00"
}
}
}

Une réservation en attente est approuvée — le flux d’approbation manuelle. Cet événement se déclenche uniquement pour les réservations créées en pending ; une réservation auto-confirmée n’émet jamais reservation.confirmed — elle arrive une seule fois, en tant que reservation.created avec status: "confirmed".

{
"id": "evt_2M9yR3n5We1qFsK8tO2bA0cR",
"object": "event",
"type": "reservation.confirmed",
"created": "2026-06-20T09:30:00Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "reservation",
"id": "resv_8xKQ2m4Vd0pErJ7sN1aZ9bQ",
"status": "confirmed",
"source": "widget",
"booking_channel": "website_widget",
"party_size": 4,
"actual_party_size": null,
"service_date": "2026-06-27",
"starts_at": "2026-06-27T20:00:00+02:00",
"ends_at": "2026-06-27T22:00:00+02:00",
"guest_notes": "Window table if possible",
"internal_notes": null,
"guest": "gst_3Td9Lp0WqZ",
"tables": [],
"created_at": "2026-06-20T11:04:18+02:00",
"updated_at": "2026-06-20T11:30:00+02:00"
}
}
}

Une réservation en attente est refusée.

{
"id": "evt_3N0zS4o6Xf2rGtL9uP3cB1dS",
"object": "event",
"type": "reservation.declined",
"created": "2026-06-20T09:31:00Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "reservation",
"id": "resv_8xKQ2m4Vd0pErJ7sN1aZ9bQ",
"status": "cancelled",
"source": "widget",
"booking_channel": "website_widget",
"party_size": 4,
"actual_party_size": null,
"service_date": "2026-06-27",
"starts_at": "2026-06-27T20:00:00+02:00",
"ends_at": "2026-06-27T22:00:00+02:00",
"guest_notes": "Window table if possible",
"internal_notes": null,
"guest": "gst_3Td9Lp0WqZ",
"tables": [],
"created_at": "2026-06-20T11:04:18+02:00",
"updated_at": "2026-06-20T11:31:00+02:00"
}
}
}

Les détails d’une réservation changent — par exemple la taille du groupe ou les notes. previous_attributes liste les champs modifiés et leurs valeurs précédentes (ici, la taille du groupe est passée de 4 à 6 et la note du client a changé).

{
"id": "evt_4O1aT5p7Yg3sHuM0vQ4dC2eT",
"object": "event",
"type": "reservation.updated",
"created": "2026-06-25T07:12:55Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "reservation",
"id": "resv_8xKQ2m4Vd0pErJ7sN1aZ9bQ",
"status": "confirmed",
"source": "widget",
"booking_channel": "website_widget",
"party_size": 6,
"actual_party_size": null,
"service_date": "2026-06-27",
"starts_at": "2026-06-27T20:00:00+02:00",
"ends_at": "2026-06-27T22:00:00+02:00",
"guest_notes": "Window table; celebrating an anniversary",
"internal_notes": null,
"guest": "gst_3Td9Lp0WqZ",
"tables": [],
"created_at": "2026-06-20T11:04:18+02:00",
"updated_at": "2026-06-25T09:12:55+02:00"
},
"previous_attributes": {
"party_size": 4,
"guest_notes": "Window table if possible"
}
}
}

Une partie du groupe, mais pas la totalité, a été installée.

{
"id": "evt_5P2bU6q8Zh4tIvN1wR5eD3fU",
"object": "event",
"type": "reservation.partially_seated",
"created": "2026-06-27T18:05:00Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "reservation",
"id": "resv_8xKQ2m4Vd0pErJ7sN1aZ9bQ",
"status": "partially_seated",
"source": "widget",
"booking_channel": "website_widget",
"party_size": 6,
"actual_party_size": 4,
"service_date": "2026-06-27",
"starts_at": "2026-06-27T20:00:00+02:00",
"ends_at": "2026-06-27T22:00:00+02:00",
"guest_notes": "Window table if possible",
"internal_notes": null,
"guest": "gst_3Td9Lp0WqZ",
"tables": [
{
"object": "table",
"id": "tbl_QpZ2",
"name": "12",
"min_capacity": 2,
"max_capacity": 6,
"section": {
"object": "section",
"id": "sec_Lm8",
"name": "Main room",
"area_type": "indoor"
}
}
],
"created_at": "2026-06-20T11:04:18+02:00",
"updated_at": "2026-06-27T20:05:00+02:00"
}
}
}

Le groupe a été installé.

{
"id": "evt_6Q3cV7r9Ai5uJwO2xS6fE4gV",
"object": "event",
"type": "reservation.seated",
"created": "2026-06-27T18:08:00Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "reservation",
"id": "resv_8xKQ2m4Vd0pErJ7sN1aZ9bQ",
"status": "seated",
"source": "widget",
"booking_channel": "website_widget",
"party_size": 6,
"actual_party_size": 6,
"service_date": "2026-06-27",
"starts_at": "2026-06-27T20:00:00+02:00",
"ends_at": "2026-06-27T22:00:00+02:00",
"guest_notes": "Window table if possible",
"internal_notes": null,
"guest": "gst_3Td9Lp0WqZ",
"tables": [
{
"object": "table",
"id": "tbl_QpZ2",
"name": "12",
"min_capacity": 2,
"max_capacity": 6,
"section": {
"object": "section",
"id": "sec_Lm8",
"name": "Main room",
"area_type": "indoor"
}
}
],
"created_at": "2026-06-20T11:04:18+02:00",
"updated_at": "2026-06-27T20:08:00+02:00"
}
}
}

La réservation est terminée — le groupe est parti.

{
"id": "evt_7R4dW8s0Bj6vKxP3yT7gF5hW",
"object": "event",
"type": "reservation.completed",
"created": "2026-06-27T20:15:00Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "reservation",
"id": "resv_8xKQ2m4Vd0pErJ7sN1aZ9bQ",
"status": "completed",
"source": "widget",
"booking_channel": "website_widget",
"party_size": 6,
"actual_party_size": 6,
"service_date": "2026-06-27",
"starts_at": "2026-06-27T20:00:00+02:00",
"ends_at": "2026-06-27T22:00:00+02:00",
"guest_notes": "Window table if possible",
"internal_notes": null,
"guest": "gst_3Td9Lp0WqZ",
"tables": [],
"created_at": "2026-06-20T11:04:18+02:00",
"updated_at": "2026-06-27T22:15:00+02:00"
}
}
}

La réservation est annulée.

{
"id": "evt_8S5eX9t1Ck7wLyQ4zU8hG6iX",
"object": "event",
"type": "reservation.cancelled",
"created": "2026-06-26T16:00:00Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "reservation",
"id": "resv_8xKQ2m4Vd0pErJ7sN1aZ9bQ",
"status": "cancelled",
"source": "widget",
"booking_channel": "website_widget",
"party_size": 6,
"actual_party_size": null,
"service_date": "2026-06-27",
"starts_at": "2026-06-27T20:00:00+02:00",
"ends_at": "2026-06-27T22:00:00+02:00",
"guest_notes": "Window table if possible",
"internal_notes": null,
"guest": "gst_3Td9Lp0WqZ",
"tables": [],
"created_at": "2026-06-20T11:04:18+02:00",
"updated_at": "2026-06-26T18:00:00+02:00"
}
}
}

Le groupe ne s’est pas présenté.

{
"id": "evt_9T6fY0u2Dl8xMzR5aV9iH7jY",
"object": "event",
"type": "reservation.no_show",
"created": "2026-06-27T18:45:00Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "reservation",
"id": "resv_8xKQ2m4Vd0pErJ7sN1aZ9bQ",
"status": "no_show",
"source": "widget",
"booking_channel": "website_widget",
"party_size": 6,
"actual_party_size": null,
"service_date": "2026-06-27",
"starts_at": "2026-06-27T20:00:00+02:00",
"ends_at": "2026-06-27T22:00:00+02:00",
"guest_notes": "Window table if possible",
"internal_notes": null,
"guest": "gst_3Td9Lp0WqZ",
"tables": [],
"created_at": "2026-06-20T11:04:18+02:00",
"updated_at": "2026-06-27T20:45:00+02:00"
}
}
}

Le data.object d’un événement de client est un client complet, dans la même forme que celle renvoyée par la référence de l’API (en anglais). Les événements de client ne portent pas previous_attributes — comparez avec votre propre copie stockée si vous avez besoin d’un diff.

Une fiche client est créée.

{
"id": "evt_A1bC2dE3fG4hI5jK6lM7nO8p",
"object": "event",
"type": "guest.created",
"created": "2026-06-20T09:04:18Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "guest",
"id": "gst_3Td9Lp0WqZ",
"first_name": "Marie",
"last_name": "Dupont",
"email": "[email protected]",
"phone": "+33612345678",
"notes": null,
"blacklisted": false,
"blacklist_reason": null,
"dietary_preferences": [],
"allergies": [],
"birthday": null,
"anniversary": null,
"vip": false,
"language": "fr",
"source": "widget",
"marketing_email_consent": true,
"marketing_email_consent_at": "2026-06-20T11:04:18+02:00",
"marketing_sms_consent": false,
"marketing_sms_consent_at": null,
"visit_count": 0,
"no_show_count": 0,
"cancellation_count": 0,
"first_visit_at": null,
"last_visit_at": null,
"created_at": "2026-06-20T11:04:18+02:00",
"updated_at": "2026-06-20T11:04:18+02:00"
}
}
}

Les détails d’un client changent. (Les seules statistiques de visite ne déclenchent pas cet événement — voir Pagination.)

{
"id": "evt_B2cD3eF4gH5iJ6kL7mN8oP9q",
"object": "event",
"type": "guest.updated",
"created": "2026-06-28T08:00:00Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "guest",
"id": "gst_3Td9Lp0WqZ",
"first_name": "Marie",
"last_name": "Dupont",
"email": "[email protected]",
"phone": "+33612345678",
"notes": null,
"blacklisted": false,
"blacklist_reason": null,
"dietary_preferences": ["vegetarian"],
"allergies": [],
"birthday": null,
"anniversary": null,
"vip": true,
"language": "fr",
"source": "widget",
"marketing_email_consent": true,
"marketing_email_consent_at": "2026-06-20T11:04:18+02:00",
"marketing_sms_consent": false,
"marketing_sms_consent_at": null,
"visit_count": 3,
"no_show_count": 0,
"cancellation_count": 0,
"first_visit_at": "2026-06-21T21:00:00+02:00",
"last_visit_at": "2026-06-27T20:00:00+02:00",
"created_at": "2026-06-20T11:04:18+02:00",
"updated_at": "2026-06-28T10:00:00+02:00"
}
}
}

Un client est supprimé (par exemple, une demande d’effacement pour protection des données). Le data.object est un instantané final du client complet (la même forme que toute autre charge utile de client) ; le client n’est plus récupérable depuis l’API par la suite.

{
"id": "evt_C3dE4fG5hI6jK7lM8nO9pQ0r",
"object": "event",
"type": "guest.deleted",
"created": "2026-06-29T07:00:00Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "guest",
"id": "gst_3Td9Lp0WqZ",
"first_name": "Marie",
"last_name": "Dupont",
"email": "[email protected]",
"phone": "+33612345678",
"notes": null,
"blacklisted": false,
"blacklist_reason": null,
"dietary_preferences": ["vegetarian"],
"allergies": [],
"birthday": null,
"anniversary": null,
"vip": true,
"language": "fr",
"source": "widget",
"marketing_email_consent": true,
"marketing_email_consent_at": "2026-06-20T11:04:18+02:00",
"marketing_sms_consent": false,
"marketing_sms_consent_at": null,
"visit_count": 3,
"no_show_count": 0,
"cancellation_count": 0,
"first_visit_at": "2026-06-21T21:00:00+02:00",
"last_visit_at": "2026-06-27T20:00:00+02:00",
"created_at": "2026-06-20T11:04:18+02:00",
"updated_at": "2026-06-28T10:00:00+02:00"
}
}
}

Un client soumet un avis après une visite. Le data.object est un objet-valeur d’avis intégré (ce n’est pas une ressource d’API récupérable) portant les notes et le commentaire, ainsi que des références sous forme de simples identifiants vers le client et la réservation auxquels il se rapporte.

{
"id": "evt_D4eF5gH6iJ7kL8mN9oP0qR1s",
"object": "event",
"type": "feedback.received",
"created": "2026-06-28T11:20:00Z",
"livemode": true,
"api_version": "2026-06-27",
"data": {
"object": {
"object": "feedback",
"id": "fb_7hn2qp",
"overall_rating": 5,
"food_rating": 5,
"service_rating": 4,
"comment": "Lovely evening, great service.",
"responded_at": "2026-06-28T13:20:00+02:00",
"guest": "gst_3Td9Lp0WqZ",
"reservation": "resv_8xKQ2m4Vd0pErJ7sN1aZ9bQ"
}
}
}

Les champs overall_rating, food_rating, service_rating et comment peuvent chacun valoir null lorsque le client ne les a pas fournis. Utilisez cet événement pour inviter les clients à laisser un avis, acheminer les avis vers la bonne équipe, ou synchroniser les notes dans vos propres outils.