Oui : un template UTILITY à deux boutons de réponse rapide ouvre la conversation ; dès le premier clic, la fenêtre de 24 h est ouverte et vous posez la note de 1 à 5 en menu, sans template.
Astuce
Oui : un template UTILITY à deux boutons de réponse rapide ouvre la conversation ; dès le premier clic, la fenêtre de 24 h est ouverte et vous posez la note de 1 à 5 en menu, sans template.
Le lendemain d'une livraison, vous demandez son avis au client. Il n'a rien écrit depuis plus de 24 h : le premier message est donc un template. Son clic rouvre la fenêtre, et la suite se fait en messages libres.
Vous : (template) Bonjour Awa, votre commande 1042 est arrivée. Êtes-vous satisfaite ?
[ Oui, je donne mon avis ] [ Non merci ]
Client : (touche « Oui, je donne mon avis ») → webhook : button_id = "Oui, je donne mon avis"
Vous : (liste, sans template) Quelle note donnez-vous ? [ Voir les notes ▾ ]
⭐⭐⭐⭐⭐ Excellent · ⭐⭐⭐⭐ Bien · ⭐⭐⭐ Moyen · ⭐⭐ Décevant · ⭐ Mauvais
Client : (choisit « ⭐⭐⭐⭐ Bien ») → webhook : button_id = "note:4"
D'abord le template, à créer une 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": "avis_commande",
"language": "fr",
"category": "UTILITY",
"body_text": "Bonjour {{1}}, votre commande {{2}} est arrivée. Êtes-vous satisfait(e) de votre achat ?",
"example_values": ["Awa", "1042"],
"buttons": [
{ "kind": "quick_reply", "text": "Oui, je donne mon avis" },
{ "kind": "quick_reply", "text": "Non merci" }
]
}'
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": "avis_commande",
"language": "fr",
"category": "UTILITY",
"body_text": "Bonjour {{1}}, votre commande {{2}} est arrivée. Êtes-vous satisfait(e) de votre achat ?",
"example_values": ["Awa", "1042"],
"buttons": [
{ "kind": "quick_reply", "text": "Oui, je donne mon avis" },
{ "kind": "quick_reply", "text": "Non merci" }
]
}),
});
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" => "avis_commande",
"language" => "fr",
"category" => "UTILITY",
"body_text" => "Bonjour {{1}}, votre commande {{2}} est arrivée. Êtes-vous satisfait(e) de votre achat ?",
"example_values" => ["Awa", "1042"],
"buttons" => [
["kind" => "quick_reply", "text" => "Oui, je donne mon avis"],
["kind" => "quick_reply", "text" => "Non merci"],
],
]),
]);
$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": "avis_commande",
"language": "fr",
"category": "UTILITY",
"body_text": "Bonjour {{1}}, votre commande {{2}} est arrivée. Êtes-vous satisfait(e) de votre achat ?",
"example_values": ["Awa", "1042"],
"buttons": [
{"kind": "quick_reply", "text": "Oui, je donne mon avis"},
{"kind": "quick_reply", "text": "Non merci"},
],
},
timeout=15,
)
print(res.status_code, res.json())
Puis, après le clic, la note en menu (dans les 24 h, sans template) :
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": "+237690000002",
"body": "Quelle note donnez-vous à votre commande 1042 ?",
"list": {
"button": "Voir les notes",
"sections": [
{
"rows": [
{ "id": "note:5", "title": "⭐⭐⭐⭐⭐ Excellent" },
{ "id": "note:4", "title": "⭐⭐⭐⭐ Bien" },
{ "id": "note:3", "title": "⭐⭐⭐ Moyen" },
{ "id": "note:2", "title": "⭐⭐ Décevant" },
{ "id": "note:1", "title": "⭐ Mauvais" }
]
}
]
}
}'
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": "+237690000002",
"body": "Quelle note donnez-vous à votre commande 1042 ?",
"list": {
"button": "Voir les notes",
"sections": [
{
"rows": [
{ "id": "note:5", "title": "⭐⭐⭐⭐⭐ Excellent" },
{ "id": "note:4", "title": "⭐⭐⭐⭐ Bien" },
{ "id": "note:3", "title": "⭐⭐⭐ Moyen" },
{ "id": "note:2", "title": "⭐⭐ Décevant" },
{ "id": "note:1", "title": "⭐ Mauvais" }
]
}
]
}
}),
});
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" => "+237690000002",
"body" => "Quelle note donnez-vous à votre commande 1042 ?",
"list" => [
"button" => "Voir les notes",
"sections" => [
[
"rows" => [
["id" => "note:5", "title" => "⭐⭐⭐⭐⭐ Excellent"],
["id" => "note:4", "title" => "⭐⭐⭐⭐ Bien"],
["id" => "note:3", "title" => "⭐⭐⭐ Moyen"],
["id" => "note:2", "title" => "⭐⭐ Décevant"],
["id" => "note:1", "title" => "⭐ Mauvais"],
],
],
],
],
]),
]);
$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": "+237690000002",
"body": "Quelle note donnez-vous à votre commande 1042 ?",
"list": {
"button": "Voir les notes",
"sections": [
{
"rows": [
{"id": "note:5", "title": "⭐⭐⭐⭐⭐ Excellent"},
{"id": "note:4", "title": "⭐⭐⭐⭐ Bien"},
{"id": "note:3", "title": "⭐⭐⭐ Moyen"},
{"id": "note:2", "title": "⭐⭐ Décevant"},
{"id": "note:1", "title": "⭐ Mauvais"},
],
},
],
},
},
timeout=15,
)
print(res.status_code, res.json())
Le clic sur un bouton de template arrive comme les autres : type: "text", text et button_id = le libellé du bouton. Voir Savoir quel bouton le client a touché et Notation de 1 à 5.
Attention
Piège : le template n'a que deux boutons au plus : n'y mettez pas les cinq notes. Les cinq notes passent en liste après le premier clic, quand la fenêtre de 24 h est ouverte.
Preuve — vérifié dans le code de l'API : templates.py, meta_webhooks.py, api_schemas.py.