CRM · Zoho · Optimisation
Closing the loop: CRM feedback that actually moves CPL
Every agency we audit has the same pattern: their Zoho or Google Sheets data does sync to Meta — but only one-way, and only as a Custom Audience. They upload last quarter's customers as a seed for lookalikes and consider the integration "done." Meanwhile, the disposition data the sales team is generating every day — which leads picked up the phone, which booked a visit, which converted — is sitting unused.
The accounts that beat their category on CPL aren't the ones with more sophisticated targeting. They're the ones whose CRM disposition data is feeding back to Meta as a Conversion event, so the auction optimises for "leads that close" rather than "leads that submit a form."
The two-way wiring
Three pieces:
- Outbound: customer list + recent buyers → Meta as a Custom Audience (you already have this).
- Inbound — lead capture: every Meta lead → CRM with the Meta lead ID and ad ID attached.
- Inbound — disposition feedback: every CRM disposition update → Meta as a Conversion API event, tagged to the original lead ID.
Piece 3 is where the lift comes from. Without it, Meta's auction has no idea which of the leads it delivered were actually any good.
What "disposition feedback" looks like in practice
Pick 2–3 disposition states that genuinely indicate quality. For real-estate accounts we usually pick:
Lead— the form submission itself (Meta already knows this).QualifiedLead— call-back answered + non-junk, fired within 48 hours.BookedVisit— agreed to a site visit / sales office meeting.Customer— paid the down-payment (this one is rare but valuable).
Each is a separate custom-conversion event in Meta. Fire each one with the original fbclid / lead-form ID attached so Meta can map the conversion back to the ad that delivered the lead.
The Conversion API payload
POST /v19.0/<pixel_id>/events
{
"data": [{
"event_name": "QualifiedLead",
"event_time": 1715520000,
"action_source": "system_generated",
"user_data": {
"ph": ["sha256-hashed-phone"],
"em": ["sha256-hashed-email"],
"fbc": "fb.1.1715520000.AbZ..." // captured at form submission
},
"custom_data": {
"lead_event_source": "Zoho CRM",
"event_source": "crm",
"currency": "EGP",
"value": 150
}
}],
"access_token": "<system_user_token>"
}
Notes from doing this in production:
- Hash user data. Phone, email, names → SHA-256 lowercase, no whitespace. Meta's deduplication relies on this.
- Capture
fbcat form submission, not at disposition time. Push it as a hidden field through your form provider so it lives on the lead row in Zoho/Sheets. WithoutfbcMeta can still match on hashed email/phone, but the attribution confidence drops. - Set
action_source=system_generatedfor CRM-sourced events. Setting it towebsitewill get the events deduplicated against your pixel and you'll lose half of them.
What changes once you ship this
Switch the optimisation goal on your top-of-funnel campaigns from OUTCOME_LEADS with Lead as the event, to OUTCOME_LEADS_CONVERSION with QualifiedLead as the event. Meta will:
- Narrow targeting toward people demographically similar to your qualified-lead cohort.
- Suppress delivery to lead-form-fillers who don't tend to answer phones.
- Report CPL based on the qualified event, not raw submissions.
Your reported CPL will go UP — sometimes dramatically — because the count you're optimising on is smaller. But your cost per actually-useful lead drops, your sales team stops chasing junk, and your monthly close rate climbs.
Common mistakes
1. Wiring without enough volume
Meta needs ~50 events in the first 7 days to exit Learning Phase on the new conversion. If your QualifiedLead event fires fewer than 50 times a week, stay on the raw Lead event and use a downstream filter on the campaign report instead.
2. Inconsistent disposition labels
If your sales team disposition leads as "qualified", "Qualified", "Qual." across different reps, you'll see 1/3 of the volume actually firing. Pick one canonical label, enforce it.
3. Delaying disposition feedback
Meta's training window for new conversion events is ~24 hours. If your sales team logs dispositions weekly in a batch, you're feeding Meta stale signal. Fire the event the same day the disposition happens.
One last thing
"You can't out-targeting bad data. Clean the disposition pipeline first; wire it back to Meta second."
The wiring is the easy part. The hard part is getting your sales team to consistently disposition leads — and that's an internal-ops problem, not a marketing-tech problem. Most agencies that fail to make the CRM feedback loop work, fail at the disposition-discipline step, not at the API integration step.
If you can solve the discipline problem, the rest is one weekend of plumbing.