FeaturesHow it worksPricingBlogFAQSign inعربي
Home›Blog›Advertising
Advertising

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.

R Rabet team 28 Sep 2026 8 min read

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.

What this costs in practice

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:

EventMeaning in a chatAccepted?
PurchaseSale closedYes
InitiateCheckoutPrice agreed, one step leftYes
AddToCartPicked a specific productYes
ViewContentInterested, asking and comparingYes
Lead, Contact, Schedule, CompleteRegistration…—Rejected
Three limits you only find by trying

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.

Where this does not work

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.

  1. 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.
  2. Rabet stores the click ID on every chat that came from an ad, and shows the agent that this customer came from an ad.
  3. The agent picks the outcome from the chat's status button, under "What happened with the sale?":
What the agent picksWhat reaches Meta
InterestedViewContent
Close to buyingInitiateCheckout
SalePurchase
Did not buyNothing
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.

From the first rollout

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

MistakeInstead
Marking sales once a weekMark 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 askedViewContent — Lead is rejected for business messaging
Sending events to a general dataset under Business ManagerA dataset linked to the WhatsApp Business Account itself
Judging the setup from Events Manager right awayWait half an hour, or read the API response itself
Keeping a Messages campaign after events arriveA 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.

Meta's policies, event names and limits change at Meta's discretion. The information here is current as of 28 September 2026 and was measured with live API calls; the final reference is Meta's Conversions API for Business Messaging documentation.

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