<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rytis Balys</title>
    <description>The latest articles on DEV Community by Rytis Balys (@rytisbalys).</description>
    <link>https://dev.to/rytisbalys</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4018434%2F9820b06b-4c6a-495a-b94a-2a00b9a1f96e.png</url>
      <title>DEV Community: Rytis Balys</title>
      <link>https://dev.to/rytisbalys</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rytisbalys"/>
    <language>en</language>
    <item>
      <title>Meta Pixel not firing? The 6 real causes, in the order to check them</title>
      <dc:creator>Rytis Balys</dc:creator>
      <pubDate>Mon, 06 Jul 2026 22:15:34 +0000</pubDate>
      <link>https://dev.to/rytisbalys/meta-pixel-not-firing-the-6-real-causes-in-the-order-to-check-them-4d0f</link>
      <guid>https://dev.to/rytisbalys/meta-pixel-not-firing-the-6-real-causes-in-the-order-to-check-them-4d0f</guid>
      <description>&lt;p&gt;"The Meta Pixel isn't firing" is one of the most common things I get called in to fix. The frustrating part is that "the pixel is installed" and "the pixel is firing" are completely different claims - and most dashboards happily say &lt;em&gt;connected&lt;/em&gt; while the events never actually leave the browser.&lt;/p&gt;

&lt;p&gt;Here are the six causes I check, in order, each with a verification step you can run in a couple of minutes.&lt;/p&gt;

&lt;p&gt;First, know what you're looking for. A firing pixel sends network requests to &lt;code&gt;facebook.com/tr&lt;/code&gt;. Open DevTools &amp;gt; Network, filter by &lt;code&gt;tr&lt;/code&gt;, and act on the site. No requests = not firing, whatever your tag manager says.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Consent banner is blocking it (the #1 cause in the EU)
&lt;/h2&gt;

&lt;p&gt;If you run Cookiebot, OneTrust or any CMP in opt-in mode, the pixel is legally supposed to stay silent until the visitor accepts. The bug: after acceptance it often &lt;em&gt;stays&lt;/em&gt; silent, because the pixel tag in GTM isn't wired to the consent state, or fires before consent updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify:&lt;/strong&gt; open the site in incognito, accept all cookies, then watch for &lt;code&gt;facebook.com/tr&lt;/code&gt; requests. Silent even after full acceptance = your consent wiring is broken, not working.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Pixel initialized twice (or three times)
&lt;/h2&gt;

&lt;p&gt;A hardcoded base code in the theme &lt;em&gt;and&lt;/em&gt; a GTM tag &lt;em&gt;and&lt;/em&gt; a platform integration all loading the same pixel. The symptom is usually the opposite of silence - events fire 2-3x per action, purchases double-count, and audiences get polluted. The classic version I keep running into: the base pixel hardcoded in the theme, a second copy bolted on through GTM "for safety", and the app's own integration on top - three Purchase events per order, a ROAS that looks incredible, and ad budget getting scaled on a number that's pure fiction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify:&lt;/strong&gt; in the console run &lt;code&gt;fbq.getState().pixels&lt;/code&gt; (or use Meta Pixel Helper). More than one init of the same ID, or multiple IDs you don't recognise = consolidate before anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. GTM trigger chain never completes
&lt;/h2&gt;

&lt;p&gt;The tag exists, but its trigger waits for a dataLayer event (&lt;code&gt;purchase&lt;/code&gt;, &lt;code&gt;add_to_cart&lt;/code&gt;) that the site never pushes - a theme update or checkout change silently broke the push. The tag is "active" and fires exactly never.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify:&lt;/strong&gt; GTM Preview mode, perform the action, watch the event stream. If your trigger event never appears in the left column, the dataLayer push is gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Redirect checkouts eat the Purchase event
&lt;/h2&gt;

&lt;p&gt;PayPal, financing providers, bank-redirect payments: the buyer leaves your site to pay and often never returns to the thank-you page where the Purchase pixel lives. The pixel works perfectly - for the customers who come back. The rest vanish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify:&lt;/strong&gt; compare pixel Purchase counts against real backend orders &lt;em&gt;by payment method&lt;/em&gt;. If card orders track and redirect-payment orders don't, this is your gap. The durable fix is server-side (Conversions API from the order event, not the browser).&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Checkout runs in an iframe or on another domain
&lt;/h2&gt;

&lt;p&gt;Embedded checkouts (Eventbrite, Calendly, some booking and payment widgets) run in a cross-origin iframe. Your page's pixel physically cannot see events inside it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify:&lt;/strong&gt; if the confirmation step's URL bar or frame ancestry is another domain, stop debugging your pixel. You need the vendor's own tracking hooks, a postMessage bridge, or server-side events.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Ad blockers and browser privacy (the loss you can't fix client-side)
&lt;/h2&gt;

&lt;p&gt;Some meaningful share of your visitors block &lt;code&gt;facebook.com/tr&lt;/code&gt; outright - ad blockers, Safari ITP, strict browser modes. No client-side fix exists. This is exactly what the Conversions API is for: the same event, sent server-to-server, deduplicated against the browser event via a shared &lt;code&gt;event_id&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify:&lt;/strong&gt; in Events Manager, check the ratio of browser vs server events per event type. Browser-only setup = you're losing whatever your audience's blocker rate is, silently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one-line rule
&lt;/h2&gt;

&lt;p&gt;Don't trust any dashboard that says "connected". Trace one real event end to end - browser network tab, GTM Preview, Events Manager Test Events - and compare monthly totals against your backend's paid orders. The number that matches reality is your backend; everything else is a suspect until proven otherwise.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This first appeared on &lt;a href="https://rytisbalys.com/meta-pixel-not-firing" rel="noopener noreferrer"&gt;rytisbalys.com&lt;/a&gt;, where I keep the &lt;a href="https://rytisbalys.com" rel="noopener noreferrer"&gt;rest of my troubleshooting guides&lt;/a&gt; - written from real audits, not documentation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>analytics</category>
      <category>debugging</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
