Oui, avec un template MARKETING : un code promo propre à chaque client en variable, un lien vers son panier en bouton. L'envoi marketing doit d'abord être activé sur votre compte.
Astuce
Oui, avec un template MARKETING : un code promo propre à chaque client en variable, un lien vers son panier en bouton. L'envoi marketing doit d'abord être activé sur votre compte.
Un client a laissé un panier il y a deux heures. Votre boutique lui envoie un code de réduction à son nom et un bouton qui rouvre son panier.
Vous : Bonjour Awa, votre panier vous attend ! Avec le code AWA-10, -10 % jusqu'à dimanche.
[ Reprendre mon panier ] → https://boutique.exemple.com/panier/c8f2a1
Client : (touche le bouton)
L'envoi des templates MARKETING est désactivé par défaut sur chaque compte. Tant qu'il l'est, l'envoi répond 403 « Catégorie MARKETING non activée pour cette clé ». La création du template, elle, est toujours permise. Pour l'activer, écrivez au support WhatsApp +237 6 56 09 88 31.
curl
curl -X POST "https://wa-api.geskap.com/v1/templates" \
-H "Authorization: Bearer $GESKAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "panier_abandonne",
"language": "fr",
"category": "MARKETING",
"body_text": "Bonjour {{1}}, votre panier vous attend ! Avec le code {{2}}, profitez de -10 % jusqu'\''à {{3}}.",
"example_values": ["Awa", "AWA-10", "dimanche"],
"buttons": [
{
"kind": "url",
"text": "Reprendre mon panier",
"url": "https://boutique.exemple.com/panier/{{1}}",
"url_example": "https://boutique.exemple.com/panier/c8f2a1"
}
]
}'
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": "panier_abandonne",
"language": "fr",
"category": "MARKETING",
"body_text": "Bonjour {{1}}, votre panier vous attend ! Avec le code {{2}}, profitez de -10 % jusqu'à {{3}}.",
"example_values": ["Awa", "AWA-10", "dimanche"],
"buttons": [
{
"kind": "url",
"text": "Reprendre mon panier",
"url": "https://boutique.exemple.com/panier/{{1}}",
"url_example": "https://boutique.exemple.com/panier/c8f2a1"
}
]
}),
});
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" => "panier_abandonne",
"language" => "fr",
"category" => "MARKETING",
"body_text" => "Bonjour {{1}}, votre panier vous attend ! Avec le code {{2}}, profitez de -10 % jusqu'à {{3}}.",
"example_values" => ["Awa", "AWA-10", "dimanche"],
"buttons" => [
[
"kind" => "url",
"text" => "Reprendre mon panier",
"url" => "https://boutique.exemple.com/panier/{{1}}",
"url_example" => "https://boutique.exemple.com/panier/c8f2a1",
],
],
]),
]);
$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": "panier_abandonne",
"language": "fr",
"category": "MARKETING",
"body_text": "Bonjour {{1}}, votre panier vous attend ! Avec le code {{2}}, profitez de -10 % jusqu'à {{3}}.",
"example_values": ["Awa", "AWA-10", "dimanche"],
"buttons": [
{
"kind": "url",
"text": "Reprendre mon panier",
"url": "https://boutique.exemple.com/panier/{{1}}",
"url_example": "https://boutique.exemple.com/panier/c8f2a1",
},
],
},
timeout=15,
)
print(res.status_code, res.json())
curl
curl -X POST "https://wa-api.geskap.com/v1/messages" \
-H "Authorization: Bearer $GESKAP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+237690000002",
"template": {
"name": "panier_abandonne",
"language": "fr",
"variables": ["Awa", "AWA-10", "dimanche"],
"button_url_param": "c8f2a1"
}
}'
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": "+237690000002",
"template": {
"name": "panier_abandonne",
"language": "fr",
"variables": ["Awa", "AWA-10", "dimanche"],
"button_url_param": "c8f2a1"
}
}),
});
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" => "+237690000002",
"template" => [
"name" => "panier_abandonne",
"language" => "fr",
"variables" => ["Awa", "AWA-10", "dimanche"],
"button_url_param" => "c8f2a1",
],
]),
]);
$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": "+237690000002",
"template": {
"name": "panier_abandonne",
"language": "fr",
"variables": ["Awa", "AWA-10", "dimanche"],
"button_url_param": "c8f2a1",
},
},
timeout=15,
)
print(res.status_code, res.json())
Attention
Piège : un client qui n'a pas accepté vos messages commerciaux vous signale, et un numéro trop signalé est limité par Meta. N'envoyez qu'aux clients consentants, et honorez « STOP » : Gérer les désinscriptions.
Attention
Piège : le code promo est une variable du texte, pas du bouton. Le bouton n'a qu'une variable : la fin de son lien (button_url_param).
Coût : frais plateforme de la catégorie marketing (GET /v1/pricing), plus le tarif marketing de Meta, facturé sur votre compte Meta. Voir Coût d'un message.
Preuve — vérifié dans le code de l'API : api_quota.py, api_send.py, api_schemas.py.