Troubleshooting
Why Isn't My GTM Tag Firing? A 6-Step Debugging Checklist
A tag that won't fire is the most common Google Tag Manager problem, and almost always one of a handful of causes. Work this checklist top to bottom in GTM Preview (Tag Assistant) and you'll find it fast. Each step tells you exactly what to look at and what "good" looks like.
Before you start
1. Are you testing the right version?
The most common "it works in Preview but not live" cause: the change was never published. Preview runs your latest workspace draft; the live site runs the last published version.
- If it works in Preview but not in production, click Submit → Publish.
- Confirm the right container ID (
GTM-XXXXXXX) is installed on the page. - Hard-refresh (the old container can be cached) and re-check.
2. Did the trigger actually match?
Select the event in the timeline and open the Tags tab. Your tag is either under "Tags Fired" or "Tags Not Fired." If it's not fired, click it to see which trigger condition failed, GTM shows the condition and the actual value side by side.
- Wrong event. A Custom Event trigger for
add_to_cartwon't fire if your site pushesaddToCart. Names are case- and spelling-sensitive. - Condition mismatch. "Page Path equals
/thank-you" fails on/thank-you/or/thank-you?id=1. Use contains or a regex when appropriate. - Click/Form trigger never sees the interaction. JavaScript-driven buttons and embedded forms often don't emit native events, you may need a dataLayer push instead.
3. Is the data there yet? (timing & race conditions)
A tag can fire on the right event but send nothing because the value it needs didn't exist yet. Open the Variables tab for that event and check your variable has a value, not undefined.
// BAD: tag fires on Page View, but user_id is pushed a moment later.
dataLayer.push({ event: "page_view" });
setTimeout(() => dataLayer.push({ user_id: "abc" }), 500); // too late
// GOOD: push context before the tag that needs it.
dataLayer.push({ user_id: "abc" });
dataLayer.push({ event: "page_view" });The rule
undefined in the Variables tab, the data was pushed too late, fire the tag on the event that carries the data instead.4. Is a blocking trigger (exception) stopping it?
Exceptions silently win. If your tag has a blocking trigger and its condition is true, the tag will not fire even when its firing trigger matches. In the not-fired tag detail, check for a blocking trigger and whether it evaluated true.
- A site-wide "don't fire on staging" exception that's matching production.
- A "exclude internal traffic" rule catching more than intended.
5. Is consent holding the tag?
With Consent Mode and consent checks, a tag can be intentionally held until the user grants permission. That's correct behavior, but it looks identical to a broken tag if you don't know to check.
- In the tag detail, look for a consent status showing the tag is waiting.
- Accept the consent banner in Preview and confirm the tag then fires.
- Verify your CMP actually pushes the consent update, if it never does, tags stay held.
Practice this on a real container
The fastest way to get good at debugging is to break things on purpose. Practice triggers, exceptions and Preview on a live container, see exactly why a tag fires or doesn't, in Tag Assistant.
Practice triggers & debugging →6. The tag fired, but did the hit leave the browser?
"Tag fired" means GTM ran the tag, not that the request succeeded. For the full truth, open the browser's Network tab and filter for the vendor endpoint:
Network tab filter: collect GA4 success looks like: POST https://www.google-analytics.com/g/collect?v=2&tid=G-XXXX&en=purchase ... → 200/204
- No request at all? An ad/tracking blocker may be stopping it, or the page navigated before it sent (see form tracking).
- Request present but wrong params? Back to step 3, your variables are empty or mismapped.
The 60-second triage
- Published? Live ≠ Preview. Publish and hard-refresh.
- Trigger matched? Check Tags Not Fired → which condition failed.
- Variable populated? Variables tab for that event, not
undefined. - Exception blocking? Look for a true blocking trigger.
- Consent holding? Accept the banner, re-test.
- Hit sent? Network tab → vendor endpoint → 200/204.
Now go practice it
Reading sticks when you do it. These hands-on lessons load your own GTM container and let you debug in Tag Assistant.
Frequently asked questions
Why is my GTM tag not firing?
Work through six causes in order: (1) the change isn't published, so live differs from Preview; (2) the trigger conditions don't actually match the event; (3) a needed variable is undefined because data was pushed too late; (4) a blocking trigger (exception) is true; (5) consent is holding the tag; or (6) the tag fired but the network request was blocked or cancelled. Use GTM Preview / Tag Assistant to identify which.
My tag works in Preview but not on the live site. Why?
Preview runs your latest workspace draft; the live site runs the last published version. If it works in Preview only, click Submit → Publish, confirm the correct GTM container ID is installed, and hard-refresh to clear a cached container.
How do I see why a trigger didn't fire in GTM?
In Preview / Tag Assistant, select the event in the timeline, open the Tags tab, and click the tag under 'Tags Not Fired'. GTM shows each trigger condition next to the actual value, so you can see exactly which condition failed.
Does 'tag fired' mean the data reached GA4?
No. 'Tag fired' only means GTM executed the tag. To confirm data was sent, open the browser's Network tab, filter for the vendor endpoint (for GA4, 'collect'), and check there's a request with the right parameters returning 200/204.
Could consent be stopping my tag from firing?
Yes. With Consent Mode or consent checks, a tag can be intentionally held until the user grants permission. In the tag detail, look for a consent status showing it's waiting, accept the banner in Preview, and confirm your CMP actually pushes a consent update.
Related posts
Troubleshooting
GTM Preview Not Working? 6 Fixes That Actually Connect
Preview won't connect or Tag Assistant keeps spinning? It's almost always an environment issue, not a broken container. The fixes in the order worth trying them.
Read →Troubleshooting
Shopify Checkout Tracking Not Working? Missing & Doubled Purchases, Fixed
Missing purchases, doubled purchases, wrong revenue, Shopify checkout tracking fails in predictable ways, almost all of them environmental. Here's how to find which one you hit.
Read →Troubleshooting
Why GA4 and Google Ads Conversions Don't Match (and When to Worry)
142 conversions in Ads, 119 in GA4, same week, before assuming it's broken, know the two tools are supposed to differ. Why they drift, and how to spot a real bug.
Read →About the author

Analytics & Tag Management Consultant
Nathan Gage got his start in marketing through Google Tag Manager. Seeing how tracking customer behavior could turn raw clicks into insight you can actually act on is what pulled him into the field. Since then he has worked both full time and as a consultant with 15 marketing agencies, supporting brands that spend anywhere from a thousand dollars a month to over a million. Along the way he built a multi-touch attribution app, and he created The Happy Tagger so anyone can practice GTM, GA4 and server-side tracking on a real container instead of a production site.