Most Meta Pixel installs are compliant in intention and leaking in practice. The reason is sequencing.
The default snippet Meta gives you calls fbq('init', ...) and then fbq('track', 'PageView'). Both sit high in the so the Pixel loads fast. Your consent banner is a separate script that loads later. For the window between them, the Pixel has already sent a PageView with no consent recorded anywhere.
Meta's own GDPR implementation docs cover the fix. The Pixel has a consent state, and you set it before you initialise:
`js
fbq('consent', 'revoke'); // must run before init
fbq('init', 'YOUR_PIXEL_ID');
fbq('track', 'PageView');
Then, in your banner's accept handler:
js
fbq('consent', 'grant');
While revoked, the Pixel loads but holds back tracking data. That is the state you want by default for EU and UK traffic.
The part that catches teams out
The Conversions API does not inherit this. It runs server side, so your revoke call has no reach over it. If you are gating the Pixel and firing CAPI events for everyone, you have gated the visible half of your setup and left the other half open. The route changed. The legal basis did not.
Second trap: if the Pixel and CAPI both report the same purchase, you double count it. Meta deduplicates when both events carry the same event_id and event_name`. Generate the ID once per event, pass it to both, and your numbers stop inflating.
One more that has quietly changed: the Advertiser Tracking Enabled parameter is no longer required for Facebook SDK for iOS 17.0.0 and later. If your mobile setup still hardcodes it, review it.
The full sequence, including the GTM variant, is in this walkthrough of facebook ads consent tracking.
Where a CMP earns its place
Wiring this by hand across Meta, Google Consent Mode v2 and Microsoft means three separate signal paths to keep in sync, and every deploy is a chance to break one. A consent platform with native Meta integration emits all three from one source, so the banner state and the tag state cannot drift apart. That is the reason to use one, rather than the banner itself.
Top comments (0)