> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apifycloud.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Overview

> Template categories, button types, CPR, and how templates flow through approval

A **template** is a pre-approved message structure you can send at any time,
regardless of whether a 24h session is open. Meta approves templates per
category, language, and content. Until a template is `approved`, you cannot
use it.

## Category

Every template has exactly one category. Meta prices and enforces each one
independently:

<CardGroup cols={3}>
  <Card title="Marketing" icon="bullhorn">
    Promotions, product launches, offers, newsletters, event invites.
    Highest user friction — treat opt-in like marketing email.
  </Card>

  <Card title="Utility" icon="bell">
    Transactional updates tied to an existing user action: order confirm,
    shipping, receipt, password reset, appointment reminder.
  </Card>

  <Card title="Authentication" icon="shield">
    OTPs and verification codes. Dedicated layout with COPY\_CODE button
    or ONE\_TAP subtypes. Lowest cost but narrowest content.
  </Card>
</CardGroup>

Meta can reclassify a template post-approval based on content heuristics
and user signals. The ApifyCloud console flags this with a **category
change indicator** on the template list and detail view.

## Structure

A template is assembled from:

* **Header** (optional): `TEXT`, `IMAGE`, `VIDEO`, `DOCUMENT`, or
  `LOCATION`. Text headers allow one variable.
* **Body** (required): the main content, plain text with optional
  variables (`{{1}}`, `{{2}}`, … or named like `{{first_name}}`).
* **Footer** (optional): a short trailing line (no variables).
* **Buttons** (optional): up to the Meta-allowed count, mixing allowed
  types.

## Variables and personalisation

Template bodies and many button types accept **variables** —
placeholders you fill in at send time so the same template
personalises per recipient.

Two naming styles, both supported:

* **Indexed**: `{{1}}`, `{{2}}`, `{{3}}`, …
* **Named**: `{{first_name}}`, `{{order_id}}`, `{{amount}}`, …

Pick one style per template and stay consistent. Named variables are
easier to read in complex templates; indexed ones are more compact
for short messages.

### Where variables can appear

| Location           | Variables allowed                                       |
| ------------------ | ------------------------------------------------------- |
| Body               | Any number                                              |
| TEXT header        | Exactly one (or none)                                   |
| Footer             | None                                                    |
| URL button         | At most one, and it **must** be at the end of the URL   |
| QUICK\_REPLY label | None                                                    |
| PHONE\_NUMBER      | None (phone is a constant)                              |
| COPY\_CODE         | None on the label; the code itself is the body variable |
| VOICE\_CALL        | None                                                    |

### Filling variables at send time

* **Campaign**: the wizard maps each variable to a column of the
  contact list (or a constant)
* **Direct message (Messages tab)**: the composer asks for each
  variable's value
* **Flow**: the Template node maps variables to flow variables or
  contact attributes
* **Public API**: variable values are passed in the request body

### Sample values for Meta's review

When submitting a template, you must provide **sample values** for
every variable. Meta uses them to render the template during review
— so use realistic examples (`Ana`, `A-10042`, `$1,250`), not
placeholders like `FIRSTNAME` or the literal `{{1}}`. Sample values
don't affect actual sends; they're only for review.

## Languages

Templates are language-scoped. `en`, `es`, `pt_BR`, `es_AR`, `fr`,
`de` — Meta supports \~90 locales. A single template **name** can
exist in multiple languages; each language is submitted and approved
separately.

## Button types

<AccordionGroup>
  <Accordion title="QUICK_REPLY">
    A tap inserts the button's text as the user's reply. Most common
    choice for starting a flow or collecting yes/no/option feedback.
  </Accordion>

  <Accordion title="URL">
    Opens a URL in the user's browser. Can contain **at most one
    variable**, and the variable must be at the **end** of the URL
    (e.g., `https://example.com/orders/{{1}}`).
  </Accordion>

  <Accordion title="PHONE_NUMBER">
    Opens the phone dialer with the configured number. Not compatible with
    `VOICE_CALL` buttons on the same template.
  </Accordion>

  <Accordion title="COPY_CODE (Authentication)">
    Copies a code (OTP) to the user's clipboard. Used inside Authentication
    templates.
  </Accordion>

  <Accordion title="VOICE_CALL (Gupshup + voice calling only)">
    Initiates a WhatsApp voice call to your business inside the WhatsApp
    app. Configured with a TTL in minutes (1 to 43,200, default 10,080 /
    7 days) after which the button is no longer tappable.

    Only visible when voice calling is enabled on the app. Not compatible
    with `PHONE_NUMBER` buttons.
  </Accordion>
</AccordionGroup>

### Call Permission Request (CPR) flag

A template can be flagged as a **CPR** (`is_cpr = true`) if it has at
least one `VOICE_CALL` button. Sending a CPR template to a user asks for
their permission for your business to call them inside WhatsApp.

Rules:

* CPR requires at least one `VOICE_CALL` button
* CPR is mutually exclusive with **most** other flags and with
  `PHONE_NUMBER` buttons
* Only templates in `approved` status **and** flagged as CPR can be
  selected as the CPR template in a Call Permission Request

The CPR toggle appears in the template editor only when the template has
at least one `VOICE_CALL` button.

## Status lifecycle

| Status     | What it means                                                                                  |
| ---------- | ---------------------------------------------------------------------------------------------- |
| `draft`    | Created in the console, not yet submitted to Meta                                              |
| `pending`  | Submitted; Meta is reviewing (minutes to a few hours, up to 24h for novel content)             |
| `approved` | Meta approved; usable everywhere (messages, campaigns, widgets)                                |
| `rejected` | Meta rejected, with a reason. Can be edited and resubmitted                                    |
| `paused`   | Approved but temporarily paused by Meta due to low quality signals. Can recover                |
| `disabled` | Permanently disabled by Meta after severe or repeated negative feedback. Create a new template |
| `archived` | Auto-archived after 12+ months of inactivity; deleted after another 28 days if unused          |
| `missing`  | Used to exist but can no longer be found — stale or deleted                                    |

Only `approved` templates are selectable for sending. The picker
shows all statuses but disables non-approved entries with a reason.

Full walkthrough of approval, pausing, disabled, and archival:
[Approval flow](/guides/whatsapp/templates/approval).

## Edit restrictions post-approval

Meta is strict about what you can change once a template is approved:

| Field    | Editable after approval?                          |
| -------- | ------------------------------------------------- |
| Name     | No                                                |
| Language | No                                                |
| Category | Only if the template is in `rejected` state       |
| Header   | Limited (content yes, type no, depending on Meta) |
| Body     | Limited                                           |
| Footer   | Limited                                           |
| Buttons  | Limited                                           |

The console disables fields you can't edit and explains why.

## Limits

Meta enforces per-template edit rate limits. When you reach them,
the template editor surfaces the remaining quota and blocks further
edits until the window rolls over — so you don't burn an edit on a
typo.

## Sync

Templates stay in sync whether you authored them in ApifyCloud or in
your provider's dashboard — approval status, rejection reasons,
category changes, and new templates flow both ways automatically.

## What's next

<CardGroup cols={2}>
  <Card title="Approval flow" href="/guides/whatsapp/templates/approval">
    How submission works, reasons for rejection, and how to handle
    them.
  </Card>

  <Card title="Template categories" href="/guides/whatsapp/template-categories">
    Marketing, Utility, Authentication, and when to use each.
  </Card>

  <Card title="Template examples" href="/guides/whatsapp/template-examples">
    Copy-and-adapt patterns you can submit for approval.
  </Card>
</CardGroup>
