Documentation Index
Fetch the complete documentation index at: https://docs.zavu.dev/llms.txt
Use this file to discover all available pages before exploring further.
Templates
Templates are reusable message formats for sending structured messages across WhatsApp, SMS, Telegram, Instagram, and Email. They are especially important for WhatsApp, which requires template approval for business-initiated conversations.Why Templates?
Templates solve three key problems:- WhatsApp Compliance: Meta requires businesses to use approved templates when initiating conversations outside the 24-hour window
- Consistency: Ensure your transactional messages follow a consistent format
- Multi-Channel Delivery: Define one template with channel-specific bodies, then send it on any channel
Template Structure
A template consists of:Fields
| Field | Description |
|---|---|
name | Unique identifier (lowercase, underscores) |
language | Language code (e.g., “en”, “es”, “pt”) |
body | Message text with variable placeholders |
category | WhatsApp category (required for WhatsApp submission, optional for other channels) |
variables | List of variable names for documentation |
status | Approval status |
Template Variables
Templates support dynamic content through variables. Two formats are supported:Numbered Variables (WhatsApp Native)
Use{{1}}, {{2}}, {{3}} for WhatsApp compatibility:
Named Variables
Use{{name}} for better readability:
{{1}}, {{2}}) at the moment it is submitted to
Meta. The template is therefore approved as positional at Meta, even though
Zavu keeps the readable named body for display.
Templates imported from an existing WhatsApp Business Account keep whatever
format Meta has on file — these can be named ({{customer_name}}) or
positional ({{1}}). Zavu detects the format per template and sends the
correct payload either way.
Whichever format a template uses, you always pass values the same way through
templateVariables — keyed by name ({ "customer_name": "John" }) or by
position ({ "1": "John" }). Zavu maps them to the format Meta expects. See
Sending templates for
details.Contact Variables
Use{{contact.*}} variables to auto-resolve values from the recipient’s contact metadata:
| Variable | Resolved From |
|---|---|
{{contact.first_name}} | Contact metadata first_name |
{{contact.last_name}} | Contact metadata last_name |
{{contact.phone}} | Contact’s phone number |
{{contact.email}} | Contact’s primary email |
{{contact.country}} | Contact’s country code |
{{contact.custom_field}} | Any custom metadata field |
WhatsApp Categories
WhatsApp requires every template to be categorized:| Category | Use Case | Examples |
|---|---|---|
| UTILITY | Transactional messages | Order confirmations, shipping updates, appointment reminders |
| MARKETING | Promotional content | Sales, offers, newsletters |
| AUTHENTICATION | Verification codes | OTPs, login codes, 2FA |
Authentication Templates
Authentication templates are used for sending verification codes (OTPs) to users. These templates have special requirements and behavior.Requirements
How Authentication Templates Work
Unlike regular templates, authentication templates have a pre-defined message format controlled by Meta. When you create an authentication template:- The message body is automatically generated by Meta
- The format is:
{{1}} is your verification code. - You cannot customize the body text
OTP Button Types
Authentication templates support two types of OTP buttons:| Button Type | Description | Use Case |
|---|---|---|
| COPY_CODE | Shows a “Copy Code” button | User manually copies and pastes the code |
| ONE_TAP | Enables Android autofill | Automatic code entry on Android devices |
ONE_TAP Button Requirements
For ONE_TAP buttons (Android autofill), you must provide:| Field | Description |
|---|---|
packageName | Your Android app’s package name |
signatureHash | Your Android app’s signature hash for SMS verification |
Optional Security Features
Authentication templates can include:| Feature | Description |
|---|---|
addSecurityRecommendation | Adds “Do not share this code with anyone” disclaimer |
codeExpirationMinutes | Shows expiration time (1-90 minutes) in footer |
Creating an Authentication Template
The
body field should be empty or omitted for authentication templates. Meta will automatically generate the message body.WhatsApp Approval Workflow
WhatsApp templates must be approved by Meta before use:Template Statuses
| Status | Description |
|---|---|
draft | Created but not submitted |
pending | Submitted, awaiting Meta review |
approved | Ready to use |
rejected | Rejected by Meta (see reason) |
Creating Templates
Via API
Response
Rich Template Components
WhatsApp templates can include rich components:Header
Add a header with text, image, video, or document:Footer
Add a footer text:Buttons
Add interactive buttons:Sending Template Messages
To send a template message, specify the template ID and variables:Templates with Dynamic URL Buttons
If your template has a URL button with a{{1}} placeholder (e.g., https://example.com/orders/{{1}}), pass the value through templateButtonVariables. Keys are the button index (0-based) in the template’s buttons array.
| Field | Keys | What it substitutes |
|---|---|---|
templateVariables | Position in body ("1", "2", …) | Body placeholders |
templateButtonVariables | Button index ("0", "1", "2") | The {{1}} placeholder inside that button’s URL |
Multi-Channel Templates
Templates support channel-specific bodies. When a message is sent, Zavu uses the channel-specific body if available, falling back to the defaultbody.
| Field | Channel | Fallback |
|---|---|---|
body | Default for all channels | - |
smsBody | SMS, SMS One-Way | body |
telegramBody | Telegram | body |
instagramBody | body | |
emailSubject | Email subject | - |
emailHtmlBody | Email HTML body | body (plain text) |
Sending Templates on Different Channels
WhatsApp templates require Meta approval before use. Templates on SMS, Telegram, and Instagram do not require external approval.
Managing Templates
List Templates
Get Template
Delete Template
Best Practices
Keep It Short
WhatsApp has character limits. Keep your templates concise and actionable.
Use UTILITY Category
For transactional messages, always use UTILITY to improve approval chances.
Test Before Launch
Create templates early in development. Approval can take 24-48 hours.
Handle Rejections
If rejected, review Meta’s guidelines, fix the issue, and resubmit.
Common Rejection Reasons
| Reason | Solution |
|---|---|
| Promotional content in UTILITY | Change category to MARKETING or remove promotional language |
| Missing variable examples | Provide clear example values for each variable |
| Inappropriate content | Review WhatsApp commerce policy |
| Poor grammar/spelling | Proofread and fix language errors |
Next Steps
WhatsApp Templates
Deep dive into WhatsApp template features
Senders
Learn how templates work with senders
API Reference
Manage templates programmatically:- List templates — fetch all templates for your project
- Get a template — retrieve template details by ID
- Delete a template — remove an unapproved template
