Panier abandonné et code promo personnalisé (messages marketing)

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.

Panier abandonné et code promo personnalisé (messages marketing)

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.

Scénario

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.

Conversation

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)

Activer l'envoi marketing

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.

Code

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.