E-Commerce
A Complete Guide to Meta Event Match Quality (EMQ) for Shopify Brands
Meta Event Match Quality (EMQ) is a score from 1 to 10 that shows how well the customer information sent with your events can be matched to a Meta account. Meta recommends aiming for 6.0 or higher, and the score is calculated separately for each event, so Purchase and PageView will rarely look the same.
This guide explains what EMQ measures, what a good score looks like for each event on a Shopify store, which parameters move it, seven steps to raise your score, the mistakes that lower it, and how to pass matching data with sign-up events in Google Tag Manager. For how events reach Meta in the first place, start with our guide to the Meta Conversions API and first-party data.
What is Meta Event Match Quality?
Event Match Quality is Meta's rating of how well the customer information parameters on your server events can be matched to a Facebook or Instagram account. Meta's setup verification guide describes it as a score from 1 to 10, shown on the Overview page in Events Manager for a pixel (dataset) that uses the Conversions API, and recommends a score of 6.0 or higher where possible.
Despite the name, EMQ doesn't grade the event itself. It answers one question: when Meta receives this event, can it tell which person it came from? We find it more useful to think of it as an audience match score. An event Meta can't tie to a person still counts in your totals, but it can't teach Meta's delivery system who your buyers are.
Three things to know up front:
- It's per event. Purchase, AddToCart, ViewContent and PageView each get their own score.
- It's driven by the identifiers you send. Email, phone, the ad click ID and the other customer information parameters are what Meta matches on.
- It's a diagnostic, not a goal. A low score can hold performance back, but a high score doesn't create performance on its own. We treat it like a check-engine light.
How is Event Match Quality scored?
Meta doesn't publish its formula. What it does document is the set of customer information parameters it uses for matching, and Events Manager shows which parameters arrive with each event and how often.
In practice, the score reflects:
- Which identifiers you send. Some carry far more weight than others (see the parameter table below).
- How often you send them. An identifier present on 95% of events helps more than one present on 20%.
- Whether they're formatted correctly. Meta matches on normalized, SHA-256 hashed values, so an email hashed before it was lowercased won't match.
Scores for low-volume events can swing noticeably from day to day, so judge trends rather than single readings.
What is a good Event Match Quality score?
Meta's guidance is 6.0 or higher. Across the Shopify accounts we work with, healthy scores look different at each stage of the funnel, because the data available changes as a shopper moves toward checkout:
| Event | Healthy range | Low end |
|---|---|---|
| Purchase | About 8.9 to 9.3 | Below 8.5 |
| InitiateCheckout | Around 8.5 | Below 7.5 |
| AddToCart and ViewContent | Around 7 to 7.5 | Low 6s |
| PageView | Around 7 to 7.5 | 6.2 to 6.5 |
These are our observations, not Meta benchmarks. They move with your traffic mix and your tracking setup.
Why is PageView EMQ lower than Purchase?
At Purchase you have everything: the shopper typed their email, phone and shipping address into checkout. On a PageView you often have none of that, only the browser ID, IP address, user agent and, if the visit came from an ad, the click ID. Purchase scores also have little room to move, because most of the data is already there. The upper funnel is where tracking quality makes the biggest difference.
When is a lower score expected?
Brands with a lot of organic, email or affiliate traffic will see lower upper-funnel scores, because those visitors arrive without a Meta click ID. That doesn't mean tracking is broken. A useful check: the share of your events carrying a click ID should roughly match the share of your traffic coming from Meta ads. Our guide to fbclid and the _fbc cookie explains how to measure it.
Which parameters affect Event Match Quality?
Meta's customer information parameters, with Meta's hashing rules and how much each one tends to matter in the accounts we audit:
| Parameter | What it is | Hashing | Weight |
|---|---|---|---|
fbc | Click ID from the fbclid URL parameter or _fbc cookie | Do not hash | Highest: identifies the person, the ad and the time of the click |
em | Email address | Hash (SHA-256) | High: stable for years |
ph | Phone number with country code | Hash | Good, but numbers get recycled |
external_id | Your own stable customer ID | Hashing recommended | Helps Meta recognize the same person across visits |
fbp | Browser ID from the _fbp cookie | Do not hash | Supporting |
client_ip_address, client_user_agent | Connection and browser details | Do not hash | Supporting only |
fn, ln, ct, st, zp, country | Name and location | Hash | Useful together, minor alone |
db, ge | Date of birth, gender | Hash | Minor |
Two practical consequences:
- Click ID and email do most of the work. If your upper-funnel events carry neither, their score will sit in the low 6s however many minor fields you add.
- Sending a field isn't the same as sending it well. Meta's parameter reference sets normalization rules for each field (for example, phone numbers as digits only with a country code, and US ZIP codes as the first five digits). Step 4 below has the format for each field.
For the full list of what a Conversions API event contains, see what data the Conversions API sends to Meta.
How to improve your Event Match Quality score in 7 steps
Before changing anything, check your scores in Events Manager and note which identifiers are missing, and on which events. The steps are in the order we work through them in the Shopify accounts we audit. The first three account for most of the gain.
1. Send events through the Conversions API as well as the pixel
The browser pixel misses events when ad blockers, browser privacy features or slow pages get in the way, and it only knows what the browser knows. The Conversions API sends events from your server, where the order, the customer's email and their phone number are available.
Send both, and give each matching pair the same event_name and event_id. Meta's deduplication guide keeps the first event and discards a duplicate received within 48 hours, so you get the coverage of two sources without double counting. Our pillar explains how Meta deduplicates pixel and CAPI events in more detail.
2. Pass the click ID with every event
When someone clicks a Meta ad, the landing page URL carries an fbclid parameter. The pixel stores it in the _fbc cookie, and the Conversions API sends it as fbc. It's the strongest identifier you can send, because it ties the event to a specific person and a specific ad click.
Most stores lose it somewhere: a redirect that drops the query string, a landing page on another domain, or a cookie Safari has expired. Capture fbclid when the visitor lands, store it against that visitor on your server, and attach it to every later event, including a purchase days later. Our guide to fbclid and the _fbc cookie covers the format and where it goes missing.
3. Send hashed email and phone whenever you know them
Email is the most stable identifier most stores hold, and phone is the next best. Send them on every event where you know who the visitor is, not only on Purchase: logged-in customers, visitors who arrived from one of your marketing emails, and anyone who has filled in a sign-up form. If a customer gave you both, send both, so Meta has a second way to match when one doesn't.
4. Normalize identifiers before you hash them
Meta matches on SHA-256 hashes, and two hashes only match if the values were formatted the same way before hashing. John@Gmail.com (with a trailing space) and john@gmail.com produce different hashes. Meta's customer information parameters reference sets the format for each field:
| Parameter | Format before hashing | Example |
|---|---|---|
em (email) | Trim spaces, lowercase | john_smith@gmail.com |
ph (phone) | Digits only, with country code; no symbols, letters or leading zeros | 16505551212 |
fn, ln (first and last name) | Lowercase, no punctuation | mary |
ct (city) | Lowercase, no punctuation, special characters or spaces | newyork |
st (state) | 2-letter code, lowercase | ca |
zp (ZIP code) | Lowercase, no spaces or dashes; first 5 digits for US codes | 94035 |
country | ISO 3166-1 alpha-2 code, lowercase | us |
Phone numbers are the field we see broken most often. A number stored as (650) 555-1212, or with a leading +, has to become 16505551212 before it's hashed. If a tool hashes for you, check that it normalizes first.
For a worked example and the privacy position, see what a hashed email is.
5. Add the supporting parameters
These rarely move the score on their own, but they help Meta confirm a match:
external_id: your own stable ID for the customer or visitor, sent in the same format on every event. Meta recommends hashing it.fbp: the browser ID from the_fbpcookie. Don't hash it.client_ip_addressandclient_user_agent: taken from the shopper's browser request. Don't hash either. Meta requires the user agent on website events sent through the Conversions API.
Meta also asks for the real IP address of the shopper's browser. A server-side setup that sends its own server's IP instead makes every event look like it came from the same place.
6. Capture identifiers at sign-up with advanced matching
A newsletter or SMS sign-up is often the first time a store learns who an anonymous visitor is. Track it as Lead or CompleteRegistration (Meta reserves Subscribe for the start of a paid subscription), and pass the email or phone to the pixel through manual advanced matching. The next section shows how to set this up in Google Tag Manager.
7. Connect earlier sessions to the person who buys
Steps 1 to 6 improve what each session sends. The remaining gap is between sessions. A shopper clicks an ad on their phone on Monday, comes back from an email on Thursday and buys on a laptop. With nothing connecting those visits, Monday's events carry only a click ID, Thursday's carry only an email, and none of them scores as well as it could.
Identity resolution connects them. Once a visitor is known, their email and original click ID can be attached to later events, and a stable external_id links their earlier browsing to the same person. This is where upper-funnel scores move most, because many ViewContent and AddToCart events come from returning visitors who aren't identified in that session.
What mistakes lower Event Match Quality?
- Hashing before normalizing. Uppercase letters, spaces or a
+in a phone number produce a hash Meta can't match. - Hashing what shouldn't be hashed.
fbc,fbp, IP address and user agent must be sent as plain values. - Identifiers on Purchase only. Many setups attach email and phone at checkout and nothing earlier, which leaves upper-funnel scores in the low 6s.
- Losing the click ID. Redirects, link shorteners and expired cookies drop
fbclidbefore the purchase happens. - Sending the server's IP address. Events that carry your server's IP rather than the shopper's all look like one visitor.
- Duplicates without a shared event ID. If pixel and server events don't share an
event_id, Meta can't deduplicate them and counts the conversion twice. Our guide to Meta attribution pitfalls shows how to spot this. - Changes that break tracking quietly. A theme update, a new checkout app or a consent banner change can remove a parameter overnight. Recheck your scores after any tracking change.
How do you pass matching parameters with Subscribe and Lead events in GTM?
Sign-up forms are one of the few places a store learns who an anonymous visitor is before checkout, so they matter for match quality. Three things to get right when you set them up in Google Tag Manager:
Use the right event
Meta's standard events reference defines Subscribe as a person starting a paid subscription. A newsletter or SMS sign-up is a Lead (Meta: "when a sign up is completed") or CompleteRegistration (a completed registration form). Subscription brands should send Subscribe for the first paid subscription only, and shouldn't send recurring renewal orders as Purchase events, which teaches Meta that renewals are new conversions.
Pass the email or phone to the pixel's advanced matching
For browser events, Meta's advanced matching documentation has you pass customer data as the third argument of fbq('init') in the pixel base code, and says values passed this way are hashed automatically by the pixel using SHA-256. Meta also notes that the values must be in the base code to count as manual advanced matching. In GTM, that means making the normalized email or phone from the form available (for example through the data layer) to the tag that initializes the pixel, not only to a later event tag.
Send the same identifiers server-side
If you also send the sign-up through the Conversions API, include the hashed email or phone in the event's user data and reuse the browser event's ID as event_id, so Meta can deduplicate the two. Then check the event's details in Events Manager: email coverage on Lead should rise to match your form completions.
Step-by-step: a Lead or Subscribe event in GTM
- Push the sign-up to the data layer. When the form submits successfully, push an event such as
lead_signupwith the normalized email or phone and a uniqueevent_id. - Create Data Layer Variables in GTM for the email, phone and
event_id, so every tag reads the same values. - Fire the Meta event tag on that push. Send
fbq('track', 'Lead', {}, {eventID: ...})with theevent_idvariable as the event ID, the format in Meta's deduplication guide. UseSubscribeonly for the first paid subscription. - Send the server-side copy. Send the same event through the Conversions API with the hashed email or phone in
user_dataand the sameevent_id. - Carry the identifier forward. Store the email first-party once it's known and pass it in the pixel base code's
fbq('init')on later page loads, so the visitor's ViewContent and AddToCart events carry advanced matching too. - Verify. Submit a test sign-up and check Test Events in Events Manager or Meta Pixel Helper: the
Leadevent should arrive from both browser and server with one deduplicated count and the email or phone listed under advanced matching parameters.
Once a visitor has signed up, that email is known. Attaching it to their later ViewContent and AddToCart events is what lifts upper-funnel scores, which is where identity resolution comes in.
How do you check your Event Match Quality in Events Manager?
- Open Events Manager and select your dataset (pixel).
- On the Overview, pick an event such as Purchase and open its details.
- Find Event Match Quality for the score and the customer information parameters Meta is receiving, with how often each one arrives.
- Check Diagnostics for formatting or hashing problems Meta has flagged.
- Repeat for InitiateCheckout, AddToCart and ViewContent, and note which parameters drop away further up the funnel.
Read the parameter list as a coverage report. A parameter that arrives on 30% of events helps far less than one on 95%. The two that matter most are the click ID (fbc) and email (em). If an event is missing both, start there.
While you're there, confirm the event arrives from both the browser and the server, and that the two lines move together. If you're unsure whether your pixel and Conversions API are set up correctly in the first place, start with our Meta Pixel Helper guide.
Timing. In our experience, the score refreshes several times a day, fixes start to show within 48 to 72 hours, and the score settles after about two weeks. Judge changes on full days of data, and expect low-volume events to move around more than Purchase. If the score doesn't move after a fix, open the event's parameter list again: the usual reason is that the new parameter is arriving on only a small share of events.
What does Event Match Quality affect?
EMQ matters because of what matching unlocks, not because of the number itself:
- Attribution. An event Meta can't match to a person can't be credited to the ad that person saw, so low match quality shows up as under-reported conversions in Ads Manager.
- Optimization. Meta's delivery system learns from the people it can identify. Meta's own verification guide notes that a higher score can help lower your cost per action.
- Audiences. Retargeting pools, lookalike seeds and exclusions are built from matched people. Poor matching shrinks them and lets existing customers slip into prospecting.
- Upper-funnel signal. Meta uses ViewContent, AddToCart and InitiateCheckout to understand who is showing intent. Unmatched upper-funnel events give it little to work with.
How does Upstack improve Event Match Quality?
Most low scores aren't a tracking problem, they're an identity problem: the shopper who bought is the same person who clicked the ad three days earlier on a phone, but nothing connects the two sessions.
Upstack Signal handles steps 1, 2, 3, 5 and 7 above for Shopify stores, and resolves each event to a person before it reaches Meta. It restores the click ID across sessions and devices, attaches hashed email and phone when the shopper is known (including visitors arriving from a Klaviyo email), adds a stable external ID, and sends browser and server events deduplicated on a shared event ID. Setup runs through the Shopify integration.
Frequently asked questions
What is a good Event Match Quality score?
Meta recommends 6.0 or higher. On Shopify stores with healthy tracking, we typically see Purchase between about 8.9 and 9.3 and upper-funnel events such as PageView around 7 to 7.5, with low 6s on the upper funnel indicating missing identifiers.
Why is my PageView EMQ lower than my Purchase EMQ?
Shoppers give you their email, phone and address at checkout, so Purchase events carry far more identifiers than an anonymous PageView. Lower upper-funnel scores are normal; the goal is to raise them by attaching identifiers you already know, such as a click ID or an email from an earlier sign-up.
Does Event Match Quality affect ad performance?
Indirectly. EMQ measures how many of your events Meta can tie to a person, and matched events are what Meta uses for attribution, optimization and audiences. Meta notes a higher score can help lower cost per action, but a high score doesn't make up for weak creative or offers.
Where do I find my Event Match Quality score?
In Events Manager, select your dataset (pixel), open an event such as Purchase from the Overview and view its details. The Event Match Quality section shows the score and the customer information parameters Meta receives for that event, with how often each one arrives.
Should I use the Subscribe event for newsletter sign-ups?
No. Meta defines Subscribe as the start of a paid subscription. Use Lead or CompleteRegistration for newsletter and SMS sign-ups, and pass the sign-up's email or phone through advanced matching so the event can be matched.
What is the fastest way to improve Event Match Quality?
Attach the click ID (fbc) and a hashed email to every event where you have them, not only to Purchase. Those two identifiers carry the most weight, and most stores already capture both somewhere but don't send them with upper-funnel events.
Should I hash fbc and fbp before sending them to Meta?
No. Meta's customer information parameters reference says fbc, fbp, the client IP address and the user agent must not be hashed. Email, phone, name, city, state, ZIP code, country, date of birth and gender must be hashed with SHA-256, and Meta recommends hashing external_id.
What phone number format does Meta want?
Digits only, including the country code, with no symbols, letters, spaces or leading zeros: for example, 16505551212 for a US number. Normalize to that format first, then hash it with SHA-256. A + sign or any formatting characters will produce a hash that doesn't match.
Why did my Event Match Quality score drop?
Usually because a parameter stopped arriving. Compare the event's parameter list with an earlier period: theme updates, new apps, checkout changes and consent banner changes can remove the click ID or email without any error. A shift in traffic toward organic, email or affiliate visitors can also lower upper-funnel scores, because those visitors arrive without a Meta click ID.
Key takeaways
- EMQ is Meta's 1 to 10 score for how well your events' customer information matches a Meta account; Meta recommends 6.0 or higher.
- Scores are per event. Purchase typically runs highest; upper-funnel events are where tracking quality shows.
- Click ID and email carry the most weight; IP, user agent and name fields only support them.
- Normalize before hashing (phone as digits with country code, email lowercase), and never hash
fbc,fbp, IP address or user agent. - Upper-funnel scores move most when earlier sessions are connected to the person who buys.
- Use Lead or CompleteRegistration for sign-ups, pass the email through advanced matching, and send the same identifiers server-side.
- Treat EMQ as a diagnostic: fix what a low score reveals rather than chasing the number.
Want to know what's holding your scores back? Request a demo and we'll review your Meta setup.
Want similar results?
Start free for 21 days and see what clean signal does for your performance. No card, no contract.