What MM API for WhatsApp Is
Marketing Messages API for WhatsApp (formerly "Marketing Messages Lite API", now generally available) is Meta's optimized send path for marketing template messages. It uses the same templates, the same phone numbers, and the same per-message billing as Cloud API — but routes sends through a parallel /marketing_messages endpoint that adds delivery and creative optimizations.
MM API is send-only. To receive incoming messages, status webhooks for non-marketing traffic, or send anything other than marketing templates, you continue to use Cloud API in parallel on the same phone number.
Feature Comparison vs Cloud API
| Capability | Cloud API | MM API for WhatsApp |
|---|---|---|
| Send marketing templates | Yes | Yes |
| Send authentication / utility / service templates | Yes | No |
Send freeform (text, image, etc.) | Yes (inside CSW) | No |
| Receive incoming messages and statuses | Yes | No |
| Quality-based delivery optimization | No | Yes — up to ~9% higher delivery for high-engagement messages |
| Automatic creative optimizations | No | Yes |
| Animated image (GIF) header | No | Yes |
| Android app deep links on URL buttons | No | Yes |
| Customizable TTL on marketing templates | No | Yes (12 hours – 30 days) |
| TTL on auth/utility templates | Yes | N/A |
| Performance benchmarks vs similar businesses | No | Yes |
| Tailored creative recommendations | No | Yes |
| Conversion metrics (Web/App) | No | Yes |
| Cost metrics (spend per template, per click, per delivery) | Yes | Yes |
| Basic metrics (sent, delivered, read, clicked, errors) | Yes | Yes |
| Local Storage support | Yes | Yes |
| Compliance certifications (GDPR, LGPD, SOC, ISO 27001) | Yes | Yes |
| Max-price (beta) | No | Yes |
| Onboarding | Embedded Signup | Embedded Signup, Intent API, Intent UI |
The /marketing_messages Endpoint
POST https://graph.facebook.com/<GRAPH_VERSION>/<PHONE_NUMBER_ID>/marketing_messages
The send payload is identical to Cloud API's /messages payload for template messages, with two MM-specific optional fields:
{
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": "<WHATSAPP_USER_PHONE_NUMBER>",
"type": "template",
"template": {
"name": "<TEMPLATE_NAME>",
"language": { "code": "<LANGUAGE_AND_LOCALE_CODE>" },
"components": [ /* same shape as Cloud API */ ]
},
"product_policy": "CLOUD_API_FALLBACK",
"message_activity_sharing": true
}
| Field | Default | Purpose |
|---|---|---|
product_policy | CLOUD_API_FALLBACK | If the WABA hasn't completed MM API onboarding, the message is automatically sent through Cloud API instead. Set to STRICT to disable this fallback (the call fails instead of falling back). |
message_activity_sharing | WABA-level default | Per-message override of whether read/click events from this send are shared with Meta to improve optimization. Boolean. |
Authentication is the same access token you use for Cloud API — whatsapp_business_messaging permission is required. See WhatsApp Business API Permissions.
Fallback Behavior to Cloud API
By default (product_policy omitted or set to CLOUD_API_FALLBACK), MM API will silently route a marketing template send through Cloud API if the WABA has not yet completed MM API onboarding. This makes MM API safe to wire up before the customer has signed the ToS.
Two important caveats:
- If you have set
disable_marketing_messages_on_cloud_api: trueon the WABA (see below), the fallback is rejected with error131063because Cloud API marketing is disabled. - If you set
product_policy: STRICTon the call, no fallback is attempted regardless of the disable flag.
Disable Marketing on Cloud API
Once a WABA has fully onboarded to MM API, you can require all marketing traffic to go through MM API by setting:
POST /<WABA_ID>
{ "disable_marketing_messages_on_cloud_api": true }
When this is true, attempting to send a MARKETING category template through /messages returns:
{
"error": {
"code": 131063,
"message": "(#131063) Marketing templates disabled for Cloud API",
"error_data": {
"details": "Your template is categorized as Marketing, but marketing templates are currently disabled for your Cloud API configuration. To send this template, use the Marketing Messages API for WhatsApp or enable marketing templates on Cloud API by turning off disable_marketing_messages_on_cloud_api."
}
}
}
This setting only takes effect on WABAs that have fully onboarded (ToS signed). Setting it on a partially-onboarded WABA can produce blocked sends without a working fallback path. To check the current value:
GET /<WABA_ID>?fields=disable_marketing_messages_on_cloud_api
To re-enable Cloud API marketing, set the field back to false.
Geographic Availability
| Region | MM API behavior |
|---|---|
| EEA, UK, Japan, South Korea | Sends work, but no delivery optimizations, no click/conversion reporting, no per-user marketing limits. Metrics available only via Business Management API and WhatsApp Manager (not Ads Manager / Insights API). |
| United States | Marketing messages to US recipients are blocked by Meta with error 131049 since April 1, 2025 — applies to both Cloud API and MM API. US-based business numbers can still send to non-US recipients. |
| Russia | MM API works since June 20, 2025, but with no delivery optimization or click/conversion reporting for sends from Russian business profiles or Russian payment methods. |
| Cuba, Iran, North Korea, Syria, Crimea, Donetsk, Luhansk | Cannot onboard, cannot send. Applies platform-wide. |
| Everywhere else | Full feature set. |
Status Webhooks
MM API sends emit the same sent / delivered / read status webhooks as Cloud API, but the pricing object distinguishes them:
"conversation": {
"id": "<CONVERSATION_ID>",
"origin": { "type": "marketing_lite" }
},
"pricing": {
"billable": true,
"pricing_model": "PMP",
"category": "marketing_lite"
}
For Cloud API marketing sends, pricing.category is marketing and conversation.origin.type is marketing. For MM API sends, both fields use marketing_lite.
If you want to attribute outgoing message IDs back to their send path (e.g. for billing reconciliation), log which endpoint each wamid was returned from at send time and join against the webhook's id field.
Incoming Messages (Send-Only)
MM API does not deliver incoming messages. The messages field in webhooks for inbound user messages always comes through Cloud API's webhook subscription. In Dualhook setups, this is delivered directly to your endpoint via Webhook Override — there is no separate MM API inbound channel to subscribe to.
Errors Specific to MM API
| Code | Meaning | Fix |
|---|---|---|
131049 | Marketing messages cannot be delivered to US recipients | Suppress US wa_ids before sending |
131063 | Marketing templates disabled for Cloud API | Either send via /marketing_messages or set disable_marketing_messages_on_cloud_api: false |
131061 | Templates with bid_spec (max-price) cannot be sent via Cloud API | Send via /marketing_messages instead |
131050 | Recipient stopped marketing messages from your business | Suppress the recipient and respect the user_preferences webhook |
Dualhook's Stance
Dualhook does not currently call /marketing_messages on your behalf — outbound message sends, marketing or otherwise, originate from your backend. What Dualhook does:
- Issues an access token via Embedded Signup that has
whatsapp_business_messagingpermission, which is sufficient for both/messagesand/marketing_messages. - Syncs and manages your marketing templates — the same templates can be sent through either endpoint.
- Forwards
account_updatemanagement webhooks (including MM API onboarding events — see MM API Onboarding).
If you want Dualhook to surface MM API onboarding status, eligibility, or the marketing_lite pricing breakdown in the dashboard, that's a feature request — open it through the in-app support chat.