Oui : cotisation due avec lien de paiement, convocation à l'assemblée avec réponse en un clic, reçu de cotisation en PDF et rappel d'événement, avec l'API.
Astuce
Oui : cotisation due avec lien de paiement, convocation à l'assemblée avec réponse en un clic, reçu de cotisation en PDF et rappel d'événement, avec l'API.
| Besoin | Comment | Recette |
|---|---|---|
| Cotisation due | Template cotisation_due avec un bouton à lien variable vers la page de paiement du membre. | Lien variable dans un bouton · Relance d'impayé |
| Convocation à l'assemblée | Template convocation_assemblee avec deux boutons : présent ou excusé. | Boutons de template · Récupérer le clic |
| Reçu de cotisation en PDF | Template recu_cotisation avec le reçu en PDF en en-tête. | PDF en en-tête |
| Rappel d'événement | Template rappel_evenement pour les inscrits. Une annonce à tous les membres est de la promotion : MARKETING. | Rappel de rendez-vous la veille · Panier abandonné et promo |
| Inscription à un événement | Dans les 24 h : liste des événements, puis confirmation par boutons. | Menu en liste · Oui, non, plus tard |
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 |
|---|---|---|---|
| cotisation_due | UTILITY | Bonjour {{1}}, votre cotisation {{2}} de {{3}} est à régler avant le {{4}}. Vous pouvez la payer en ligne avec le bouton ci-dessous. Si c'est déjà fait, merci d'ignorer ce message. | lien variable : « Payer ma cotisation » |
| convocation_assemblee | UTILITY | Bonjour {{1}}, vous êtes convoqué(e) à l'assemblée générale de l'Association Exemple le {{2}} à {{3}}, à {{4}}. Merci de nous indiquer si vous serez présent(e). | réponse rapide : « Je serai présent(e) », « Je suis excusé(e) » |
| recu_cotisation | UTILITY | Bonjour {{1}}, nous avons bien reçu votre cotisation {{2}} de {{3}} le {{4}}. Votre reçu est joint à ce message en PDF. Merci pour votre soutien. | en-tête PDF |
| rappel_evenement | UTILITY | Bonjour {{1}}, rappel : l'événement {{2}} auquel vous êtes inscrit(e) a lieu le {{3}} à {{4}}, à {{5}}. Nous comptons sur votre présence. | — |
Cotisation due, avec un bouton de paiement dont la fin du lien est propre à chaque membre. 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": "cotisation_due",
"language": "fr",
"category": "UTILITY",
"body_text": "Bonjour {{1}}, votre cotisation {{2}} de {{3}} est à régler avant le {{4}}. Vous pouvez la payer en ligne avec le bouton ci-dessous. Si c'\''est déjà fait, merci d'\''ignorer ce message.",
"example_values": ["Awa", "annuelle", "10 000 F", "30 novembre"],
"buttons": [
{
"kind": "url",
"text": "Payer ma cotisation",
"url": "https://association-exemple.test/cotisation/{{1}}",
"url_example": "https://association-exemple.test/cotisation/ab12cd"
}
]
}'
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": "cotisation_due",
"language": "fr",
"category": "UTILITY",
"body_text": "Bonjour {{1}}, votre cotisation {{2}} de {{3}} est à régler avant le {{4}}. Vous pouvez la payer en ligne avec le bouton ci-dessous. Si c'est déjà fait, merci d'ignorer ce message.",
"example_values": ["Awa", "annuelle", "10 000 F", "30 novembre"],
"buttons": [
{
"kind": "url",
"text": "Payer ma cotisation",
"url": "https://association-exemple.test/cotisation/{{1}}",
"url_example": "https://association-exemple.test/cotisation/ab12cd"
}
]
}),
});
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" => "cotisation_due",
"language" => "fr",
"category" => "UTILITY",
"body_text" => "Bonjour {{1}}, votre cotisation {{2}} de {{3}} est à régler avant le {{4}}. Vous pouvez la payer en ligne avec le bouton ci-dessous. Si c'est déjà fait, merci d'ignorer ce message.",
"example_values" => ["Awa", "annuelle", "10 000 F", "30 novembre"],
"buttons" => [
[
"kind" => "url",
"text" => "Payer ma cotisation",
"url" => "https://association-exemple.test/cotisation/{{1}}",
"url_example" => "https://association-exemple.test/cotisation/ab12cd",
],
],
]),
]);
$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": "cotisation_due",
"language": "fr",
"category": "UTILITY",
"body_text": "Bonjour {{1}}, votre cotisation {{2}} de {{3}} est à régler avant le {{4}}. Vous pouvez la payer en ligne avec le bouton ci-dessous. Si c'est déjà fait, merci d'ignorer ce message.",
"example_values": ["Awa", "annuelle", "10 000 F", "30 novembre"],
"buttons": [
{
"kind": "url",
"text": "Payer ma cotisation",
"url": "https://association-exemple.test/cotisation/{{1}}",
"url_example": "https://association-exemple.test/cotisation/ab12cd",
},
],
},
timeout=15,
)
print(res.status_code, res.json())
Envoi à chaque membre en retard de cotisation, depuis votre registre des adhérents.
curl
curl -X POST "https://wa-api.geskap.com/v1/messages" \
-H "Authorization: Bearer $GESKAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+237690000020",
"template": {
"name": "cotisation_due",
"language": "fr",
"variables": ["Awa", "annuelle", "10 000 F", "30 novembre"],
"button_url_param": "ab12cd"
}
}'
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": "+237690000020",
"template": {
"name": "cotisation_due",
"language": "fr",
"variables": ["Awa", "annuelle", "10 000 F", "30 novembre"],
"button_url_param": "ab12cd"
}
}),
});
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" => "+237690000020",
"template" => [
"name" => "cotisation_due",
"language" => "fr",
"variables" => ["Awa", "annuelle", "10 000 F", "30 novembre"],
"button_url_param" => "ab12cd",
],
]),
]);
$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": "+237690000020",
"template": {
"name": "cotisation_due",
"language": "fr",
"variables": ["Awa", "annuelle", "10 000 F", "30 novembre"],
"button_url_param": "ab12cd",
},
},
timeout=15,
)
print(res.status_code, res.json())
Association : Bonjour Awa, vous êtes convoquée à l'assemblée générale le 22 novembre à 10h00.
[ Je serai présent(e) ] [ Je suis excusé(e) ]
Membre : (touche « Je serai présent(e) »)
Webhook : message.inbound type=text text="Je serai présent(e)" button_id="Je serai présent(e)"
Association : Merci Awa, votre présence est enregistrée. Souhaitez-vous vous inscrire au repas ?
[ Oui ] [ Non ] [ Plus tard ]
Les réponses courtes suivent Oui, non, plus tard ; le clic d'un bouton de template se lit comme dans Boutons de template.
Attention
Piège : Un template porte au plus deux boutons : « Oui / Non / Plus tard » (trois choix) ne s'envoie que dans les 24 h, comme message interactif. Hors 24 h, restez à deux boutons.
Attention
Piège : Un appel aux dons ou une annonce à l'ensemble des membres relève du MARKETING, bloqué par défaut tant que l'administrateur du compte ne l'a pas activé. Une cotisation due ou une convocation de membres inscrits reste UTILITY.
Preuve — vérifié dans le code de l'API : api_schemas.py.