Je suis un hôtel

Oui : réservation confirmée, chambre prête, room service par liste avec numéro de chambre et « commande en route », avec l'API.

Je suis un hôtel

Astuce
Oui : réservation confirmée, chambre prête, room service par liste avec numéro de chambre et « commande en route », avec l'API.

Ce que vous pouvez automatiser

BesoinCommentRecette
Réservation confirméeHors 24 h (réservation faite par téléphone ou sur place) : template reservation_confirmee. Dans les 24 h : texte libre.Écrire le premier message · Répondre en texte libre
Chambre prêteTemplate chambre_prete avec deux boutons (Room service, Infos pratiques) : le client arrive souvent plus de 24 h après sa réservation.Boutons de template · Notification d'arrivée sur place
Room service : plats et numéro de chambreDans les 24 h : liste des plats (10 lignes), puis question du numéro de chambre en texte libre, puis confirmation.Menu en liste · Formulaire pas à pas · Répondre en texte libre
Commande en routeDans les 24 h, texte libre. Si la commande a été prise par téléphone : template commande_en_route.Répondre en texte libre · Statut de livraison
Questions pratiques (Wi-Fi, horaires, piscine)FAQ d'abord, IA ensuite, réception en dernier recours.FAQ, IA, humain

Hors des 24 h qui suivent le dernier message du client, seul un template approuvé par Meta peut partir. Dans les 24 h, vous composez librement : boutons (3 de 20 caractères au plus), liste (10 lignes de 24 caractères au plus) ou texte libre.

Les templates à créer

NomCatégorieTexteBoutons
reservation_confirmeeUTILITYBonjour {{1}}, votre réservation {{2}} à l'Hôtel Exemple est confirmée : chambre {{3}}, arrivée le {{4}} dès 14h. Total : {{5}}, payable sur place.réponse rapide : « Infos pratiques »
chambre_preteUTILITYBonjour {{1}}, votre chambre n° {{2}} est prête. Présentez-vous à la réception avec votre pièce d'identité. Nous vous souhaitons un agréable séjour.réponse rapide : « Room service », « Infos pratiques »
commande_en_routeUTILITYBonjour, votre commande {{1}} est en route vers la chambre {{2}}. Bon appétit !—

Exemple complet

Notification « chambre prête », avec deux boutons de réponse rapide. Création, une seule fois.

curl

curl -X POST "https://wa-api.geskap.com/v1/templates" \
  -H "Authorization: Bearer $GESKAP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "chambre_prete",
  "language": "fr",
  "category": "UTILITY",
  "body_text": "Bonjour {{1}}, votre chambre n° {{2}} est prête. Présentez-vous à la réception avec votre pièce d'\''identité. Nous vous souhaitons un agréable séjour.",
  "example_values": ["Awa", "204"],
  "buttons": [
    { "kind": "quick_reply", "text": "Room service" },
    { "kind": "quick_reply", "text": "Infos pratiques" }
  ]
}'

Node.js

const res = await fetch("https://wa-api.geskap.com/v1/templates", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.GESKAP_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "name": "chambre_prete",
    "language": "fr",
    "category": "UTILITY",
    "body_text": "Bonjour {{1}}, votre chambre n° {{2}} est prête. Présentez-vous à la réception avec votre pièce d'identité. Nous vous souhaitons un agréable séjour.",
    "example_values": ["Awa", "204"],
    "buttons": [
      { "kind": "quick_reply", "text": "Room service" },
      { "kind": "quick_reply", "text": "Infos pratiques" }
    ]
  }),
});
console.log(res.status, await res.json());

PHP

$ch = curl_init("https://wa-api.geskap.com/v1/templates");
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer " . getenv("GESKAP_API_KEY"),
    "Content-Type: application/json",
  ],
  CURLOPT_POSTFIELDS => json_encode([
    "name" => "chambre_prete",
    "language" => "fr",
    "category" => "UTILITY",
    "body_text" => "Bonjour {{1}}, votre chambre n° {{2}} est prête. Présentez-vous à la réception avec votre pièce d'identité. Nous vous souhaitons un agréable séjour.",
    "example_values" => ["Awa", "204"],
    "buttons" => [
      ["kind" => "quick_reply", "text" => "Room service"],
      ["kind" => "quick_reply", "text" => "Infos pratiques"],
    ],
  ]),
]);
$res = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), " ", $res;

Python

import os, requests

res = requests.request(
    "POST",
    "https://wa-api.geskap.com/v1/templates",
    headers={"Authorization": f"Bearer {os.environ['GESKAP_API_KEY']}"},
    json={
        "name": "chambre_prete",
        "language": "fr",
        "category": "UTILITY",
        "body_text": "Bonjour {{1}}, votre chambre n° {{2}} est prête. Présentez-vous à la réception avec votre pièce d'identité. Nous vous souhaitons un agréable séjour.",
        "example_values": ["Awa", "204"],
        "buttons": [
            {"kind": "quick_reply", "text": "Room service"},
            {"kind": "quick_reply", "text": "Infos pratiques"},
        ],
    },
    timeout=15,
)
print(res.status_code, res.json())

Envoi quand la réception libère la chambre, même si le client ne vous a pas écrit depuis des jours.

curl

curl -X POST "https://wa-api.geskap.com/v1/messages" \
  -H "Authorization: Bearer $GESKAP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "to": "+237690000012",
  "template": {
    "name": "chambre_prete",
    "language": "fr",
    "variables": ["Awa", "204"]
  }
}'

Node.js

const res = await fetch("https://wa-api.geskap.com/v1/messages", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.GESKAP_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "to": "+237690000012",
    "template": {
      "name": "chambre_prete",
      "language": "fr",
      "variables": ["Awa", "204"]
    }
  }),
});
console.log(res.status, await res.json());

PHP

$ch = curl_init("https://wa-api.geskap.com/v1/messages");
curl_setopt_array($ch, [
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer " . getenv("GESKAP_API_KEY"),
    "Content-Type: application/json",
  ],
  CURLOPT_POSTFIELDS => json_encode([
    "to" => "+237690000012",
    "template" => [
      "name" => "chambre_prete",
      "language" => "fr",
      "variables" => ["Awa", "204"],
    ],
  ]),
]);
$res = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), " ", $res;

Python

import os, requests

res = requests.request(
    "POST",
    "https://wa-api.geskap.com/v1/messages",
    headers={"Authorization": f"Bearer {os.environ['GESKAP_API_KEY']}"},
    json={
        "to": "+237690000012",
        "template": {
            "name": "chambre_prete",
            "language": "fr",
            "variables": ["Awa", "204"],
        },
    },
    timeout=15,
)
print(res.status_code, res.json())

Conversation

Client  : Bonjour, je voudrais commander à manger
Hôtel   : Quel plat souhaitez-vous ?  [ Voir le menu ]  (liste : Poulet DG, Ndolé, Club sandwich…)
Client  : (choisit « Poulet DG »)
Webhook : message.inbound  type=text  text="Poulet DG"  button_id="plat:poulet_dg"
Hôtel   : Quel est votre numéro de chambre ?
Client  : 204
Hôtel   : Commande CMD-0031 : Poulet DG, chambre 204. La cuisine prépare votre commande.
          [ Menu ]

Voir Menu en liste pour la liste, Boutons de réponse rapide pour la confirmation et Récupérer le clic pour lire le plat choisi.

Attention
Piège : Le client qui commande vous a écrit : dans les 24 h, aucun template. Mais « chambre prête » arrive presque toujours après la fenêtre : prévoyez le template, sinon l'envoi répond 400.
Attention
Piège : Une liste tient 10 lignes de 24 caractères : mettez le prix dans la description de la ligne, pas dans son titre, et découpez une carte de plus de 10 plats en plusieurs listes (entrées, plats, boissons).

Preuve — vérifié dans le code de l'API : api_schemas.py ; appliqué par la démo WhatsApp : hotel.