CTWA attribution, end to end

Click to WhatsApp ads that stop losing attribution at the first message

The ad referral carries a click identifier that most platforms drop within seconds. ChatSetu AI writes it to the contact record and sends the outcomes that follow back to Meta as conversion events.

The gap everyone works around

Your ad reporting stops exactly where the money starts

Click-to-WhatsApp campaigns look excellent right up to the handover. Ads Manager shows impressions, clicks and cost per conversation started. Then the person opens a chat, and every system that could tell you whether they became a customer is on the other side of a wall from every system that knows which ad they came from.

So the workarounds appear. Someone asks new enquiries where they heard about you. Campaigns get judged on conversations started, a metric that rewards cheap curiosity and punishes nothing. Meanwhile Meta's delivery model optimises towards the only outcome it can observe — a tap — and cheerfully finds you more people who tap and then vanish.

None of that is inevitable. Meta already hands you the missing link: a click identifier riding along with the conversation. The data exists. It simply arrives once, on the first webhook, and gets discarded before anybody needed it.

How it actually works

The mechanism, without hand-waving

Four steps, and the third is the one competing tools skip. Worth understanding properly if you are going to depend on the numbers.

The tap carries an identifier

When somebody taps a Click-to-WhatsApp ad, the conversation that opens arrives with a referral payload attached. Inside that payload is a click identifier — the ctwa_clid — that ties this specific chat to that specific ad click. It exists for exactly one message, at the very start of the thread.

Most tools throw it away

The referral appears once, on the first inbound webhook, and never again. If the platform receiving it does not persist the identifier somewhere durable, it is gone the instant the second message arrives — and nothing downstream can recover it.

ChatSetu writes it to the contact

The contact record holds ctwa_clid, ctwa_source_id and ctwa_clid_at. The click identifier, the source it came from, and when it was captured are stored on the person, not on a transient session. Weeks later, that contact still knows which ad click created it.

Outcomes go back to Meta

The Conversions API module posts conversion events to Meta against a dataset, with a graph version, an attribution window in days and a test event code for verifying the pipe first. Meta receives the click id and the outcome together, and can join them.

What you get

Attribution that survives the conversation

Storage, window, verification and a definition of success you chose deliberately rather than inherited.

Durable click-to-contact linkage

One contact, one stored click identifier, one timestamp. Because it lives on the contact record rather than in a conversation cache, an outcome that lands a fortnight after the ad click can still be traced back to it.

A configurable attribution window

The Conversions API integration carries an attribution window expressed in days. WhatsApp conversations do not resolve in a single session — set the window to match how long your sales cycle genuinely takes rather than what a dashboard default assumed.

Test event code before live traffic

A test event code is part of the configuration, so you can confirm events are arriving in the shape Meta expects before you start sending real conversions. Attribution built on an unverified pipe is worse than no attribution at all.

Outcomes from CRM primitives

An outcome does not have to be a purchase. A contact moving to a qualified lead status, or a follow-up task completing, is a real business signal — and both are things the CRM already records rather than things you have to instrument by hand.

Facebook Lead Ads webhook

Lead ads are handled separately from CTWA: a webhook endpoint per identifier covers Meta's verification handshake and receives lead events, with an activity view so you can see what has arrived rather than guess whether the subscription is live.

Ad-sourced contacts join everything else

Once the click id is on the record, the contact is just a contact. It flows into the same journeys, follow-ups and campaigns as anyone who found you organically — and because the source is stored, it can still be segmented as its own audience.

What this deliberately does not do

ChatSetu AI is not an ad platform and does not pretend to be one. There is no ad creation, no creative editing, no audience builder, no budget control and no spend management anywhere in the product. Your ads are built, targeted, funded and paused in Meta Ads Manager, by whoever does that today.

What ChatSetu AI does is the half Ads Manager cannot see: receive the conversation the click produced, attach it durably to that click, carry the contact through the rest of your pipeline, and report the outcome back to Meta so the optimisation has something true to learn from. Two systems, one loop, and a clear line between them — which we would rather say here than let you discover during onboarding.

Typical setup

How the loop gets closed

Six steps. The fifth is the one that determines whether any of the other five were worth doing.

  1. 1

    Build the ad in Meta Ads Manager

    Creative, targeting, budget and the WhatsApp destination are all set up in Meta's own tools, as they always were. ChatSetu has no part in this step and does not try to have one.

  2. 2

    Connect the WhatsApp number that receives the chats

    The number the ad points at needs to be the number ChatSetu is receiving webhooks for. If the ad opens a chat on a number the platform is not connected to, there is no referral payload to capture and nothing further to do.

  3. 3

    The first message arrives with the referral

    Somebody taps the ad and sends the pre-filled opener. That inbound message carries the click identifier. ChatSetu reads it off the referral and writes ctwa_clid, ctwa_source_id and ctwa_clid_at to the contact as the record is created or matched.

  4. 4

    Configure the Conversions API dataset

    Point the integration at your Meta dataset, set the graph version and choose an attribution window in days. Use the test event code first and confirm the events land correctly before switching to live traffic.

  5. 5

    Decide what counts as a conversion

    Pick outcomes you would defend in a meeting. A lead status that means genuinely qualified, or a follow-up that completed successfully, are both defensible. Every inbound chat counted as a conversion is not — it tells Meta that any click is a good click.

  6. 6

    Send the event and let Meta re-optimise

    When the outcome happens, the conversion event goes back to Meta carrying the stored click id. Meta joins it to the original click inside the attribution window, and delivery starts favouring the audiences that produced real outcomes rather than cheap taps.

Where to go from here

Attribution is only useful if something happens after the click, so the pieces either side matter as much as the tracking. The contact record, custom fields and lead statuses are where the click identifier lives and where your conversion definition comes from. The automation flows and follow-up journeys are what move an ad-sourced contact towards that outcome instead of leaving them in an unread queue.

Ad traffic arrives at unhelpful hours, which is why an AI chatbot that answers immediately often lifts the same campaigns more than another round of creative testing. And if the underlying plumbing is new to you, start with what the WhatsApp Business API is.

FAQ

Frequently asked questions

The specifics performance marketers ask before trusting a CTWA number.

What is ctwa_clid and why does it matter?

It is the click identifier that Meta attaches to a conversation started from a Click-to-WhatsApp ad. It appears once, in the referral data on the first inbound message, and it is the only durable link between that conversation and the ad click that caused it. If it is not stored when it arrives, no amount of later analysis can reconstruct which ad produced which customer.

Can I create or manage my WhatsApp ads inside ChatSetu AI?

No. ChatSetu AI has no ad creation, editing, budgeting or spend management. Ads are built and run in Meta Ads Manager. ChatSetu AI's role starts after the click: receiving the resulting conversation, attributing it to the click through the stored identifier, and reporting outcomes back to Meta via the Conversions API.

What does the Meta Conversions API integration actually send?

Conversion events posted against a Meta dataset, configured with a graph version, an attribution window in days and a test event code for validating the connection before live traffic. The events carry the stored click identifier so Meta can match an outcome to the original ad click rather than inferring it.

What counts as a conversion for a WhatsApp conversation?

That is your decision, and it should be something meaningful rather than something convenient. Using the CRM primitives available, a contact reaching a particular lead status or a follow-up completing are both concrete signals of progress. Reporting every inbound chat as a conversion teaches Meta's optimisation that all clicks are equal, which is the opposite of what you want.

How is this different from Facebook Lead Ads?

They are separate mechanisms and ChatSetu AI supports both. Lead ads collect a form submission inside Meta and deliver it to a webhook, with an activity view showing what has arrived. Click-to-WhatsApp ads open a conversation instead of a form, which is why the attribution problem exists at all — there is no form submission to point at, only a chat that has to be linked back to its click.

Why does the attribution window need to be configurable?

Because WhatsApp sales cycles are not uniform. A conversation about a same-day service resolves in minutes; one about a considered purchase may take a fortnight of back-and-forth. The window determines how long after a click an outcome can still be credited to it, so it should reflect how your customers actually buy rather than a platform default.

Find out which ads actually produced customers

Tell us what you need and we'll set it up with you, or message us on WhatsApp and we'll help you get the click id captured and the Conversions API loop closed.