Skip to content
Paid mediaAugust 21, 2026 · 10 min read

Meta Event Match Quality: what actually moves the score

Event Match Quality does not go up by changing a setting inside Meta. It is a consequence of how much you capture and how much of it survives to the send — and both are measurable on your side, today.


Event Match Quality — EMQ — is a 0 to 10 score Meta assigns to each event you send through the Conversions API. It answers a single question: with the data that arrived in this event, can Meta tell whose it is?

Most EMQ conversations start in the wrong place, hunting for a setting inside Events Manager. That setting does not exist. The score is a mirror: it measures what you captured and what you sent. Both ends are on your side.

What each parameter is worth

user_data fields are not equal. It pays to know where to spend capture effort before you start asking visitors for more.

ParameterWhat it resolvesPractical weight
em (email)Direct account identificationThe strongest single field. On its own it lands the score around 5 to 6
ph (phone)A second strong identity, near universal in some marketsAdded to email, it pushes the score to 7 or above
fbcThe ad click, derived from the fbclid in the URLWhen present it is direct attribution, not inference
fbpThe browser, used to stitch sessions of the same personMedium. Connects the anonymous visit to the identified one
external_idYour own stable identifier for the personMedium, and it is what makes events consistent with each other
fn, lnFirst and last nameLow alone, relevant in combination
ct, st, zp, countryLocationLow alone. Together they break ties

Note what the table does not say: there is no magic parameter. Email is the first step, and everything after it comes from stacking weak signals — which is exactly the work nobody wants to do.

A low score is almost never a configuration problem. It is a capture problem: either the data does not exist, or it exists in your database and never made it into the send.

The measurement that settles the argument in ten minutes

Events Manager shows an aggregate score, hours late, without telling you what was missing. There is a far more useful signal, and it lives on your side: across the events you delivered in the last seven days, what percentage carried each parameter.

parameter coverage, over what was actually delivered
-- Parameter coverage over the events you ACTUALLY delivered.
-- Not what the payload could have carried: what left the building.
SELECT
  event_name,
  count()                                    AS sent,
  round(100 * countIf(has_email), 1)         AS pct_email,
  round(100 * countIf(has_phone), 1)         AS pct_phone,
  round(100 * countIf(has_fbc), 1)           AS pct_fbc,
  round(100 * countIf(has_external_id), 1)   AS pct_external_id
FROM deliveries
WHERE sent_at >= now() - INTERVAL 7 DAY
GROUP BY event_name
ORDER BY sent DESC

That query changes the conversation. If email shows up in 30% of sends, no adjustment on Meta's side will save matching, and arguing about hashing or formatting is beside the point: 70% of the emails are missing.

A real result that makes the point

In one account we audited, the same pixel, in the same week, produced two completely different numbers: the page view event went out with email on 11.4% and phone on 10.3%, while the abandoned cart event from the same account went out with both at 100%.

That is not a contradiction. It is about when capture happens: at the cart the person has already identified themselves, on the visit they have not. The correct reading is that EMQ is per event — comparing the score of different events means nothing.

The three mistakes that cancel out your capture work

1. Normalizing after hashing, or not at all

sha256 is of the exact string. An email with a capital letter or a stray space produces a different hash from the same email cleaned up, and only the clean one matches. Before hashing: lowercase, trim. Phone: digits only, with the country code in front.

2. Sending only what arrived in the event payload

This is the most expensive and the most common. The person's email usually already exists in your database, tied to them by an earlier purchase or a form filled two months ago. If user_data is assembled from the request that just came in, you throw away what you already knew. user_data should come from the identity graph, not from the event body.

3. Inventing what is missing

The temptation to fill in gender or city by inference is strong, and the effect is the opposite of what you want: a wrong guess is not neutral, it is noise Meta uses to try to match the wrong person.

We measured this. A name dictionary used to infer gender covered 87.7% of Brazilian traffic and did not recognise extremely common local names — and accents broke the lookup in both directions. The result was that the gender parameter went out on roughly half of the events where a name existed. The fix was not to guess better: it was to leave the field empty when the name is ambiguous.

A missing parameter costs you one signal. A wrong parameter costs you the whole match for that event.

The ceiling nobody mentions

It is worth saying what a high score does not fix. EMQ measures person recognition, not conversion quality. An event scoring 9 that points at an expired payment still teaches the campaign to look for people who start checkouts and never pay.

That is why both fronts move together, in this order: first the filter on what goes up, then the coverage of who it is. Raising the score of an event that should not be sent at all only makes the campaign wrong with more confidence.

In CrazyLeads, user_data is assembled from the identity graph — the email someone left in any source travels with the purchase — normalisation and hashing are the default behaviour, and parameter coverage is a screen, not a query you have to write.

Start measuring what actually becomes revenue

Create a free account, connect your first source and see your first lead timeline today. No card required.