Je suis un commerce ou une boutique en ligne

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.

Je suis un commerce ou une boutique en ligne

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.

Ce que vous pouvez automatiser

BesoinCommentRecette
Confirmation de commandeDans 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 suiviTemplate 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 uniqueTemplate lien_paiement_commande : bouton à lien variable plk_… créé par commande.Lien variable dans un bouton
Facture en PDFTemplate 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 satisfactionTemplate 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, suivreDans 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.

Les templates à créer

NomCatégorieTexteBoutons
commande_confirmeeUTILITYBonjour {{1}}, votre commande {{2}} d'un montant de {{3}} est confirmée. Livraison prévue sous {{4}}. Nous vous appelons avant de passer.—
colis_expedieUTILITYBonjour {{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_commandeUTILITYBonjour {{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_pdfUTILITYBonjour {{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_impayeUTILITYBonjour {{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_abandonneMARKETINGBonjour {{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_persoMARKETINGBonjour {{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_satisfactionUTILITYBonjour {{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 »

Exemple complet

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

Conversation

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.