Match quality
What ad platforms can match, and how to raise it.
Ad platforms only credit conversions they can match to a user. Every extra matching signal raises the share of conversions that get attributed - and therefore how well the platforms optimize your campaigns.
What PixelFox sends per event
| Signal | Facebook CAPI | TikTok | Requires |
|---|---|---|---|
Hashed email (em) | ✅ | ✅ | identify() with email, or server-side purchase events |
Hashed phone (ph) | ✅ | ✅ | identify() with phone |
| Hashed external id | ✅ | ✅ | automatic (device id / stitched customer id) |
Browser cookie (fbp) | ✅ | - | Facebook Pixel present |
Click id (fbc / ttclid) | ✅ | ✅ | visitor arrived from an ad |
| Client IP + user agent | ✅ | ✅ | automatic |
| Event source URL | ✅ | ✅ | automatic |
Click ids (fbclid, ttclid, gclid, msclkid, li_fat_id) are captured from the
landing URL automatically and persisted as super properties, so a conversion three pages
later still carries them. When only an fbclid is present, PixelFox synthesizes the fbc
cookie format for you.
Phone numbers
Meta and TikTok match ph on the hash of the E.164 digits - country code included.
A number typed as 01712 345678 on a Bangladeshi checkout would hash as 01712345678
and never match. PixelFox completes national numbers before hashing, inferring the country
per event from the strongest signal available: the typed country, the visitor's geo,
the order currency, the browser locale, the timezone, the store's domain suffix, and
the number's own national shape (an 11-digit 01x… is a Bangladeshi mobile). When none
of those apply it falls back to the country your traffic mostly comes from, learned
automatically. Home country in Settings is an optional override, not a requirement.
The match profile
Every browser event teaches PixelFox something about the visitor: the _fbp and _fbc
cookies, the IP and user agent, and - after identify() or a form read through field
selectors - hashed email, phone, name and address. PixelFox keeps the best of these per
visitor in a match profile (hashes only for personal fields; IP and user agent
encrypted and dropped after 30 days) and fills the gaps at fan-out:
- A purchase from a visitor who identified last week carries their email and phone even if the purchase payload has neither.
- A server-side purchase (WooCommerce, Shopify, Laravel) borrows the browser's
fbp,fbc, IP and user agent from the session that placed the order. - A COD delivery purchase is joined by phone to the checkout session and carries its keys days later.
The event payload always wins; the profile only fills what is missing. Offline sites and consent-denied events never write to or read from it.
Server helpers can also pass the shopper's own client_ip_address and
client_user_agent; PixelFox then forwards those instead of your server's address.
Reading customer fields off the page
Every event definition can carry a value element and customer field selectors
(email, phone, first/last name, city, state, postal code, country). When the event
fires, the tag reads those inputs live, and the values ride on the event to be hashed
server-side - so a mapped "Place order" button reaches Meta with em, ph, fn, ln
and the order total, without a single line of code on the site.
PixelFox detects them for you: discovery records the form inputs it sees (type,
autocomplete, name, placeholder, label - never the values), and when you map a
checkout, lead or signup event the matching fields are attached automatically. You can
also set them in the dashboard definition editor, or with the browser extension: open a
mapped event, click a field chip (Email, Phone, Value…), then click that input on
your page. The selectors only fill keys the event does not already carry, so
identify() data always wins.
The same identify() data is also handed to the Meta Pixel as browser-side Advanced Matching, normalised with the same rules the server uses - the Pixel hashes what it is given, so an un-normalised value there would produce a different hash from the server's for the same person, and the pair would match nobody.
City and state come only from what the customer actually typed. An IP's geographic location is a different fact - often a mobile carrier's exit node - so it is never hashed into the customer's address, only used to pick the country for phone formatting.
How to raise match quality
- Call
identify()early - at login and at checkout, with the email. This is by far the biggest lever; see identity stitching. - Send purchases server-side with the customer email (WooCommerce and Laravel helpers do this out of the box).
- Keep the PixelFox pixels enabled - the browser half contributes
fbpcookies and catches sessions where the server event's IP/UA differ (proxies, apps). - Pass values -
value+currencyon conversions don't affect matching but are required for value-based optimization and ROAS reporting.
Watching it
The overview's Match quality card counts, per conversion, which keys actually reached
Meta over the window - email, phone, fbc, fbp, IP + user agent, name - and shows the
EMQ band that key mix usually earns. It is an estimate from our side of the wire; the
card links to Events Manager's Diagnostics for Meta's own score. Meta's response
warnings (a mis-formatted field, an invalid country) surface on the destination card.
Verifying
- Facebook: Events Manager → your pixel → Diagnostics shows an event match quality
(EMQ) score per event; the Test events tab (with a
test_event_codeconfigured in PixelFox) shows events arriving live, labeled server. - TikTok: Events Manager → your pixel → Test events with the PixelFox
test_event_code.