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

# Send WhatsApp marketing templates through Meta MM Lite

> Route MARKETING-category template sends through Meta's Marketing Messages API (MM Lite) for send-time and creative optimization: your first send, campaign correlation with tracking_id, webhook reconciliation, a standard-path holdout recipe, and error handling with fallback.

# Send WhatsApp marketing templates through Meta MM Lite

Meta's Marketing Messages API (MM Lite) is a dedicated send endpoint for MARKETING-category WhatsApp templates that applies Meta-side send-time and creative optimization to every send. Orbit exposes it as `POST /api/v1/whatsapp/marketing-messages/send`. This guide covers when to use it instead of the standard send path, your first send, reconciling outcomes back to the campaign, measuring the lift, and handling errors.

## 1. What MM Lite is and how it differs from the standard send path

* **Same template body, dedicated endpoint.** The request carries the same template name, language, and component parameters as a standard template send; Orbit forwards it to Meta's `/{phone_number_id}/marketing_messages` endpoint instead of `/messages`.
* **Meta-side optimization.** Sends through MM Lite are eligible for send-time optimization (Meta shifts delivery toward the moment each recipient is most likely to engage) and creative optimization across your approved marketing creative, improving marketing deliverability and click-through versus the standard path.
* **No new integration to provision.** MM Lite reuses your organization's existing connected WABA access token and phone number id. If you can send WhatsApp today, you can send through MM Lite today.
* **Marketing category only.** The endpoint accepts MARKETING templates exclusively; every other category stays on the standard path (section 2).

## 2. Before you send: the template must be MARKETING

MM Lite accepts exactly one template category: `MARKETING`. Utility, authentication, and service templates are rejected by Meta on this endpoint and surface to you as a 422 provider error; keep those on the standard send path, which remains the right route for anything that is not a marketing campaign.

Before your first send:

1. Confirm the template's category is `MARKETING` and its status is approved, under **Channels → WhatsApp → Templates** or via the WhatsApp templates API. Category is set when the template is created; see the [template authoring guide](/guides/whatsapp/templates-create-approve).
2. Confirm each recipient is opted in and not suppressed. Consent, opt-out handling, and quiet hours are tenant-owned controls in Orbit and apply to MM Lite sends exactly as they apply to the standard path; see [opt-out rules for WhatsApp and RCS](/guides/opt-out-rules-whatsapp-rcs).
3. Remember the 24-hour window rule is unchanged: marketing templates are how you reach recipients outside an open service window, and MM Lite does not alter that ([24-hour window guide](/guides/whatsapp/24h-window)).

## 3. Your first MM Lite send

```bash theme={null}
curl -X POST "https://api.orbit.devotel.io/api/v1/whatsapp/marketing-messages/send" \
  -H "X-API-Key: $ORBIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+14155552671",
    "template_name": "summer_drop_vip_v2",
    "language_code": "en_US",
    "components": [
      { "type": "body", "parameters": [ { "type": "text", "text": "Aisha" } ] }
    ],
    "tracking_id": "cmp_summer_vip_drop"
  }'
```

A successful send returns the Meta message id and a `sent` status in the standard envelope:

```json theme={null}
{
  "data": {
    "messageId": "wamid.HBgNMTQxNTU1NTI2NzEbFhBDRjY0NEU4QzA2NzA3QkVGQzlB",
    "status": "sent"
  },
  "meta": {
    "request_id": "req_wa_mml_7f3a",
    "timestamp": "2026-10-14T09:12:44.210Z"
  }
}
```

| Field | Required | Notes |
| - | - | - |
| `to` | Yes | Recipient in E.164 format. |
| `template_name` | Yes | Approved MARKETING template name; case-sensitive. |
| `language_code` | Yes | Template language code, e.g. `en_US`. |
| `components` | No | Header, body, and button parameters in the same shape as a standard template send. Omit for templates without variables. |
| `tracking_id` | No | Your correlation string, e.g. a campaign or journey id, up to 512 characters. Echoed on status webhooks (section 4). |
| `phone_number_id` | No | WABA selector for multi-WABA organizations; defaults to your connected WABA. |

Set `tracking_id` on all campaign traffic: it is the correlation key for section 4 and costs nothing.

**Test mode.** With a test-prefixed API key (`dv_test_sk_*`) or the dashboard test-mode toggle, the endpoint returns a synthetic `sent` response without dispatching a real message and without deducting credits, so you can wire the integration end to end before a live send; `meta.test_mode: true` marks those responses. See the [sandbox test-mode guide](/guides/sandbox-test-mode).

**Multi-WABA organizations.** Pass `phone_number_id` to choose the sending WABA; omit it to use your organization's connected WABA ([adding a WABA](/guides/whatsapp-add-waba)).

## 4. Reconcile delivery, read, and CTR webhooks with tracking\_id

Every send emits the same per-message webhooks as the standard path: `message.sent`, `message.delivered`, `message.read`, and `message.failed` ([webhook events catalog](/webhooks/events)). Your `tracking_id` travels with the message (as Meta's `biz_opaque_callback_data`) and returns on the status callbacks, so your pipeline can group delivered, read, and click outcomes by campaign or journey without keeping a send-time join table of its own.

A minimal reconciliation loop:

1. Persist `data.messageId` and `tracking_id` from the send response.
2. On `message.delivered` and `message.read`, upsert by message id and bucket by `tracking_id`.
3. For CTR, tracked links in the template produce `short_link.click` events ([link tracking and analytics](/guides/link-tracking-analytics)); attribute them with the same campaign id you stamped at send time.

## 5. Measure the lift: a standard-path holdout

MM Lite changes when Meta delivers, so measure it the way you would measure any delivery treatment: hold a slice of the audience back on the standard path.

1. Split the audience, e.g. 90/10, drawing the holdout at random so both legs have matching engagement profiles.
2. Send the treatment through `/whatsapp/marketing-messages/send` and the holdout through the standard send path, with a distinct `tracking_id` per leg (`cmp_x_mmlite` vs `cmp_x_standard`).
3. After the read window closes (48 to 72 hours for most lists), compare delivered rate, read rate, and link CTR per leg using the two `tracking_id` values.

The [holdout uplift guide](/guides/campaign-holdout-uplift-measurement) covers split sizing and significance for campaign sends; the same math applies here with `tracking_id` as the leg key. If the lift is immaterial for a given list or market, that traffic is fine on the standard path; MM Lite earns its keep on large marketing blasts, not on every template.

## 6. Error handling and when to fall back to the standard path

| Symptom | Meaning | What to do |
| - | - | - |
| 422 naming the template category or approval | Meta rejected a non-MARKETING, unapproved, or paused template on the MM Lite endpoint. | Keep utility, authentication, and service templates on the standard path; re-check category and status under **Channels → WhatsApp → Templates**. |
| 429 | Your organization's per-minute WhatsApp send budget is exhausted; this endpoint shares that budget with the other direct WhatsApp send routes. | Back off and retry with jitter, and batch large lists at a sustained rate instead of a single burst. See [rate limits](/guides/rate-limits). |
| 400 `WhatsApp not connected` | No connected WABA for the organization, or the `phone_number_id` you passed is not connected. | Finish WhatsApp onboarding, or pass a connected `phone_number_id`. |
| Daily spend-cap refusal | Your organization sets a daily WhatsApp spend limit and it has been reached. | Wait for the limit to reset in your billing timezone, or raise the limit in your spend settings. |
| 502 after Meta accepted the send | Meta returned success but no message id, so the send cannot be confirmed. | Retry; reuse the same `Idempotency-Key` header on the retry so a deferred original cannot double-send. |

Fall back to the standard path for non-marketing categories, for a one-off urgent send where send-time optimization would only add latency, and on sustained Meta-side errors on the marketing endpoint (retry first, then fall back). The request body is identical apart from the endpoint, so a fallback is a URL change, not a rewrite.

## 7. Pricing

MM Lite does not change how WhatsApp conversations bill: a marketing template send opens a marketing conversation at the same rate as the standard path, and Meta's per-recipient marketing frequency caps apply either way. Throughput is governed by your messaging-limit tier and WABA quality rating exactly as on the standard path, and sends count toward your organization's daily spend limit if one is set. See the [WhatsApp pricing guide](/guides/whatsapp/pricing).

## Troubleshooting

* **422 on a first send with a template that works on the standard path.** Almost always the category: the template is UTILITY or AUTHENTICATION. MM Lite is marketing-only; route that send back to the standard path or create a MARKETING variant.
* **Sends succeed but no webhook reconciles to the campaign.** Check that `tracking_id` was set at send time and that your endpoint subscribes to the message status events; the tracking id only reconciles what you stamp.
* **Delivered rate looks lower than the standard path right after launch.** Send-time optimization can hold sends inside the optimization window; compare over a full read window (48 to 72 hours) before drawing a conclusion.

For the raw request and response schema, see the [WhatsApp API reference](/api-reference/endpoints/whatsapp). For the campaign-level flow around these sends, see the [WhatsApp campaign launch playbook](/guides/whatsapp/campaign-launch-playbook).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.