Templates marketing WhatsApp
Un modèle marketing contient du contenu promotionnel, comme une offre, une annonce de produit ou un coupon. Préparez un contenu approuvé, le consentement du destinataire et un moyen clair de gérer les réponses et les désinscriptions avant d'envoyer.
Avant d'envoyer
Le catalogue géré de Bird ne contient aucun template marketing, donc un envoi marketing utilise toujours un template créé par votre espace de travail, sur un WhatsApp Business Account qui vous appartient :
- Connectez un WhatsApp Business Account et un numéro qui vous appartient. Consultez Configuration du numéro de téléphone.
- Créez un template avec la catégorie marketing et soumettez-le pour examen. Consultez les Directives sur les templates pour savoir ce qui est accepté.
- Envoyez depuis un numéro rattaché au même WhatsApp Business Account que le template. from est obligatoire pour un envoi marketing, et un expéditeur sur un compte différent est refusé 422 E15023 WhatsAppSenderWABAMismatch avant toute facturation.
Envoyer un template marketing
POST /v1/whatsapp/messages avec from défini et un objet template désignant votre propre slug :
const msg = await bird.whatsapp.send({
to: "+16505551234",
from: "+13125550101",
template: {
slug: "summer_sale",
language: "en",
components: [
{
type: "header",
parameters: [{ type: "image", url: "https://cdn.example.com/banners/summer.png" }],
},
{ type: "body", parameters: [{ type: "text", name: "first_name", text: "Pablo" }] },
{ type: "button", parameters: [{ type: "text", text: "SUMMER25" }] },
],
},
});
console.log(msg.id, msg.status);msg = client.whatsapp.send(
to="+16505551234",
from_="+13125550101",
template="summer_sale",
language="en",
components=[
{
"type": "header",
"parameters": [{"type": "image", "url": "https://cdn.example.com/banners/summer.png"}],
},
{"type": "body", "parameters": [{"type": "text", "name": "first_name", "text": "Pablo"}]},
{"type": "button", "parameters": [{"type": "text", "text": "SUMMER25"}]},
],
)
print(msg.id, msg.status)package main
import (
"context"
"fmt"
"log"
"os"
bird "github.com/messagebird/bird-sdk-go"
"github.com/messagebird/bird-sdk-go/option"
)
func main() {
client, err := bird.NewClient(option.WithAPIKey(os.Getenv("BIRD_API_KEY")))
if err != nil {
log.Fatal(err)
}
name := "Pablo"
nameKey := "first_name"
banner := "https://cdn.example.com/banners/summer.png"
coupon := "SUMMER25"
components := []bird.WhatsAppMessageTemplateComponent{
{Type: "header", Parameters: &[]bird.WhatsAppMessageTemplateComponentParameter{{Type: "image", Url: &banner}}},
{Type: "body", Parameters: &[]bird.WhatsAppMessageTemplateComponentParameter{{Type: "text", Name: &nameKey, Text: &name}}},
{Type: "button", Parameters: &[]bird.WhatsAppMessageTemplateComponentParameter{{Type: "text", Text: &coupon}}},
}
msg, err := client.Whatsapp.Send(context.Background(), bird.WhatsappSendParams{
To: "+16505551234",
From: "+13125550101",
Template: "summer_sale",
Language: "en",
Components: components,
})
if err != nil {
log.Fatal(err)
}
fmt.Println(msg.Id, *msg.Status)
}$components = [
(new WhatsAppMessageTemplateComponent())
->setType('header')
->setParameters([
(new WhatsAppMessageTemplateComponentParameter())->setType('image')->setUrl('https://cdn.example.com/banners/summer.png'),
]),
(new WhatsAppMessageTemplateComponent())
->setType('body')
->setParameters([
(new WhatsAppMessageTemplateComponentParameter())->setType('text')->setName('first_name')->setText('Pablo'),
]),
(new WhatsAppMessageTemplateComponent())
->setType('button')
->setParameters([
(new WhatsAppMessageTemplateComponentParameter())->setType('text')->setText('SUMMER25'),
]),
];
$message = $bird->whatsapp->send(
to: '+16505551234',
from: '+13125550101',
template: 'summer_sale',
language: 'en',
components: $components,
);
echo $message->getId(), ' ', $message->getStatus();bird whatsapp send \
--from +13125550101 \
--components '[{"parameters":[{"type":"image","url":"https://cdn.example.com/banners/summer.png"}],"type":"header"},{"parameters":[{"name":"first_name","text":"Pablo","type":"text"}],"type":"body"},{"parameters":[{"text":"SUMMER25","type":"text"}],"type":"button"}]' \
--language en \
--template summer_sale \
--to +16505551234{
"name": "whatsapp_send",
"arguments": {
"from": "+13125550101",
"template": {
"components": [
{
"parameters": [
{
"type": "image",
"url": "https://cdn.example.com/banners/summer.png"
}
],
"type": "header"
},
{
"parameters": [
{
"name": "first_name",
"text": "Pablo",
"type": "text"
}
],
"type": "body"
},
{
"parameters": [
{
"text": "SUMMER25",
"type": "text"
}
],
"type": "button"
}
],
"language": "en",
"slug": "summer_sale"
},
"to": "+16505551234"
}
}curl -X POST "https://us1.platform.bird.com/v1/whatsapp/messages" \
-H "Authorization: Bearer $BIRD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+16505551234",
"from": "+13125550101",
"template": {
"slug": "summer_sale",
"language": "en",
"components": [
{
"type": "header",
"parameters": [
{
"type": "image",
"url": "https://cdn.example.com/banners/summer.png"
}
]
},
{
"type": "body",
"parameters": [
{
"type": "text",
"name": "first_name",
"text": "Pablo"
}
]
},
{
"type": "button",
"parameters": [
{
"type": "text",
"text": "SUMMER25"
}
]
}
]
}
}'- Les paramètres de corps sont nommés, comme pour les templates utilitaires. Chaque paramètre porte un name, et l'ordre dans le tableau n'a aucune signification.
- Le code d'un bouton coupon est un paramètre text ordinaire, comme celui du bouton ci-dessus. Il n'existe pas de type de paramètre distinct pour les codes de coupon.
- Un en-tête gif prend un paramètre gif, pas video ni image. Marketing est la seule catégorie qui accepte un en-tête GIF animé.
- Les valeurs d'un carrousel vont sur cards, pas sur parameters, et un envoi doit fournir exactement le nombre de cartes avec lequel le template a été approuvé.
Bird achemine automatiquement chaque envoi marketing vers l'API Marketing Messages de Meta ; vous n'avez pas à activer cette option et il n'y a pas de commutateur par envoi. Le statut d'intégration du compte professionnel avec cette API conditionne les optimisations de Meta plutôt que la livraison elle-même, à une exception près : un en-tête gif nécessite un compte intégré, sinon l'envoi échoue auprès de WhatsApp. Consultez Templates marketing pour l'état du compte, ce que l'intégration débloque et les pays où le marketing est restreint.
Désinscriptions
Lorsque Bird reçoit un événement d'arrêt marketing valide de Meta, il enregistre une préférence du destinataire pour ce compte professionnel. Cette préférence est distincte d'un blocage de tous les envois. Vérifiez les deux enregistrements avant d'envoyer. Un échec de remise peut arriver avant l'événement de préférence correspondant ; préservez le choix du destinataire et examinez cet historique plutôt que de réessayer. Consultez Désinscriptions pour l'enregistrement et la lecture de ces données.
Coût
Utilisez le tarif marketing publié pour la destination et la devise. Bird facture ses frais sortants avant la soumission ; un événement facturable de remise ou de lecture peut ajouter les frais de Meta. Consultez Coûts et facturation et Tarification WhatsApp.
Points de vigilance
- Meta recatégorise vers marketing, jamais en dehors, et cela implique un changement de prix. Un template que Meta juge promotionnel sur le fond devient marketing quelle que soit la catégorie soumise, et l'envoi continue au nouveau tarif, plus élevé. Il n'est pas possible de refuser cette recatégorisation ni de rétablir la catégorie précédente ; la seule solution est un nouveau template.
- 131049 est une pause de livraison, pas une limitation du débit que vous avez configurée, et réessayer aggrave la situation. Meta signale 131049 aussi bien pour sa pause générale aux États-Unis que pour un plafond marketing par utilisateur, et sa propre recommandation est d'attendre environ un jour avant de renvoyer. Renvoyer plus tôt peut rendre le compte indisponible pour ce destinataire plus longtemps et fausse votre propre taux de livraison. Bird signale l'échec comme rate_limited.
- 131050 signifie que le destinataire a désactivé "Offers and announcements", et l'envoi ne doit jamais être réessayé. Meta accepte l'envoi puis refuse de le livrer. La bonne réponse est le parcours des préférences de messagerie, pas un renvoi : bloquez vous-même les envois à ce destinataire, ou attendez qu'il réactive la livraison, ce que Bird apprend via le même mécanisme de préférences qui a signalé l'arrêt. Consultez Désinscriptions.
- 132015 et 132016 concernent la mise en pause du template, pas un problème de destinataire. 132015 est une pause pour qualité insuffisante ; 132016 est une désactivation permanente après des pauses répétées, et la seule solution est un nouveau template avec un contenu différent. Vérifiez le statut de la langue plutôt que celui du template, car une langue mise en pause arrête immédiatement les envois.
- Un expéditeur sur le mauvais WhatsApp Business Account est refusé avant toute facturation. from doit être rattaché au même compte que le template, sinon l'envoi échoue 422 E15023 WhatsAppSenderWABAMismatch.
Étapes suivantes
- Templates WhatsApp : parcourir le catalogue et le contrat partagé d'envoi par template
- Templates marketing : l'API Marketing Messages, le statut d'intégration et les restrictions géographiques du marketing
- Désinscriptions : enregistrer et consulter les suppressions et les préférences
- Templates utilitaires : mises à jour de commandes, rappels de rendez-vous et notifications de compte
Ressources associées
Poursuivez avec la documentation, les guides et les exemples sur ce sujet. Les ressources sont en anglais.
Regarder le guideConnecting WhatsApp to Bird: from buying a number to a live channelComprendre le conceptWhat is the 24-hour customer service window on WhatsApp?Utiliser l'outilWhatsApp message builderExplorer la fonctionnalitéWhatsApp
Essayez la pratique et obtenez un guide d'implémentation