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

# Marketing templates

> Deep-dive on MARKETING category templates — decision tree, billing, opt-out, category migration, and sample known-good bodies.

`MARKETING` is the highest-scrutiny, highest-cost template category. Meta uses it for anything promotional — offers, campaigns, re-engagement, newsletters — and bills it at a premium. Getting marketing templates approved on the first submit requires understanding the category boundaries, the opt-out requirement, and the category-migration behaviour.

This page is the practical companion to the [Template rules reference](/whatsapp/template-rules).

## MARKETING vs UTILITY vs AUTHENTICATION

Meta categorises every template into exactly one of three buckets. Picking the wrong one means either a rejection, a silent re-categorisation, or a bill you did not budget for.

### Decision tree

```
Is the message a one-time code, OTP, or MFA?
├── YES → AUTHENTICATION
└── NO
    └── Is the message a transactional update about something the customer
        already requested or bought? (order, booking, invoice, appointment,
        shipment, cancellation, refund confirmation)
        ├── YES → UTILITY
        └── NO → MARKETING
```

### Signal words

| Signal in body                                                       | Likely category  |
| -------------------------------------------------------------------- | ---------------- |
| "confirmed", "shipped", "your order", "invoice", "receipt", "refund" | `UTILITY`        |
| "discount", "% off", "sale", "limited time", "exclusive", "promo"    | `MARKETING`      |
| "code", "OTP", "verification", "one-time"                            | `AUTHENTICATION` |

If a `UTILITY` body contains any marketing signal words, Meta will either reject or migrate to `MARKETING`. Writing "Your order shipped — and here's 20% off your next one!" is a `MARKETING` template, regardless of how you label it.

## Billing differences

Meta moved to per-conversation pricing in 2024 and prices vary by recipient country. In every market, the relative ordering is stable:

* **`AUTHENTICATION`** — cheapest, priced per message in some regions.
* **`UTILITY`** — mid-tier, business-initiated transactional rate.
* **`MARKETING`** — premium, typically **2–5× the UTILITY rate** depending on market.
* **Service (user-initiated, 24h window)** — free in most regions.

See Meta's [WhatsApp Business Platform pricing page](https://developers.facebook.com/docs/whatsapp/pricing) for the current per-market rate card. Because a silent category migration from `UTILITY` to `MARKETING` can multiply your send cost, always inspect the post-approval category — not just the status — when reviewing a template.

## Opt-out button requirement

EU and Brazil regulations (GDPR, LGPD) require every marketing message to carry a clear, low-friction opt-out path. Meta's review team enforces this at the content-review stage for templates destined for those markets and strongly encourages it globally.

The canonical pattern is a footer line plus a `QUICK_REPLY` button:

```json theme={null}
{
  "type": "FOOTER",
  "text": "Rispondi STOP per non ricevere più offerte."
}
```

And in the buttons array:

```json theme={null}
{
  "type": "BUTTONS",
  "buttons": [
    { "type": "QUICK_REPLY", "text": "Scopri" },
    { "type": "QUICK_REPLY", "text": "Non mi interessa" }
  ]
}
```

Switchbord's webhook worker recognises localised opt-out tokens (`STOP`, `FERMA`, `PARAR`, `BLOQUEAR`) and automatically flags the contact as `marketing_opt_out = true`. Subsequent campaign audiences exclude them by default.

<Warning>
  An opt-out footer alone is not enough if the user cannot act on it. Make sure your inbox has automation that actually honours the reply — see [Webhooks and opt-out](/operations/webhooks).
</Warning>

## Category migration

Meta may re-categorise a template during review. With `allow_category_change: true` (Switchbord's default for `MARKETING` drafts), the template is moved silently instead of rejected.

### When it happens

* You submit as `UTILITY` but the content contains marketing signal words.
* You submit as `MARKETING` but the content is actually a `UTILITY` update (less common, but happens).
* Meta re-runs classification on already-approved templates and reclassifies post-hoc.

### The webhook event

Meta fires `message_template_status_update` on the WABA webhook when status or category changes:

```json theme={null}
{
  "entry": [{
    "changes": [{
      "field": "message_template_status_update",
      "value": {
        "event": "APPROVED",
        "message_template_id": 123456789,
        "message_template_name": "flash_sale",
        "message_template_language": "it",
        "reason": "NONE",
        "previous_category": "UTILITY",
        "new_category": "MARKETING"
      }
    }]
  }]
}
```

Detect a category change by comparing `previous_category` and `new_category`. In v22+ Meta also emits `message_template_category_update` for post-approval reclassification of a live template.

Switchbord's webhook worker:

1. Stores both the submitted category and the Meta-assigned category on the `templates` row.
2. Logs every migration to `audit_log` for billing reconciliation.
3. Raises an internal alert when a `UTILITY` template is migrated to `MARKETING` (2–5× cost impact).

## Best practices for high approval rates

1. **Put the sender in the first line.** `"Ciao Marco, GB Viaggi ha pensato a te..."` — Meta's reviewer needs to identify the business immediately.
2. **Avoid stacked emoji and exclamation marks.** 🎉🔥💥!!! patterns trigger the spam classifier.
3. **No raw links in the body.** Put URLs in buttons where Meta can parse them cleanly.
4. **One promotional idea per template.** A template that pitches a sale AND announces new hours AND asks for a review will be rejected as vague.
5. **Realistic examples.** Do not use `"20"` next to a `%` — bake the unit into the example (`"20%"`). See [numeric-only-example](/whatsapp/template-rules#numeric-only-example).
6. **Opt-out everywhere.** Footer line + quick reply, not just one.
7. **Set `allow_category_change: true`.** Better a migrated approval than a rejection.
8. **Test in Italian first, translate second.** GB Viaggi's primary market is IT; approved IT templates clone cleanly to EN/DE. The opposite direction often trips on Italian-specific phrasing.

## Sample marketing templates

These are the corrected bodies from BORD-336. All four passed review on the first resubmit. Copy them as starting points and adapt the variables.

### Winback — 30-day lapsed customer

```json theme={null}
{
  "name": "winback_30d",
  "language": "it",
  "category": "MARKETING",
  "allow_category_change": true,
  "components": [
    { "type": "HEADER", "format": "TEXT", "text": "Ci manchi" },
    { "type": "BODY",
      "text": "Ciao {{1}}, è passato un po' dall'ultima volta. Abbiamo selezionato {{2}} idee viaggio pensate per te — dai un'occhiata quando vuoi.",
      "example": { "body_text": [["Marco", "tre"]] } },
    { "type": "FOOTER", "text": "Rispondi STOP per non ricevere più offerte." },
    { "type": "BUTTONS", "buttons": [
      { "type": "QUICK_REPLY", "text": "Mostrami" },
      { "type": "QUICK_REPLY", "text": "Più tardi" }
    ] }
  ]
}
```

### Seasonal — summer campaign

```json theme={null}
{
  "name": "seasonal_campaign",
  "language": "it",
  "category": "MARKETING",
  "allow_category_change": true,
  "components": [
    { "type": "HEADER", "format": "TEXT", "text": "Estate 2025" },
    { "type": "BODY",
      "text": "Ciao {{1}}! Abbiamo pensato a te per {{2}}. Scopri di più rispondendo a questo messaggio.",
      "example": { "body_text": [["Marco", "una vacanza al mare a giugno"]] } },
    { "type": "FOOTER", "text": "GB Viaggi — Rispondi STOP per uscire." },
    { "type": "BUTTONS", "buttons": [
      { "type": "QUICK_REPLY", "text": "Mare" },
      { "type": "QUICK_REPLY", "text": "Montagna" },
      { "type": "QUICK_REPLY", "text": "Città d'arte" }
    ] }
  ]
}
```

### Referral — ask for a share

```json theme={null}
{
  "name": "referral_ask",
  "language": "it",
  "category": "MARKETING",
  "allow_category_change": true,
  "components": [
    { "type": "BODY",
      "text": "Ciao {{1}}, grazie per aver viaggiato con noi a {{2}}. Se ti è piaciuto, passa il link a chi vuoi — un regalo per entrambi al prossimo viaggio.",
      "example": { "body_text": [["Marco", "Parigi"]] } },
    { "type": "FOOTER", "text": "Rispondi STOP per non ricevere più offerte." },
    { "type": "BUTTONS", "buttons": [
      { "type": "URL", "text": "Condividi",
        "url": "https://gbviaggi.it/refer/{{1}}",
        "example": ["https://gbviaggi.it/refer/abc123"] }
    ] }
  ]
}
```

### Flash sale — time-limited offer

```json theme={null}
{
  "name": "flash_sale",
  "language": "it",
  "category": "MARKETING",
  "allow_category_change": true,
  "components": [
    { "type": "BODY",
      "text": "48 ore soltanto: sconto del {{1}} su viaggi verso {{2}}. Prenota entro il {{3}}. Codice promo: {{4}}.",
      "example": { "body_text": [["20%", "Parigi", "15 maggio 2025", "FLASH20"]] } },
    { "type": "FOOTER", "text": "GB Viaggi — offerte limitate. Rispondi STOP per uscire." },
    { "type": "BUTTONS", "buttons": [
      { "type": "QUICK_REPLY", "text": "Voglio saperne di più" },
      { "type": "QUICK_REPLY", "text": "Non mi interessa" }
    ] }
  ]
}
```

Note how `"20%"` sits in the example with the `%` baked in — see [numeric-only-example](/whatsapp/template-rules#numeric-only-example).

## See also

* [Template rules reference](/whatsapp/template-rules)
* [Your first template](/getting-started/first-template)
* [Configure marketing messages](/getting-started/configure-marketing)
* [Template API endpoints](/api-reference/template-endpoints)
