missing conversions

Low event match quality in Meta Events Manager

Event match quality is Meta's estimate of how reliably an event can be tied to a person, calculated from the customer parameters you send with it. It falls when those parameters are missing, wrongly formatted before hashing, or present in the browser event but absent from the server event, and an event Meta cannot match is a conversion Meta cannot attribute.

Updated

The symptom: a weak match quality score

Events Manager reports a weak match quality score on one or more of your standard events. Ads Manager shows fewer purchases or leads than your order table or your CRM for the same window. The gap is wider on paid social than on paid search. Your own cost per acquisition, calculated by hand, is lower than the one Ads Manager reports. Website custom audiences fill slowly or sit below serving size.

If you run Conversions API alongside the pixel, the server event often scores lower than the browser event for the same action, which is the opposite of what most teams expect when they add a server feed.

Scores vary by event, and that variation is normal. Purchase and Lead usually score highest because those steps collect an email address and a phone number. ViewContent and AddToCart score lower because anonymous browsers have not identified themselves yet. A weak score on the event you optimize toward is the one that costs money.

Why match quality falls

Match quality is computed from the customer information parameters attached to the event, not from the event’s own properties. Value, currency, content IDs and content type do not move it. Identity does.

The parameters that move the score are the ones that describe a person: email, phone, first name, last name, city, state, postal code, country, date of birth, gender, and your own external ID. Alongside them sit the signals that describe the browser and the click: the _fbp browser cookie, the _fbc click cookie derived from the fbclid parameter on the landing URL, the client IP address and the client user agent. Send more of them, correctly formatted, and the score rises. Send fewer, or send them malformed, and it falls.

Three failure modes account for most weak scores.

Normalization before hashing. The identifying parameters are hashed with SHA-256 before they leave your environment, and hashing is exact. Two values that differ by a single space produce two unrelated digests, and only one of them can match. Normalization has to happen first: trim whitespace, lowercase everything, strip punctuation from names, reduce phone numbers to digits including the country code with no plus sign and no separators, and use lowercase two letter codes for country and state. A checkout that passes the email exactly as the customer typed it, capitals and trailing space included, is sending a value that will never match.

Double hashing and junk values. Hashing a string that is already a hash produces something that matches nothing. So does hashing an empty string, or hashing the literal text that a template emits when a field is missing: undefined, null, N/A, or a placeholder like customer@example.com. These are worse than sending nothing at all, because the field looks populated in every check you run.

Server events built from scratch. This is the big one. The browser pixel picks up _fbp, _fbc, the visitor’s real IP address and the real user agent without being asked. A server event carries only what you explicitly put in it. Two things go missing routinely. First, the browser and click cookies are never read and forwarded, so the strongest paid-traffic signal is absent from the event that is supposed to reinforce the pixel. Second, client_ip_address and client_user_agent end up describing your infrastructure rather than the visitor, because your server made the request. A server purchase with a hashed email, a datacenter IP, a generic user agent and no _fbc is a much weaker match than the browser event it was built to back up.

Consent gating compounds all of this. If the pixel is blocked until a visitor accepts, no _fbc cookie is written on the click that mattered, so there is nothing for the server event to forward later even when the code is correct.

One more thing worth stating plainly: do not assume Meta merges the parameters of a deduplicated pair. If a browser event and a server event share an event ID and one of the two is discarded, build both so each stands on its own.

How to confirm the missing parameters

Read the score per event, not per dataset. A dataset average hides the fact that Purchase is fine and Lead is not.

Then open the parameter breakdown for that event, the view that lists which customer parameters were received and in what share of events. That table is the diagnosis, not the score. An event where email arrives on 98 percent of hits but _fbc arrives on 4 percent tells you exactly where to look.

Compare the browser event and the server event for the same action side by side. If you use a server-side container, capture one outgoing Conversions API request and read the user_data object field by field. Check the IP address in it against your own server’s public IP. If they match, you are sending your server’s identity instead of the visitor’s.

Take a single test order through the funnel and capture the raw values your site emits before hashing. Look for leading spaces, mixed case, formatted phone numbers with brackets and dashes, and empty strings dressed up as values.

Finally, check volume as well as quality. If Conversions API events arrive at a lower count than pixel events for the same action, the server is not firing on every conversion. That is a different problem with the same appearance in Ads Manager, and it will not be solved by improving parameters.

How to fix low match quality

Normalize in one place, before hashing, and hash once. A single shared function for every event and every surface prevents the checkout and the lead form from disagreeing about what a phone number looks like.

Collect identity earlier where you legitimately can. A logged in user, a returning customer, or a newsletter subscriber who arrived from an email link can be identified at page load rather than only at the confirmation step, which lifts the score on mid funnel events too.

Forward the browser context to the server. Read the _fbp and _fbc cookies at the moment of the event and include them in the payload. Where _fbc is absent because the visitor arrived with an fbclid and the cookie was not written, construct it from the fbclid on the landing URL and persist it.

Pass the visitor’s IP and user agent explicitly rather than letting the server supply its own.

Suppress empty fields instead of sending placeholders. If a value is missing, omit the key.

Send an external ID. A stable, hashed internal identifier costs nothing and matches across sessions and devices where nothing else does.

Then re-test with the same order flow and compare the parameter coverage table before and after.

What unmatched events cost you

Meta can attribute a conversion to an ad only if it can match the event to a person who saw or clicked that ad. Unmatched events are not attributed. They still happened, and your bank statement knows it, but the ad account does not.

The loss is not confined to reporting. Delivery and bidding run on the same matched events. Fewer matched purchases mean a thinner training signal, longer learning phases, weaker value optimization, and smaller retargeting and lookalike audiences. Reporting damage is annoying. Optimization damage compounds.

As a worked example, take a store that receives 400 purchases a month from paid social on $6,000 of spend. Real cost per purchase is $15. If a quarter of those events cannot be matched, Ads Manager attributes 300 and reports $20. Reported ROAS falls by the same quarter. Nothing changed in the business. The measurement got worse, and every decision downstream of it inherits the error.

Match quality is one of the few tracking problems that ships with a visible score, which makes it easy to watch and easy to leave alone. The score is a symptom. The fix sits upstream, in what your site collects, how it is normalized, and what survives the trip to your server. The Missing Conversions Audit reviews the pixel and the Conversions API payload parameter by parameter, logs every gap it finds, builds the top 10 corrections in a separate GTM workspace, and shows the before and after in Events Manager. $900 flat, 5 business days.

Questions

What counts as a good event match quality score?

Meta reports a rating alongside the score, but the useful benchmark is your own. Compare the score on your highest intent event against the parameters you know you could send at that step. If email, phone, city, state, postal code, country, _fbp and _fbc are all available at checkout and the score is still weak, the problem is formatting or delivery, not availability.

Will adding Conversions API fix a low score on its own?

No. Adding a server feed to a weak browser setup often lowers the average, because server events arrive missing the identifiers the browser had for free. Conversions API raises match quality only when the payload carries the same customer parameters plus the browser and click cookies and the visitor's real IP address and user agent.

Does sending more customer parameters mean sending personal data to Meta?

The identifying parameters are normalized and hashed with SHA-256 in your own environment before they are transmitted, so what leaves is an irreversible digest rather than the raw value. What you collect, and what you choose to send, is a policy question for your business and your counsel. This is measurement guidance, not legal advice.

My score is fine but conversions still look underreported. Why?

Match quality is one of three conditions. The event has to fire on every conversion, it has to deduplicate correctly against its browser or server twin, and it has to match. A strong score on an incomplete set of events still underreports. Reconcile event counts against your order table before touching parameters.

Next step

Find out what this is costing you.

The Missing Conversions Audit is a fixed-price teardown of your GA4, Google Tag Manager, ad pixels and consent setup. Every gap logged, the top 10 fixed and validated. $900 flat. 5 business days.

A 15 minute call

  • We look at your setup from the outside and say what we can already see.
  • You get a straight answer on whether the audit is worth it for your account.
  • If it fits, we book the slot and send the access checklist.
Open the booking calendar

Opens the calendar here. Nothing loads from Calendly until you do.

Prefer email? hello@missingconversions.com