Found in AI answers?Hire Theory Road
Theory Road.

GTM Tag Not Firing? The Order We Check It In.

A tag that never fires reports nothing, and the silence looks like a campaign problem. Here is the order we check a Google Tag Manager container, one layer at a time, until the failure shows itself.

By October 18, 202610 min read

When a Google Tag Manager tag is not firing, the cause is almost always one of eight things: the container was never published, the site loads a different container ID than the one you are editing, the trigger conditions do not match (wrong page path or click class), the built-in variable the trigger depends on is not enabled, the data layer event is pushed too early or under a different name, consent settings are holding the tag back, a setup tag in a sequence failed, or the site is a single-page app that never reloads the page. You find which one in Tag Manager Preview mode, under Tags Not Fired for the event you expected, then fix that one layer and publish a new version.

Google Tag Manager is a container script, loaded from googletagmanager.com/gtm.js with your GTM- container ID, that reads events from a JavaScript array called dataLayer and decides which tags to run. Every event in the data layer (the page load events, a click, a form submit, or a custom event you push) is checked against each trigger. When a trigger matches, its tags fire. Nothing in the live container exists until a version is published.

The eight causes we find most often.

We run these audits on our own sites and on accounts we take over. The same list comes up every time.

  • Container not published: the tag works in Preview because Preview uses the workspace draft, but nobody clicked Submit and Publish, so the live container still runs the old version
  • Wrong container on the site: the page loads a different GTM- ID than the container you are editing, often a staging container, an old agency container, or one hardcoded in a theme
  • Trigger conditions do not match: the condition says Page Path equals /thank-you but the real path is /thank-you/ or carries a query string, or the click condition checks a class that is on a child element, not the one clicked
  • Built-in variable not enabled: the trigger or condition relies on Click Classes, Click ID, or the history variables, and they were never switched on under Variables, Built-In Variables, Configure
  • Data layer timing or name mismatch: the custom event is pushed before GTM loads with the data overwritten, or the code pushes form_submit while the Custom Event trigger listens for formSubmit, and the data layer is case sensitive
  • Consent settings blocking the tag: the tag is set to Require additional consent for tag to fire and the consent type is still denied, or the consent banner never updates consent state
  • Tag sequencing failure: the tag has a setup tag with Don't fire this tag if the setup tag fails checked, and the setup tag failed or never signaled success
  • Single-page app route changes: the site changes URLs with the History API instead of loading new pages, so a Page View trigger fires once on the first load and never again

How to verify whether a GTM tag is firing.

Look at what the container does in a browser, not at the workspace. Three checks, in this order.

Preview mode in Tag Assistant. In the GTM workspace click Preview in the top right. Tag Assistant opens in a new tab at tagassistant.google.com. Enter the page URL and click Connect. Your site opens with a Connected badge. In Tag Assistant, the left column lists every event in order. Click the event your tag should fire on, then read the Tags tab: the tag is either under Tags Fired or under Tags Not Fired. The Variables and Data Layer tabs show the values GTM saw at that exact event.

The browser network tab. Open developer tools, go to Network, and filter on gtm.js. The request URL shows the container ID the page actually loads. Then filter on the destination of the tag (collect for GA4, the ad platform domain for a pixel) to confirm the hit left the browser after the tag fired.

View source on the live site. Search the page source for GTM-. More than one container, or an ID you do not recognize, explains a lot before you open a single trigger.

Diagnose top to bottom.

This is the order we run. Each step checks one layer, and you stop at the first real failure.

Confirm the container ID and the live version.
View source and the network tab on the live page and note the GTM- ID. Open that exact container. Go to Versions and check which version is live and when it was published. If your tag change is only in the workspace, click Submit, choose Publish and Create Version, add a version name, and Publish. If the site uses environments, confirm you published to the environment the site loads.
Find the event in Preview and read Tags Not Fired.
Connect Tag Assistant, perform the action (load the page, click the button, submit the form), and select that event in the left column. If the tag sits under Tags Not Fired, click it. Tag Assistant shows the firing triggers with a check or a cross next to each condition, so you see exactly which condition failed. If the event you expected is missing from the left column entirely, the problem is upstream of the trigger: the data layer push or the listener.
Check the condition values against the Variables tab.
With the event still selected, open Variables and compare the real values to your trigger conditions. Page Path is the path only, without the domain or query string. Click Classes is the class attribute of the element that was actually clicked, which is often an icon or span inside the button. Use contains instead of equals, or match a CSS selector against Click Element, to cover nested elements.
Enable the built-in variables the trigger needs.
If a condition variable shows as undefined, or does not appear in the condition dropdown at all, go to Variables, Built-In Variables, Configure, and tick the boxes for the click, form, or history variables you need. Save, then reconnect Preview.
Match the data layer event name and timing.
Open the Data Layer tab at the event and read the exact event key that was pushed. Copy it character for character into the Custom Event trigger, since names are case sensitive. Confirm the site declares the data layer with window.dataLayer = window.dataLayer || [] above the container snippet, and that no script later resets it with dataLayer = [].
Check consent state and settings.
In Tag Assistant, select the earliest Consent event and open the Consent tab: the On-page Default column shows the starting state. Select the latest Consent event after clicking the banner and read On-page Update. Then open the tag, Advanced Settings, Consent Settings. If it says Require additional consent for tag to fire and the listed types are denied at that event, the tag is behaving as configured. Fix the banner integration so it updates consent, not the tag.
Check sequencing, firing options, and SPA routes.
In Advanced Settings, look at Tag Sequencing for a setup tag and the Don't fire option, and at Tag firing options (Once per page blocks repeat firing). For single-page apps, add a History Change trigger, or have the app push a custom virtual page view event to the data layer on each route change, and fire the tag on that.
GTM tag not firing: symptom, likely cause, fix
SymptomLikely causeFix
Fires in Preview, not on the live siteChanges never published, or published to the wrong environmentSubmit, Publish and Create Version, confirm the live version in Versions
Tag Assistant never connects, no gtm.js requestSnippet missing, wrong container ID, or blockedCheck page source for the GTM- ID and the network tab for gtm.js
Tag under Tags Not Fired with a red cross on Page PathPath condition too strict (trailing slash, query string)Use contains or a regex, check the value in the Variables tab
Click trigger never matches a buttonClick Classes is the inner element, or click variables disabledEnable built-in click variables, match with contains or a CSS selector
Custom event missing from the event listdataLayer.push never ran or dataLayer was resetDeclare the data layer above the snippet, never reassign it
Custom event appears, tag still not firedEvent name in the trigger differs in spelling or caseCopy the event key from the Data Layer tab into the trigger
Tag fires only after the visitor accepts the bannerAdditional consent required and consent denied by defaultConfirm that is the intended policy and that the banner sends consent updates
Fires on first page of the app, never after navigationSPA route change does not reload the pageUse a History Change trigger or push a virtual page view event
Tag fires once, then never again on the same pageTag firing options set to Once per pageSet to Once per event when repeat firing is intended

Tags Not Fired: what is normal and what is a red flag.

Tags Not Fired is not an error list. On any given event, most tags in a healthy container are not fired, because their triggers are meant for other events. Read Tags Not Fired only on the event where you expected the tag to run.

Normal: a tag not fired on Container Loaded but fired on a later event such as Window Loaded or your custom event. Normal: tags with built-in consent checks, such as Google tags, behaving differently when ad_storage or analytics_storage is denied. Normal: a small share of real visitors never loading gtm.js because an ad blocker or browser setting blocks it, which you see as a gap between server orders and tag hits.

Red flags: the expected event never appears in the left column, which means the data layer push or the listener is broken. A tag listed as fired with no matching network request, which points at the tag configuration or a blocked destination. Two containers on the same page firing the same tag. A gap between Preview and live behavior, which is almost always an unpublished workspace or the wrong container.

Once the tag fires, check that the destination receives it. That half of the problem lives in our guides on GA4 conversions not showing and Google Ads conversion tracking not working. If the tag in question is a Meta pixel loaded through GTM, the browser side is covered in why your Meta pixel is not firing.

We run these checks as part of the wider conversion tracking audit checklist before we spend on any account, because a silent tag reports nothing and that silence is easy to mistake for a campaign problem. If you send conversions server side as well, the enhanced conversions setup depends on the same data layer values being present at the right event.

Why does my GTM tag fire in Preview but not on the live site?

Preview mode runs the current workspace draft, while visitors get the last published version. If you made changes and never clicked Submit and then Publish, the live container does not include them. Check Versions to see which version is live, and confirm you published to the environment your site actually loads.

What does Tags Not Fired mean in Tag Assistant?

It lists tags whose triggers did not match the event you have selected in the left column. It is normal for most tags to sit there on most events. Select the event where you expected your tag to run, click the tag, and Tag Assistant shows which trigger condition failed.

How do I make GTM fire tags on a single-page app?

Single-page apps change the URL without reloading the page, so Page View triggers fire only once. Add a History Change trigger, which fires when the app uses pushState or the URL fragment changes, or have the app push a custom event to the data layer on every route change and fire the tag on that event.

Why is my click trigger not working in Google Tag Manager?

Usually the click variables are not enabled, or the condition checks the wrong element. Go to Variables, Built-In Variables, Configure, and enable Click Classes, Click ID, and related variables. Then click the button in Preview and read the Variables tab to see which element and class GTM actually recorded.

Can consent mode stop a GTM tag from firing?

Yes. If a tag's consent settings say Require additional consent for tag to fire, it waits until every listed consent type is granted. Tags with built-in consent checks, such as Google tags, also adjust their behavior when consent is denied. Use the Consent tab in Tag Assistant to see the consent state at each event.

Is the GTM data layer case sensitive?

Yes. Google's documentation states the dataLayer object name is case sensitive, and event names in a Custom Event trigger must match what the site pushes exactly. dataLayer and datalayer are different objects, and form_submit and Form_Submit are different events.

Work with us

Let’s talk about what’s next.

A short note on where the business is and where it needs to go. A senior partner replies within one business day.

t@theoryroad.com

Step 1 of 2

How can we help you get found?

What do you need help with?

Next: name, email and budget. That’s it.