Skip to main content
WhatsApp requires you to use pre-approved Message Templates whenever you initiate a conversation with a user or message someone outside the 24-hour session window. Templates go through a three-step lifecycle: you create the template in Convo, submit it to Meta for review, and — once it reaches APPROVED status — send it to your contacts with dynamic parameter values substituted at runtime.
Template names must be unique per project and cannot be edited after approval. If you need to change the content, delete the existing template and create a new one with a different name.

Submitting a Template

Send a POST request to create and queue a template for Meta’s review.
Use double-brace placeholders like {{1}}, {{2}} for dynamic values. The sample_text field shows Meta reviewers what realistic content looks like in those slots.

Key template fields


Template with CTA Buttons

Call-to-action buttons let recipients open a URL or dial a phone number directly from the message. Set message_action_type to "CTA" and supply a call_to_action array.
You can include up to two CTA buttons — one URL and one phone number.

Quick Reply Templates

Quick Reply buttons let recipients tap a pre-defined response, making it easy to collect structured feedback or route conversations. Set message_action_type to "QuickReplies" and list up to three reply strings.

Sending an Approved Template

Once a template reaches APPROVED status, send it using the messages endpoint with type: "template". Pass dynamic values as parameters inside the appropriate components array entry.
Parameters are positional — the first object maps to {{1}}, the second to {{2}}, and so on.

Template with Image Header

For templates with a type of IMAGE, include a header component that supplies the image URL at send time.
The same pattern applies to VIDEO and DOCUMENT headers — replace "type": "image" with "type": "video" or "type": "document" and update the nested object key accordingly.
Carousel templates display a horizontal scroll of up to 10 product cards, each with its own image, body text, and buttons. This is ideal for showcasing a range of products or promotions in a single message. Each card is represented as a separate component with type: "carousel_card" and its own card_index. Supply header media and body parameters for each card independently.

Checking Template Status

Poll the template status endpoint to find out whether Meta has approved or rejected a submitted template.

Status values

When a template is rejected, the response includes a rejected_reason field with a short explanation from Meta — for example, "ABUSIVE_CONTENT" or "INVALID_FORMAT". Use this to fix and resubmit under a new name.