How to Improve Facebook Event Match Quality (EMQ) Score
What Is Event Match Quality and Why It Matters
Meta compares the hashed identifiers in your event payload against its account database. If the payload carries only a vague combination (say, country plus gender), Meta marks the event as unmatched. Unmatched events do not count toward attribution, so your ad account reports fewer conversions than actually happened.
The score appears per event name inside Events Manager under the dataset quality tab. It currently applies to web events only.
A low EMQ directly inflates your cost per result because the delivery algorithm receives weaker optimization signals. Media buyers who raised EMQ from 4 to 8+ routinely report 10-20% CPA improvement on the same budget.
For a broader look at why server events complement the browser pixel, see server-side tracking vs browser pixel.
Which Customer Parameters Affect EMQ
Meta scores events based on the quantity and quality of identifiers in the user_data object. The official hierarchy from the customer information parameters docs:
| Parameter | Key | Hashing | Normalization rule |
|---|---|---|---|
em | SHA-256 | Trim, lowercase | |
| Phone | ph | SHA-256 | Digits only, include country code, strip leading zeros |
| First name | fn | SHA-256 | Lowercase, no punctuation |
| Last name | ln | SHA-256 | Lowercase, no punctuation |
| City | ct | SHA-256 | Lowercase, no punctuation |
| State | st | SHA-256 | 2-letter ANSI code, lowercase |
| Zip | zp | SHA-256 | Lowercase, no spaces or dashes (5 digits for US) |
| Country | country | SHA-256 | 2-letter ISO code, lowercase |
| External ID | external_id | SHA-256 recommended | Any unique advertiser ID |
| Click ID | fbc | Never hash | Cookie value fb.1.{timestamp}.{fbclid} |
| Browser ID | fbp | Never hash | Cookie value fb.1.{timestamp}.{random} |
| IP address | client_ip_address | Never hash | Valid IPv4 or IPv6 |
| User agent | client_user_agent | Never hash | Full browser UA string |
Events that rely only on geo and gender are considered invalid and score near zero. Aim to send at least email or phone plus two additional identifiers on every event.
Sending both the client_ip_address and client_user_agent parameters increases match rates significantly, even when other identifiers are missing.
How to Check Your EMQ Score
In Events Manager
Navigate to Events Manager, pick the relevant data source, and open the overview or quality tab. Each event name shows a composite EMQ score out of 10 plus a breakdown of which identifiers contributed.
Via the Dataset Quality API
The official Dataset Quality API returns per-event scores programmatically:
curl -G \
graph.facebook.com/v25.0/{dataset_id} \
-d "fields=web{event_name,event_match_quality}" \
-d "access_token={access_token}"The response includes a composite_score and match_key_feedback showing coverage percentages for each identifier type. Use this in a scheduled script to alert when scores drop below your threshold.
If you are just getting started with sending server events, follow the Conversions API setup guide first.
Step-by-Step Fixes for Low EMQ
1. Fix normalization before hashing
The most common cause of low EMQ is hashing dirty data. A single trailing space or uppercase letter produces a completely different hash.
import hashlib
def hash_email(raw: str) -> str:
return hashlib.sha256(raw.strip().lower().encode("utf-8")).hexdigest()
def hash_phone(raw: str) -> str:
digits = "".join(c for c in raw if c.isdigit())
digits = digits.lstrip("0")
return hashlib.sha256(digits.encode("utf-8")).hexdigest()2. Add missing identifiers
Audit your payload. If you send only email, add phone, name, and location fields. Every additional matched key raises the composite score.
3. Pass click and browser cookies
The fbc and fbp cookies tie the server event to a specific browser session. Without them, Meta loses the link between the ad click and the conversion. Read the cookie values server-side from the request headers or store them in a first-party cookie on the landing page.
4. Always include IP and user-agent
These two fields are never hashed and require no normalization. Forward them from the incoming HTTP request. They alone can lift match rates by several points.
5. Deduplicate properly
If you fire both pixel and CAPI for the same event, include a shared event_id so Meta deduplicates rather than double-counting. See Facebook pixel and CAPI event deduplication for the exact pattern.
Common Mistakes That Tank Your Score
| Mistake | Symptom | Fix |
|---|---|---|
| Uppercase or spaces in email before hashing | EMQ stuck at 3-4 | Trim and lowercase before SHA-256 |
| Phone without country code | Partial matches only | Prepend country code, strip leading zeros |
| Only country + gender sent | Event marked invalid | Add email or phone plus name |
| fbc/fbp missing | Click-to-conversion link broken | Read cookies server-side on every request |
| IP/user-agent omitted | Lower match rate than peers | Forward from HTTP request headers |
If you manage multiple ad accounts or pixel destinations manually, Pixel Activator lets you activate and audit pixel events without writing code. For teams that need automated routing across trackers and platforms, MOST handles normalization, hashing, and deduplication in one pipeline.
