Sales that lose their click: a stale or altered fbc in the Conversions API
fbc changes with every ad click and is case-sensitive. Stored once or normalized, the conversion travels with the wrong click. How to send it correctly.
- The same user clicks two ads, on different days. Each click brings its own fbclid in the URL.
- The _fbc cookie is updated and keeps the latest click, with the fbclid exactly as it arrived.
- But the server sends an fbc stored at the first click, or the current value lowercased.
- The cause: the value is stored once in the profile, or normalized as if it were an email.
- The fix: read the _fbc cookie on every event and send it exactly as it is.
- Check it: each event's fbc is identical to that visit's _fbc cookie.
When someone clicks a Meta ad, the landing URL arrives with an fbclid parameter, the identifier of that click. The Pixel stores it in a first-party cookie, _fbc, and the Conversions API sends it in the fbc field of user_data. It’s the piece that ties a conversion to the click behind it. That’s why sending it isn’t enough: it has to be the current value, exactly as it was received.
What a stale or altered fbc looks like
The same user clicks ad A on October 2 and ad B on October 19. The _fbc cookie already holds the ad B click. But the Purchase event the server sends carries:
- the
fbcfrom the October 2 click, stored in the customer profile the first time it was seen; or - the current
fbc, but lowercased:fb.1.1792368000000.pazxh0bgn…instead offb.1.1792368000000.PAZXh0bgN….
In the first case, the conversion travels with a click that isn’t the latest one. In the second, with an fbclid that matches no click. The API returns no error: the problem only shows up in attribution and match quality.
Why the fbc arrives stale or altered
The fbc format is fb.<subdomain index>.<creation time in milliseconds>.<fbclid>. Two rules from Meta’s documentation explain almost everything: the value changes over multiple browser sessions, so you should always send the most recent one, and the fbclid is case-sensitive, so it must not be modified. The usual causes:
- The
fbcis stored once and reused. The backend links it to the customer on their first visit, or stores it in the CRM, and sends it with every later event, even after new clicks. - It’s normalized as if it were contact information. The same code that lowercases the email before hashing also runs on
fbc, or atoLowerCase()runs on the whole URL before readingfbclid. - It’s hashed.
fbcis one of the fields that go unhashed. - It’s only read on the confirmation page. If the
fbclidarrived on the first page and nobody saved it in the cookie, it’s gone by thePurchase. Meta recommends capturing cookies early, not only on down-funnel events.
How to find a stale or altered fbc
- Click an ad (or open the site with
?fbclid=and a test value). In the developer tools, Application → Cookies tab, copy the_fbcvalue. - Complete a conversion and find the
fbcthe server sends, in its logs or in the server-side GTM preview. It must be identical, character by character. - Repeat with a second click: the cookie changes; check that the
fbcsent changes too. - Find where the server code reads
fbc: if it comes from the customer database instead of the request’s cookie, or goes through a normalization step, that’s the cause.
How to send the right fbc
- Read the
_fbccookie from the request on every event and send it infbcas is, with no case changes and no hashing. Meta recommends sendingfbcwith every event. - If there’s no cookie (for example, because there’s no Pixel on the site) but the request URL has an
fbclid, build the value:fb.1.<time in milliseconds when you saw the fbclid>.<untouched fbclid>. - If you store the value on the server, update it every time a new
fbclidarrives and always send the most recent one. Meta also suggests setting the_fbccookie yourself, with a 90-day expiry, when it doesn’t exist or when thefbclidreceived differs from the one it holds. - Meta’s Parameter Builder library handles reading and formatting
fbcandfbpin the browser and in several server languages. If you use it, the values carry a suffix added by the library: don’t strip it.
Meta’s documentation: fbp and fbc parameters.
How to check the fbc is the latest click
- In a test conversion, the
fbcsent is identical to that visit’s_fbccookie, case included. - After a second click with another
fbclid, the next event carries the new value. - In a sample of events, every
fbcstarts withfb., keeps thefbclid’s upper case letters and none looks like a hash.
The dates, timestamps and
fbclidvalues in the example are illustrative and shortened.