A paid social checkout posts Purchase to the Meta Conversions API. Graph returns 200. Events Manager lists the event. Click-through attribution still shows nothing tied to the ad.
The access token is fine. The clock is in seconds. Email is hashed. The bug is the click id field.
"user_data": {
"em": ["a1b2c3...64 hex..."],
"fbc": "IwAR0abcdefGhijklmnop"
}
That string is the `fbclid` query parameter from the landing URL, copied server-side from the order record. Meta's [customer information parameters](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters) document `fbc` as the `_fbc` browser cookie, not the naked click token. The documented shape is four dot-separated segments:
fb.{subdomain_index}.{creation_time}.{fbclid}
Example from a real cookie line:
fb.1.1758300000.IwAR0abcdef
A bare `IwAR…` token fails that contract even when it is the same characters Meta put on the ad click. Matching expects the cookie format Meta generates when `fbclid` hits a first-party page and something (Meta Pixel, Conversions API tag helper, or your own setter) writes `_fbc` with a creation timestamp.
## Why the landing hop matters
`fbclid` lives on the inbound ad URL. `_fbc` lives in first-party storage after that URL is processed. If the shopper lands on a intermediate domain, if the tag loads after your server already captured the query string, or if Safari ITP blocks the write, your order service may only see `fbclid` in the referrer log. Forwarding that raw value as `user_data.fbc` is a common server-side shortcut. It is not what Meta documents for CAPI.
The failure mode is quiet. HTTP succeeds. Parameter names match the sample JSON. Events Manager does not flash a schema error for every malformed `fbc`. You notice only when campaign reports stay blind to clicks you know happened.
More detail on the hop is in [Meta _fbc is empty unless fbclid hits the landing page](https://pixellint.org/blog/meta-fbc-needs-fbclid-at-landing/).
## What the linter checks
I maintain [Pixellint](https://github.com/aleksUIX/pixellint), an open source linter for pixels and conversion API payloads. The Meta Conversions API pack contracts `user_data.fbc` against Meta's documented regex shape when the field is present:
console
$ pixellint validate json @purchase.json
rulepack: vendor/meta-conversions-api (vendor: meta)
error vendor.meta-conversions-api.body.user_data.fbc.invalid
user_data.fbc is IwAR0abcdefGhijklmnop, which does not match
^fb\.[0-9]\.[0-9]+\..+$. Meta documents the click id cookie as
fb.${subdomain_index}.${creation_time}.${fbclid}.
fix: Send the _fbc cookie verbatim, or rebuild it in the documented format.
Paste the body into the [playground](https://pixellint.org/) if you do not want a local install. Artifacts you test may be stored; see [privacy](https://pixellint.org/privacy/).
sh
cargo install pixellint
or: npm install pixellint
pixellint validate json @purchase.json --rulepack vendor/meta-conversions-api
The field table and every rule id live on the [Meta Conversions API pack page](https://pixellint.org/packs/meta-conversions-api/). For how `fbc` and `fbp` differ from hashed email and from click ids on other vendors, read [Identity for ads](https://pixellint.org/docs/identity/).
## Fix the pipe, not just the string
Correct CAPI wiring forwards the `_fbc` cookie value from the browser session that converted. If you must rebuild server-side, Meta's parameter docs describe setting `_fbc` when `fbclid` is present on the landing URL: subdomain index (usually `1` on www), creation time in **seconds**, then the `fbclid` value. Do not reuse millisecond clocks from other vendors; that is a different class of bug covered in [event time units](https://pixellint.org/docs/timestamp-units/).
Browser-side, confirm the pixel or tag actually runs on the landing URL where `fbclid` appears, not only on checkout. [Facebook Pixel Helper vs Network](https://pixellint.org/docs/facebook-pixel-debugger/) is the split between what the extension shows and what the network tab proves. When Events Manager looks healthy but production matching is empty, walk [Conversions API not working](https://pixellint.org/docs/conversions-api-not-working/) before you rotate tokens.
Also scan for `test_event_code` left on live traffic. That routes events to the test tool, not production reporting. It is a separate silent miss documented in Meta's API guides and flagged as `vendor.meta-conversions-api.testing.test_event_code_present` in the same pack.
## Where to go next
[What is a conversion API](https://pixellint.org/docs/what-is-a-conversion-api/) is the envelope: match keys, clocks, and dedup ids across vendors. [Conversion API validator](https://pixellint.org/docs/conversion-api-validator/) is the CI-shaped entry point when you lint POST bodies on every deploy.
Pixellint is independent of Meta. The rule ids above cite Meta's Conversions API docs because that is where the requirements live, not because this is an official tool.
**Summary:** Send `_fbc` verbatim, or build `fb.1.{seconds}.{fbclid}` after `fbclid` hits first-party landing storage. Raw `fbclid` in `user_data.fbc` is not the documented click cookie, and a 200 from Graph does not prove click matching worked.
Top comments (0)