Ads optimization: send conversion events to Meta
Ads optimization: send conversion events to Meta
Meta optimizes for what you report back — send it the moment a lead qualified, booked, or paid, and the campaign starts buying customers instead of conversations
Everything on this page exists for one ad format: click-to-WhatsApp. Someone scrolling Instagram or Facebook taps an ad and lands in a WhatsApp chat with the business. It’s the cheapest way to buy a conversation, and it’s exactly where measurement breaks — Meta records the click and nothing after it. The conversation that qualified, the slot that got booked, the payment that came through: none of it goes back, so the algorithm keeps buying more of whatever produced clicks.
Ads optimization closes that loop. You define which moments in a conversation count, and Chatfuel sends them to Meta as conversion events, credited to the ad that produced them.
Two things this buys you
Meta can optimize on the result. The algorithm needs events to learn from — the more of them it gets, the better it gets at finding people who do that thing. Optimizing for “started a conversation” finds people who write to you. Optimizing for “booked a slot” finds people who book.
Your client’s funnel becomes visible in Ads Manager. Every event you send lands as its own column in their ad account, attributed to the ad that produced it. Two creatives with identical cost per conversation stop looking identical — one brings people who ask about a service and book, the other brings people who say “hi” and vanish. For most agencies this is the part that lands first: it’s the first time they can say which creative brings clients rather than which creative brings chats.
WhatsApp itself tells Chatfuel which ad each conversation came from. You paste an ad’s ID only when you want a specific campaign measured separately. Nothing to request from the client’s Business Manager, no permission to negotiate.
Before you start
- The client’s WhatsApp is connected to the bot. If it isn’t, the page walks you through Meta’s own Embedded Signup dialog — official API, read-only, nothing installed anywhere. If the number is connected but predates conversion events, the same banner asks you to reconnect it to grant the permission.
- The ads you care about are click-to-WhatsApp ads. Organic chats have no ad click to credit, so they produce no events — this is the number one reason a setup looks broken when it isn’t.
- Budget ten to fifteen minutes. The hard part is already done: sending conversion events from business messaging normally needs a Facebook developer app, Meta’s review on two separate permissions, and a Marketing API access tier you only earn by making hundreds of API calls. Chatfuel is a Meta Business Partner and cleared that review.
Set it up
Open Ads optimization
Left menu, under AI Agent. This is where the rules live: under which condition in a conversation which event goes to Meta.
Choose the scope
Default events for all ads is your baseline — the events you want from every campaign this account ever runs. Add event set creates a set for one campaign, offer, or creative that needs its own events. Rules inside a set replace the defaults for the ads listed in it, so if you want both, add both.
Link the ads (optional)
The Ad posts block takes the ad’s ID — open the ad in Meta Ads Manager and copy it. (The side panel still talks about pasting the ad’s URL; the ID is what the block stores.) Name the set after the ad name in Ads Manager so it still makes sense in three months: Booking service funnel, not test 2.
Events created under Default events for all ads already apply to every ad. Link ads only when a campaign needs to be measured separately.
Create the events
Add new event → Event type: the name Meta receives, picked from the list or typed as a new one. → Trigger: one of seven, then its conditions. → Save event. It’s live immediately and applies to conversations that start after that moment. Two or three events, one per funnel stage.
Verify
Click the actual ad and walk the path — write the first message, ask about the price, book the slot. The event list in Chatfuel shows the rules; Meta Events Manager shows the event arriving within minutes, with the ad attributed. Verify now, or you’ll be debugging it over WhatsApp on Thursday.
- Only conversations that started from an ad produce events. An organic chat has no click to credit, so nothing is sent.
- Keep an ad in one event set only. The same outcome in two sets gets counted twice.
- The attribution window is 7-day click by default. A deal that closes later won’t be attributed — this matters for long sales cycles.
- The counter in the header shows the cap — currently 20 events per set. You’ll never need more than four.
Which events to send
A conversation is a ladder. Meta stands on the bottom rung and can’t see any of the others. Pick the highest rung this account has enough volume to stand on — and then two rungs below it, so the funnel has a shape.
That bottom rung is the only one Meta sees today. It’s also the cheapest action a human being can take — which is exactly why the campaign keeps buying it.
How deep this account can go
Work it out with the client, not for them: how many conversations a month do the ads bring, and how many of those reach the moment you want to count? The deeper the rung, the fewer of them there are — and the algorithm learns from how many it gets. Optimize on the deepest rung that still fires regularly; the rungs under it are what draws the funnel, and they’re worth having whatever the volume.
Standard Meta names come from the list (Purchase, LeadSubmitted, InitiateCheckout, AddToCart, ViewContent, QualifiedLead and the rest). Type anything into Search or create to make your own.
Four rules that prevent the two failures we actually see:
- Two to three events, one per stage. Not everything, not one.
- Never map a booking to
Purchase. You’d be teaching the algorithm that a booking is a sale, and it will go and buy people who book and never pay. - Optimize on the deepest event that fires regularly — measure the rest. An event that fires a couple of times a week is a line in the funnel, not something the algorithm can learn from.
- Use a standard Meta name when one fits. They already exist in Ads Manager reporting and can be selected as a campaign’s optimization goal. A typed custom name shows up in reporting too — it just has to be a name the client will still understand later.
The seven triggers
Seven ways to define what counts, against the two automatic events Meta gives you on its own. Each trigger has one trap, and the trap is where setups die.
Writing a custom AI instruction
Write it the way you’d explain it to a new employee on their first day: one moment, plain language, no conditions stacked on conditions.
Contact asked about a service, its price or duration
Contact received the booking link
User asked for a payment link
Contact sent the payment confirmation
Contact is interested — no moment in it; interest is a state, not an event
Contact asked about price or booked or paid — three moments in one rule
Good lead — a judgement, and it fires on whatever the model feels like that day
Presets by vertical
Don’t design a funnel from scratch while a client is on the call. Find the row that matches them and adjust one line at most. Every preset is three events: one mid-funnel, one intent, one outcome.
If the client books through a tool that isn’t Chatfuel Calendar, swap the Booking trigger for a Custom AI instruction on received the booking link. If nobody on their side moves cards in a pipeline, drop Contact status and put the outcome event on a Custom AI instruction instead.
The first week
Day 1 — check the events are arriving. Usually hours, not days. Message the client the moment the first real one fires and name the ad it came from: someone who sees their own funnel produce a signal on day one comes back on day seven. If nothing has fired, this is also when you catch a broken setup while it’s still cheap to fix.
Day 7 — read the funnel, don’t read the CPL. Seven days is enough to see the shape: how many conversations came from ads, how many reached each stage, how many events the ad account accepted. That’s a report the client has never had. See Client reporting and End-to-end analytics for how to assemble it.
Don’t promise cheaper leads in a week. Events only start flowing with the next campaign, and the algorithm needs to accumulate them before it can shift anything. Promise cheaper leads on day 7 and the client goes looking in Ads Manager, doesn’t find it, and stops opening your reports. What day 7 shows is the funnel — and that’s worth showing on its own.
When it doesn’t work
I set it up and I see nothing. Three checks, in this order. ① Did the conversation start from an ad? An organic chat has no click to credit, so no event is sent — this is almost always the answer. ② If you linked specific ads, is this one really in the set? ③ Are the set and the event both switched on? And the honest fourth: events apply to conversations that begin after the rule was created, so the first real read is a week out.
The number looks too high. Almost always a keyword list that’s too broad, or a status everyone passes through. Narrow the words to the ones that signal intent, or move the event one step deeper. Check as well whether the same outcome is firing from two triggers — a booking that fires both Booking and a keyword like “book”.
It’s lower than what the client’s CRM says. Expected, and worth saying before they find it. Some conversations start outside ads and carry no attribution; some deals close after the 7-day window. Compare trends week over week, not absolute totals against the CRM.
What this doesn’t do
- No revenue, no ROAS. Chatfuel catches the moment; Meta counts the money once the event reaches it.
- No retrospective on campaigns that already ran. What gets measured starts the day you connect. An ad account holds exactly one thing about click-to-WhatsApp — how many conversations started — so there’s no historical quality to recover.
- It isn’t a BI tool. The events cover what fired and what Meta accepted.
How Chatfuel knows which ad, post, or link a conversation came from
Give a specific ad its own script before you give it its own events
From ad spend to closed deal, in one report the client can read
The trigger that turns a booked slot into a conversion event
