Teach Meta ads who buys, not who chats
A click-to-WhatsApp ad knows exactly who tapped it and started a conversation — and then the trail goes cold. The sale happens an hour or two days later, inside the chat, where Meta cannot see. So the campaign learns to find people who like to message, not people who pay. This guide explains how to finish the story for it: what gets sent, how Meta matches it to the ad, and where the limits are.
Why the campaign brings chats, not sales
An ad algorithm learns from whatever signal you give it. In a messages campaign, the only signal Meta sees is "conversation started". So it hunts for people who resemble those who started conversations — and the people who start conversations easily are not necessarily the ones who pay.
Online stores solved this years ago with the pixel: the "payment complete" page fires a purchase event, and Meta learns which ad produced a sale. But a business that sells through chat — a travel agency, a car showroom, a clinic, a shop on Instagram — has no checkout page. The deal closes with "OK, book it for me" inside WhatsApp, and there is no pixel there.
Two ads each bring 100 conversations at the same cost. The first sells 12; the second sells 2. With no sales signal, Meta sees them as identical and splits the budget between them — and may even favour the second if its conversations are slightly cheaper.
The thread that ties a sale to an ad
When someone taps an ad that opens WhatsApp and sends their first message, that message reaches the Business Platform carrying a field called ctwa_clid: a unique ID for that specific click. That ID is the whole thread.
Most systems read the field to label the chat "came from an ad" and then throw it away. If you store it on the conversation, then on the day the customer buys you can send Meta an event that says: this click ended in a purchase. Meta then knows the ad, the audience and the timing that produced the sale, and learns from it.
The channel for that event is the Conversions API with the business_messaging action source, sent to a dataset linked to the WhatsApp Business Account itself. A general dataset under your Business Manager is not enough — events sent to it are rejected with "no WhatsApp Business Account linked to the dataset".
What Meta actually accepts
This is where practice departs from expectation. For business messaging, Meta accepts only four event names — we measured this with live calls, not from the documentation:
| Event | Meaning in a chat | Accepted? |
|---|---|---|
| Purchase | Sale closed | Yes |
| InitiateCheckout | Price agreed, one step left | Yes |
| AddToCart | Picked a specific product | Yes |
| ViewContent | Interested, asking and comparing | Yes |
| Lead, Contact, Schedule, CompleteRegistration… | — | Rejected |
1. Lead — the first event anyone reaches for — is rejected for this source. Build on it and your events bounce back silently.
2. Each event needs the WhatsApp Business Account ID, the messaging channel field, and a real click ID. A made-up value is refused.
3. Meta will not use an event older than seven days for optimisation. A sale marked two weeks later is lost to the campaign.
There is no negative event. "Did not buy" and "wrong number" are never sent to Meta at all; negative signals belong in an exclusion audience in Ads Manager, not in a conversion event.
And customers who didn't come from an ad?
A large share of sales comes from customers who messaged your number directly: they saw the ad and saved the number, or heard about you from a friend. They carry no click ID, so they cannot be sent as chat events.
But you have their phone number, and that is enough for a second path: an offline event (physical_store) carrying the phone number hashed with SHA-256. Meta matches the hashed number against Facebook and Instagram accounts; if that person saw your ad, the sale is credited to it and feeds the campaign's learning. This path accepts events up to 62 days old.
Messenger and Instagram chats carry no phone number, only a page-scoped ID that Meta does not match on this path. The outcome of those chats stays in your records for reporting, but it does not reach the campaign.
How it works in Rabet
The team has one job: mark the outcome of the chat. Everything else runs in the background.
- Connect your Meta account once. The moment the connection completes, Rabet creates a dataset linked to your WhatsApp Business Account and switches sending on. You never open Events Manager or need to know what a dataset is.
- Rabet stores the click ID on every chat that came from an ad, and shows the agent that this customer came from an ad.
- The agent picks the outcome from the chat's status button, under "What happened with the sale?":
| What the agent picks | What reaches Meta |
|---|---|
| Interested | ViewContent |
| Close to buying | InitiateCheckout |
| Sale | Purchase |
| Did not buy | Nothing |
| Not right (wrong number or spam) | Nothing |
Rabet handles the rest: it picks the path (a chat event with the click ID, or an offline event with the hashed number), queues the event with retries for up to six hours if Meta's network stumbles, and never sends the same outcome for the same chat twice, however often the agent flips the status. An event that has been sent cannot be pulled back — Meta has no way to cancel events — so "Sale" should mean a sale.
The feature is included on every plan, and message text never leaves the server: Meta receives the event name, its time, the click ID, and the hashed number only.
What to change in the campaign
Events arriving do nothing on their own; you have to ask the campaign to learn from them.
- Confirm delivery first. Open Events Manager → the dataset linked to your WhatsApp account, and wait for Purchase to appear. The Overview tab lags by up to half an hour, and the Test Events tab for messaging does not show a live stream the way it does for websites.
- Run a Sales campaign, not a Messages campaign, with the conversion location set to messaging apps, and optimise for Purchase on that dataset.
- If sales are few, start by optimising for InitiateCheckout. Meta's well-known guideline is roughly 50 conversion events per ad set per week to exit the learning phase; an event higher in the funnel gets there sooner.
- Compare ads by sales, not by chats. The ad with the more expensive conversations may well be the cheapest per sale.
The first business we switched this on for was a travel agency: more than 800 chats from ads in two and a half weeks, of which only 62 had an outcome marked — by two agents. The technology was never the obstacle; the habit was. A campaign only learns from what gets marked, so make marking the outcome part of closing every chat, not a weekend chore.
Common mistakes
| Mistake | Instead |
|---|---|
| Marking sales once a week | Mark them the day they happen — after seven days the event no longer feeds optimisation |
| Marking "Sale" on a promise to buy | "Close to buying" for a promise, "Sale" only for a real sale |
| Sending Lead for everyone who asked | ViewContent — Lead is rejected for business messaging |
| Sending events to a general dataset under Business Manager | A dataset linked to the WhatsApp Business Account itself |
| Judging the setup from Events Manager right away | Wait half an hour, or read the API response itself |
| Keeping a Messages campaign after events arrive | A Sales campaign optimised for Purchase |
Frequently asked questions
Do I need a website or pixel code?
No. Events are sent server-side through the Conversions API to a dataset linked to your WhatsApp account. No website, no code.
Does Meta see my conversations with customers?
No. It receives the event name, its time and the ad click ID, and — for offline events — the phone number hashed with SHA-256, as Meta requires. No message text, no names.
An agent tapped "Sale" by mistake — can it be undone?
If they change it before the event is sent, nothing is sent. Once an event has reached Meta it cannot be withdrawn; Meta does not allow deleting a sent event.
Does this cover Messenger and Instagram?
The outcome is stored for every chat on every channel, but sending to Meta works for WhatsApp chats, because only they carry a click ID or phone number Meta can match.
How long until the campaign improves?
It depends on how many sales get marked. Around 50 events per ad set per week is the threshold Meta gives for leaving the learning phase; below that, optimisation stays approximate.
Let the campaign see the sale
Rabet keeps the ad click on every chat and sends its outcome back to Meta with one tap from the agent — no website, no code, on every plan.
Start free trial