Oui : convocation des parents avec réponse en un clic, bulletin ou résultats en PDF, absence signalée et frais de scolarité dus, avec l'API.
Astuce
Oui : convocation des parents avec réponse en un clic, bulletin ou résultats en PDF, absence signalée et frais de scolarité dus, avec l'API.
| Besoin | Comment | Recette |
|---|---|---|
| Convocation des parents | Template convocation_parents avec deux boutons Je serai présent / Je ne peux pas venir. | Boutons de template · Récupérer le clic |
| Résultats et bulletin en PDF | Template bulletin_disponible avec le bulletin du trimestre en PDF en en-tête. | PDF en en-tête |
| Absence signalée | Template absence_signalee ; le parent répond par un bouton, puis explique le motif en texte libre dans les 24 h. | Répondre en texte libre · Boutons de template |
| Frais de scolarité dus | Template frais_scolarite_dus avec un bouton à lien variable vers la page de paiement de la famille ; relance par un autre template. | Lien variable dans un bouton · Relance d'impayé |
| Questions des parents (horaires, calendrier) | FAQ d'abord, IA ensuite, secrétariat en dernier. | FAQ, IA, humain · Reconnaître le client par son numéro |
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.
| Nom | Catégorie | Texte | Boutons |
|---|---|---|---|
| convocation_parents | UTILITY | Bonjour {{1}}, vous êtes convoqué(e) à l'école Exemple le {{2}} à {{3}} au sujet de {{4}}. Merci de confirmer votre présence en touchant un bouton ci-dessous. | réponse rapide : « Je serai présent », « Je ne peux pas venir » |
| bulletin_disponible | UTILITY | Bonjour {{1}}, le bulletin du {{2}} de {{3}} est joint à ce message en PDF. Pour toute question, contactez le secrétariat de l'école. | en-tête PDF |
| absence_signalee | UTILITY | Bonjour {{1}}, {{2}} était absent(e) le {{3}} à {{4}}. Merci de nous indiquer le motif en touchant un bouton ci-dessous. | réponse rapide : « Je justifie l'absence », « C'est une erreur » |
| frais_scolarite_dus | UTILITY | Bonjour {{1}}, la tranche {{2}} des frais de scolarité de {{3}}, d'un montant de {{4}}, est à régler avant le {{5}}. Si le règlement est déjà fait, merci d'ignorer ce message. | lien variable : « Payer en ligne » |
Convocation avec deux boutons de réponse rapide : le parent confirme d'un geste. 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": "convocation_parents",
"language": "fr",
"category": "UTILITY",
"body_text": "Bonjour {{1}}, vous êtes convoqué(e) à l'\''école Exemple le {{2}} à {{3}} au sujet de {{4}}. Merci de confirmer votre présence en touchant un bouton ci-dessous.",
"example_values": ["M. Nkoulou", "6 novembre", "16h00", "le suivi de Paul"],
"buttons": [
{ "kind": "quick_reply", "text": "Je serai présent" },
{ "kind": "quick_reply", "text": "Je ne peux pas venir" }
]
}'
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": "convocation_parents",
"language": "fr",
"category": "UTILITY",
"body_text": "Bonjour {{1}}, vous êtes convoqué(e) à l'école Exemple le {{2}} à {{3}} au sujet de {{4}}. Merci de confirmer votre présence en touchant un bouton ci-dessous.",
"example_values": ["M. Nkoulou", "6 novembre", "16h00", "le suivi de Paul"],
"buttons": [
{ "kind": "quick_reply", "text": "Je serai présent" },
{ "kind": "quick_reply", "text": "Je ne peux pas venir" }
]
}),
});
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" => "convocation_parents",
"language" => "fr",
"category" => "UTILITY",
"body_text" => "Bonjour {{1}}, vous êtes convoqué(e) à l'école Exemple le {{2}} à {{3}} au sujet de {{4}}. Merci de confirmer votre présence en touchant un bouton ci-dessous.",
"example_values" => ["M. Nkoulou", "6 novembre", "16h00", "le suivi de Paul"],
"buttons" => [
["kind" => "quick_reply", "text" => "Je serai présent"],
["kind" => "quick_reply", "text" => "Je ne peux pas venir"],
],
]),
]);
$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": "convocation_parents",
"language": "fr",
"category": "UTILITY",
"body_text": "Bonjour {{1}}, vous êtes convoqué(e) à l'école Exemple le {{2}} à {{3}} au sujet de {{4}}. Merci de confirmer votre présence en touchant un bouton ci-dessous.",
"example_values": ["M. Nkoulou", "6 novembre", "16h00", "le suivi de Paul"],
"buttons": [
{"kind": "quick_reply", "text": "Je serai présent"},
{"kind": "quick_reply", "text": "Je ne peux pas venir"},
],
},
timeout=15,
)
print(res.status_code, res.json())
Envoi à chaque parent concerné, même s'il ne vous a jamais écrit.
curl
curl -X POST "https://wa-api.geskap.com/v1/messages" \
-H "Authorization: Bearer $GESKAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+237690000019",
"template": {
"name": "convocation_parents",
"language": "fr",
"variables": ["M. Nkoulou", "6 novembre", "16h00", "le suivi de Paul"]
}
}'
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": "+237690000019",
"template": {
"name": "convocation_parents",
"language": "fr",
"variables": ["M. Nkoulou", "6 novembre", "16h00", "le suivi de Paul"]
}
}),
});
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" => "+237690000019",
"template" => [
"name" => "convocation_parents",
"language" => "fr",
"variables" => ["M. Nkoulou", "6 novembre", "16h00", "le suivi de Paul"],
],
]),
]);
$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": "+237690000019",
"template": {
"name": "convocation_parents",
"language": "fr",
"variables": ["M. Nkoulou", "6 novembre", "16h00", "le suivi de Paul"],
},
},
timeout=15,
)
print(res.status_code, res.json())
École : Bonjour M. Nkoulou, vous êtes convoqué à l'école Exemple le 6 novembre à 16h00.
[ Je serai présent ] [ Je ne peux pas venir ]
Parent : (touche « Je ne peux pas venir »)
Webhook : message.inbound type=text text="Je ne peux pas venir" button_id="Je ne peux pas venir"
École : Quel autre créneau vous conviendrait ? (liste : 7 nov. 16h00, 8 nov. 10h00, 10 nov. 16h00)
Parent : (choisit « 8 nov. 10h00 »)
École : Convocation déplacée au 8 novembre à 10h00. Merci ! [ Un conseiller ]
Le clic revient comme dans Récupérer le clic ; la liste de créneaux suit Menu en liste ; les réponses courtes se traitent avec Boutons de réponse rapide.
Attention
Piège : Notes, absences et frais concernent un mineur : n'écrivez jamais les notes dans le texte du message et n'envoyez le bulletin qu'au numéro du parent enregistré. Un PDF envoyé reste dans la conversation du téléphone ; pour des données plus sensibles, préférez un lien personnel + PIN.
Preuve — vérifié dans le code de l'API : api_schemas.py.