> For the complete documentation index, see [llms.txt](https://polser.gitbook.io/polser-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://polser.gitbook.io/polser-docs/admin/working-with-meta-templates.md).

# Working with Meta Templates

Some messages Polser sends are Meta templates: they are stored in Meta, require approval, and adhere to Meta's rules. Here's what an admin needs to understand about them.

### 1. Why Meta templates?

Polser uses Meta templates to guarantee its primary capabilities and use cases, especially for these two key aspects:

* **Messaging contacts outside the 24-hour window.** This covers both initiating contact with someone for the first time (when no conversation window is open) and following up with a customer after more than 24 hours have passed since their last message (when the window has closed).. In both cases the first message must be an approved template.
* **Sending large-scale broadcast campaigns.** A broadcast reaches many people at once, and sending on an approved template is the compliant way to message at scale on WhatsApp. So every broadcast goes out as an approved template, whether or not a given recipient happens to have an open window.

Everything else, the day-to-day replies inside an open conversation, is free text and needs no template.

> ⚠️ **Meta reviews every template before it can be used, and approval can take up to 24 hours.** Approval is often much quicker, but plan for up to a full day. A template you need for a Monday campaign should not be created on Monday morning. Prepare templates with margin, before you actually need them. Until a template is approved, it simply won't appear in Polser where you expect it.

### 2. Naming conventions

There are three recognition styles: **by prefix** (the name starts with something), **by exact name** (the name matches exactly), and **by word** (the name contains a word anywhere). This table is the reference for adding any new template:

| Use                                      | Naming rule                                 | Recognition   |
| ---------------------------------------- | ------------------------------------------- | ------------- |
| New-chat opening                         | name starts with `new_chat`                 | by prefix     |
| Expired-conversation openers (text)      | name starts with `expired_conversations`    | by prefix     |
| Expired-conversation image attachment    | exact name `expired_conversations_image`    | by exact name |
| Expired-conversation document attachment | exact name `expired_conversations_document` | by exact name |
| Expired-conversation video attachment    | exact name `expired_conversations_video`    | by exact name |
| Broadcast                                | name contains `broadcast`                   | by word       |

{% hint style="info" %}
For broadcasts, a good habit is to put `broadcast` at the **end** of the name (for example `results_day_broadcast`): it keeps your campaign templates grouped together and easy to find in Polser's UI later.
{% endhint %}

### 3. Three rules for any Meta template

Whatever the template is for, three rules save you from the most common rejections and surprises:

* **Set the language to English.** Even when the message text is in Spanish, French, or any other language, select **English** as the template's language. This is only the language *setting*, not the content: the body can stay written in whatever language you want. The reason is practical. Different users can see different default languages in Meta's interface, and normalising every template to English keeps things consistent and avoids problems later.
* **Don't let the body end on a variable.** Meta does not allow the message body to finish with a variable (`{{1}}`). Always add at least one character after it, an `OK?`, an emoji, anything, so the variable is never the last thing. A clean trick is to add the dash emoji (➖) right after the variable: it is almost invisible in the delivered message, and Meta generally accepts it as a valid ending.
* **Prefer the Utility category when it fits.** Meta sorts templates into categories, and **Utility** covers operational notices (confirmations, reminders, account or subscription updates). If your message genuinely serves an operational purpose, choose Utility: it is generally cheaper per message and is not subject to the volume limits that apply to Marketing templates. If the message is promotional, it belongs in Marketing: don't mislabel it, as Meta can recategorise or reject it.

### 4. Our Meta Templates explained

There are three types of Meta templates that come preconfigured, you'll need to adapt them to your specific needs.

#### New Chat templates

A New Chat template is the very first message a brand-new contact receives. There's no open window yet, so this opening message has to be an approved template.

You don't write the text inside Polser: you **choose, for each number, which template is used** as the opener (in the app, under **Templates → Start new chat**). What you do in Polser is connect an existing, approved template to a number.

<figure><img src="https://2865962218-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FuXtAMCUsINRibvDAbve6%2Fuploads%2F632J7KEmbhNHYp6fX3Wp%2FScreenshot%2027-08%20at%2014-01-01.png?alt=media&amp;token=b47f0ac7-09ea-4831-94b8-987d796b5daf" alt=""><figcaption></figcaption></figure>

Only templates whose name **starts with `new_chat`** appear as options. If you create an opener in Meta and don't name it that way (or it isn't approved yet), you won't see it in the list.

<figure><img src="https://2865962218-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FuXtAMCUsINRibvDAbve6%2Fuploads%2FnqwEyVRU60INZUCqu9gm%2FScreenshot%2031-08%20at%2011-15-26.png?alt=media&amp;token=cb8c5193-9ee2-41b5-972d-2dda823f2d3d" alt=""><figcaption></figcaption></figure>

Having, at least one template is **mandatory**: a number without a New Chat template can't start new conversations.

#### Expired Conversation templates

These are the templates the team uses most without realising an admin set them up: the ones that let an agent **reopen a conversation after the 24-hour window has closed**.

**What they are and why they exist.** When a contact has gone more than 24 hours without writing, the conversation is **expired**, and the agent can't just type freely. In the agent's view, an **opener dropdown** appears above the compose field. The agent picks an opener and sends it, and depending on how you set it up, may also write their own message. These openers are Meta templates that **you** configure: the team only chooses from what exists, and without them an expired conversation is a dead end.

<figure><img src="https://2865962218-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FuXtAMCUsINRibvDAbve6%2Fuploads%2FKuoncsrxauxo6LUPjyoJ%2FScreenshot%2031-08%20at%2011-18-26.png?alt=media&amp;token=df554c1f-342a-44ad-84cc-8fde44ab9a0b" alt=""><figcaption></figcaption></figure>

The admin job here is twofold: keep **enough** openers that the team isn't always sending the same one, and make sure they're **approved before they're needed**.

**Text openers follow a prefix rule**. Polser surfaces every template that starts this way, so you can have several (`expired_conversations`, `expired_conversations_1`, `expired_conversations_2`, and so on) and they all appear as different openers, giving the agent variety.

**With a variable, or without: an important decision.** When you create an opener, you choose something that changes how the team uses it: whether the template carries a variable (`{{1}}`) or not. Both are valid, but they serve different purposes.

* **With a variable, the agent writes their own message.** The template's fixed text is only the opening line; the variable becomes a "write your reply" field below the dropdown, where the agent types whatever they want. This is the option for **general-purpose** openers that can reopen any conversation.
* **Without a variable, the message is fixed and closed.** The template is sent exactly as written, and the agent can't add anything: the compose field appears greyed out. This is only useful when the whole message is always the same (a standard notice, an identical reminder for everyone).

<figure><img src="https://2865962218-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FuXtAMCUsINRibvDAbve6%2Fuploads%2FbJtdZN7T4sDc07tbwOXF%2FScreenshot%2031-08%20at%2011-20-39.png?alt=media&amp;token=5469ca59-c218-40b7-b456-eda71762a16a" alt=""><figcaption></figcaption></figure>

> 💡 **If in doubt, use a variable.** An opener with a variable does everything: the agent can write their own message or send just the opening line. An opener without a variable only works for that one specific message, and if you meant it for general use, the agent will be stuck unable to type anything.

**Attachments work differently: one exact template per file type.** When the agent needs to send an **image, document, or video** into an expired conversation, the attachment also rides on a template, but these are matched **by exact name, not by prefix**: `expired_conversations_image`, `expired_conversations_document`, `expired_conversations_video`. \
There are no numbered versions here: one template per type, with the exact name. If the name doesn't match exactly, Polser won't find it and the team can't send that file type. Each carries a short fixed line ("Click to open", "Here's the document", and so on), which is what makes an attachment sent outside the window look slightly different. That's not a bug: it's the only way to send a file outside the window.

#### Broadcast templates

Broadcast templates are the ones used in mass campaigns. This section covers the templates themselves; for building and sending a campaign, see the [Broadcasts](https://polser.gitbook.io/polser-docs/features/broadcasts) page.

{% hint style="info" %}
You can create simple text broadcast templates **directly in Polser** (see the [Templates](https://polser.gitbook.io/polser-docs/features/templates) page). Anything richer, a media header or interactive elements, is created in Meta's **WhatsApp Manager**. For Polser to recognise a template as a broadcast, its name must **contain the word `broadcast`** (see section 2).
{% endhint %}

**Creating a broadcast template in Meta.** The full walkthrough of WhatsApp Manager is here:

{% @arcade/embed flowId="vS9Iot5DzY3FlE828cL9" url="<https://app.arcade.software/share/vS9Iot5DzY3FlE828cL9>" %}

**Templates with a video.** Any template that carries a video (most often a broadcast) has a few specific requirements at creation time:

* The **header set to Video**.
* Video must be formatted in **mp4**, **under 16 MB**, **codec H264** (🙋 this last part is very important).
