Marketing Conversion Tracking

Measure conversions from marketing messages with Meta Pixel, Conversions API, and the Meta SDK. Includes fbclid handling, the click-event webhook, and Android deep-link attribution.

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:

  1. The CTA URL with fbclid opens in the device's browser or app.
  2. Pixel/Conversions API/Meta SDK reads fbclid from the URL and tags subsequent events with it.
  3. 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:

  1. The recipient's tap loads the URL with fbclid intact.
  2. Pixel / CAPI / SDK at the destination reads fbclid from that URL.
  3. 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.

Short-link and URL-rewriting services frequently strip query parameters during redirects. A typical failure:

  1. You configure CTA destination: https://www.jaspersmarket.com/checkout?campaign=whatsapp_template
  2. Your link service rewrites it to: https://www.example.com/jaspersmarket
  3. Meta appends fbclid: https://www.example.com/jaspersmarket?fbclid=xyz789
  4. The link service redirects to your site but drops the query string: https://www.jaspersmarket.com/checkout?campaign=whatsapp_template
  5. fbclid=xyz789 is gone — conversion goes unattributed.

Recommendations:

  • If you use short links or URL rewriting, validate end-to-end that fbclid survives every hop.
  • Avoid appending custom parameters after fbclid in 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 fbclid and 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_ids parsed from the al_applink_data query parameter on the deep link.
  • The deep link Meta sends carries an al_applink_data JSON blob containing campaign_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 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:

  1. Android finds an app with a matching intent filter.
  2. Creates an implicit Intent.
  3. Delivers it to the target Activity (often via onCreate() and/or onNewIntent()).
  4. 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"
        }
      ]
    }
  ]
}
FieldNotes
action_typeAlways marketing_messages_link_click
click_componentcta or body
click_idUnique identifier for the click — also appended to the destination URL
tracking_tokenInternal Meta token, opaque
product_idSet 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:

APIStrengthsPermission
Insights API (Ads Manager)Conversion metrics (web + app), spend, cost-per-click, cost-per-delivery, benchmarksads_read
Conversation Analytics (Business Management API)Sent / delivered / read / clicked / cost — basic metrics, no conversionswhatsapp_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.

Related

  • Marketing Messages API for WhatsAppMM API for WhatsApp: the /marketing_messages endpoint, feature comparison vs Cloud API, status webhook shape, fallback behavior, and the disable-marketing-on-Cloud-API toggle.
  • Marketing Deep LinksMap a URL button on a marketing template to an Android app deep link via app_deep_link, with fallback URLs for non-Android clients and uninstalled-app users.
  • Marketing MessagesMarketing template messaging hub: send paths (Cloud API and MM API), specialty template types, opt-out handling, billing, quality, and compliance.
Browse more docsStart Free Trial