Approval Workflow
Submitting for Approval
Via Dashboard
- Go to Senders > Select sender > Templates tab
- Find the template with “Draft” status
- Click the … menu and select Submit for Approval
- The status will change to “Pending”
Via API
Template Status
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:- Go to Senders > Select sender > Webhooks tab
- Add
template.status_changedto your webhook events
Polling
Check template status via API:Syncing from WhatsApp
Two cases the webhook does not cover: a template created outside Zavu (in Meta Business Manager, or by another tool) never appears in Zavu, and a missedtemplate.status_changed webhook leaves a template stuck in pending.
POST /v1/templates/sync reconciles both. It imports Meta templates Zavu does
not have — or links them to an existing template with the same name — and
refreshes the status of the ones it already knows about.
{"senderId": "sender_xyz"} to sync just one. The call waits for Meta, so it
takes a few seconds per account — list your templates right after it returns.
Templates that Meta reports as rejected or disabled are not imported and are
counted in skipped.
Common Rejection Reasons
Content Policy Violations
Formatting Issues
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
UTILITY to MARKETING — and approves it under
the new category. It can also recategorize a template months after approval.
Either way the template keeps working and every send on it is billed at the new
category’s rate.
template.category reports the category Meta currently assigns, not the one
you submitted. A recategorization is delivered as a template.status_changed
webhook carrying data.category, and it fires even when the approval status
did not move — so previousStatus and currentStatus can be identical on an
event that changes what you pay. Branch on category, not only on
currentStatus.
To reconcile templates that were recategorized before you were listening, run
POST /v1/templates/sync; it refreshes the category alongside the status.
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:- Check the rejection reason in the dashboard or API response
- Edit the template to fix the issues
- Resubmit for approval
A template’s content cannot be edited in place. Meta reviews a name plus a
body, so fixing a rejection means creating a new template and submitting that.
Delete the rejected one once the replacement is approved.
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
Good MARKETING Template
Good AUTHENTICATION Template
Rate Limits
Next Steps
Send Template Messages
Learn how to send messages using approved templates
Configure Webhooks
Set up webhooks to receive template status updates
