What Is Measured
Conversion tracking is exclusive to Marketing Messages API for WhatsApp sends — it is not available on Cloud API marketing sends. Once a WABA is onboarded to MM API and your website or app has Pixel / Conversions API / Meta SDK in place, Meta automatically attributes downstream events back to the marketing message that drove the visit.
Web events automatically attributed:
- Add to cart, Initiate checkout, Purchase, Purchase value
- Complete registration, Add to wishlist, Add payment info
- Search, Lead, View content, Custom events
App events automatically attributed:
- App Purchase, App Purchase value, App Add to cart, App Initiate checkout
- App Activations, App Complete registration, App Add to wishlist, App Add payment info
- App Level achieved, App Rate, App Tutorial completion
- App Search, App View content, App Other
iOS app measurement is not currently supported. Android app measurement requires Meta Android SDK v17.0.2 or later.
Prerequisites
- WABA onboarded to MM API (see MM API Onboarding)
- For web conversions: Meta Pixel or Conversions API installed on the destination site
- For app conversions: Meta Android SDK v17.0.2+, or Conversions API for App Events, or a supported Mobile Measurement Partner (MMP)
- Marketing template messages sent through
/marketing_messages(not/messages)
If a business is not yet reporting events, follow Meta's Pixel + Conversions API tutorial before relying on MM API conversion metrics.
How Attribution Works
When a marketing template message includes a CTA URL button, Meta automatically appends a click ID (the fbclid query parameter) to that URL before sending. When the recipient taps the button:
- The CTA URL with
fbclidopens in the device's browser or app. - Pixel/Conversions API/Meta SDK reads
fbclidfrom the URL and tags subsequent events with it. - Meta joins those events back to the originating marketing message and surfaces them in the Insights API and Ads Manager → Marketing Messages tab.
If the user later converts via a different Meta surface (e.g. an Instagram ad), Meta uses last-touch attribution based on each surface's attribution window. Whichever surface had the most recent click before the conversion gets credit.
The fbclid Click ID
fbclid is appended to your CTA URL automatically. Example:
https://www.jaspersmarket.com/?fbclid=IwAR2F4-dbP0l7Mn1IawQQGCINEz7PYXQvwjNwB_qa2ofrHyiLjcbCRxTDMgk
Three things must hold for attribution to work:
- The recipient's tap loads the URL with
fbclidintact. - Pixel / CAPI / SDK at the destination reads
fbclidfrom that URL. - Subsequent conversion events are reported within the attribution window.
If fbclid is dropped anywhere along the chain — by a redirect, a short-link service, an in-app browser, an Android intent handler — attribution silently fails and conversions are not credited to the marketing message.
URL Compatibility (Short Links and Redirects)
Short-link and URL-rewriting services frequently strip query parameters during redirects. A typical failure:
- You configure CTA destination:
https://www.jaspersmarket.com/checkout?campaign=whatsapp_template - Your link service rewrites it to:
https://www.example.com/jaspersmarket - Meta appends fbclid:
https://www.example.com/jaspersmarket?fbclid=xyz789 - The link service redirects to your site but drops the query string:
https://www.jaspersmarket.com/checkout?campaign=whatsapp_template fbclid=xyz789is gone — conversion goes unattributed.
Recommendations:
- If you use short links or URL rewriting, validate end-to-end that
fbclidsurvives every hop. - Avoid appending custom parameters after
fbclidin ways that could disrupt URL parsing. - Test the full URL with all parameters in your real client before going live.
- Validate conversion reporting in Ads Manager / Insights API before scaling sends.
Web Conversions: Pixel and Conversions API
If your site already reports events via Meta Pixel or Conversions API for web, no additional MM API integration is needed. The same Pixel/CAPI events are automatically credited to MM API marketing messages when the visitor arrived via an fbclid-tagged CTA.
If you have not yet set up event reporting, the Meta Pixel + Conversions API tutorial is the entry point. Both methods can run side-by-side; Conversions API is the more reliable signal because it bypasses browser-side tracking blockers.
App Conversions: Meta SDK and Conversions API
Three integration options:
1. Meta SDK (Android)
- Upgrade to Meta Android SDK v17.0.2 or later.
- The SDK reads
fbclidand other attribution params from the deep link automatically. - iOS not currently supported for MM API app measurement.
2. Conversions API for App Events
- Send
campaign_idsparsed from theal_applink_dataquery parameter on the deep link. - The deep link Meta sends carries an
al_applink_dataJSON blob containingcampaign_ids,ad_id,adgroup_id, etc. Parse those and forward them on event submissions. - Set up Pixel/Conversions API for the website fallback URL too — users without the app installed land there.
3. Mobile Measurement Partner (MMP)
- Some MMPs auto-forward app conversion events to Meta. Check with your provider — if supported, no integration work is needed on your side.
Android Deep Link Attribution
Android routes deep links via intent filters. A deep link URL has three parts: scheme (https, myapp), path (/product/123), and query parameters (?fbclid=...&campaignId=...).
When the user taps a deep link from a WhatsApp message:
- Android finds an app with a matching intent filter.
- Creates an implicit Intent.
- Delivers it to the target Activity (often via
onCreate()and/oronNewIntent()). - Your app must explicitly read and persist the URL's query parameters. If you don't, they are effectively lost after the first screen.
Implementation checklist:
- Read the full URI from the incoming Intent, not just the path.
- Handle both cold start (
onCreate()) and warm start / re-use (onNewIntent()) — the user may launch the app fresh, or Android may reuse a backgrounded Activity. - Extract attribution params (at minimum
fbclid, plus any others you depend on). - Persist them somewhere durable (SharedPreferences, local DB) with a timestamp so they survive across sessions for deferred attribution.
- Refresh the stored value when a newer one arrives — these IDs change session-to-session.
- Do not drop query parameters on internal redirects. If you convert the inbound URI to an internal route, carry attribution params forward or persist them before routing.
Test with adb:
adb shell am start -W -a android.intent.action.VIEW \
-d "myapp://some/path?fbclid=TEST123&campaignId=TESTCAMPAIGN"
Then confirm in your logs that the app received fbclid and persisted it.
Click Event Webhook
In addition to attribution, MM API can deliver a webhook payload when users click on the body or CTA of a marketing message. Subscribe to the messages field on the whatsapp_business_account webhook topic.
Limitations:
- Currently not available to all users (rolled out in waves).
- Click events are only available for messages sent in the last 7 days.
{
"object": "whatsapp_business_account",
"entry": [
{
"id": "102290129340398",
"changes": [
{
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "15550001234",
"phone_number_id": "123456789012345"
},
"user_actions": [
{
"action_type": "marketing_messages_link_click",
"timestamp": "<TIME_OF_CLICK>",
"marketing_messages_link_click_data": {
"click_component": "cta",
"product_id": "<SKU_ID>",
"click_id": "<CLICK_ID>",
"tracking_token": "<META_TRACKING_TOKEN>"
}
}
]
},
"field": "messages"
}
]
}
]
}
| Field | Notes |
|---|---|
action_type | Always marketing_messages_link_click |
click_component | cta or body |
click_id | Unique identifier for the click — also appended to the destination URL |
tracking_token | Internal Meta token, opaque |
product_id | Set if assigned in Ads Manager or Marketing API |
This webhook arrives on the messages field, so in Dualhook setups it is delivered directly to your endpoint via Webhook Override — Dualhook does not ingest it.
Viewing Metrics
Two reporting surfaces:
| API | Strengths | Permission |
|---|---|---|
| Insights API (Ads Manager) | Conversion metrics (web + app), spend, cost-per-click, cost-per-delivery, benchmarks | ads_read |
| Conversation Analytics (Business Management API) | Sent / delivered / read / clicked / cost — basic metrics, no conversions | whatsapp_business_management |
To include MM API messages in Conversation Analytics, query with conversation_categories=MARKETING_MESSAGES or MARKETING_LITE:
GET /<WABA_ID>?fields=conversation_analytics.start(<START>).end(<END>).granularity(DAILY).conversation_categories(MARKETING_LITE).dimensions(["CONVERSATION_CATEGORY"])
If conversation_categories is omitted, only Cloud API conversation metrics are returned — MM API sends are excluded.
For richer metrics including conversions, prefer the Insights API. Meta recommends partners surface Insights API metrics in their own dashboards rather than only relying on Conversation Analytics.
Template-to-Ad Sync Caveats
When a marketing template is created or first used after 7+ days of dormancy, Meta needs up to 10 minutes to sync it to its corresponding ad account before optimization and measurement work properly:
- New templates: Wait ~10 minutes after approval before sending production traffic.
- Reactivated templates (unused 7+ days): Send one warm-up message, then wait 10 minutes before scaling.
- CTA URL changes: Campaign and Message Set parameters sync only once per template. Editing the CTA URL on an existing template will not re-link conversion measurement to the new URL — you must create a new template.
- Templates that existed before MM API onboarding: No conversion metrics. Create new templates to enable conversions.