Skip to content
Meta trackingSeptember 10, 2026 · 9 min read

What Meta sees when the lead has no cookie: external_id, fbc and fbp explained

Ad blocker, Safari, private tab, two devices: Meta’s cookie is missing in almost half of visits. What remains to match the event to the person are three fields almost nobody fills correctly. This article says what each is, where it comes from and why external_id should be your lead’s id.


The search terms that bring the most people to this blog are “_fbp cookie”, “fbc fbp” and “fbclid decode”. It is no coincidence: they are the three things Meta uses to match an event to a person when there is no e-mail, and the three that vanish when the browser blocks the pixel script. This article is the long answer.

The three identifiers, one sentence each

FieldWhat it isWhere it comes fromWhen it is missing
fbcThe ad click: fb.1.{ms}.{fbclid}From the fbclid URL parameter when the person arrives from the adOrganic visit, copied link, fbclid dropped by a redirect
fbpThe browser: fb.1.{ms}.{random}Generated by Meta’s script and stored in a cookieBlocker, Safari with cookie limits, script did not load
external_idThe person, in YOUR systemYou define it; hashed with SHA-256Almost always — nobody fills it

The point that changes everything: fbc and fbp can be built on YOUR side, on your domain, without depending on Meta’s script. The fbc is derived from the fbclid and persisted for 90 days; the fbp can be born with the same format Meta’s script would use — and the script, when it loads, respects the cookie that already exists. We told the measurement in first-party fbc and fbp: fbp went from 44% to close to 100% of events.

external_id: the field nobody fills

The external_id is the person’s identifier in your system. Meta uses it to link events from the same person across devices and over time — and to match profiles when you have already sent that same id before along with an e-mail. Most integrations leave it empty, or send the session id (which changes every visit and links nothing).

The right value is the lead’s id in your CDP: stable, unique per person, the same on today’s pageView and tomorrow’s purchase. In a centralized base it exists for 100% of events — including anonymous ones, because the anonymous visitor is also a lead with an id. That is why, in an account we measured, external_id was the only field with full coverage on pageView, while e-mail covered 11%.

When two people are merged in your CDP, the external_id that goes to Meta has to be the canonical person’s. Otherwise Meta keeps seeing two.

Measured coverage, by event type

FieldpageView (site)Purchase (Hotmart)
external_id100%100%
fbc92%97%
fbp53% (before first-party)98%
e-mail / phone11% / 10%100% / 100%
city / state / zip (by IP)97%~11% (declared, no IP)

The important read: on the site event, what sustains matching is IP geolocation plus cookies; on the purchase, it is e-mail and phone. The event that leaves the server has to pick the right source for each field — the city declared at checkout when it exists, the one from the visit’s IP when not. That chain is what makes match quality rise.

Mistakes that silently zero the field

  • Sending the raw fbclid as fbc. The format is fb.1.{timestamp in ms}.{fbclid}; without the prefix Meta discards it.
  • Generating fbp on every pageView. It identifies the BROWSER; if it changes, every visit is a new browser.
  • Sending external_id without hashing, or hashed with different normalization between events. The hash has to be equal today and tomorrow.
  • Leaving the server IP in client_ip_address. The IP has to be the person’s browser — and it may be IPv6.
  • Treating “no cookie” as “send nothing”. Without a cookie there is still e-mail, phone, external_id, IP and user agent — and that is where the server beats the pixel.

In CrazyLeads the pixel builds fbc and fbp first-party, the resolver stores both as lead attributes (so the purchase coming from Hotmart, which has no cookie of its own, inherits the person’s last known), and the external_id of every event is the canonical lead id — the same one shown on the profile.

Frequently asked questions

Is the fbp I generate on my domain worth the same as Meta’s?

Yes, as long as it has the same format and Meta’s script finds the cookie already stored — it respects the existing one instead of creating another. Browser and server start sending the same id.

Can I use the hashed e-mail as external_id?

You can, but it is redundant — the e-mail already goes in the em field. external_id is worth more when it is an id that ALSO exists for people without an e-mail, such as the anonymous visitor.

What happens if I change a person’s external_id?

Meta starts seeing two people until an event with an e-mail joins them on its side. That is why the id must be canonical and stable — and when there is a merge in your CDP, the next event already goes out with the id that survived.

Without any cookie, is the event still worth anything?

Yes. With e-mail or phone, a lot. With IP, user agent and external_id, something — and it is more than the blocked pixel delivers, which is nothing.

Start measuring what actually becomes revenue

Create a free account, connect your first source and see your first lead timeline today. No card required.