You can tell how important EMQ is by the number of videos I’ve made about it over the years. On this page alone you’ll find 11 of them. And it wasn’t just videos that kept me up at night — PixelYourSite has many small tweaks and features built specifically to find and send the kind of data Meta wants for CAPI events.
Event Match Quality is Meta’s score for how well your Conversions API events can be matched to a real Meta user. A higher EMQ means more attributed conversions and better ad delivery. This guide explains how Meta scores it, what PixelYourSite does for you automatically, and what you can do to push it higher.
If you have PixelYourSite Pro installed, your CAPI events already carry the strongest matching signals available — IP, user agent, fbp and fbc cookies, and a stable External ID. For logged-in users and WooCommerce or EDD purchases, PYS adds hashed email, name, phone, and full billing address. You don’t have to set any of that up. The work in this guide is about extending that coverage to anonymous visitors and to forms that PYS can’t read out of the box.
What EMQ is
Each CAPI event carries a set of customer identifiers. Meta uses them to attach the event to a Meta account. EMQ is the 0–10 score in Events Manager that tells you how confidently Meta could do that.
EMQ is shown only for CAPI events. Browser Pixel events go through the same matching, but Meta doesn’t expose a score for them.
Different events score differently. A PageView from anonymous traffic always scores lower than a Purchase at a logged-in checkout. Focus on the score of your conversion events — those are the ones that drive delivery.
The matching signals
| Signal | What it is | Hashed |
|---|---|---|
client_ip_address | Visitor IP (IPv4 or IPv6) | No |
client_user_agent | Browser UA string | No |
fbp | First-party browser ID cookie set by the Meta Pixel | No |
fbc | Click ID cookie, set when a visitor lands from a Meta ad | No |
em | SHA-256 | |
ph | Phone, E.164 digits only (e.g. 16505551212) | SHA-256 |
fn / ln | First / last name | SHA-256 |
ct / st / zp / country | City / state / ZIP / country | SHA-256 |
external_id | Any stable visitor or customer ID | Recommended |
fb_login_id | Meta App-Scoped ID from a Facebook Login | No |
PixelYourSite hashes what needs hashing before sending. Don’t pre-hash anything yourself.
fbp and fbc
_fbp (Browser ID). Set by the Meta Pixel script the first time it runs on your domain. A random first-party identifier that persists for 90 days. Every event — browser and CAPI — carries it.
_fbc (Click ID). Set when a visitor lands via a Meta ad with an fbclid URL parameter. Stored for 90 days. Without an ad click in the chain, _fbc doesn’t exist — that’s not a bug.
PixelYourSite reads both on every CAPI event and forwards them when they exist. It never fabricates a missing cookie.
Watch: FBP and FBC explained
What PixelYourSite sends on every CAPI event
No configuration needed:
client_ip_address— IPv6 if the visitor’s connection has one, otherwise IPv4.client_user_agent— the browser’s UA string.fbp— read from_fbpwhenever it exists.fbc— read from_fbcwhenever it exists.external_id— PYS issues apbidbrowser ID for every visitor and sends it as External ID.
For logged-in WordPress users, PYS adds: email, first name, last name. With WooCommerce active: phone, city, state, ZIP, country (from billing). With Social Connect’s Facebook Login: fb_login_id.
For WooCommerce and EDD Purchase events, PYS uses the full billing details from the order. Purchase is almost always your highest-EMQ event.
How to push EMQ higher
The biggest gains come from identifying anonymous visitors who never log in. These levers are ordered by impact.
1. Capture identity from forms
PYS listens for blur events on input fields and stores the values in a pys_advanced_form_data cookie. Every CAPI event after that carries those identifiers, even for visitors who never log in.
Where: PixelYourSite Pro → Global Settings → Automatic data detection.
Default coverage:
input[type="email"]— detected automatically.input[type="tel"]— detected automatically.- Text inputs with
namematchingfirst_name,last_name,phone,tel.
To extend it:
- Open one of your forms and inspect a field. Note the
nameattribute. - Add any non-standard values to the matching list:
- First name field names — e.g.
fname,your-name,billing_first_name. - Last name field names — e.g.
lname,billing_last_name. - Phone field names — e.g.
your-phone,billing_phone. - Email field names — only needed for plain text inputs that look like email fields.
- First name field names — e.g.
- Save.
Phone numbers need country codes. Meta expects E.164 format (16505551212, not 6505551212). PYS strips non-digits but does not add a country code. Use a country selector or a hardcoded prefix on the form.
Watch: Automatic form data detection
2. Add Facebook Login with Social Connect
fb_login_id is one of the strongest match signals because it identifies the user directly. The Social Connect plugin adds Facebook Login to your WordPress site and stores the App-Scoped ID in user meta. PYS sends it on every CAPI event for that user.
For sites with accounts, this typically lifts EMQ by several points on engagement events (AddToCart, Lead, ViewContent).
Setup:
- Install and activate Social Connect.
- Configure the Facebook App in Social Connect (App ID, App Secret).
- Place the login button using the provided shortcode or block.
- Verify in Events Manager → Test Events that
fb_login_idappears on events fired by logged-in users.
Watch: Better EMQ with Facebook Login
3. Capture identity from URL parameters
If your traffic arrives with identifying parameters (personalised email links, SMS campaigns), PYS can save them into the persistence cookie.
Where: PixelYourSite Pro → Global Settings → Automatic data detection → URL parameters.
Add the parameter names your campaigns use. PYS saves them on the first matching page load and reuses them on every event for that visitor.
Watch: EMQ and URL parameters
4. Encourage account creation and login
A logged-in WordPress user gives PYS access to email, name, and (with Woo) the full billing address. Every event for that session carries those signals. Nothing to configure — the lever is your site’s UX.
5. Keep External ID stable across subdomains
If your site spans subdomains, turn on PixelYourSite → Global Settings → Other stuff → Track domains and subdomains together. Without it, the pbid resets at each subdomain boundary and lookback matching weakens.
Watch: External ID — how it improves matching
6. Turn on Automated Advanced Matching in Events Manager
Done outside PYS, in Events Manager → Data Sources → your Pixel → Settings → Automatic Advanced Matching → On. Meta’s pixel script then scans the page for identifiable data and sends it with browser events. It’s additive with PYS’s coded Advanced Matching.
Reading the warnings
“Missing fbc.” _fbc only exists for visitors who arrived from a Meta ad. Organic, direct, email, and other-channel traffic don’t produce it. Investigate only if you run Meta ads at scale and fbc is missing on traffic that did click an ad.
“Events not using IPv6.” PYS uses IPv6 when the visitor’s ISP provides one. WordPress can’t force it.
“PageView has low EMQ.” Expected for anonymous traffic. Look at conversion events instead.
“Score dropped suddenly.” Common causes:
- A form’s field
nameattributes changed and PYS no longer recognises them. - A consent banner change is blocking PYS for more visitors.
- A CDN configuration change is masking the visitor IP.
- A login regression is breaking the WP-user identity path.
Watch:
Limits and edge cases
Things PYS can’t fix or that cap your EMQ:
- Privacy browsers (Safari ITP, Firefox ETP) clear or partition first-party cookies.
_fbpand_fbcmay not persist for those visitors. - Ad blockers stop the Meta Pixel from loading. No
_fbp, no_fbc, no Advanced Matching. CAPI still fires server-side but matches less well. - Full-page caching plugins (WP Super Cache, LiteSpeed full HTML, Cloudflare Cache Everything) can serve cached HTML to logged-in users and break the user-identity path. Exclude logged-in users from your cache.
- CDN and reverse proxies. If
client_ip_addressis the proxy’s IP instead of the visitor’s, IP-only matching tanks. Configure WordPress to read the real IP fromX-Forwarded-For/CF-Connecting-IP. - VPNs and Tor. The IP isn’t matchable. Nothing to do.
- Visitors who never touch a form give you only cookies and IP/UA.
- Phone numbers without country codes match worse than country-coded ones. Fix on the form side.
- Consent denial. When the visitor declines ad-data consent, PYS stops sending personal data. The events for those visitors will score lower. This is a regulatory floor, not a configuration issue.
Privacy and consent
fbp, fbc, and pbid are cookies and fall under cookie consent. Advanced Matching, form data detection, URL parameters, and CAPI personal data go beyond that — they’re personal data the visitor gave you, forwarded to Meta. Under GDPR that requires explicit consent.
ConsentMagic integrates with PYS so cookies only set after cookie consent, and Advanced Matching and CAPI personal data only flow after ad/data consent. Opt-out is respected end-to-end.