In India, a WhatsApp button often outperforms a form. People would rather send a message than fill in fields, and sales teams like the immediacy. The problem is measurement. A tap on a wa.me link opens an app that your website, GA4 and ad pixels cannot see into. Most accounts end up counting button clicks as conversions, which tells Google and Meta to find people who tap buttons, not people who become customers. This is the setup I use to close the loop: capture the click ID before the handoff, tie the conversation to it, qualify the lead in the CRM, and send the outcome back to the ad platforms.
Why counting button clicks is not enough
A WhatsApp click conversion fires when someone taps the button. It does not know whether they sent a message, whether the message was spam, whether they wanted support rather than a quote, or whether they bought. In my audits, accounts optimising to WhatsApp clicks tend to drift toward cheap, curious taps over time, because that is exactly what they are rewarded for. The same thing happens with click-to-WhatsApp ads on Meta if you optimise for conversations started: a conversation is not a sale. The goal is to keep the click or conversation as an early signal and add a downstream signal, qualified lead, quote sent, or won deal, that the platforms can optimise toward instead. That downstream signal can only come from wherever your team records outcomes, which is usually a CRM such as Zoho or HubSpot, or a WhatsApp inbox tool with lead stages. So the whole problem reduces to one question: when a deal is marked won in the CRM, can you tell which ad click started it?
Capturing the click ID before the handoff
For website traffic, the identifiers you need exist on the landing page: gclid, gbraid or wbraid from Google Ads, and fbclid from Meta, which the Meta pixel stores as the fbc cookie. The trick is to carry them into the chat. I do this by generating a short reference code on the page when the visitor taps the WhatsApp button, storing that code with the click IDs, UTM parameters and timestamp in a database or the CRM via a webhook, and inserting the code into the prefilled message, for example a line like Ref: AB12C. When the message arrives, your WhatsApp inbox or Business API integration reads the reference code and links the conversation to the stored click data. Some teams use the phone number instead: when the chat arrives, they look up recent website sessions, but that only works if the visitor also left their number on the site. The reference code is cruder, and some people delete it before sending, but in practice it captures enough of the journey to be worth doing. Pair it with server-side tagging so the stored click IDs do not depend on browser cookies surviving.
Click-to-WhatsApp ads: use ctwa_clid
Meta's click-to-WhatsApp ads skip the website entirely, so there is no page to capture a click ID on. Instead, when someone starts a chat from one of these ads, the WhatsApp Business Platform includes referral information in the webhook for the first inbound message, including a click identifier called ctwa_clid. If you use the WhatsApp Business API through a provider, ask them to store ctwa_clid against the contact or pass it into your CRM. That value is what lets you report conversions back to Meta. Meta's Conversions API for business messaging expects the event to carry action_source set to business_messaging, messaging_channel set to whatsapp, and the ctwa_clid in the user data. With that in place you can send events such as LeadSubmitted or Purchase when the deal progresses in the CRM, and Meta attributes them to the ad that started the conversation. If you only use the WhatsApp Business app on a phone, none of this is available, which is one of the stronger reasons to move a sales team onto the API once click-to-WhatsApp spend becomes meaningful.
Matching and qualifying in the CRM
Once the conversation is linked to click data, the CRM becomes the source of truth. I create fields on the lead or contact for gclid, gbraid, wbraid, fbc, ctwa_clid, UTM source, medium, campaign and the first-message timestamp. The integration that creates the lead from the WhatsApp conversation populates them. Then I define the stages that matter for ads: qualified, meaning a real buyer with a need you can serve, and won, with deal value. Keep the definition of qualified strict and written down, because the sales team is effectively labelling training data for your ad accounts. A common failure is that WhatsApp leads are handled in a separate inbox and only some get copied into the CRM, usually the good ones, by hand. That biases everything. Every inbound conversation from a tracked source should create or update a CRM record automatically, even if most are later marked junk. The junk labels are useful too, because they tell you which campaigns generate noise.
Uploading conversions to Google Ads
Google Ads accepts offline conversions keyed on the click ID, and Google's documentation sets a 90-day window from the click for those uploads. Create a conversion action of the import type for each stage you want to report, for example WhatsApp qualified lead and WhatsApp won deal, and mark the one you want to bid on as primary. Then send conversions from the CRM with the gclid, conversion name, conversion time and value. Zoho and HubSpot both have Google Ads integrations that can sync stages, or you can schedule an upload through the Google Ads API or a file. Where you do not have a gclid, for example because the visitor arrived on iOS with only gbraid or wbraid, or the reference code was lost, enhanced conversions for leads can match on hashed phone number or email instead, provided you collected one on the site and the tag was set up to hash it. Keep the button click conversion as secondary so you can still see volume without the platform optimising to it.
Sending outcomes to Meta
For website traffic that ended in WhatsApp, send CRM stage changes to Meta through the Conversions API with action_source set to system_generated or website as appropriate to how the lead originated, the stored fbc value, and hashed phone and email for matching. For click-to-WhatsApp ads, use the business messaging setup with ctwa_clid described above. In both cases send a consistent event name for each stage and a stable event_id so retries do not double count. Meta's documentation expects event_time within the last seven days for most events, so long sales cycles need an earlier stage, such as qualified lead, as the optimisation event, with won deals sent for reporting where they fall inside the window. That is usually the right choice anyway: a qualified lead arrives often enough for the delivery system to learn, while won deals may be too rare for many accounts to optimise on directly.
Checking that it works
Three checks tell me whether the loop is closed. First, take a sample of recent won deals that came through WhatsApp and see what share have a click ID or ctwa_clid on the record. If it is low, the capture step is leaking, often because the prefilled message is being edited or the inbox integration is not reading the reference. Second, look at the offline conversion import diagnostics in Google Ads and the event overview in Meta Events Manager, which show uploads that failed to match. Third, compare conversions reported in each platform against the CRM for the same period and stage. They will never match exactly, because of attribution windows and unmatched records, but they should move together. When they do, you can finally shift bidding from WhatsApp clicks to qualified WhatsApp leads, which is where the gains in lead quality come from.
FAQ
Not directly. Google cannot see inside WhatsApp. You capture the gclid on your site before the chat opens, link it to the conversation with a reference code, record the outcome in your CRM, and upload it to Google Ads as an offline conversion within Google's 90-day window from the click.
It is the click identifier Meta includes in the WhatsApp Business Platform webhook when someone starts a chat from a click-to-WhatsApp ad. Storing it lets you send later conversions back through the Conversions API with action_source set to business_messaging so Meta can attribute them to the ad.
For click-to-WhatsApp ads, effectively yes, because ctwa_clid arrives through the API webhook. For website traffic you can get partway with reference codes in prefilled messages, but automating CRM record creation is far more reliable with the API through a provider.