NEWASK is live: the AI brain that answers anything about your business.Meet ASK →
Blog/Click-to-Message Identifiers
Attribution

Click to WhatsApp, Messenger and Instagram: Which Identifier You Actually Get

7 day free trialNo credit card requiredSet up in 5 minutes
Direct answer

Only click-to-WhatsApp gives you a true click identifier. WhatsApp inbound messages carry ctwa_clid in the referral object. Messenger and Instagram carry a referral object with ref and ad_id instead, and the Conversions API identifies the person by a page-scoped or Instagram-scoped user ID rather than by a click.

Meta's three click-to-message destinations look symmetrical in Ads Manager. They are not symmetrical in the API, and the differences decide what you can measure. This page sets out, field by field, what each destination actually delivers, quoted from Meta's webhook and Conversions API references.

Do all Meta click-to-message ads give you a click ID?

No. WhatsApp is the only one. That single asymmetry is the reason WhatsApp funnels are easier to measure than Messenger or Instagram funnels, and it is why advice written for one destination frequently fails on another.

DestinationClick identifierAd identityPerson identity
Click to WhatsAppctwa_clidsource_id, "Ad ID."WhatsApp phone number identity
Click to MessengerNonead_id plus optional refpage_scoped_user_id (PSID)
Click to Instagram DirectNonead_id plus optional refig_sid (IGSID)
Link to TelegramNoneNone from MetaWhatever you carry in the start parameter

The last row is not a Meta destination at all. It is included because it is the shape most teams actually run: a Meta ad pointing at a Telegram funnel, where Meta issues nothing and you build the whole handoff yourself.

What WhatsApp gives you

A per-click identifier plus the ad's identity, both inside the referral object on the first inbound message. Meta's schema reference labels the object "Only included if message via a Click to WhatsApp ad" and describes ctwa_clid simply as "Ad click ID."

The same object carries source_id ("Ad ID."), source_url ("Ad URL."), headline ("Ad headline."), body ("Ad primary text.") and the media fields. Two useful consequences follow:

The full treatment, including where the identifier is missing and what Meta does not document about it, is in ctwa_clid explained.

What Messenger gives you

A referral object with ref, an ads context block and the ad's identity, but no click identifier. There is also a scheduling subtlety that catches most first implementations.

Meta's messaging_referrals reference opens with a condition that is easy to read past:

"This callback will occur when the user already has a thread with the bot and user comes to the thread from:

Following an m.me link with a referral parameter
Clicking on a Messenger Conversation Ad"

"For tracking referrals in new threads, refer to Postback Event."

Meta, Messenger Platform, messaging_referrals. developers.facebook.com/documentation/business-messaging/messenger-platform/webhooks/webhook-events/messaging_referrals. Page shows "Updated: Jul 1, 2025". Checked 14 August 2026.

So messaging_referrals fires for people who already have a conversation with your page. A brand new thread routes through a different event. Building only the referrals handler means you silently miss every first-time contact, which is most of the traffic a new campaign produces.

Meta also states a subscription requirement on the message path: "Message with Ads Referral Information requires the application to have page subscriptions to both the messages and the messaging_referrals fields." Subscribing to one is a common and quiet misconfiguration.

The Messenger referral fields

PropertyTypeMeta's description
sourceString"The source of the referral. Supported values: ADS SHORTLINK"
typeString"The referral type. Currently supports OPEN_THREAD."
refString"The optional ref attribute set in the referrer. Only alphanumeric characters as well as -, _, and = are supported."
referer_uriString"The URI of the site where the message was sent."
ads_context_dataObjectInformation about the click-to-Messenger ad the thread was started from, including ad_title, post_id and optional media URLs

The ref field is the interesting one, because it is the Messenger analogue of Telegram's start parameter: a value you choose, set on the m.me link, and receive back. Its permitted character set is alphanumerics plus hyphen, underscore and equals, which is base64url plus the padding character. The same design rule applies as on Telegram: carry a short opaque reference, not a payload.

Note what ref is not. It is not issued by Meta, it does not identify a click, and it is only as unique as you make it. If you set the same ref on every ad, you have a campaign label. If you mint one per visitor from a bridge page, you have person-level attribution, and you have built the same machinery Telegram requires.

What Instagram gives you

The same shape as Messenger, with Instagram's own naming. Meta's Instagram messaging webhooks reference describes the messaging_referral field as firing when "an ig.me link with a referral parameter is clicked by a customer in an existing conversation", mirroring the Messenger condition exactly.

In the messages payload, Meta annotates the referral block with the comment "Included when a customer clicks an CTD ad" and shows ref, ad_id, source set to ADS, type set to OPEN_THREAD and an ads_context_data object.

Two naming traps

The field is ad_id, not ig_ad_id. And ig_sid is not a click identifier: Meta's business messaging guide describes the Instagram-scoped ID as "an identifier that represents the user in a user<>business conversation". It identifies a person in a relationship with your account, which is a different thing from identifying a click, and it does not tell you which ad brought them.

The Conversions API payload differs per channel

All three use action_source of business_messaging, which Meta defines as "Conversion was made from ads that click to Messenger, Instagram or WhatsApp." The messaging_channel and the identifying fields inside user_data are what differ.

Channelmessaging_channelFields in user_dataHashed?
WhatsAppwhatsappwhatsapp_business_account_id, ctwa_clidNo, both pass through
Messengermessengerpage_id, page_scoped_user_idNo, both pass through
Instagraminstagraminstagram_business_account_id, ig_sidNo, both pass through

Meta's customer information parameters reference marks each of these "Do not hash", describing page_scoped_user_id as the value to "Use the page-scoped user ID provided to your webhook" and ig_sid as obtainable from the Instagram webhook. Hashing any of them is accepted by the API and matches nothing, which is the failure mode our payload validator was built to catch.

Meta makes one attribution statement that applies across all three: "Attribution is based on the page/dataset id and is not related to the app id."

Five channels, one attributed record

FlowTracker's inbox covers WhatsApp, Instagram, Messenger, Telegram and Live Chat, and stores the right identifier for each on first contact, so the conversion goes back with the fields that channel actually accepts.

Start 7 day free trial

What the asymmetry means in practice

Four consequences, in rough order of how much money they cost people.

Where Telegram sits

Entirely outside this system. Meta issues no identifier for a Telegram destination, because Telegram is not a Meta surface, so there is no referral object, no ad_id and no click identifier arriving on the far side.

What you get instead is a parameter you populate yourself. Telegram documents the bot start parameter as accepting "A-Z, a-z, 0-9, _ and -" up to "64 characters long", which is enough for a reference and not for a payload. The mechanics are in the start parameter reference, and channel joins, which have no start parameter at all, are in what a Telegram channel join reveals.

The pattern across all four destinations is the same once you see it. Somewhere before the app boundary you have to write down who this person is and where they came from, because after the boundary the only thing that crosses is whatever you deliberately sent with them. WhatsApp is the one case where Meta does part of that work for you. Everywhere else it is yours to build, which is what FlowTracker's attribution layer does across the five channels its inbox covers.

Sources

Every link below was fetched and read on 14 August 2026. Where a vendor does not document something, this article says so rather than filling the gap with an estimate.

Meta, WhatsApp incoming webhook payload referenceSource for the referral object field list, the "Only included if message via a Click to WhatsApp ad" condition, and the descriptions of ctwa_clid and source_id. developers.facebook.com/documentation/business-messaging/whatsapp/reference/webhooks/whatsapp-incoming-webhook-payload. Checked 14 August 2026.
Meta, Messenger Platform, messaging_referralsSource for the existing-thread condition, the pointer to the Postback Event for new threads, and the source, type, ref, referer_uri and ads_context_data field descriptions. Page shows "Updated: Jul 1, 2025". developers.facebook.com/documentation/business-messaging/messenger-platform/webhooks/webhook-events/messaging_referrals. Checked 14 August 2026.
Meta, Messenger Platform, messages webhookSource for the requirement to subscribe to both the messages and messaging_referrals fields. developers.facebook.com/documentation/business-messaging/messenger-platform/webhooks/webhook-events/messages. Checked 14 August 2026.
Meta, Instagram Messaging webhooksSource for the messaging_referral description, the click-to-Direct referral payload shape and the ad_id field naming. Page shows "Updated: Jun 26, 2026". developers.facebook.com/documentation/business-messaging/instagram-messaging/webhooks. Checked 14 August 2026.
Meta, Conversions API for Business MessagingSource for the per-channel payload shapes, the description of the Instagram-scoped ID, the statement that attribution is based on the page or dataset ID, and the statement that Meta does not assist with deduplication. Page shows "Updated: May 5, 2026". developers.facebook.com/documentation/ads-commerce/conversions-api/business-messaging. Checked 14 August 2026.
Meta, Customer Information ParametersSource for the "Do not hash" marking on ctwa_clid, page_id, page_scoped_user_id and ig_sid. Page shows "Updated: Jan 9, 2026". developers.facebook.com/documentation/ads-commerce/conversions-api/parameters/customer-information-parameters. Checked 14 August 2026.
Meta, Server Event ParametersSource for the definition of the business_messaging action source. Page shows "Updated: Feb 12, 2026". developers.facebook.com/documentation/ads-commerce/conversions-api/parameters/server-event. Checked 14 August 2026.
Telegram, Bot Features, Deep LinkingSource for the 64 character start parameter limit and permitted character set. core.telegram.org/bots/features#deep-linking. Checked 14 August 2026.

Last reviewed 14 August 2026

Messaging Attribution

Every channel, with the right identifier

FlowTracker stores whatever each destination actually delivers on first contact, and returns conversions with the fields that channel accepts.

FAQ

Messaging Attribution, answered

Do click-to-Messenger ads have a click ID like ctwa_clid?

No. WhatsApp is the only Meta messaging destination with a click identifier. Messenger delivers a referral object containing source, type, ref, referer_uri and ads_context_data, and the Conversions API identifies the person with page_id plus page_scoped_user_id instead of a click.

What is the ref parameter on an m.me link?

A value you set yourself and receive back on the referral object. Meta describes it as "The optional ref attribute set in the referrer. Only alphanumeric characters as well as -, _, and = are supported." It is not issued by Meta and does not identify a click, so it is only as unique as you make it.

Why does my Messenger referral webhook not fire for new conversations?

Because messaging_referrals is scoped to existing threads. Meta states the callback occurs "when the user already has a thread with the bot", and directs you to the Postback Event for tracking referrals in new threads. Meta also requires page subscriptions to both the messages and messaging_referrals fields.

Is ig_sid an Instagram click ID?

No. Meta describes the Instagram-scoped ID as "an identifier that represents the user in a user<>business conversation". It identifies a person in a relationship with your account. It does not identify a click and does not tell you which ad brought them.

Which fields go in user_data for each messaging channel?

WhatsApp uses whatsapp_business_account_id and ctwa_clid with messaging_channel set to whatsapp. Messenger uses page_id and page_scoped_user_id with messaging_channel set to messenger. Instagram uses instagram_business_account_id and ig_sid with messaging_channel set to instagram. All three use action_source business_messaging, and Meta marks every one of these fields "Do not hash".

Can I get ad-level reporting without a Conversions API integration?

Yes, on all three destinations. WhatsApp's referral object carries source_id, described by Meta as "Ad ID." Messenger and Instagram carry ad_id. If your question is which creative starts conversations, the webhook alone answers it inside your own inbox.

What identifier does Meta give me for a Telegram destination?

None. Telegram is not a Meta surface, so no referral object, ad_id or click identifier arrives on the far side. The only value that crosses is what you place in the bot start parameter, which Telegram limits to 64 characters from A-Z, a-z, 0-9, underscore and hyphen.

Keep reading