Meta Pixel vs Conversions API: what each does and why you need both
"Do I need the Meta Pixel or the Conversions API?" The honest 2026 answer is both — the Pixel for browser context, CAPI to survive ad blockers and iOS. Here is exactly what each does and the event_id trap that breaks setups.
The Meta Pixel runs in your visitor's browser; the Conversions API (CAPI) sends the same events from your server directly to Meta. You need both, sending the same events with a shared event ID so Meta can deduplicate them — the browser pixel gives you rich signals like click IDs and cookies, and the server sends the events browsers increasingly block. Running only one leaves measurable conversions on the table.
What the browser pixel actually does
The Meta Pixel is a JavaScript snippet that initialises fbq on your page. When a visitor loads a page or completes an action, it sends an event to Meta from the browser, along with whatever context the browser can see: the _fbp browser cookie, the _fbc click cookie set when someone arrives from a Meta ad, the user agent, the page URL, and the IP address.
That browser context is genuinely valuable. The click ID in _fbc is the strongest possible attribution signal — it ties the conversion directly to a specific ad click, with no probabilistic matching required.
The problem is delivery. Browser events are lost to ad blockers, iOS tracking prevention, Safari's storage limits, network failures, and users who navigate away before the request completes. The share lost varies enormously by audience, but for most consumer sites it is not a rounding error.
What the Conversions API adds
CAPI sends events server to server: your backend posts a JSON payload to Meta's Graph API when a real event happens — an order is created, a lead is stored, a subscription starts.
Because it never touches the visitor's browser, nothing about the client can block it. And because it fires from the system of record, it reflects what actually happened. A browser purchase event fires when a confirmation page renders; a server purchase event fires when payment is captured. Those are not the same set of events, and the server's version is the honest one.
What CAPI gives up is browser context — unless you deliberately pass it. This is the single most-missed step in a CAPI implementation.
| Browser Pixel | Conversions API | |
|---|---|---|
| Runs in | Visitor's browser | Your server |
| Blocked by | Ad blockers, ITP, network loss | Nothing client-side |
| Has natively | _fbp, _fbc, user agent, IP, referrer | Only what you send it |
| Reflects | What the page rendered | What actually happened |
| Failure mode | Silent under-reporting | Silent mismatching |
| Needed for | Signal richness | Coverage and durability |
Why running both is not double-counting
Meta deduplicates. When the same conversion arrives twice — once from the browser, once from the server — Meta keeps one, as long as you give it enough to match the pair:
- Send the same event name from both sources. A browser Purchase and a server purchase are two different events to Meta.
- Send the same event ID with both. In the browser this is the eventID parameter on your fbq call; on the server it is event_id in the payload.
- Send them close together in time. Meta's deduplication window is finite; hours-later batch uploads will not pair with the browser event.
Generate the ID once, at the source of the event, and pass it to both paths — an order ID plus event name works well, because it is stable and naturally unique:
// Browser
fbq('track', 'Purchase',
{ value: 129.00, currency: 'USD' },
{ eventID: 'order_10432_purchase' }
);
// Server payload (same string)
{
"event_name": "Purchase",
"event_id": "order_10432_purchase",
"event_time": 1774310400,
"action_source": "website"
}
Get this wrong and you do not get an error message. You get inflated conversion counts, a ROAS number that is quietly wrong, and campaign optimisation aimed at a phantom.
Match quality: the number that decides your results
Meta scores every server event on how well it can be matched to a real person — the Event Match Quality score in Events Manager. A CAPI implementation sending only an event name and a value will match poorly, and poorly matched events barely improve optimisation.
You raise match quality by sending more customer parameters, each SHA-256 hashed before it leaves your server:
- Email and phone — the strongest identifiers by a wide margin.
- First name, last name, city, state, zip, country — helpful in combination.
- External ID — your own stable customer identifier, hashed.
- _fbp and _fbc — read from the browser cookies and passed through to the server call. Not hashed.
- client_ip_address and client_user_agent — the visitor's, not your server's. Not hashed.
Those last three lines are what most implementations miss. If your server sends its own IP and user agent, every event looks like it came from one data-centre robot, and match quality collapses. Read the cookies in the browser, attach them to your order record, and forward them.
Normalise before hashing: lowercase, trim whitespace, strip punctuation from phone numbers, and use E.164 format. Meta hashes the same way on their side, so a stray capital letter is a failed match. See hashed identifiers for the exact normalisation rules.
Which implementation path should you pick?
There are four common ways to get CAPI running, in rough order of effort:
- Platform integration. Shopify, WooCommerce, and most major carts have a first-party Meta connection that handles CAPI for you. Least effort; least control over payload and deduplication.
- Conversions API Gateway. Meta's hosted option — you point a subdomain at it and it forwards browser events server-side. Fast to deploy, a recurring cost, limited customisation.
- Server-side GTM. A server container receives your events and fans them out to Meta, Google, TikTok, and anything else. Most flexible if you already run server-side tagging, and the marginal cost of the second vendor is near zero. See when to move to server-side GTM.
- Direct from your backend. Your application posts to the Graph API when an order is written. Most accurate and most durable, because it fires from the system of record — but it is real engineering work, including retries and error handling.
Meta CAPI: Gateway vs self-hosted vs GTM server compares these in detail.
The five mistakes that cost the most
- No shared event ID. Duplicated conversions, inflated ROAS, misdirected optimisation.
- Server IP and user agent instead of the visitor's. Match quality drops to near zero and the whole implementation underdelivers.
- Unhashed PII. Sending a raw email address is a policy violation and can get your access restricted. Hash everything except cookies, IP, and user agent.
- Different event names or parameters per source. Deduplication fails, and your funnel reports disagree with themselves.
- Server-only implementations. You lose _fbc, the strongest attribution signal you had. CAPI is a supplement to the pixel, not a replacement.
FAQ
Do I still need the browser pixel if I have the Conversions API?
Yes. The pixel is where _fbp and _fbc originate, and those cookies carry the click attribution that makes conversions matchable. Meta's own guidance is to run both — the recommended architecture is redundant by design.
Will running both double-count my conversions?
Not if both events carry the same event name and the same event ID within the deduplication window. If your reported conversions roughly doubled after enabling CAPI, deduplication is failing — check the event ID first.
What is a good Event Match Quality score?
Above 6.0 out of 10 is workable and above 8.0 is strong. If you are below 5.0, you are almost certainly missing hashed email, the _fbp and _fbc cookies, or the visitor's IP and user agent.
Does the Conversions API bypass consent requirements?
No. Consent is about the legal basis for processing personal data, not about where the code runs. If a visitor has not consented to advertising cookies, you should not be sending their identifiers to Meta from your server either.
How do I verify deduplication is working?
Open Events Manager, find the event, and look at the events breakdown by source. You should see both browser and server as origins, with a deduplication figure — not two separate full-volume counts. Debugging the Meta Pixel walks through the whole verification path.
Not sure whether your pixel is even loading? The free tracking audit checks Meta Pixel initialisation alongside twelve other checks, on any URL.
See where your tracking stands
Run the same 13-check audit referenced in this post against any URL. No signup, results in seconds.