Oui : confirmation de commande, colis expédié avec lien de suivi, lien de paiement unique, facture PDF, relance d'impayé, panier abandonné, code promo et enquête de satisfaction, avec l'API.
Astuce
Oui : confirmation de commande, colis expédié avec lien de suivi, lien de paiement unique, facture PDF, relance d'impayé, panier abandonné, code promo et enquête de satisfaction, avec l'API.
| Besoin | Comment | Recette |
|---|---|---|
| Confirmation de commande | Dans les 24 h : texte libre ou boutons. Sinon : template commande_confirmee. | Boutons de réponse rapide · Écrire le premier message |
| Colis expédié, avec lien de suivi | Template colis_expedie : un bouton à lien variable dont la fin est le numéro de suivi. | Lien variable dans un bouton · Statut de livraison |
| Lien de paiement unique | Template lien_paiement_commande : bouton à lien variable plk_… créé par commande. | Lien variable dans un bouton |
| Facture en PDF | Template facture_pdf avec la facture en en-tête. | PDF en en-tête |
| Relance d'impayé | Template relance_impaye, ton neutre, deux boutons de réponse. | Relance d'impayé · Boutons de template |
| Panier abandonné | Template panier_abandonne, catégorie MARKETING : bloqué (403) tant que l'administrateur ne l'a pas activé. | Panier abandonné et promo · STOP et désinscription |
| Code promo personnalisé | Template code_promo_perso, catégorie MARKETING, avec une mention de désinscription. | Panier abandonné et promo · STOP et désinscription |
| Enquête de satisfaction | Template enquete_satisfaction avec deux boutons ; la note détaillée suit dans les 24 h. | Enquête de satisfaction · Notation de 1 à 5 |
| Catalogue : voir, commander, suivre | Dans les 24 h : liste des articles, boutons Détails / Commander, puis suivi de commande. | Menu en liste · Boutons de réponse rapide · Récupérer le clic |
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 |
|---|---|---|---|
| commande_confirmee | UTILITY | Bonjour {{1}}, votre commande {{2}} d'un montant de {{3}} est confirmée. Livraison prévue sous {{4}}. Nous vous appelons avant de passer. | — |
| colis_expedie | UTILITY | Bonjour {{1}}, votre commande {{2}} a été expédiée avec {{3}}. Suivez son acheminement en touchant le bouton ci-dessous. | lien variable : « Suivre mon colis » |
| lien_paiement_commande | UTILITY | Bonjour {{1}}, votre commande {{2}} est prête à être réglée : montant {{3}}. Le lien de paiement est personnel et ne fonctionne qu'une seule fois. | lien variable : « Payer ma commande » |
| facture_pdf | UTILITY | Bonjour {{1}}, voici la facture {{2}} de votre commande du {{3}}, d'un montant de {{4}}. Elle est jointe à ce message en PDF. | en-tête PDF |
| relance_impaye | UTILITY | Bonjour {{1}}, sauf erreur de notre part, la facture {{2}} de {{3}}, arrivée à échéance le {{4}}, reste à régler. Si vous avez déjà payé, merci d'ignorer ce message. | réponse rapide : « J'ai déjà payé », « Demander un délai » |
| panier_abandonne | MARKETING | Bonjour {{1}}, vous avez laissé {{2}} dans votre panier. Il est toujours disponible : vous pouvez finaliser votre commande quand vous le souhaitez. | lien variable : « Reprendre mon panier » |
| code_promo_perso | MARKETING | Bonjour {{1}}, merci pour votre fidélité. Voici votre code personnel {{2}} : {{3}} de réduction sur votre prochaine commande, valable jusqu'au {{4}}. | lien fixe : « Voir la boutique » |
| enquete_satisfaction | UTILITY | Bonjour {{1}}, votre commande {{2}} a été livrée le {{3}}. Votre avis nous aide à améliorer notre service : étiez-vous satisfait ? | réponse rapide : « Satisfait », « Pas satisfait » |
Lien de paiement unique : le bouton pointe vers votre page de paiement, la fin du lien (plk_…) change à chaque commande. 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": "lien_paiement_commande",
"language": "fr",
"category": "UTILITY",
"body_text": "Bonjour {{1}}, votre commande {{2}} est prête à être réglée : montant {{3}}. Le lien de paiement est personnel et ne fonctionne qu'\''une seule fois.",
"example_values": ["Awa", "CMD-1042", "18 500 F"],
"buttons": [
{
"kind": "url",
"text": "Payer ma commande",
"url": "https://pay.boutique-exemple.test/p/{{1}}",
"url_example": "https://pay.boutique-exemple.test/p/plk_a1b2c3d4"
}
]
}'
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": "lien_paiement_commande",
"language": "fr",
"category": "UTILITY",
"body_text": "Bonjour {{1}}, votre commande {{2}} est prête à être réglée : montant {{3}}. Le lien de paiement est personnel et ne fonctionne qu'une seule fois.",
"example_values": ["Awa", "CMD-1042", "18 500 F"],
"buttons": [
{
"kind": "url",
"text": "Payer ma commande",
"url": "https://pay.boutique-exemple.test/p/{{1}}",
"url_example": "https://pay.boutique-exemple.test/p/plk_a1b2c3d4"
}
]
}),
});
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" => "lien_paiement_commande",
"language" => "fr",
"category" => "UTILITY",
"body_text" => "Bonjour {{1}}, votre commande {{2}} est prête à être réglée : montant {{3}}. Le lien de paiement est personnel et ne fonctionne qu'une seule fois.",
"example_values" => ["Awa", "CMD-1042", "18 500 F"],
"buttons" => [
[
"kind" => "url",
"text" => "Payer ma commande",
"url" => "https://pay.boutique-exemple.test/p/{{1}}",
"url_example" => "https://pay.boutique-exemple.test/p/plk_a1b2c3d4",
],
],
]),
]);
$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": "lien_paiement_commande",
"language": "fr",
"category": "UTILITY",
"body_text": "Bonjour {{1}}, votre commande {{2}} est prête à être réglée : montant {{3}}. Le lien de paiement est personnel et ne fonctionne qu'une seule fois.",
"example_values": ["Awa", "CMD-1042", "18 500 F"],
"buttons": [
{
"kind": "url",
"text": "Payer ma commande",
"url": "https://pay.boutique-exemple.test/p/{{1}}",
"url_example": "https://pay.boutique-exemple.test/p/plk_a1b2c3d4",
},
],
},
timeout=15,
)
print(res.status_code, res.json())
Envoi pour chaque commande à régler. button_url_param est la seule partie qui varie ; le reste de l'adresse est figé dans le template.
curl
curl -X POST "https://wa-api.geskap.com/v1/messages" \
-H "Authorization: Bearer $GESKAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+237690000017",
"template": {
"name": "lien_paiement_commande",
"language": "fr",
"variables": ["Awa", "CMD-1042", "18 500 F"],
"button_url_param": "plk_a1b2c3d4"
}
}'
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": "+237690000017",
"template": {
"name": "lien_paiement_commande",
"language": "fr",
"variables": ["Awa", "CMD-1042", "18 500 F"],
"button_url_param": "plk_a1b2c3d4"
}
}),
});
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" => "+237690000017",
"template" => [
"name" => "lien_paiement_commande",
"language" => "fr",
"variables" => ["Awa", "CMD-1042", "18 500 F"],
"button_url_param" => "plk_a1b2c3d4",
],
]),
]);
$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": "+237690000017",
"template": {
"name": "lien_paiement_commande",
"language": "fr",
"variables": ["Awa", "CMD-1042", "18 500 F"],
"button_url_param": "plk_a1b2c3d4",
},
},
timeout=15,
)
print(res.status_code, res.json())
Client : Bonjour
Boutique: Bonjour Awa ! Que souhaitez-vous faire ?
[ Voir les articles ] [ Mes commandes ] [ La boutique ]
Client : (touche « Voir les articles »)
Boutique: Nos articles (liste : Sac en cuir · 18 500 F, Sandales · 9 000 F…)
Client : (choisit « Sac en cuir »)
Boutique: Sac en cuir, 18 500 F, en stock. [ Détails ] [ Commander ]
Client : (touche « Commander »)
Webhook : message.inbound type=text text="Commander" button_id="order:42"
Boutique: Commande CMD-1042 : sac en cuir, 18 500 F. Payez ici : https://pay.boutique-exemple.test/p/plk_a1b2c3d4
[ Mes commandes ] [ Voir d'autres ]
La liste vient de Menu en liste, les boutons de Boutons de réponse rapide et order:42 revient avec Récupérer le clic.
Attention
Piège : Panier abandonné et code promo sont MARKETING : l'envoi répond 403 tant que l'administrateur n'a pas activé le MARKETING pour le compte. Ils exigent aussi une mention de désinscription (voir STOP et désinscription). Confirmation, facture et relance restent UTILITY.
Attention
Piège : Pas de carrousel, pas de photo libre, pas de bouton lien dans un message libre : l'API ne les expose pas. Pour montrer un article, mettez son lien dans le texte ou utilisez un template à en-tête image . Un template n'accepte qu'un seul bouton à lien variable.
Preuve — vérifié dans le code de l'API : api_schemas.py ; appliqué par la démo WhatsApp : boutique.