Blog

The single biggest cause of CAPI low match rates

It is not normalisation, click IDs, or hashing. It is something simpler that almost every team gets wrong at first.

When match rates are low across Meta, TikTok, or LinkedIn CAPI integrations, the obvious suspects are normalisation, missing click IDs, or wrong hash format. The actual most common cause is simpler: the events being sent server-side use different timestamps from the events sent client-side, breaking dedup and confusing attribution.

Why timestamps matter for matching

Meta and TikTok use the timestamp to assign attribution to a specific click in the user's history. If the server-side timestamp is meaningfully different from the click timestamp (more than a few minutes), the destination cannot reliably tie the conversion to the original click.

When the same event is sent both client-side and server-side, the timestamps need to match (or be very close). If they differ by hours, dedup fails because the destinations treat them as separate events.

How timestamps drift

  • The browser uses local clock time. Some user clocks are wrong by hours (especially on shared family devices, kiosks, devices that have not synced).
  • The server uses UTC, almost always correct.
  • The client-side event uses the browser timestamp; the server-side event, when forwarded, sometimes uses the server timestamp instead.
  • The mismatch is invisible in normal monitoring; it only shows up as a depressed match rate in the destination.

The fix: use the server timestamp consistently

In your tagging server, generate the canonical timestamp at the moment the event is received, and pass it back to the browser for the client-side Pixel to use as well. The browser then sends the same timestamp on its CAPI-equivalent call.

If you cannot synchronise back to the browser, at minimum send the server timestamp on the server-side event and let the browser timestamp on the client-side. Meta's matching is forgiving enough that a few seconds of drift do not break it; hours do.

In sGTM

// In your Meta CAPI tag, override event_time
return Math.floor(Date.now() / 1000);

Use the server's current time, in seconds since epoch (Meta expects seconds, not milliseconds). The Meta tag template has an event_time field where you can wire in this variable.

Verifying the fix

In Meta Events Manager, the Diagnostics tab shows match quality scores broken down by event source. After deploying the timestamp fix, watch the score over the next two days. A 5-15 point lift on previously-poor events is the expected pattern.

If the lift does not materialise, check the other usual suspects: email normalisation, click IDs, advanced matching parameters.