> ## 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.

# Configure marketing messages

> Open the template editor, seed the GB Viaggi starter pack, set approval expectations, and troubleshoot rejections.

This guide walks a workspace owner or admin through the end-to-end setup for marketing messages: opening the template editor, seeding the GB Viaggi starter pack, setting expectations for Meta's review timeline, and troubleshooting common rejections.

## Prerequisites

Before you start:

* A workspace with a connected Meta WhatsApp Business Account (WABA). See [Connect WhatsApp](/platform/connect-whatsapp).
* A Meta system user access token stored in the workspace vault under `meta-access-token`. See [Meta credential setup](/operations/meta-credential-setup).
* `owner` or `admin` role on the workspace (seed pack is admin-only).

## How to access the template editor

<Steps>
  <Step title="Open Templates">
    From the left sidebar, click **Templates**. You will see your template library grouped by status. First-time workspaces show an empty-state card with a quick-start button.
  </Step>

  <Step title="Choose a start mode">
    Three entry points:

    * **New template** — blank editor, for one-off drafts.
    * **From library** — clone an approved template from another language.
    * **Seed starter pack** (admin-only) — bulk-load the GB Viaggi pack in one click.
  </Step>

  <Step title="Compose">
    The editor has four panels: metadata (name, language, category), components (header, body, footer, buttons), live preview that mirrors WhatsApp rendering, and validation results.
  </Step>
</Steps>

Every field has an info icon that links to the exact rule on [Template rules](/whatsapp/template-rules).

## Seed the GB Viaggi starter pack

The starter pack is a curated library of 13 production-grade templates (8 `UTILITY` + 5 `MARKETING`, Italian + English) that covers the most common GB Viaggi flows: booking confirmation, invoice, cancellation, winback, seasonal offer, referral, flash sale, and more. Seeding is idempotent — safe to re-run if a subset failed on a first attempt.

<Steps>
  <Step title="Confirm the WABA is connected">
    Go to **Settings → Channel** and check that `waba_id` is populated. If not, the seed will fail with `no_waba`.
  </Step>

  <Step title="Click Seed starter pack">
    On the **Templates** page, click **Seed starter pack** (visible only to owner/admin). A modal summarises what will be submitted and asks for confirmation.
  </Step>

  <Step title="Review the per-template results">
    The seeder posts each template to Meta sequentially. Each row in the result table reports `submitted`, `pending_approval`, or `error` with the Meta message. Errors are also stored on the `templates` row as `rejection_reason` for later retry.
  </Step>
</Steps>

Under the hood the UI calls `POST /api/templates/seed-starter-pack` — see [Template endpoints](/api-reference/template-endpoints) if you want to trigger this from a script.

## Approval timeline expectations

Meta's review pipeline is almost always fast, but "fast" varies by category and by load:

| Category         | Typical review time  | Outlier cases        |
| ---------------- | -------------------- | -------------------- |
| `AUTHENTICATION` | Under 5 minutes      | Up to 1 hour         |
| `UTILITY`        | 5–30 minutes         | 1–2 hours under load |
| `MARKETING`      | 15 minutes – 2 hours | Up to 24 hours       |

Rules of thumb:

* **Clean, well-formed templates get approved within minutes.** If yours has been pending for more than 2 hours, a reviewer has flagged it for manual review.
* **Weekends and Meta-US holidays slow reviews.** Submit on weekdays if you are campaign-critical.
* **Burst submits throttle.** Meta rate-limits at 100 templates/hour per WABA. Seeding the 13-template starter pack uses less than 15% of that budget.

You do not need to poll the Meta API. Switchbord's webhook worker listens for `message_template_status_update` and updates the template row in real time. The UI refreshes via Supabase Realtime.

## Troubleshooting rejections

When a template is rejected, Switchbord stores Meta's human-readable message in `rejection_reason` and surfaces it at the top of the editor and on the template row.

### Common rejection → fix map

| Meta message (paraphrased)                                   | Rule                                                                      | Fix                                                          |
| ------------------------------------------------------------ | ------------------------------------------------------------------------- | ------------------------------------------------------------ |
| Variable parameters cannot be next to each other             | [adjacent-variables](/whatsapp/template-rules#adjacent-variables)         | Add a word between placeholders                              |
| Body text cannot begin with a variable parameter             | [leading-variable](/whatsapp/template-rules#leading-variable)             | Add greeting before `{{1}}`                                  |
| Body text cannot end with a variable parameter               | [trailing-variable](/whatsapp/template-rules#trailing-variable)           | Add fixed text after the last placeholder                    |
| Number of parameter examples does not match variables        | [example-count-mismatch](/whatsapp/template-rules#example-count-mismatch) | Provide one example per `{{n}}`                              |
| Examples must be representative — numeric/symbol not allowed | [numeric-only-example](/whatsapp/template-rules#numeric-only-example)     | Use realistic alphanumeric examples (bake units into values) |
| Template name must contain only lowercase letters…           | [name-regex](/whatsapp/template-rules#name-regex)                         | Rename to `snake_case`                                       |
| Body text exceeds the 1024 character limit                   | [length-caps](/whatsapp/template-rules#length-caps)                       | Trim body to ≤ 1024 chars                                    |
| Template cannot have more than 3 quick reply buttons         | [button-limits](/whatsapp/template-rules#button-limits)                   | Cap quick replies at 3                                       |

### Resubmit workflow

<Steps>
  <Step title="Duplicate the rejected template">
    The original is locked. Click **Duplicate** to get a fresh draft with the same body and components.
  </Step>

  <Step title="Apply the fix">
    The validator panel highlights every rule the draft violates. Fix them until the panel is green.
  </Step>

  <Step title="Validate (optional, no-op call)">
    Click **Validate** to re-run only the client-side linter. Unlike **Submit for approval**, this does not consume a slot of your Meta rate-limit budget.
  </Step>

  <Step title="Submit for approval">
    Click **Submit for approval**. Webhook updates the template status in the background.
  </Step>
</Steps>

### When to escalate

If a template is rejected with a Meta message you do not recognise, or if the same template is rejected for different reasons on each attempt:

1. Capture the full Meta error JSON from the template's `rejection_reason` row (it includes `fbtrace_id`).
2. File a Linear issue tagged `whatsapp-templates` with the template name, body, and the error.
3. If the issue blocks a campaign, open a Meta Business Support case with the `fbtrace_id` — turnaround is usually 24–48 hours.

## See also

* [Your first template](/getting-started/first-template) — end-to-end walkthrough.
* [Template rules reference](/whatsapp/template-rules) — every validator rule.
* [Marketing templates](/whatsapp/marketing-templates) — category decision tree and opt-out.
* [Template endpoints](/api-reference/template-endpoints) — automate from scripts.
