Skip to main content
Back to blog

Meta's Marketing Messages API (MM Lite): Marketing Sends on Devotel Orbit

MM Lite is Meta's dedicated send path for MARKETING-category WhatsApp templates, adding send-time and creative optimization on top of the template body you already send. Which sends belong on it, the first send, campaign correlation with tracking_id, the holdout recipe that measures the lift, and fallback to the standard path.

Orbit Editorial Team

Quick answer: Meta's Marketing Messages API (MM Lite) is a dedicated send path for MARKETING-category WhatsApp templates that applies Meta-side send-time and creative optimization to each send: Meta shifts delivery toward the moment each recipient is most likely to engage and selects across your approved marketing creative. On Devotel Orbit it is one endpoint, POST /api/v1/whatsapp/marketing-messages/send, reusing your connected WABA with nothing new to provision. The template body, component parameters, and language code are the same ones you send on the standard path today; what changes is the route the send travels and the optimization applied on it. The pricing posture is unchanged: Meta bills the marketing conversation at the same rate on either path, and the Orbit platform fee stays $0. MM Lite is an optimization opportunity, not a guarantee; Meta's results vary by list, market, and creative, which is exactly why this post closes with the holdout recipe that tells you what your own traffic got.

Which sends belong on MM Lite, and which stay on the standard path

MM Lite accepts exactly one template category: MARKETING. Utility, authentication, and service templates are rejected on this endpoint and surface as a 422 provider error naming the category, so they stay on the standard send path, which remains the right route for anything that is not a marketing campaign.

The split in practice:

  • Promotional and lifecycle marketing templates (drops, offers, win-backs, re-engagement) belong on MM Lite, because send-time optimization has an engagement curve to work with.
  • One-time codes, receipts, appointment reminders, and service updates stay on the standard path. They are time-critical, and send-time optimization would only add latency to a message the recipient is waiting for.
  • Urgent one-off marketing sends can stay standard as well. If a send must land the moment you fire it, the standard path is the correct choice.

Category is set when the template is created, so the routing decision happens at authoring time, not at send time. If a utility template grows a marketing twin, author the MARKETING variant and send that one through MM Lite.

Your first send

The request is the standard template send with one difference: the endpoint.

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, so existing response handling keeps working. There is nothing new to provision: the endpoint uses your organization's connected WABA access token and phone number id, and if you can send WhatsApp today you can send through MM Lite today. Multi-WABA organizations pass phone_number_id to choose the sending number; everyone else omits it. Test-prefixed API keys return a synthetic sent response marked meta.test_mode: true without dispatching a message, so the integration can be wired end to end before the first live send.

Campaign correlation: stamp tracking_id and reconcile webhooks

Set tracking_id on every campaign send. It is your correlation string, a campaign or journey id up to 512 characters; it travels with the message and returns on the status webhooks, so delivered, read, and click outcomes group by campaign without a send-time join table on your side.

The send response gives you the id to persist:

{
  "data": {
    "messageId": "wamid.HBgNMTQxNTU1NTI2NzEbFhBDRjY0NEU4QzA2NzA3QkVGQzlB",
    "status": "sent"
  }
}

The status webhooks then carry the same correlation you stamped at send time, matching the samples shipped in the guide:

{
  "event": "message.read",
  "data": {
    "messageId": "wamid.HBgNMTQxNTU1NTI2NzEbFhBDRjY0NEU4QzA2NzA3QkVGQzlB",
    "tracking_id": "cmp_summer_vip_drop"
  }
}

The reconciliation loop is three lines of discipline: persist messageId and tracking_id from the send response, upsert on message.delivered and message.read and bucket by tracking_id, and attribute short_link.click events with the same campaign id for CTR. In Orbit analytics the two tracking_id legs are what let a campaign report read as a comparison instead of one blended number.

Measuring lift: the standard-path holdout

Send-time optimization changes when Meta delivers, so measure it the way you would measure any delivery treatment: hold a randomized slice of the audience back on the standard path as the control.

  1. Split the audience, 90/10 is a common draw, at random so both legs carry matching engagement profiles.
  2. Send the treatment through the MM Lite endpoint and the holdout through the standard send path, with a distinct tracking_id per leg, cmp_x_mmlite versus cmp_x_standard.
  3. Wait for the read window to close, 48 to 72 hours for most lists, then compare delivered rate, read rate, and link CTR per leg.

Two measurement traps are worth naming. Delivered rate can look lower on the MM Lite leg in the first hours after launch, because send-time optimization holds sends inside the optimization window; compare over the full read window before drawing a conclusion. And 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.

Error handling and fallback

  • 422 naming the category or approval. A non-MARKETING, unapproved, or paused template reached the MM Lite endpoint. Keep it on the standard path and re-check category and status under Channels → WhatsApp → Templates.
  • 429. The organization's per-minute WhatsApp send budget is exhausted; MM Lite shares it with the other direct WhatsApp send routes. Back off and retry with jitter, and batch large lists at a sustained rate instead of one burst.
  • 400 `WhatsApp not connected`. No connected WABA for the organization, or the phone_number_id passed is not connected. Finish WhatsApp onboarding or pass a connected phone_number_id.
  • 502 after Meta accepted the send. Meta returned success but no message id, so the send cannot be confirmed. Retry with the same Idempotency-Key header so a deferred original cannot double-send.

Fallback is cheap by design: the request body is identical apart from the endpoint, so falling back to the standard path is a URL change, not a rewrite. The tenant sees the same envelope and the same webhooks either way, and a 422 on the marketing endpoint never eats a campaign; it routes that template back to the path it was authored for. Fall back the same way for a one-off urgent send where send-time optimization would only add latency, and on sustained Meta-side errors on the marketing endpoint after a retry.

Limits and responsibilities

Pricing is unchanged on both sides. Meta bills the marketing conversation at the same rate on either path, per-recipient marketing frequency caps apply either way, and the Orbit platform fee stays $0. Throughput follows 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.

Two things stay yours. Consent posture is a tenant-owned control: opt-in evidence, opt-out handling, and quiet hours apply to MM Lite sends exactly as they apply to the standard path, and the 24-hour service window rule is unchanged. Template approval stays with Meta: category, status, and the per-marketing-messages-per-user cap are Meta-side. The per-user cap explainer is the companion read for how delivery behaves under that cap, and the cadence playbook covers the operator levers on your side of it.

MM Lite is an optimization opportunity on marketing traffic, and Meta's results vary. The holdout above turns that into a measured number for your lists instead of a vendor claim.

Frequently asked questions

Does MM Lite work with my existing WABA?

Yes. The endpoint reuses your connected WABA access token and phone number id, there is nothing new to provision, and multi-WABA organizations select the sending number with phone_number_id.

Can I send utility or authentication templates through MM Lite?

No. The endpoint accepts MARKETING templates only; every other category returns a 422 naming the category and belongs on the standard send path.

Does MM Lite change what WhatsApp conversations cost?

No. Meta bills the marketing conversation at the same rate on either path, and the Orbit platform fee stays $0.

How do I know whether the lift is real for my list?

Run the 90/10 standard-path holdout with a distinct tracking_id per leg and compare delivered rate, read rate, and link CTR over the full 48 to 72 hour read window.

Where to go next

Meta's Marketing Messages API (MM Lite): Marketing Sends on Devotel Orbit — Orbit by Devotel