Skip to main content
All WhatsApp templates must be approved by Meta before they can be used to send messages. This guide explains the approval process, common rejection reasons, and how to track template status.

Approval Workflow

Submitting for Approval

Via Dashboard

  1. Go to Senders > Select sender > Templates tab
  2. Find the template with “Draft” status
  3. Click the menu and select Submit for Approval
  4. The status will change to “Pending”

Via API

// Submit a draft template for approval
await zavu.templates.submit({
  templateId: 'tmpl_abc123',
});

Template Status

StatusDescriptionCan Send?
draftNot yet submitted to MetaNo
pendingSubmitted, awaiting Meta reviewNo
approvedApproved by MetaYes
rejectedRejected by MetaNo

Approval Timeline

  • Typical review time: 24-48 hours
  • Complex templates: Up to 72 hours
  • Peak periods: May take longer during high volume
Meta reviews templates for compliance with their Business Messaging Policy. Ensure your templates follow these guidelines before submitting.

Tracking Status Changes

Webhooks

Configure webhooks to receive real-time notifications when template status changes:
{
  "id": "evt_1702000000000_abc123",
  "type": "template.status_changed",
  "timestamp": 1702000000000,
  "senderId": "sender_xyz",
  "projectId": "proj_abc",
  "data": {
    "templateId": "tmpl_123",
    "name": "order_confirmation",
    "previousStatus": "pending",
    "currentStatus": "approved",
    "rejectionReason": null
  }
}
Enable the webhook event:
  1. Go to Senders > Select sender > Webhooks tab
  2. Add template.status_changed to your webhook events

Polling

Check template status via API:
const template = await zavu.templates.get({
  templateId: 'tmpl_abc123'
});

console.log('Status:', template.whatsappStatus);
if (template.rejectionReason) {
  console.log('Rejection reason:', template.rejectionReason);
}

Common Rejection Reasons

Content Policy Violations

Templates that violate Meta’s policies will be rejected. Common violations include:
  • Misleading content
  • Prohibited products/services
  • Spammy language
  • Missing opt-out information for marketing

Formatting Issues

IssueSolution
Invalid variable formatUse {{1}}, {{2}} format
Too many variablesLimit to 10 variables per component
Variable in wrong positionVariables can’t be at start of template
Button URL without variableDynamic URLs must include variables

Category Mismatch

Templates may be rejected if the category doesn’t match the content:
  • UTILITY templates shouldn’t contain promotional content
  • MARKETING templates need clear opt-out language
  • AUTHENTICATION templates should only contain OTP/verification content

Language Issues

  • Template body must match the declared language
  • Special characters may cause issues in some languages
  • Emojis should be used sparingly

Fixing Rejected Templates

When a template is rejected:
  1. Check the rejection reason in the dashboard or API response
  2. Edit the template to fix the issues
  3. Resubmit for approval
// Update a rejected template
await zavu.templates.update({
  templateId: 'tmpl_abc123',
  body: 'Updated message content that addresses the rejection reason'
});

// Resubmit for approval
await zavu.templates.submit({
  templateId: 'tmpl_abc123',
});
Editing an approved template will reset its status to “draft” and require re-approval.

Best Practices for Approval

Be Clear and Specific

Vague templates are more likely to be rejected. Be specific about the purpose.

Match Category to Content

Ensure your template category accurately reflects the message type.

Avoid Promotional Language in UTILITY

UTILITY templates should be purely transactional without marketing content.

Include Opt-Out for MARKETING

Marketing templates should include clear unsubscribe instructions.

Template Examples

Good UTILITY Template

Hi {{1}}, your order #{{2}} has shipped!

Tracking number: {{3}}
Estimated delivery: {{4}}

Track your package: https://example.com/track/{{2}}

Good MARKETING Template

Hi {{1}}!

We have a special offer just for you: {{2}}% off your next purchase!

Use code: {{3}}
Valid until: {{4}}

Reply STOP to unsubscribe.

Good AUTHENTICATION Template

Your verification code is {{1}}.

This code expires in 10 minutes. Do not share this code with anyone.

Rate Limits

ActionLimit
Submit templates100/minute
Templates per WABA250 total

Next Steps