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.
| Situation | Can use free text? | Needs a template? |
|---|---|---|
| User sent a message in the last 24h | ✅ | ❌ (but can use) |
| No active session | ❌ | ✅ |
Creating a template
In the Hub Chatt2.me dashboard:
- Go to Channels → [your WhatsApp channel] → Templates
- Click Create template
- Fill in the information:
| Field | Description |
|---|---|
| Name | Unique identifier in snake_case, no spaces (e.g. confirm_order) |
| Category | MARKETING, UTILITY, or AUTHENTICATION |
| Language | E.g. pt_BR, en_US |
| Body | Text with variables in the format {{1}}, {{2}}... |
| Header | Optional: text, image, video, document, or location |
| Footer | Fixed text at the bottom |
| Buttons | Quick Reply or dynamic URL |
- Click Submit for approval
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 fieldFor 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
| Component | type | Description |
|---|---|---|
| Header | header | Media or text at the top of the message |
| Body | body | Main text with variables |
| Button | button | Dynamic URL or Quick Reply button |
Template categories
| Category | Use |
|---|---|
MARKETING | Promotions, offers, campaigns |
UTILITY | Order confirmations, transactional notifications, reminders |
AUTHENTICATION | OTP, account verification |
MARKETING templates have a cost per initiated conversation (according to Meta's pricing table). UTILITY and AUTHENTICATION have different costs.
Next steps
- Payment Request & Order Status — ORDER_STATUS template in practice
- Interactive Messages — buttons without templates
- WhatsApp — connecting and configuring the channel