Ad platforms and webshops

Meta Event Match Quality: how to raise your score

Event Match Quality scores how well your Conversions API events match Meta accounts. Learn which parameters raise it, how to hash them and what to aim for.

·Updated ·8 min read·By the ROASaurus team

Key takeaways
  • Event Match Quality (EMQ) is a score out of 10 that Meta gives each website event sent through the Conversions API.
  • Email and the click id (fbc) have the highest priority in Meta's list; phone, external_id, fbp and country come next.
  • Normalize contact data before hashing it with SHA-256, and never hash fbp, fbc, the IP address or the user agent.
  • Meta's developer documentation recommends aiming for 6.0 or higher; a Purchase built from order data carries the most identifiers, while PageView usually carries few.
  • Check the score per event under View details in Events Manager, and give it two days after a change, because it uses the last 48 hours of events.

Event Match Quality (EMQ) is a score out of 10 that Meta gives each website event you send through the Conversions API. It shows how well the customer information on that event can match it to a Meta account. You raise it by sending more of the right identifiers, formatted and hashed the way Meta expects.

This guide explains what the score measures, which customer information parameters count most, the hashing and normalization rules, why purchases from order data carry more identifiers than page views, what score to aim for, and where to check it.

What does Event Match Quality measure?

Meta calculates the score from two things: the quality of the customer information you send with a server event, and the share of those events that Meta matches to an account. A matched event tells Meta which person bought. Meta can then credit the purchase to the ad that person saw or clicked, and show your ads to people who are more likely to buy.

A few facts from Meta's documentation shape how you read the score:

  • It is per event. Purchase, AddToCart and PageView each get their own score, for standard and custom events alike.
  • It covers server events only. The score is available for website events sent through the Conversions API with action_source set to website. Events sent only by the browser pixel have no score.
  • It uses the last 48 hours. Send events steadily, or the score goes stale.
Example: Purchase event, Event Match Quality8.3
Under 6.0
6.0 or higher
010
An example Purchase score. Meta's developer documentation recommends aiming for 6.0 or higher.

Meta also notes that better matching may increase the additional conversions it reports for your Conversions API setup. A purchase that Meta cannot match is a purchase your ads do not get credit for.

Which customer information parameters raise the score?

Meta publishes a priority for each type of customer information. Send every parameter you have for an event, and start with the high-priority ones.

ParameterKeyMeta priorityWhere a webshop gets it
EmailemHighCheckout, account or a signup form
Click IDfbcHighThe fbclid in the landing page URL after an ad click
Phone numberphMediumCheckout, if the field is filled in
External IDexternal_idMediumYour customer id or a visitor id
Browser IDfbpMediumThe _fbp cookie
CountrycountryMediumBilling or shipping address
BirthdatedbMediumRarely available in a webshop
First and last namefn, lnLowCheckout
City and zip codect, zpLowBilling or shipping address
Priorities from Meta's help article on Event Match Quality. Email and the click id count most.

The IP address and the user agent are not in Meta's priority list, but Meta's developer documentation says that sending client_ip_address and client_user_agent may help matching. The user agent is required for website events anyway. Both must be the shopper's values, not the ones of your server.

How do you hash and normalize customer data?

Meta requires contact information to be hashed with SHA-256 before you send it. Hashing only works if every system writes the same value in the same way, so Meta defines a normal form for each field. Normalize first, then hash.

FieldRaw valueNormalized, before hashingRule
Email Anna.Berg@Example.com anna.berg@example.comTrim spaces, lowercase
Phone+1 (415) 555-013414155550134Digits only, with country code
First nameAnna-LenaannalenaLowercase, no punctuation
CitySan FranciscosanfranciscoLowercase, no spaces or punctuation
State (US)CaliforniacaTwo-letter code, lowercase
Zip (US)94107-123494107First five digits for US codes
CountryUnited StatesusTwo-letter ISO code, lowercase
Each normalized value is then hashed with SHA-256. The same person must always produce the same hash.

In code, the order of the steps is what matters:

Normalize, then hash (Node.js)
import { createHash } from 'node:crypto';
const sha256 = (s) => createHash('sha256').update(s).digest('hex');

// Normalize first, then hash.
const em = sha256(' Anna.Berg@Example.com '.trim().toLowerCase());
// hashes "anna.berg@example.com"

const ph = sha256('+1 (415) 555-0134'.replace(/\D/g, ''));
// hashes "14155550134"

const ct = sha256('San Francisco'.toLowerCase().replace(/[^a-z]/g, ''));
// hashes "sanfrancisco"

// Sent as they are, never hashed:
// fbp, fbc, client_ip_address, client_user_agent

Watch out for phone numbers with a trunk zero. A Dutch number written as +31 (0)6 1234 5678 becomes 310612345678 if you only strip the symbols. The correct form is 31612345678. Placeholder values are another trap: an email such as noemail@example.com that a shop fills in for guest orders is shared by many customers, so it cannot identify one person. Leave the field out instead.

Why do server events from order data carry more identifiers?

A page view happens before the visitor has told you anything. The browser knows a cookie id, perhaps a click id, an IP address and a user agent. A paid order is different: the shopper has typed in an email address, often a phone number, a name and an address.

PageView from the browser
  • fbp browser id
  • fbc, only after an ad click
  • IP address and user agent
  • Email only if the visitor gave it earlier
Purchase from order data
  • Email and phone from the checkout
  • Name, city, state, zip and country
  • Your customer id as external_id
  • IP address, user agent, fbp and fbc joined from the visit
A purchase built from the order carries the contact data that a page view does not have.

That is why a Purchase event sent from your server can score higher than PageView or ViewContent. A purchase event that only comes from the thank-you page has the browser identifiers, but not always the email and phone from the order.

Not every parameter can reach 100% of events, and that is normal. In the example below, the click id is on 38% of purchases, because only buyers who arrived from a Meta ad click have one.

Example store: share of Purchase events with each parameter
IP address
100%
User agent
100%
External ID
100%
Email
99%
Browser ID (fbp)
91%
Phone
64%
Click ID (fbc)
38%
Illustrative numbers. Track this coverage over time: a sudden drop in one parameter, not a low click id share, is the sign of a problem.

What is a realistic Event Match Quality target?

Meta's developer documentation says it typically recommends a score of 6.0 or higher, where possible. Treat that as the target for the events that carry contact data, above all Purchase. A Purchase built from order data carries email, one of the two high-priority parameters, and most of the medium-priority ones, so it is the event where the target is most realistic. Measure it rather than assume it: the score also depends on your customers.

Do not expect the same score on every event. PageView, ViewContent and AddToCart often have no contact data, because most visitors are anonymous until checkout. A lower score there is expected, and it is not a reason to collect email addresses earlier than your visitors want to give them.

Do not chase a 10 either. The score also depends on the share of events that Meta matches, and part of that is outside your control: some of your buyers have no Meta account, or used a different email address there. Consent matters too. In ROASaurus, with Respect visitor consent on, a visitor who declines marketing cookies has no stored click id or visitor id, so the paid order goes out with hashed order data and the order's IP address and user agent, but without fbc and fbp. More declines mean fewer identifiers per event. Our help page on consent explains the setting.

The useful question is not whether your score is high, but whether it changed. Compare each event with its own history after every change to your theme, checkout or tracking.

How do you check Event Match Quality in Events Manager?

  1. Open your dataset

    Go to Events Manager and select the name and id of your pixel or dataset.

  2. Open the event details

    Find the event, for example Purchase, and click View details.

  3. Read the Event matching tab

    It shows the score, the share of events that carry customer information, and tips to improve matching.

  4. Check Diagnostics

    The Diagnostics tab in Events Manager lists issues with your events and recommendations on how to fix them.

  5. Recheck after two days

    The score uses the last 48 hours of events, so a fix shows up fully about two days later.

The other tabs on the same page help too. Event coverage compares your server events with your pixel events, Event deduplication shows the share of events that carry a deduplication key such as the event id, and Data freshness shows how quickly your server events arrive. If you are still setting up the server side, start with our Meta Conversions API guide.

Why is my Event Match Quality low?

When one event scores lower than you expect, these are the usual causes:

  • The server sends its own IP address. If events pass through your server or a tag server, it must forward the IP address and user agent it recorded from the shopper, not its own.
  • The fbclid is lost. The click id is only in the URL of the landing page. If nothing saves it there, it is gone by checkout. Keep it exactly as it arrives, because it is case sensitive.
  • Contact data is hashed without normalizing, or sent unhashed.
  • The browser identifiers are hashed. A hashed fbp or fbc cannot be matched.
  • Purchases come only from the browser. A thank-you page event often lacks the email and phone that the order has. Sending the purchase from the order fixes that.

How ROASaurus sends customer information

ROASaurus builds the Purchase event from the order in your shop, so it carries the order's contact data. Email, phone, first and last name, city, state, zip and country are normalized and hashed with SHA-256. The shop's customer id and the ROASaurus visitor id go in hashed as external_id. The IP address, user agent, page URL and fbp are joined from the shopper's visit, and fbc is built from the fbclid that the storefront script saves when the visitor lands.

An event with no fbc, fbp, email, phone or IP address is skipped, because Meta cannot match it. The Meta integration page lists every field that is sent, and server-side tracking explains how orders are matched to the ad click. To follow the score, the Tracking health page reads each Meta pixel's Event Match Quality every day and raises an alert when the Purchase score falls below your minimum, 6.0 by default.

Sources

  1. Meta Business Help Center: About Event Match Quality
  2. Meta for Developers: Customer Information Parameters
  3. Meta for Developers: Verifying Your Setup
  4. Meta Business Help Center: View server event details in Meta Events Manager
  5. Meta for Developers: Best Practices - Conversions API

In ROASaurus

Keep reading

Ad platforms and webshopsCash on delivery conversion tracking and external checkoutsCash on delivery conversion tracking: why pixels miss COD and external checkout orders, when to send the purchase, and how to handle refused orders.Ad platforms and webshopsCCV Shop conversion tracking: a setup guideCCV Shop conversion tracking: send paid orders to Meta and TikTok with a signed webhook, link them to ad clicks, set up, test and handle late payments.Ad platforms and webshopsGoogle Ads enhanced conversions on ShopifyEnhanced conversions add hashed customer data to Google Ads purchases on Shopify. How they work, how they differ from offline imports, and the setup.
FAQ

Questions, answered

What is a good Event Match Quality score?

Meta's developer documentation recommends aiming for 6.0 or higher where possible. Purchase events built from order data carry the most identifiers; events from anonymous visitors, such as PageView, often score lower.

Why is my PageView score lower than my Purchase score?

Most visitors are anonymous when they view a page, so a PageView has no email or phone. A Purchase built from the order has the contact data from checkout, so it can be matched more often.

Do I hash the IP address and fbp for the Conversions API?

No. Hash contact data such as email, phone, name and address with SHA-256 after normalizing it. Send the IP address, user agent, fbp and fbc as they are.

How long does Event Match Quality take to update?

Meta calculates the score from the last 48 hours of events. After a change to your setup, give it about two days before you judge the result.

Does the browser pixel get an Event Match Quality score?

No. Meta shows the score for website events sent through the Conversions API with action_source set to website.

Every sale, traced to the ad that earned it

Server-side tracking, profit and lifetime value in one app. 14-day free trial, no credit card.

Start your free trial →