What is a smart link

Why Your Pixel Isn't Tracking (Dedup, iOS, In-App Browsers)

Bradley J Simons
Bradley J Simons
Founder of VLVTN · runs paid Meta ads for his own releases as Babbage
Updated 2026-06-09
5 min read
The short answer
A Facebook pixel that looks like it isn't tracking is almost always under-reporting, not dead. iOS opt-outs since iOS 14.5, ad blockers, and in-app browsers block the browser event before it reaches Meta, and a missing shared event_id can double-count what does land. The durable fix is sending the same event from your server with the Conversions API and deduping on event_id.
Key takeaways
  • The pixel is browser-side JavaScript. iOS App Tracking Transparency, ad blockers, and in-app browsers all block browser events before Meta sees them.
  • Conversions API (CAPI) is server-side. It sends the same event from your server, so it survives the blocks the browser cannot.
  • Pass a shared event_id from both the pixel and the server, or Meta double-counts the same conversion.
  • Meta recommends running the pixel and CAPI together. That is the durable answer to under-reporting.
  • A conversion is a tracked click-out to a DSP, not a guaranteed stream.

Your pixel is under-reporting, not broken

When people search for why their Facebook pixel is not tracking, they usually picture a broken snippet. That is rarely it. The Meta Pixel is a piece of JavaScript (the fbq()call) that fires events from the visitor's browser. For most visitors it fires exactly as intended. The problem is everything sitting between that browser and Meta's servers, quietly eating events on the way.

So the right question is not "is my pixel broken". It is "how much of my real traffic can the browser pixel even reach". Once you see the four things blocking it, the gap stops looking like a bug and starts looking like a measurement problem you can close. Each one has a plain fix, and the same answer keeps coming up: send the event from your server too.

Reason 1: iOS App Tracking Transparency

In April 2021, iOS 14.5 introduced App Tracking Transparency. Apps now have to ask permission before tracking a user across other apps and sites, and a large share of iOS users decline. When one of those users taps your ad and clicks out to a DSP, the browser pixel signal can be blocked or never reach Meta. Ads Manager then falls back to modeled and aggregated estimates to fill the gap.

This is the single biggest reason a campaign run mostly to iPhone users looks under-reported. You will see fewer browser conversions than clicks suggest, and the numbers feel soft. The plain fix is to stop relying on the browser alone. A server-side event does not go through the browser, so ATT does not touch it.

Note
You will see big "X percent of events are lost to iOS" figures online. They vary a lot by source and audience, so treat any specific number as a practitioner read, not an official Meta stat. The mechanism is real. The exact percentage for your account is not something Meta publishes.

Reason 2: ad blockers

EasyList, the most-used filter list behind ad blockers, targets tracking pixels from Meta, Google, TikTok, and others. When a visitor runs a blocker, the fbq() request is blocked and the event simply never fires. There is no error you will catch, no partial signal. The conversion happens and the browser pixel says nothing.

You cannot turn off someone's ad blocker, and you should not try to fight it. The fix is the same as the iOS one: a server-side event originates from your server, not the visitor's browser, so a client-side blocker has nothing to block.

Reason 3: in-app browsers

Most of your paid music traffic comes from a Reel or a TikTok, which means the link opens inside an in-app browser: the webview baked into Instagram, TikTok, or Snapchat. Those webviews suppress third-party cookies and device identifiers, so the signals the browser pixel relies on are not there. On top of that, Safari's Intelligent Tracking Prevention caps JavaScript-set cookies like _fbp at around seven days.

Stack these together. An iPhone user who declined tracking, opening your link in the Instagram webview, with ITP capping cookies. The odds of the browser pixel capturing that conversion approach zero. That same user is exactly who a server-side event still records, because the server send does not depend on browser cookies at all.

Tip
In-app browsers also break the click-out itself if a link tries to open a new tab the webview will not allow. VLVTN detects Instagram, TikTok, and Snapchat webviews on the smartlink and forces a same-tab redirect, so the fan still lands on the DSP and the event still fires.

Reason 4: a missing event_id (double-counts and mismatches)

This one is the opposite problem. Once you start sending events from both the browser pixel and the server, you can accidentally count the same conversion twice. Meta only knows two events are the same when it receives a matching event_name plus event_id within a short window. When it sees that match, it dedupes and counts one. Without a shared, identically-formatted ID, it counts both.

Wiring it up means passing event_id as the fourth argument to the pixel call, fbq('track', 'EVENTNAME', {}, { eventID: '...' }), and sending that exact same event_id in the server payload. Get this wrong and your reported numbers wobble: some conversions doubled, some mismatched, none of it trustworthy enough to optimize against.

Watch out
If your conversion count suddenly jumped after you added server-side tracking, check the dedup before you celebrate. A doubled count is not more conversions. It is the same conversions counted twice because the event_id is not shared or not formatted identically on both sides.

The durable fix: pixel plus CAPI with event_id dedup

Every reason above points at the same answer. The Conversions API (CAPI) sends your events from your server directly to Meta, server-to-server, with no browser involvement and no cookie dependency. That means iOS opt-outs, ad blockers, and in-app browsers do not block it. Meta and TikTok both recommend running the browser pixel and the server API together for the most complete coverage, then deduping the pair on event_id so each real conversion counts once.

Tracking methodWhat blocks it
Meta Pixel (browser)iOS opt-outs, ad blockers, in-app browser cookie suppression, ITP cookie limits.
Conversions API (server)None of the above. The send comes from your server, not the visitor's browser.
Both, deduped on event_idThe browser copy is caught when it can be; CAPI fills the gap; Meta counts one. Most complete view.

This dual-channel setup with automatic event_id dedup is exactly what VLVTN does on the smartlink landing page. When a fan clicks out to a DSP, the page fires the browser pixel and a CAPI event sharing one UUID, and Meta dedupes them by event_name plus event_id. That is the moat: accurate paid-ad optimization even when most of your traffic is iPhone users coming through the Instagram webview. To be clear about what CAPI does and does not do, it recovers signal the browser would lose. The exact amount is account-specific, so do not expect it to recover everything.

Once your tracking is honest, grade your cost per conversion

For the wiring itself, the sibling guide on tracking Spotify conversions walks through the setup, and the smart link pillar covers where this sits in the wider funnel. One honest reminder before you start reading the numbers: a conversion is a tracked click-out to a DSP, not a guaranteed stream. Fixing the tracking makes the count trustworthy. What happens after the click-out is the song's job.

Frequently asked

Is my Facebook pixel actually broken if conversions look low?

Usually not. The pixel is firing fine for most people. What is happening is that iOS opt-outs, ad blockers, and in-app browsers stop a chunk of those browser events from ever reaching Meta. The fix is sending the same event from your server with the Conversions API so the count holds even when the browser copy is blocked.

Does server-side CAPI recover all my lost conversions?

No. CAPI recovers signal the browser pixel loses to iOS, ad blockers, and in-app webviews, but the amount it recovers is account-specific. Meta's own guidance is that the pixel and CAPI together give the most complete view. Anyone promising a fixed recovery percentage is guessing.

Why would my conversions get double-counted?

If you send the same event from both the browser pixel and the server but do not pass a shared event_id, Meta has no way to know it is one event and may count it twice. Meta dedupes when it sees a matching event_name plus event_id within a short window. Without that shared ID you get double-counts or mismatches.

Do conversions equal streams?

No. A conversion here is one tracked click-out from your smartlink to a streaming service. It is not a guaranteed play, save, or follow. You optimize the campaign on that click-out, then the song decides what happens on Spotify.

Bradley J Simons
About Bradley J Simons
Founder of VLVTN · runs paid Meta ads for his own releases as Babbage

Bradley J Simons founded VLVTN and runs his own paid Meta and Spotify ad campaigns as the artist Babbage. He writes about paid music marketing from the buyer's seat, with his own money on the line.

Keep reading

Grade your own cost per conversionPaste in your cost per result and see where it lands against real benchmarks.Open the grader