A Shopify client came to me convinced their Meta CAPI setup was “done.” Their previous developer had installed a Conversions API tag, purchases were flowing, everyone was happy. Then their ROAS quietly slid for two months and nobody could explain it. The first thing I checked wasn’t the tag. It was their Event Match Quality score, sitting at a 4.8 out of 10, glowing yellow in Events Manager like a warning light everyone had learned to ignore.
Within three weeks it was at 9.1, and their measured CPA dropped by roughly a third. Nothing about the “tracking” changed. We just fed Meta better identifiers.
EMQ is the most under-appreciated lever in the entire CAPI game, so let me walk through how I actually move it.
What EMQ is really measuring
Event Match Quality is Meta grading how well it can tie your server event to a real person in its graph. More matched customer-information parameters, hashed correctly, means better matching, which means better attribution and — this is the part clients care about — better optimization, because the algorithm is learning from cleaner signal.
A CAPI setup that “works” (events arrive, no errors) can still be starving Meta of the identifiers it needs. Firing the event is table stakes. The match quality is where the money is.
The order I fix things in
I don’t try to send everything at once. I work the parameters in order of impact.
1. Email and phone, hashed properly. This is 80% of the battle. The number of “professional” setups I’ve inherited that send an unhashed email, or hash it without lowercasing and trimming first, is genuinely depressing. Normalize before you SHA-256: lowercase, strip whitespace, and for phones, E.164 format with country code and no symbols. One client’s phone match rate was near zero purely because they were sending (555) 123-4567 instead of 15551234567.
2. External ID. Send a stable, hashed user identifier — your customer ID or a persistent first-party cookie value. This one is quietly powerful and most setups skip it. It gives Meta a durable anchor that survives even when email is missing.
3. fbp and fbc. The Meta browser cookies. fbp you almost always have; fbc (the click ID) is the one people lose because they never capture fbclid from the landing URL and persist it. If someone lands from an ad and you don’t grab that fbclid into a first-party cookie, you’re throwing away the single strongest ad-attribution signal you’ll ever get.
4. Name, city, state, zip, country. Lower value individually, but they stack. On checkout events you already have this data — there’s no reason not to hash and send it.
5. client_ip_address and client_user_agent. Easy to forget in a server-side context because the server has to pass the user’s IP, not the server’s. I’ve debugged setups sending the Cloud Run container’s IP to Meta, which is worse than useless.
The deduplication trap that tanks EMQ
Here’s a subtle one. If your pixel and your CAPI event aren’t sharing a consistent event_id, Meta may treat them as separate events, and your match signals get split instead of combined. Proper deduplication doesn’t just stop double-counting — it consolidates identifiers onto one event so EMQ actually reflects everything you’re sending. I’ve raised scores a full point just by fixing dedup that someone thought was “a reporting thing.”
Mistakes to avoid
- Hashing without normalizing. Uppercase letters, stray spaces, and unformatted phone numbers silently kill match rates. The hash looks fine; the match is dead.
- Sending the server’s IP instead of the user’s. In sGTM, explicitly forward the client IP and user agent.
- Ignoring
fbc. Capturefbclidon the landing page, persist it, rebuildfbcserver-side. This is free attribution most people leave on the table. - Treating EMQ as a vanity metric. It’s not a report card. Lower match quality means the optimization algorithm learns from worse data, and that shows up in real spend.
- Sending PII you shouldn’t, unhashed. Always hash customer data client-parameters before they leave your server. Consent rules still apply.
What I tell clients
EMQ isn’t a checkbox, it’s a dial, and most setups are running it at half. The fix is rarely a rebuild — it’s normalization, capturing the click ID properly, adding external ID, and cleaning up deduplication. I aim for 8+ on purchase events for every e-commerce client, and I treat anything under 6 as an active leak in their ad budget.
If you’ve got CAPI “working” but your Meta performance is drifting, don’t look at the tag first. Open Events Manager, find that score, and start with email and phone. That one number will tell you more than an hour of debugging ever will.