Templates are reusable message formats for sending structured messages across WhatsApp, SMS, Telegram, and other channels. WhatsApp requires template approval for business-initiated conversations.
Create Template
const result = await client.templates.create({
name: "order_confirmation",
language: "en",
body: "Hi {{1}}, your order #{{2}} is confirmed!",
whatsappCategory: "UTILITY",
variables: ["customer_name", "order_id"],
});
console.log(result.id); // tpl_xxx
console.log(result.status); // draft, pending, approved, rejected
List Templates
const result = await client.templates.list({});
for (const template of result.items) {
console.log(template.id, template.name, template.status);
}
// With pagination
const result = await client.templates.list({
limit: 50,
cursor: "cursor_xxx",
});
Get Template
const result = await client.templates.get({
templateId: "tpl_abc123",
});
console.log(result.name);
console.log(result.body);
console.log(result.status);
Delete Template
await client.templates.delete({
templateId: "tpl_abc123",
});
Submit Template for Approval
After creating a template, you need to submit it to Meta for approval before you can use it:
const result = await client.templates.submit({
templateId: "tpl_abc123",
senderId: "sender_xyz",
category: "UTILITY", // Optional if already set on template
});
console.log(result.status); // "pending"
The senderId must reference a sender that has a WhatsApp Business Account configured. Templates are submitted to the WABA associated with that sender.
Template Categories
| Category | Use Case |
|---|
UTILITY | Order updates, account alerts, appointment reminders |
MARKETING | Promotions, offers, newsletters |
AUTHENTICATION | OTP codes, verification messages |
Using Templates in Messages
Templates can be sent on any channel by specifying the channel parameter:
// WhatsApp (default if no channel specified)
const result = await client.messages.send({
to: "+14155551234",
messageType: "template",
content: {
templateId: "tpl_abc123",
templateVariables: {
"1": "John",
"2": "ORD-12345",
},
},
});
// Telegram
const telegramResult = await client.messages.send({
to: "123456789",
channel: "telegram",
messageType: "template",
content: {
templateId: "tpl_abc123",
templateVariables: {
"1": "John",
"2": "ORD-12345",
},
},
});
// SMS
const smsResult = await client.messages.send({
to: "+14155551234",
channel: "sms",
messageType: "template",
content: {
templateId: "tpl_abc123",
templateVariables: {
"1": "John",
"2": "ORD-12345",
},
},
});
When a channel-specific body (smsBody, telegramBody) is set on the template, it will be used instead of the default body. Contact variables like {{contact.first_name}} are auto-resolved from the recipient’s contact metadata.