7 Meta CAPI Setup Errors That Tank Your Event Match Quality
We've audited hundreds of Meta CAPI implementations. These are the 7 errors we see most often — and each one directly tanks your Event Match Quality score, wastes ad spend, and breaks attribution.
Warning: A single misconfiguration can drop your EMQ from "Great" to "Poor", costing you 20-40% of attributable conversions.
#1 Missing Event ID Deduplication
The most common error. Your browser pixel fires a Purchase event and your server sends the same event via CAPI — but without a shared event_id, Meta counts it twice.
Double-counted conversions inflate your reported ROAS, making you think campaigns are performing better than they are. When you scale based on that inflated data, you bleed budget.
Fix
Generate a unique event_id in the browser (UUID or hash of order ID + event name), pass it via both the pixel fire and the server-side CAPI call. Meta deduplicates on exact match of event_name + event_id within a 48-hour window.
#2 Broken Advanced Matching Parameters
Advanced matching lets Meta hash and send user identifiers (email, phone, name, city) alongside pixel events for better attribution. But most implementations either don't send the parameters or send them unhashed and malformatted.
Common mistakes: sending mixed-case emails (Meta requires lowercase before hashing), including country codes in phone numbers without stripping formatting, or passing empty strings instead of omitting the field entirely.
Fix
Normalize all parameters before hashing: lowercase emails, strip phone number formatting to digits only with country code, trim whitespace. Use SHA-256 hashing on normalized values. Don't send empty strings — omit the parameter if the value isn't available.
#3 Wrong Event Names or Custom Event Misuse
Meta's algorithm optimizes based on standard event names: Purchase, AddToCart, InitiateCheckout. Sending purchase (lowercase) or completed_purchase means Meta can't optimize against it.
Custom events have their place, but using them instead of standard events for core funnel actions leaves conversion data stranded outside Meta's optimization engine.
Fix
Use Meta's 17 standard event names exactly as documented (case-sensitive). Map your platform's event names (Shopify's checkout_completed) to Meta's standard names in your sGTM or CAPI layer.
#4 No FBP Cookie Pass-Through
The _fbp cookie is Meta's first-party browser identifier. Without it in your CAPI call, Meta can't match the server event to the user's browser session — even if everything else is perfect.
This is especially common when server-side implementations bypass the browser entirely (like backend-only CAPI setups triggered by webhooks). The server doesn't have access to the cookie unless you explicitly capture and forward it.
Fix
Read _fbp and _fbc cookies client-side, store them in your session or data layer, and include them in every CAPI payload. sGTM can extract these automatically from the incoming request if configured correctly.
#5 Missing or Incorrect Currency/Value on Purchase
CAPI Purchase events without value and currency parameters break ROAS reporting entirely. Meta can track the conversion but can't calculate return on ad spend.
We also see implementations where value is sent as a string like "$49.99" instead of a number 49.99, or where tax/shipping is included inconsistently between browser and server events.
Fix
Always send value as a decimal number (not a formatted string) and currency as an ISO 4217 code (e.g. "USD"). Ensure browser and server events use the same value calculation — either both include tax or both exclude it.
#6 CAPI Events Without External ID
The external_id parameter links your internal user/customer ID to Meta's identity graph. Without it, Meta relies entirely on cookies and IP for matching — which fails for logged-in users on new devices or returning users with cleared cookies.
This is a missed opportunity: if a user purchases on mobile and you have their customer ID, passing it as external_id lets Meta connect the dots even without browser-level identifiers.
Fix
Hash your internal customer/user ID with SHA-256 and pass it as external_id in both browser (via advanced matching) and server (via CAPI) events. Consistency across channels is key — use the same ID everywhere.
#7 Server Events Arriving Too Late
Meta's attribution window for CAPI events is tight. If your server sends a Purchase event hours after the actual conversion (common with batch-processing or queued webhook pipelines), Meta may attribute it incorrectly or not at all.
The event_time parameter tells Meta when the event actually happened, but it still needs to arrive within a reasonable window. Stale events degrade match quality.
Fix
Send CAPI events in real-time (within minutes, not hours). Set event_time to the actual conversion timestamp (Unix epoch). If using webhooks, process them synchronously rather than queuing for batch processing.
The Bottom Line
Every one of these errors is fixable — and most can be resolved in a single implementation session. The difference between a "Poor" and "Great" EMQ score is often just 2-3 of these fixes applied correctly.
If you're running Meta ads and your Event Match Quality is below "Good", at least one of these issues is active on your site right now.
Need this fixed?
We fix these exact issues in 48 hours. $645 flat fee, no retainers.
Free Resource
Get the Free Tracking Health Checklist
The same 14-point checklist we run on every client audit. Check your Meta CAPI, sGTM, and GA4 setup in 10 minutes.
Stop Losing Conversions
We fix broken Meta CAPI, sGTM, and GA4 tracking in 48 hours. $645 flat fee. No retainers.
Get Your Tracking Fixed