Skip to main content

Template Components: Headers, Body, Footer, and Buttons

A WhatsApp template is built from four components — header, body, footer, and buttons — each with its own rules and content options.

Written by Tarek Khalil

Important: Octopods’ built-in template editor creates body-only templates (with a name, body text, language, and category). Templates that include headers, footers, or buttons must be authored in Meta Business Manager‘s template editor, then synced into Octopods. This article describes all the components Meta supports so you can recognize them when they appear in synced templates and when you create them on Meta’s side.

Body (required)

The body is the only required component and carries the main message text.

  • Character limit: 4,096 characters.

  • Variables: use #{{1}}, #{{2}}, #{{3}}, etc. for dynamic content. Variables must be numbered sequentially starting at 1 and must have matching example values provided at template creation.

  • Formatting: WhatsApp supports inline bold (*text*), italic (_text_), strikethrough (~text~), and monospace (``` around text) in the body. Avoid overusing formatting — plain text reads best in most cases.

Header (optional)

Headers sit above the body and come in four formats. Each template can have at most one header.

  • Text header — a short piece of text (typically under 60 characters), optionally including a single variable.

  • Image header — a JPEG or PNG image sent at the top of the message. Useful for product imagery or branded announcements.

  • Video header — an MP4 video.

  • Document header — a PDF document displayed at the top of the message.

For image, video, and document headers, the actual media is picked at send time — Meta approves the format, not the specific file.

Footer (optional)

The footer is a single short line of text displayed below the body in a smaller, muted style.

  • Use it for opt-out instructions (“Reply STOP to unsubscribe”), fine print, or a subtle tagline.

  • The footer does not support variables.

Buttons (optional)

A template can include one or more buttons that appear under the message. WhatsApp supports several button types:

URL button. Sends the recipient to a web URL when tapped. The URL can be static (same every time) or dynamic (ends with a placeholder so you can append a per-recipient value, such as an order ID). The visible button label is set at template creation, and the URL itself can use a variable suffix for dynamic content.

Quick reply button. A tappable button that sends a predefined text reply back to your WhatsApp number. Useful for simple branching questions like “Yes/No” or “Which option?” The button label and the reply text are the same — whatever the customer taps becomes their incoming message. Multiple quick reply buttons can be attached to a single template.

Copy code button. A one-tap button that copies a short code — usually a one-time password — to the recipient’s clipboard. Available on Authentication templates only. Simplifies OTP flows by removing the need for the user to manually read and re-type the code.

Flow button. Launches a WhatsApp Flow — a structured, in-chat experience that can collect input, confirm a booking, or guide the recipient through a multi-step interaction.

How variables are counted across components

If your template includes variables in the body, in a text header, or in a dynamic URL button, each one counts separately. Meta requires an example value for every variable in the template at submission time.

Plan the variable count before writing the template:

  1. Count #{{N}} in the body.

  2. Add one if the text header uses a variable.

  3. Add one for each dynamic URL button with a variable suffix.

  4. Provide an example value for each variable before submitting.

Mapping variables when sending

When you send an approved template — from the inbox, a proactive message, or a broadcast — Octopods shows a field for every variable declared in the template. Fill each one with the value you want that specific recipient to receive; Octopods substitutes the values at send time.

Note: Variable order matters. #{{1}} always maps to the first input, #{{2}} to the second, and so on — Octopods presents them in that order automatically.


What’s next

Did this answer your question?