WhatsApp-marketingtemplates
Een marketingtemplate bevat promotionele inhoud, zoals een aanbieding, productaankondiging of coupon. Zorg vóór verzending voor goedgekeurde inhoud, toestemming van de ontvanger en een duidelijke manier om antwoorden en afmeldingen te verwerken.
Voordat je verstuurt
De beheerde catalogus van Bird bevat helemaal geen marketingtemplate, dus een marketingverzending gebruikt altijd een template die je werkruimte zelf heeft gemaakt, op een eigen WhatsApp Business Account:
- Koppel een eigen WhatsApp Business Account en een eigen nummer. Zie Telefoonnummer instellen.
- Maak een template met categorie marketing en dien deze in ter beoordeling. Zie Templaterichtlijnen voor wat wordt goedgekeurd.
- Verstuur vanaf een nummer op hetzelfde WhatsApp Business Account als de template. from is verplicht bij een marketingverzending, en een afzender op een ander account wordt geweigerd 422 E15023 WhatsAppSenderWABAMismatch voordat er iets in rekening wordt gebracht.
Een marketingtemplate versturen
POST /v1/whatsapp/messages met from ingesteld en een template-object met je eigen 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"
}
]
}
]
}
}'- Bodyparameters hebben een naam, net als bij utility. Elke parameter heeft een name, en de volgorde in de array heeft geen betekenis.
- De code van een couponknop is een gewone text-parameter, zoals die op de knop hierboven. Er is geen apart parametertype voor couponcodes.
- Een gif-header neemt een gif-parameter, niet video of image. Marketing is de enige categorie die een geanimeerde-GIF-header accepteert.
- De waarden van een carrousel staan op cards, niet parameters, en een verzending moet precies het aantal kaarten bevatten waarmee de template is goedgekeurd.
Bird stuurt elke marketingverzending automatisch naar Meta's Marketing Messages API; je hoeft je niet aan te melden en er is geen schakelaar per verzending. De onboardingstatus van het zakelijke account bij die API bepaalt Meta's optimalisaties, niet de bezorging zelf, met één uitzondering: een gif-header vereist een onboarded account, anders mislukt de verzending bij WhatsApp. Zie Marketingtemplates voor de accountstatus, wat onboarding ontsluit en waar marketing per land beperkt is.
Opt-outs
Wanneer Bird een geldig marketing-stopevenement van Meta ontvangt, slaat het een ontvangersvoorkeur op voor dat zakelijke account. Deze voorkeur staat los van een onderdrukking van alle berichten. Controleer beide records voordat je verzendt. Een bezorgfout kan binnenkomen vóór het bijbehorende voorkeurevenement; bewaar de keuze van de ontvanger en onderzoek die geschiedenis in plaats van opnieuw te proberen. Zie Afmeldingen voor het vastleggen en uitlezen van deze records.
Kosten
Gebruik het gepubliceerde marketingtarief voor de bestemming en valuta. Bird brengt de uitgaande kosten in rekening vóór verzending; een factureerbare bezorging of leesuitkomst kan Meta's kosten toevoegen. Zie Kosten en facturering en WhatsApp-tarieven.
Waar je op moet letten
- Meta hercategoriseert naar marketing, nooit eruit, en dat is een prijswijziging. Een template die Meta inhoudelijk promotioneel vindt, wordt marketing ongeacht de categorie die je hebt ingediend, en de verzending gaat gewoon door tegen de nieuwe, hogere prijs. Je kunt dit niet weigeren en de categorie niet terugzetten; de oplossing is een nieuwe template.
- 131049 is een bezorgpauze, geen door jou ingestelde limiet, en opnieuw proberen maakt het erger. Meta meldt 131049 zowel voor de algemene pauze in de VS als voor een marketinglimiet per gebruiker, en het eigen advies is om ongeveer een dag te wachten voordat je opnieuw verstuurt. Eerder opnieuw versturen kan het account langer onbereikbaar maken voor die ontvanger en vertekent je eigen bezorgpercentage. Bird meldt de fout als rate_limited.
- 131050 betekent dat de ontvanger "Offers and announcements" heeft uitgeschakeld, en dit mag nooit opnieuw worden geprobeerd. Meta accepteert de verzending en weigert vervolgens deze te bezorgen. De juiste reactie is het pad voor berichtvoorkeuren, niet opnieuw versturen: onderdruk de ontvanger zelf, of wacht tot deze bezorging weer inschakelt, wat Bird te weten komt via hetzelfde voorkeursmechanisme dat de stop heeft gemeld. Zie Opt-outs.
- 132015 en 132016 zijn templatepauzering, geen ontvangersprobleem. 132015 is een pauze vanwege lage kwaliteit; 132016 is permanente uitschakeling na herhaalde pauzes, en de enige oplossing is een nieuwe template met andere inhoud. Controleer de status van de taal zelf in plaats van die van de template, want een gepauzeerde taal stopt onmiddellijk met verzenden.
- Een afzender op het verkeerde WhatsApp Business Account wordt geweigerd voordat er iets in rekening wordt gebracht. from moet op hetzelfde account staan als de template, anders mislukt de verzending 422 E15023 WhatsAppSenderWABAMismatch.
Volgende stappen
- WhatsApp-templates: door de catalogus bladeren en het gedeelde send-by-template-contract
- Marketingtemplates: de Marketing Messages API, onboardingstatus en waar marketing beperkt is
- Opt-outs: suppressies en voorkeuren vastleggen en uitlezen
- Utilitytemplates: orderupdates, afspraakherinneringen en accountmeldingen
Gerelateerde bronnen
Ga verder met de documentatie, gidsen en voorbeelden voor dit onderwerp. De bronnen zijn in het Engels.
Bekijk de gidsConnecting WhatsApp to Bird: from buying a number to a live channelBegrijp het conceptWhat is the 24-hour customer service window on WhatsApp?Gebruik de toolWhatsApp message builderOntdek de mogelijkheidWhatsApp
Probeer de oefening en ontvang een implementatieoverzicht