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.
| Symptom | Likely cause | Fix |
|---|---|---|
| Fires in Preview, not on the live site | Changes never published, or published to the wrong environment | Submit, Publish and Create Version, confirm the live version in Versions |
| Tag Assistant never connects, no gtm.js request | Snippet missing, wrong container ID, or blocked | Check page source for the GTM- ID and the network tab for gtm.js |
| Tag under Tags Not Fired with a red cross on Page Path | Path condition too strict (trailing slash, query string) | Use contains or a regex, check the value in the Variables tab |
| Click trigger never matches a button | Click Classes is the inner element, or click variables disabled | Enable built-in click variables, match with contains or a CSS selector |
| Custom event missing from the event list | dataLayer.push never ran or dataLayer was reset | Declare the data layer above the snippet, never reassign it |
| Custom event appears, tag still not fired | Event name in the trigger differs in spelling or case | Copy the event key from the Data Layer tab into the trigger |
| Tag fires only after the visitor accepts the banner | Additional consent required and consent denied by default | Confirm that is the intended policy and that the banner sends consent updates |
| Fires on first page of the app, never after navigation | SPA route change does not reload the page | Use a History Change trigger or push a virtual page view event |
| Tag fires once, then never again on the same page | Tag firing options set to Once per page | Set 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.