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.

You never need access to the client's ad account

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

1

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.

2

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.

4

Create the events

Add new eventEvent 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.

5

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.

Four things that decide whether it works
  • 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.

The moment in the conversationEvent to send
Sent the payment confirmationPurchase
Asked for the payment linkAddToCart
Booked a slotInitiateCheckout
Received the booking linkInitiateCheckout
Asked about a service, its price or durationViewContent
Wrote the first messageLeadSubmitted

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:

  1. Two to three events, one per stage. Not everything, not one.
  2. 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.
  3. 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.
  4. 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.

TriggerFires whenReach for it whenThe trap
KeywordsA message contains, or exactly matches, the words you choosePromo codes, and gate words the ad itself asks for (“send OFFER”)Generic words. The panel says it itself: generic words clutter the event data and distort the funnel. hi and info fire on everyone and teach nothing.
First messageSomeone writes for the first timeA baseline: how many of the clicks you paid for became an actual conversationThis is the rung Meta already optimizes on. Useful as a denominator, never sellable as the result.
PropertiesA field on the contact card gets a value or changes — phone, email, or any custom field”Qualified” defined by data captured: treatment of interest, city, budget rangeOnly fires if something actually fills the field — the AI, a flow, or a person. No filler, no event.
BookingA booking is created for the contact in Chatfuel CalendarClinics, salons, spas — anything that sells slots. Deterministic: the slot is either in the calendar or it isn’tRequires the client to actually use Chatfuel Calendar. If bookings live in another tool, use Custom AI instruction instead.
Contact statusA contact moves into a status you selected — Captured, Sorting, Qualified, Selling, Lead won, Lead lostClients whose team already works the kanban. It turns work they already do into optimization dataOnly as reliable as the person dragging the cards. And a long cycle can close outside the attribution window.
Chat switched to human agentThe AI hands the chat over, or an agent takes itA mid-funnel signal, and a headcount argument: this is how many conversations the team has to handleNever map it to Purchase. A hand-off is a step toward a sale, not a sale.
Custom AI instructionYou describe the moment in your own words; the AI reads the conversation and decidesEverything a keyword list would either miss or over-catch — and it reads conversations nobody automated, including the ones a salesperson is runningOne clear moment per instruction. Two moments in one rule fire unpredictably.

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.

These work

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

These don't

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.

BusinessFunnel topIntentOutcome
Aesthetic or dental clinicViewContent ← Custom AI: asked about a service, its price or durationInitiateCheckout ← Custom AI: received the booking linkPurchase ← Custom AI: sent the payment confirmation
Salon or spa on Chatfuel CalendarViewContent ← Custom AI: asked about a serviceInitiateCheckout ← BookingPurchase ← Contact status = Lead won
Car dealership, high-ticket serviceViewContent ← Custom AI: asked about a model or a priceLeadSubmitted ← Chat switched to human agentPurchase ← Contact status = Lead won
Online storeViewContent ← Custom AI: asked about a productAddToCart ← Custom AI: asked for the payment linkPurchase ← Custom AI: sent the payment confirmation
Course or schoolViewContent ← Custom AI: asked about the timetable or the priceLeadSubmitted ← Properties: phone or email capturedPurchase ← Contact status = Lead won
Your own agency funnelLeadSubmitted ← Chat switched to human agentQualifiedLead ← Properties: budget capturedPurchase ← Contact status = Lead won

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.

What not to promise

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.