foco
Back to Blog

The 3 Meta CAPI Mistakes That Are Costing You Conversions

March 28, 2026 4 min read

You set up Meta CAPI. Events Manager shows green checkmarks. Your team marks the ticket as done.

Three months later, ROAS is declining and nobody can explain why. The algorithm has been optimizing against garbage data the entire time.

I audit CAPI implementations regularly. The same three mistakes show up in almost every one.

Mistake 1: No Event Deduplication

When you run both the Meta Pixel and CAPI, Meta receives two signals for every conversion. Without a matching event_id on both sides, it counts every conversion twice.

I audited a B2B SaaS account where Meta showed 340 conversions in a month. Their CRM showed 185. The 1.8x inflation wasn't random. It was almost exactly what you'd expect from every conversion being double-counted, minus the fraction where ad blockers killed the Pixel event.

The dangerous part: nobody investigates a number that looks good. Marketing sees doubled ROAS and wants to scale. Finance sees the same period's revenue and it doesn't match. The gap gets attributed to "platform overcounting" and nothing gets fixed.

What to check: Go to Events Manager, Test Events. Fire a test conversion. If you see two events arrive with different event_id values (or one with no event_id at all), deduplication is broken.

The fix: Generate a unique event_id client-side when the conversion fires. Pass it to both the Pixel event and your server. Include it in the CAPI payload. Meta deduplicates automatically when the IDs match.

Double-counting compounds downstream

When your optimization signal is inflated, Meta's algorithm thinks it's performing better than it is. It allocates budget toward audiences that appear to convert but are just double-reporting. You end up optimizing toward a phantom signal.

Mistake 2: Sending Browser-Quality Data via Server

The whole point of CAPI is to send richer data than the browser can. But most implementations just relay the same dataLayer values through a server-side GTM tag. You moved the plumbing to the server without improving the water.

This shows up as a low Event Match Quality score. Below 6 means Meta can't match your conversions to the users who saw your ads. I recently found a site sending 8 customer parameters but scoring EMQ 3.8. The email field contained "N/A" for 40% of events. Phone numbers had no consistent format. Meta couldn't match any of it.

What to check: Events Manager, your conversion event, Event Match Quality. If it's below 6, the data enrichment is insufficient. Click the parameter breakdown to see which fields Meta is flagging.

The fix: Enrich the CAPI payload with server-side data. Match the conversion to a real customer record. Send hashed email, phone, and external_id from your CRM, not from browser cookies. And don't send the field at all if you don't have real data. Meta handles missing parameters better than fake ones.

Mistake 3: Not Sending Revenue Values

Meta's algorithm optimizes toward the signal you give it. If you're sending Purchase events without a value, or with a placeholder like $1.00, the algorithm can't distinguish a $50 order from a $5,000 contract.

I see this constantly in B2B. The lead event fires when someone fills out a form, but no value is attached. Meta optimizes for form-fill volume. You get a lot of low-quality leads and wonder why paid social "doesn't work for B2B."

What to check: Events Manager, your Purchase or Lead events. Do they have value and currency parameters? Are the values real or placeholder?

The fix: Send actual revenue with every conversion event. For B2B where deal value isn't known at form-fill time, send the initial lead event when it happens, then use CAPI to send an updated event with the actual deal value when the opportunity closes. Meta can optimize against the delayed signal.

Why These Mistakes Persist

All three of these are fixable in a week with the right sGTM setup. They persist because the people who set up CAPI aren't the same people who look at the ad performance data. The engineer marks the integration as done because events are flowing. The marketer sees declining performance months later and doesn't connect it to a data quality issue.

The gap between "CAPI is firing" and "CAPI is sending data Meta can actually use" is where most of the value gets lost.

Not sure which of these is costing you?

Get a measurement review

Share this article