Too Long? Read This in 10 Seconds
Executive bullet points for fast decision-making
- ✓ The first inbound message from an ad carries a referral payload — capture it or the attribution is gone.
- ✓ Store the click ID on the contact at creation, not later; you cannot backfill it.
- ✓ Ads Manager counts clicks; your inbox counts conversations. They will never match exactly.
- ✓ Report cost per qualified conversation — the only number that survives the discrepancy.
Click-to-WhatsApp campaigns break the tracking habits people bring from landing pages. There is no pixel on the destination, no session, no form submission. There is exactly one moment where attribution is possible, and it happens once.
For the cost and free-window side of these campaigns, see the CTWA 72-hour window playbook. This article is about proving they worked.
The one moment that matters#
When someone taps a click-to-WhatsApp ad and sends their first message, that inbound webhook payload carries referral data: the source ad, and a click identifier tying the conversation back to the campaign.
This arrives once. It is attached to the first message of the conversation, not to the contact, and not to subsequent messages. If your ingest drops unknown fields, or your contact-creation path ignores it, the link is gone permanently.
The rule follows: capture referral data at ingest, before any business logic runs.
$referral = data_get($payload, 'entry.0.changes.0.value.messages.0.referral');
if ($referral) {
$contact->update([
'source' => 'ctwa',
'ctwa_click_id' => data_get($referral, 'ctwa_clid'),
'source_headline' => data_get($referral, 'headline'),
'source_url' => data_get($referral, 'source_url'),
'first_seen_at' => now(),
]);
}
Store the whole referral object as JSON alongside the extracted fields. New keys appear over time, and having the raw payload means you can backfill new columns later — which you cannot do if you only kept three fields.
If nothing is arriving at all, the problem is upstream: webhooks not firing.
Matching the click to a customer record#
The click ID is only useful if it travels:
- Contact creation — click ID stored on the contact.
- Stage changes — every pipeline movement inherits the click ID.
- Conversion — the order or booking record carries it too.
That last step is the one teams skip, and it is the one that lets you answer "how much revenue did that campaign produce" three months later. Conversions recorded without their source are conversions you cannot attribute, and if your CRM overwrites conversion history when a customer returns, the numbers get worse over time — the architecture problem covered in multi-lifecycle CRM leads.
Why Ads Manager and your inbox will not agree#
They count different things:
| Ads Manager | Your inbox |
|---|---|
| Counts clicks on the ad | Counts conversations that started |
| Attributes within its own window | Attributes whenever the deal closes |
| Cannot see your qualification criteria | Defines qualification |
| Deduplicates by its own rules | Deduplicates by phone number |
Structural reasons for the gap:
- Clicks that never message. The customer taps, WhatsApp opens, they close it. Counted as a click, produces no conversation.
- Repeat contacts. An existing customer clicking an ad produces referral data on a contact you already had. Is that a new lead? Decide once and apply it consistently.
- Delayed messages. Someone taps today and messages next week — outside the reporting window on one side, inside it on the other.
- Shared devices and number changes break identity in both systems differently.
Expect a persistent double-digit percentage gap and stop trying to reconcile it exactly. Instead, track both series over time and watch whether they move together.
Report cost per qualified conversation#
Cost per qualified conversation = campaign spend / qualified conversations
Where "qualified" is a definition you write down, apply consistently, and do not change mid-quarter. It might be: replied with a requirement, gave a quantity, or asked for a price.
This metric survives the Ads Manager discrepancy because it uses your spend, which is exact, and your qualification, which is yours. Cost per lead flatters you by counting people who wrote "hi" and vanished.
Response time is part of attribution#
Chat leads decay fast. The same campaign, same creative and same audience produces materially different close rates depending on how quickly a human replies — which means an attribution report without response-time context is misleading.
Instrument it:
- Time to first human reply, by hour of day.
- Percentage of ad conversations answered within your target.
- Close rate bucketed by first-reply time.
If the third table shows a sharp cliff, staffing is your highest-leverage optimisation, not creative.
Debug checklist when attribution breaks#
- Are inbound webhooks arriving at all?
- Does the first-message payload contain a referral object? Log a raw sample.
- Is your parser reading it before contact creation, or after?
- Is the click ID stored on the contact, or lost in a variable?
- Do stage changes and conversions carry it forward?
- Are repeat customers overwriting their original source? Keep first-touch and last-touch separately.
Connect ad leads to a shared inbox pipeline where referral data is captured at ingest and carried through to conversion.
Related: the CTWA cost playbook · the metrics worth reporting.
Frequently asked questions
How do I track conversions from click to WhatsApp ads? +
Capture the referral payload attached to the first inbound message, store its click identifier against the contact, and stamp that identifier on every downstream stage change so revenue can be traced back to the campaign.
What is ctwa_clid? +
The click identifier attached to a conversation that began from a click-to-WhatsApp ad. It is the key that links an inbox conversation back to the ad that produced it.
Why are my WhatsApp ad leads not showing in Ads Manager? +
Ads Manager reports on clicks and on conversions it can observe. A conversation that closes days later inside your CRM is invisible to it unless you send that outcome back.
How do I connect WhatsApp conversations to ad campaigns? +
Through the referral data on the first message. Nothing in the WhatsApp thread itself identifies the campaign after that first payload, so capture it at ingest.
WhatsApp policies, limits and pricing change often. This article was last reviewed on Aug 21, 2026 and is scheduled for its next review on Nov 21, 2026.