Poser une question Oui / Non / Plus tard

Oui — trois boutons Oui, Non, Plus tard sans template dans les 24 h ; le choix revient dans button_id et « Plus tard » est à gérer chez vous (relance planifiée).

Poser une question Oui / Non / Plus tard

Astuce
Oui — trois boutons Oui, Non, Plus tard sans template dans les 24 h ; le choix revient dans button_id et « Plus tard » est à gérer chez vous (relance planifiée).

Scénario

Vous posez une question fermée (« Voulez-vous recevoir votre facture par WhatsApp ? ») et laissez trois issues : oui, non, ou « plus tard ». Le client touche, votre serveur lit button_id et agit.

Oui, c'est possible sans template, avec trois boutons de réponse rapide, si le client vous a écrit dans les dernières 24 h. Hors des 24 h, la question doit être posée par un template à boutons.

Conversation

Vous    : Awa, voulez-vous recevoir vos factures ici, sur WhatsApp ?
          [ Oui ]  [ Non ]  [ Plus tard ]
Client  : (touche « Plus tard »)
Webhook : message.inbound  type=text  text="Plus tard"  button_id="optin:later"
Vous    : D'accord, je vous reposerai la question dans quelques jours.

Code

curl

curl -X POST "https://wa-api.geskap.com/v1/messages/interactive" \
  -H "Authorization: Bearer $GESKAP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "to": "+237690000001",
  "body": "Awa, voulez-vous recevoir vos factures ici, sur WhatsApp ?",
  "buttons": [
    { "id": "optin:yes", "title": "Oui" },
    { "id": "optin:no", "title": "Non" },
    { "id": "optin:later", "title": "Plus tard" }
  ]
}'

Node.js

const res = await fetch("https://wa-api.geskap.com/v1/messages/interactive", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.GESKAP_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "to": "+237690000001",
    "body": "Awa, voulez-vous recevoir vos factures ici, sur WhatsApp ?",
    "buttons": [
      { "id": "optin:yes", "title": "Oui" },
      { "id": "optin:no", "title": "Non" },
      { "id": "optin:later", "title": "Plus tard" }
    ]
  }),
});
console.log(res.status, await res.json());

PHP

$ch = curl_init("https://wa-api.geskap.com/v1/messages/interactive");
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" => "+237690000001",
    "body" => "Awa, voulez-vous recevoir vos factures ici, sur WhatsApp ?",
    "buttons" => [
      ["id" => "optin:yes", "title" => "Oui"],
      ["id" => "optin:no", "title" => "Non"],
      ["id" => "optin:later", "title" => "Plus tard"],
    ],
  ]),
]);
$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/interactive",
    headers={"Authorization": f"Bearer {os.environ['GESKAP_API_KEY']}"},
    json={
        "to": "+237690000001",
        "body": "Awa, voulez-vous recevoir vos factures ici, sur WhatsApp ?",
        "buttons": [
            {"id": "optin:yes", "title": "Oui"},
            {"id": "optin:no", "title": "Non"},
            {"id": "optin:later", "title": "Plus tard"},
        ],
    },
    timeout=15,
)
print(res.status_code, res.json())

Réception :

switch (data.button_id) {
  case "optin:yes":   await db.setOptIn(data.from, true);  break;
  case "optin:no":    await db.setOptIn(data.from, false); break;
  case "optin:later": await db.scheduleAsk(data.from, { inDays: 3 }); break; // votre planificateur
  default:            /* le client a tapé du texte : traitez data.text */ ;
}

Voir Savoir quel bouton ou quelle ligne le client a touché pour recevoir le webhook signé.

Limites exactes

ÉlémentLimite
Boutons1 à 3 : trois suffisent pour Oui / Non / Plus tard
Titre d'un bouton20 caractères
id d'un bouton256 caractères
Texte de la question (body)1 024 caractères
Attention
Piège : « Plus tard » n'est qu'une réponse reçue : l'API ne rappelle rien toute seule. C'est à vous de noter la date et de reposer la question. Si le client n'a pas écrit depuis plus de 24 h à ce moment-là, la relance doit passer par un template, pas par ces boutons (400 « Hors de la fenêtre de 24h »).
Attention
Piège : ne déduisez pas le consentement d'un silence ni du seul libellé du bouton : enregistrez le choix par son id avec la date. Un client peut aussi répondre « stop » en texte : voir Stop / désinscription.

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