Vazante
Sign inStart

Meta Ads reporting

Click to WhatsApp ads tracking: which ad started each conversation

Track click-to-WhatsApp ads past the conversation count: tie each chat to the ad that started it, then to spend and sales, without moving your team.

Also available in: Português · Español

Click-to-WhatsApp ads have a tracking gap that every media buyer runs into. Ads Manager reports how many conversations each ad started. Your sales team knows how many deals they closed on the phone. Nobody can tell you which ad brought in the customer who actually paid. The fix is a click ID Meta sends with the first message of each ad-driven conversation, delivered only through the Cloud API webhook. With WhatsApp coexistence, your number runs in the Business app and the API at the same time, so you can capture that ID on every conversation while your team keeps replying from their phones.

The "how did you hear about us?" problem

On a website, attribution is a solved problem, more or less. Someone clicks, the page loads, the pixel fires, a purchase event goes back to the campaign. A WhatsApp chat has none of that. There is no landing page, no pixel, no checkout. The sale happens over a voice note, a payment link or a phone call.

So most teams fall back on one of three habits:

  • Optimizing for conversations started. It is the number Ads Manager gives you, and it is easy to inflate with a creative that attracts browsers.
  • Asking the customer. "How did you hear about us?" gets a shrug, or "Instagram" regardless of what actually happened.
  • Trusting the gut. The account manager remembers that the video ad "felt" better last month.

None of these is a discipline problem. The data simply was not reachable for anyone who wanted to keep using the WhatsApp Business app.

How the click ID travels

Here is the full chain, from tap to cost per sale:

  1. Someone taps your click-to-WhatsApp ad and lands in a chat with a prefilled message.
  2. They send that first message. Alongside it, Meta sends the click ID, ctwa_clid. Only on the first message of the conversation, and only through the API webhook.
  3. With the number in coexistence, the API receives that webhook even though your rep replies from the phone, exactly as before.
  4. Your connected system records the link: this conversation came from this ad.
  5. Join it with ad spend and you get cost per conversation. Join it with closed deals in your CRM and you get cost per sale.

Step 2 is the whole game. The ID shows up once. If nothing is listening to the webhook at that moment, the chat still exists and the customer still exists, but the source is gone.

Before coexistence, receiving that webhook meant moving the number to the API and taking it out of the app. That meant retooling the sales team, which is why so many businesses gave up on attribution entirely. If you are still weighing that trade-off, read coexistence or migration.

What you can report once the source is captured

MetricWhat it needsWhere it comes from
Conversations per adclick ID storedfirst-message webhook
Cost per conversationad spend + attributed chatsad account + webhook
Deals per adchat linked to a dealCRM
Cost per salespend + attributed dealsad account + CRM
Non-ad conversationsmessage with no click IDorganic, referrals, repeat customers

Do not skip the last row. Knowing how many chats did not come from ads tells you how big your organic demand really is, and stops you from crediting paid media with sales that would have happened anyway.

A worked example

Say you run two ad sets with US$ 500 each for the month.

  • Ad set A drives 100 conversations: US$ 5 per conversation.
  • Ad set B drives 40 conversations: US$ 12.50 per conversation.

Looking at Ads Manager alone, A wins and gets the budget increase. Now say the CRM shows 3 closed deals from A's conversations and 8 from B's. Cost per sale is about US$ 167 for A and US$ 62.50 for B. The decision flips.

The numbers are illustrative. The pattern is not unusual: the creative that grabs everyone's attention is often not the one that grabs buyers. Without the source stored, you never find out.

Connect before you launch

This is the rule that costs the most when ignored: what is not stored when it arrives does not come back.

When you connect, Meta syncs up to 6 months of message history, so you do not start from a blank slate. But that history carries the messages, not the click IDs nobody captured at the time. If the campaign ran for two weeks before you connected, those two weeks stay unattributed for good.

The initial sync takes anywhere from minutes to hours and happens only once. It is not something to start the morning of a launch. What gets transferred, and what does not, is covered in the 24-hour sync.

Pre-launch checklist:

  • Number connected in coexistence, with the sync finished.
  • One test conversation from a real ad click showing up with its source recorded. Use an actual ad, not a direct message.
  • Every ad points to the connected number, not a regional line or a rep's personal business number.
  • CRM connected, if you want to get to cost per sale instead of stopping at cost per conversation.
  • Someone opens the WhatsApp Business app regularly. If nobody opens it for about 14 days, Meta may drop the connection, and attribution stops with it.

Mistakes that quietly kill attribution

Connecting mid-campaign. The first week is the learning phase, when you most need to know what works. It is also the week with no data.

Splitting ads across numbers. Common for franchises and multi-location businesses. If only one number is connected, the others produce chats with no source, and the report goes wrong without telling you.

Expecting a source on every message. The click ID comes on the message that opens the conversation from the ad. If a customer saved your number and comes back on their own a week later without tapping an ad, that message has no paid source. That is correct behavior, not a bug. Decide in your CRM how to treat returning customers.

Disconnecting during a campaign. Disconnecting gives you back the app features that are locked while the API is attached, but while the number is off the API, no click is recorded. The gap stays in the report.

Stopping at cost per conversation. A conversation is a step, not an outcome. Without the deal from the CRM, you have swapped one guess for a slightly better guess.

When this will not help

To be straight about the limits:

  • No click-to-WhatsApp ads, no click ID. A WhatsApp button on your website takes people into a chat, but it does not carry ctwa_clid. Measure that path on the website.
  • No record of the sale. You still get cost per conversation by ad, which beats guessing, but not cost per sale.
  • Number not on WhatsApp Business yet. Start somewhere else first. Check the coexistence requirements.

Your next move

If a click-to-WhatsApp campaign is already live, every day without the connection is a day of chats with no source. The order is simple: connect the number, let the sync finish, run one test conversation from an ad, and only then launch or scale the budget.

Once the source is stored, your report stops saying "how many conversations" and starts saying "what each sale cost". To get that number in front of the people who sign off on budget, see campaign reports on WhatsApp. To plan the first month after connecting, follow the first 30 days with coexistence. Module details are on the WhatsApp Coexistence page.

Frequently asked questions

How do I track which ad a WhatsApp conversation came from?

Meta sends a click identifier with the first message of a conversation that starts from a click-to-WhatsApp ad, but only through the API webhook. You need the number connected to the Cloud API, and coexistence lets you do that while your team keeps using the WhatsApp Business app.

What is ctwa_clid?

It is the click ID Meta attaches to the first message of a conversation started from a click-to-WhatsApp ad. It arrives only through the webhook and has to be stored the moment it arrives.

Can I recover attribution for chats that happened before I connected?

No. Connecting syncs up to 6 months of message history, but a click ID that nobody stored when it arrived cannot be recovered later. Connect before the campaign goes live.

Is the messaging conversations metric in Ads Manager enough?

It tells you how many conversations each ad started, not which ones turned into revenue. To get cost per sale you need each chat tied to an ad and each sale recorded in your CRM.

Read next