A low Event Match Quality score is Meta quietly telling you it cannot recognize the people behind your conversions, and every point you leave on the table is weaker optimization and wasted spend. The good news is that EMQ is fixable with a handful of deliberate moves. Here is how to improve it.
What EMQ actually measures
Event Match Quality, scored from 0 to 10 in Events Manager, reflects how well the customer information you send lets Meta match an event to a real account. The richer and cleaner the identifiers, the higher the score, and a higher score means Meta can attribute and optimize more accurately. Anything above 8 is strong; a pixel-only setup usually plateaus around 4 to 6.
Send the strongest identifiers
Not all parameters carry equal weight, so lead with the ones that match best:
- Email and phone number are the strongest signals and the first thing to add.
- An external_id, your own stable user identifier, adds real matching power.
- fbc and fbp, the click and browser cookies, help especially for people who arrived from a Meta ad.
- Client IP address and user agent round out the picture as supporting signals.
Hash and format correctly
The most common reason a score stays low is a formatting or hashing mistake, which silently makes an identifier unmatchable. Personal data like email and phone must be normalized and SHA-256 hashed before it leaves, while fbc, fbp, IP, and user agent are sent as-is.
// Normalize, then SHA-256 hash PII before sending; leave cookies/IP raw
const user_data = {
em: sha256(email.trim().toLowerCase()), // email: lowercase + trim
ph: sha256(phone.replace(/[^0-9]/g, '')), // phone: digits, E.164 style
external_id: sha256(userId),
fbc: getCookie('_fbc'), // sent unhashed
fbp: getCookie('_fbp'), // sent unhashed
client_ip_address: ip, // added server-side
client_user_agent: ua
};
Go server-side to lift the ceiling
A browser-only Pixel can only send what the browser exposes, which is why it stalls in the mid-range. The Conversions API, running server-side, can attach richer first-party data like a verified email and the real client IP, which is what pushes EMQ into the 8-to-10 band. If your score is stuck, adding CAPI is almost always the single biggest lever.
Send more parameters, not just more events
A frequent mistake is sending a high volume of events that each carry only one weak identifier. EMQ rewards depth per event, so it is better to send fewer events rich with email, phone, external_id, and cookies than many events with just an fbp. Audit a sample of your events and count how many strong identifiers each actually carries.
Verify in Events Manager
Treat EMQ as a number you monitor, not a thing you set once. Check the score per event in Events Manager, watch it after each change, and confirm hashed fields show as matched rather than rejected. If a score drops, a recent formatting or consent change is usually the cause, and catching it quickly keeps your optimization from degrading unnoticed.
Send whatever you have, even when it is partial
A common mistake is withholding the whole user_data block because one field is missing. Match quality is additive, so a conversion with just a hashed email still matches far better than one with none, and adding phone or external_id on top only helps. Send every identifier you legitimately have for each event, and do not let a missing phone number stop you from sending the email you do have. Partial data beats empty data every time, as long as each field you do send is formatted and hashed correctly.
A low EMQ is Meta admitting it cannot see the people behind your conversions, and each point back is sharper optimization and less wasted budget. Send the strongest identifiers, hash and format them correctly, move to server-side to lift the ceiling, and watch the score in Events Manager. Do that and Meta starts recognizing your customers again, which is the whole point of sending the data in the first place.
Want a stronger data analyst role or a raise? Grab the FREE Product Analyst Playbook and get the exact roadmap to your next offer.
