Skip to main content
Version: Latest

WhatsApp Templates

Templates are pre-approved messages by Meta that allow you to initiate conversations outside the 24-hour service window. All proactive sending (notifications, charges, order updates) must use an approved template.

Why do templates exist?

The WhatsApp Business API has an anti-spam protection policy: outside an active session (last 24h of user interaction), you can only send messages using templates previously approved by Meta.

SituationCan use free text?Needs a template?
User sent a message in the last 24h❓ (if you want to)
No active session

Creating a template

In the Hub Chatt2.me dashboard:

  1. Go to Channels → [your WhatsApp channel] → Templates
  2. Click Create template
  3. Fill in the information:
FieldDescription
NameUnique identifier in snake_case, no spaces (e.g. confirm_order)
CategoryMARKETING, UTILITY, or AUTHENTICATION
LanguageE.g. pt_BR, en_US
BodyText with variables in the format {{1}}, {{2}}...
HeaderOptional: text, image, video, document, or location
FooterFixed text at the bottom
ButtonsQuick Reply or dynamic URL
  1. Click Submit for approval
Approval time

Approval usually takes from a few minutes to 24 hours. Marketing templates with promotional content may take longer to review.

Using templates when sending

from field

For WhatsApp sends, from may be the application channel UUID or the configured business phone number for that channel. See Sending messages overview.

Simple template (no parameters)

{
"from": "channel-uuid-wa",
"to": "5511993986082",
"content": {
"template": {
"id": "2bb28b3a-80c6-4a63-a6f3-48701044e514"
}
}
}

Template with body parameters

If the template has variables ({{1}}, {{2}}...), pass the values in the body component:

{
"content": {
"template": {
"id": "0a9d4cbd-d321-41f5-abda-16255c273ee0",
"components": [
{
"type": "body",
"parameters": [
{ "type": "text", "text": "Maria" },
{ "type": "text", "text": "Order #12345" }
]
}
]
}
}
}

Template with image header

{
"content": {
"template": {
"id": "template-uuid",
"components": [
{
"type": "header",
"parameters": [
{
"type": "image",
"image": { "link": "https://example.com/banner.jpg" }
}
]
},
{
"type": "body",
"parameters": [
{ "type": "text", "text": "John" }
]
}
]
}
}
}

Template with video header

{
"content": {
"template": {
"id": "template-uuid",
"components": [
{
"type": "header",
"parameters": [
{
"type": "video",
"video": { "link": "https://example.com/video.mp4" }
}
]
}
]
}
}
}

Template with document header

{
"content": {
"template": {
"id": "template-uuid",
"components": [
{
"type": "header",
"parameters": [
{
"type": "document",
"document": {
"link": "https://example.com/contract.pdf",
"filename": "Contract.pdf"
}
}
]
}
]
}
}
}

Template with location header

{
"content": {
"template": {
"id": "template-uuid",
"components": [
{
"type": "header",
"parameters": [
{
"type": "location",
"location": {
"latitude": -23.5505,
"longitude": -46.6333,
"name": "Our store",
"address": "Av. Paulista, 1000, São Paulo, SP"
}
}
]
}
]
}
}
}

ORDER_STATUS template

A special case: the ORDER_STATUS type template is used to send order status updates outside the 24h window. You pass the template.id together with the orderStatus object:

{
"content": {
"template": {
"id": "b50baa16-555b-4cfc-8fa8-29392a6e43d1"
},
"orderStatus": {
"referenceId": "order-987654344",
"status": "shipped",
"bodyText": "Your order has been shipped. Tracking code: BR123456789BR"
}
}
}

When template.id and orderStatus are sent together, the template must be of the ORDER_STATUS type — the platform builds the component automatically.

See more in Payment Request & Order Status.

Component types

ComponenttypeDescription
HeaderheaderMedia or text at the top of the message
BodybodyMain text with variables
ButtonbuttonDynamic URL or Quick Reply button

Template categories

CategoryUse
MARKETINGPromotions, offers, campaigns
UTILITYOrder confirmations, transactional notifications, reminders
AUTHENTICATIONOTP, account verification
warning

MARKETING templates have a cost per initiated conversation (according to Meta's pricing table). UTILITY and AUTHENTICATION have different costs.

Next steps