Facebook CAPI Match Quality (2026): How to Fix a Low EMQ Score
A low Meta Conversions API Event Match Quality score is usually a data-quality problem, not an API-delivery problem. The useful question is not “How do I force EMQ to 8?” but “Which matching signals are missing, malformed, or lost before the server event reaches Meta?”
Quick answer: Start by checking your user_data payload, especially em, ph, external_id, fbc, fbp, client_ip_address, and client_user_agent.
Normalise the customer information according to Meta’s rules before SHA-256 hashing. Keep fbc and fbp in their Meta formats rather than hashing them. For website events, send the correct event metadata, including the actual event_time and source URL where applicable.
When Pixel and Conversions API both report the same conversion, use a consistent event_name and event_id so the two copies can be deduplicated.
1. What Meta Event Match Quality Actually Measures
Event Match Quality, or EMQ, is a diagnostic shown in Meta’s Events Manager that reflects how effectively the customer information attached to events can be matched to Meta accounts.
That makes EMQ different from event delivery. A server request can reach Meta successfully while the information attached to that event is too limited or incorrectly formatted to produce a strong match.
Meta’s own Conversions API guidance says that additional customer information parameters can help increase matched events and Event Match Quality. Meta also says the EMQ score uses the most recent 48 hours of event data, so the number is a moving diagnostic rather than a permanent rating of your implementation.
This is why a fixed promise such as “add fbc and your score will jump from 4 to 8” is not technically reliable. The result depends on the event type, the information actually available for those users, how much of the data is correctly formatted, and how much of the recent event sample can be matched.
Important: Treat EMQ as a diagnostic, not a universal pass/fail threshold. A higher score generally indicates better matching coverage, but a particular number does not guarantee a particular ROAS, attribution percentage, or campaign result.
2. Which Data Signals Matter?
Meta supports a range of customer information parameters for Conversions API matching. The exact fields available depend on the data you legitimately collect and the event context. The goal is not to manufacture identifiers simply to raise a dashboard number. The goal is to send accurate information that already exists in the customer journey and is appropriate to share.
| Parameter | Where it comes from | How it is handled |
|---|---|---|
em | Email from checkout, CRM or form | Normalise, then SHA-256 hash before sending. |
ph | Phone from checkout, CRM or form | Normalise to the required phone format, then SHA-256 hash. |
external_id | Your own stable customer or user identifier | Use a consistent identifier according to Meta’s parameter requirements. |
fbc | Meta click information / _fbc cookie | Send in Meta’s expected plain-text format. Do not SHA-256 hash it. |
fbp | Meta Pixel’s _fbp cookie | Forward the cookie value as-is. Do not hash it. |
client_ip_address | Browser request or trusted server-side request context | Send the actual client IP where permitted; do not hash it. |
client_user_agent | Browser request headers | Forward the browser user-agent string; do not hash it. |
| Name / address fields | Checkout, CRM or other first-party source | Apply the specific normalisation and hashing rules Meta documents for each field. |
Do not interpret this table as a checklist where every field must exist on every event. If you do not have legitimate access to a value, do not invent one. Missing data is preferable to fabricated data.
3. fbp and fbc: The Two Fields People Commonly Get Wrong
fbp: the browser identifier
fbp is the value stored in Meta’s _fbp browser cookie. If the Meta Pixel is able to run and establish the cookie, that value can be captured on the browser side and forwarded with your server event.
Do not assume every visitor will have _fbp. Consent settings, browser behaviour, blocking, implementation timing, and whether the Pixel actually executed can all affect whether the value exists.
When it exists, the normal approach is simple: capture the complete _fbp value and pass it through as user_data.fbp. Do not hash it.
fbc: the click identifier
Meta advertising links can carry the fbclid query parameter. That click information can become the _fbc cookie value, which is then sent to Meta as user_data.fbc.
The important point is that fbclid and fbc are not interchangeable strings. The raw fbclid is the source value; fbc is the structured value Meta expects.
Correct structure: fb.1.<creation-time-milliseconds>.<fbclid>
Use the complete _fbc cookie when it is already available. If you must construct the value from an observed fbclid, retain the original click/capture time. Do not replace it with the purchase timestamp later.
This is one of the most important corrections to the old implementation on this page: the timestamp embedded in the fbc value is expressed in milliseconds. The separate event_time field in the CAPI event is expressed in Unix seconds.
fb.1.1759000000000.IwAR2_example_fbclid_value
If the landing page receives ?fbclid=..., capture that identifier before the user moves through redirects, forms or a hosted checkout. Then persist it in the data that eventually reaches the server-side conversion event.
Do not manufacture an fbc for traffic that did not provide a click identifier. A direct visitor does not become a Meta-ad click merely because you create an fbc-looking string.
4. Normalisation and SHA-256 Hashing
Hashing does not repair dirty data. The sequence is important: first normalise the customer information according to Meta’s documented rules, then hash the normalised value.
- Remove unintended leading and trailing whitespace.
- Convert the value to lowercase before hashing.
- Then apply SHA-256.
- Send the resulting hash in the appropriate email parameter.
Input:
" Customer@Example.com "
Normalised:
"customer@example.com"
Then:
SHA-256("customer@example.com")Phone
- Normalise the number into the country-aware format required by Meta.
- Remove formatting characters that should not be part of the final value.
- Include the country code.
- Apply SHA-256 after normalisation.
Input:
+1 (415) 555-0123
Normalised:
14155550123
Then:
SHA-256("14155550123")The same principle applies to other customer parameters that Meta documents as hashable. Do not assume every field uses identical normalisation rules. Check Meta’s current customer-information parameter reference before implementing additional fields.
Also remember that fbc, fbp, client_ip_address and client_user_agent are not customer PII fields that should simply be run through the same SHA-256 function.
5. A Clean Meta CAPI Payload
One reason CAPI debugging becomes confusing is that many examples on the web show only the inner event object. A server request normally contains a data array containing one or more event objects.
For a website purchase, a useful baseline structure looks like this. Replace the illustrative values with values from your own system.
{
"data": [
{
"event_name": "Purchase",
"event_time": 1759000000,
"action_source": "website",
"event_source_url": "https://example.com/thank-you",
"event_id": "order_12345",
"user_data": {
"em": [
"SHA256_HASHED_EMAIL"
],
"ph": [
"SHA256_HASHED_PHONE"
],
"external_id": [
"SHA256_HASHED_CUSTOMER_ID"
],
"fbc": "fb.1.1758999000000.EXAMPLE_FBCLID",
"fbp": "fb.1.1758998000000.123456789",
"client_ip_address": "203.0.113.10",
"client_user_agent": "Mozilla/5.0 ..."
},
"custom_data": {
"value": 997.00,
"currency": "USD",
"order_id": "order_12345"
}
}
]
}
Notice the timestamp difference: event_time is in seconds, while the timestamp embedded inside the fbc value is in milliseconds.
For a website event, also make sure the event’s action_source, source URL and browser context accurately describe what happened. Do not copy a “website” payload unchanged for a CRM, phone, offline or other event source.
Event freshness matters too: Meta’s server-event documentation allows the actual event time to precede the send time for legitimate batching, but the event timestamp cannot simply be arbitrarily old. Current CAPI implementations should treat the seven-day boundary as an important validation limit.
6. Pixel + CAPI Deduplication Is a Separate Problem
EMQ and deduplication solve different problems.
EMQ is about whether Meta can match the customer information on an event. Deduplication is about recognising that a browser event and a server event represent the same underlying conversion.
If the same purchase is sent through both Pixel and CAPI, the recommended architecture is to use the same event identity across both copies. In particular, the browser event’s eventID should correspond to the server event’s event_id, alongside the same event name.
- Generate one stable ID for the conversion.
- Use that ID in the browser event.
- Send the same ID as CAPI
event_id. - Keep the event name consistent between the two paths.
- Verify the result in Meta’s event diagnostics rather than assuming deduplication worked.
Do not confuse fbc, fbp and event_id. They have different jobs. A click identifier identifies advertising context, a browser identifier supplies browser context, and an event ID identifies the conversion instance for deduplication.
7. The Practical Debugging Sequence
When EMQ is lower than expected, do not randomly add fields. Trace one real conversion from the landing page to Meta.
-
Start at the landing URL.
Check whether the Meta click produced a
fbclid. If the user did not arrive through a Meta click, anfbcvalue may legitimately be absent. -
Check browser storage.
Inspect whether
_fbpand, where applicable,_fbcexist. Do not assume their existence on every browser. - Check persistence. Follow the identifiers through redirects, forms, checkout pages and payment-provider metadata. The most common architecture problem is losing the click identifier before the eventual webhook.
- Inspect the Make.com bundle. Confirm the webhook actually contains the values you thought the customer journey captured.
-
Inspect the transformed values.
Verify that email and phone were normalised before hashing. Verify that
fbcandfbpwere not accidentally hashed. -
Validate the payload shape.
Confirm the top-level
dataarray, event fields, user-data fields, timestamps and website source fields. - Check the event ID. If Pixel and CAPI both fire the same conversion, verify that the IDs and event names line up.
- Check Meta diagnostics. Use Events Manager and Test Events to determine whether the problem is delivery, parameter quality, matching, deduplication or another validation issue.
- Then watch the EMQ trend. Because Meta calculates EMQ from recent event data, judge the result after valid traffic has accumulated rather than expecting the number to change immediately from one test event.
The fastest place to look when fbc disappears
Suppose the customer arrives at:
https://example.com/landing?fbclid=IwAR2_exampleBut the eventual Stripe or CRM webhook contains only:
{
"email": "customer@example.com",
"order_id": "12345"
}The problem is not the Meta API. The click identifier was lost earlier in your data flow. Fix the capture and persistence layer before changing the CAPI payload.
8. Where Make.com Fits
Make.com does not create a higher EMQ score by itself. It is the orchestration layer between systems such as your website, checkout, CRM or payment processor and the destination API.
That makes Make useful when you need to capture a webhook, retrieve or transform customer fields, carry fbclid or cookie values forward, hash the appropriate PII, construct the CAPI payload and send it through an HTTP request.
The important distinction is between routing and data quality. A perfectly working Make scenario can still send a weak payload. Conversely, a carefully designed payload can be sent through several different server-side architectures.
If you are comfortable managing the mappings yourself, Make gives you a flexible no-code/low-code orchestration layer. If you would rather use a managed attribution product, that is a different trade-off: less infrastructure maintenance in exchange for less direct control over the implementation.
Need Make.com for the routing layer?
Use Make when you need to connect your payment, CRM or webhook infrastructure to Meta without building a dedicated backend service just for the orchestration layer.
9. Common Questions
What is a good Meta CAPI EMQ score?
Meta presents EMQ as a diagnostic score for event matching. Higher is generally better, but there is no need to treat a fixed number such as 6.0 or 8.0 as a universal API pass mark. Look at the score together with parameter coverage, matched-event diagnostics and your own conversion reconciliation.
Can CAPI work without fbc?
Yes. A Conversions API event can still contain other customer and browser signals. An absent fbc simply means that particular click identifier is not available for that event. Do not create a fake one just to make the payload look complete.
Should fbc and fbp be hashed?
No. Forward the appropriate _fbc and _fbp values in the formats Meta expects. The SHA-256 normalisation workflow applies to the customer information parameters for which Meta specifies hashing.
Why does my EMQ stay low even though CAPI returns successfully?
Successful API delivery only tells you that Meta accepted the request. It does not mean every customer-information value matched successfully. Check whether identifiers are present, correctly normalised, correctly hashed, retained through the checkout journey and attached to the correct event.
Why did my fbc implementation fail?
The common failure is confusing the raw fbclid with the structured fbc value. Another is rebuilding the value with the purchase timestamp instead of preserving the original click/capture time. Also check that the value was not accidentally SHA-256 hashed.