Je suis une école

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.

Je suis une école

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.

Ce que vous pouvez automatiser

BesoinCommentRecette
Convocation des parentsTemplate 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 PDFTemplate bulletin_disponible avec le bulletin du trimestre en PDF en en-tête.PDF en en-tête
Absence signaléeTemplate 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é dusTemplate 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.

Les templates à créer

NomCatégorieTexteBoutons
convocation_parentsUTILITYBonjour {{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_disponibleUTILITYBonjour {{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_signaleeUTILITYBonjour {{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_dusUTILITYBonjour {{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 »

Exemple complet

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())

Conversation

É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.