Signals Docs
Concepts

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

SignalFacebook CAPITikTokRequires
Hashed email (em)identify() with email, or server-side purchase events
Hashed phone (ph)identify() with phone
Hashed external idautomatic (device id / stitched customer id)
Browser cookie (fbp)-Facebook Pixel present
Click id (fbc / ttclid)visitor arrived from an ad
Client IP + user agentautomatic
Event source URLautomatic

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

  1. Call identify() early - at login and at checkout, with the email. This is by far the biggest lever; see identity stitching.
  2. Send purchases server-side with the customer email (WooCommerce and Laravel helpers do this out of the box).
  3. Keep the PixelFox pixels enabled - the browser half contributes fbp cookies and catches sessions where the server event's IP/UA differ (proxies, apps).
  4. Pass values - value + currency on 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_code configured in PixelFox) shows events arriving live, labeled server.
  • TikTok: Events Manager → your pixel → Test events with the PixelFox test_event_code.

On this page