A GTM container audit is not the same as opening GTM and scrolling through the tag list. Scrolling gives you names. An audit gives you a picture of what's actually firing, how often, on what pages, for what purpose, and whether anyone still needs it. Those are different questions, and they require different tools.
This process works for any container — whether you're auditing a client's account you've just inherited, investigating performance complaints, or doing a scheduled review of your own setup. The goal at the end is a clear, categorized inventory with each tag marked as keep, review, or remove.
Step 1: Export the full container inventory
GTM lets you export the full container configuration as a JSON file. This gives you a complete, structured record of every tag, trigger, and variable — useful both as a backup and as the raw material for your inventory.
- In GTM, go to Admin → Export Container
- Select the current workspace and export as JSON
- Open the JSON or use GTM's tag list view to build a spreadsheet with one row per tag
Your spreadsheet should have columns for: tag name, tag type (GA4, Meta Pixel, Google Ads, etc.), trigger(s) it fires on, firing frequency (you'll fill this in later), consent status, owner/requester, last known purpose, and your audit verdict (keep / review / remove).
Don't skip the spreadsheet. Working directly in GTM's interface makes it easy to lose track of what you've reviewed and what decisions you've made. A spreadsheet gives you a record you can share with stakeholders, return to across multiple sessions, and use as the basis for cleanup decisions.
Step 2: Check what's actually firing
A tag that exists in GTM is not necessarily a tag that fires. Tags can be paused, have broken triggers, or fire only under conditions that no longer exist on the site. Checking firing status is the fastest way to divide your tag list into things that are actively doing something and things that are just sitting there.
Using GTM Preview mode
Enter preview mode and navigate through your key page types — homepage, product/category pages, checkout, thank you page, blog posts. For each page load, GTM's preview panel will show you which tags fired and which didn't. Note any tags that appear in "Not Fired" consistently across page types — these are candidates for closer investigation.
Checking tag firing history
GTM doesn't have a native firing history dashboard, but you can cross-reference against your analytics platform. If a tag is supposed to send data somewhere — an ad platform, an analytics tool — check whether that platform has received data recently. A Meta Pixel with no events in the last 30 days, or a Google Ads conversion tag that hasn't fired in 90 days, is a strong signal the tag is dormant.
Paused tags still count against your container capacity. A tag that's been paused "just in case" is occupying space and adding to the cognitive overhead of anyone who looks at the container. Paused tags that have been inactive for more than 90 days should go through the same keep/remove evaluation as live ones.
Step 3: Identify zombie tags
A zombie tag is one that's alive in the container but serving no current business purpose. Identifying them requires asking three questions about each tag:
- Who requested this and why? If nobody on the current team can answer, that's a yellow flag — not necessarily a removal signal, but worth investigating.
- Is the platform it belongs to still in use? A conversion tag for an ad platform you stopped using 18 months ago is almost certainly removable.
- Is there a corresponding business process that depends on it? Conversion tags need active campaigns. Audience tags need active remarketing lists. Analytics tags need someone reading the reports. If the downstream process doesn't exist, the tag probably doesn't need to either.
Common zombie tag patterns to look for:
- Tags from ad platforms not in the current media plan
- Multiple versions of the same tag (e.g. "GA4 — Pageview", "GA4 — Pageview v2", "GA4 — Pageview NEW") where only one should be active
- Tags added by agencies that are no longer retained, with names or IDs that reference that agency
- Test tags with "test", "temp", or a date in the name that is more than a few months old
- Tags for tools the business has replaced (old live chat platform, retired A/B testing tool, previous CMP)
Step 4: Audit ad partner tags specifically
Ad platforms tend to accumulate the most tags because each platform typically needs multiple: a base pixel or global site tag, one or more conversion tags, and often a remarketing or audience tag. Across three or four platforms, that's easily 12–20 tags before you've added anything else — and when platforms change or campaigns evolve, old tags rarely get removed.
For each ad platform in your container, map out:
- How many tags belong to this platform
- Which account and campaign each conversion tag corresponds to
- Whether there are duplicate conversion tags for the same event
- Whether the platform is still actively used for paid media
- Whether server-side tracking has been implemented for this platform (making the browser-side tag redundant)
A common pattern is finding three or four Google Ads conversion tags for the same conversion action, added at different times by different people, all firing simultaneously. Each one sends a separate conversion signal to Google Ads — inflating reported conversions and distorting Smart Bidding performance.
Ad platform tags are often the heaviest tags in a container. A full Meta Pixel implementation with CAPI events, a TikTok Pixel, a Google Ads global site tag with multiple conversion actions, and a LinkedIn Insight Tag can collectively add several hundred milliseconds to page load on slower connections. Auditing which of these are actually earning their performance cost is worth doing even when the container isn't at capacity.
Step 5: Check consent coverage
Every tag that drops a cookie, collects personal data, or sends information to a third party needs to be gated on the appropriate user consent. In GTM, this is typically implemented through a consent trigger that fires only after the user's CMP choice is registered. But in most containers, the implementation is incomplete — some tags predate the consent setup, some were added informally, and some simply weren't configured correctly.
For each tag in your inventory, note:
- Does it require consent? (Ad pixels, analytics, personalization: yes. Functional tags like performance monitoring or error logging: often no.)
- Does it have a consent trigger or consent check in its firing conditions?
- Is it correctly categorized — analytics consent for analytics tags, marketing consent for ad pixels?
- Does it fire before the CMP loads? (Tags that fire on DOM Ready or Window Loaded without a consent check may be running before the user has made a choice.)
Any tag that requires consent and doesn't have it properly implemented is a compliance gap, regardless of what your cookie banner says. The banner creates the appearance of consent management — the GTM trigger is what actually enforces it.
Step 6: Assess tag weight and trigger logic
Not all tags carry the same performance cost. A lightweight custom HTML tag might be a few hundred bytes. A full ad platform integration pulling in audience syncing, cross-device matching, and conversion modeling can be significantly heavier — and may trigger additional network requests you don't see in GTM. Identifying your heaviest tags tells you where performance gains are available if those tags can be removed, replaced, or moved server-side.
The fastest way to assess tag weight is through browser DevTools. Open the Network tab, load a key page with GTM preview mode active, and filter by third-party domains. The requests associated with each ad platform will show you both the initial payload and any subsequent calls that tag triggers.
Trigger scope
Also review whether tags are firing more broadly than their purpose requires. A conversion tag should fire on a thank-you page or a specific conversion event — not on All Pages. An audience tag for cart abandoners should fire when a product is added to the cart, not on every page load. Tags with All Pages triggers that don't actually need page-level coverage are creating unnecessary firing volume and should have their triggers tightened.
Categorizing your findings
At the end of the audit, every tag in your spreadsheet should have one of three verdicts:
| Status | Criteria | Next step |
|---|---|---|
| KEEP | Active, owned, correctly configured, consent properly handled, firing on appropriate triggers | Document owner and purpose if not already noted |
| REVIEW | Owner unclear, purpose uncertain, or configuration questionable — needs a conversation before a decision can be made | Assign to a stakeholder to confirm or deny need |
| REMOVE | Platform no longer in use, confirmed duplicate, zombie tag with no active downstream process, or paused for 90+ days with no clear return date | Pause first, then follow the removal process in Part 3 |
The REVIEW category is where most of the work is. Getting clear answers on uncertain tags requires reaching out to stakeholders — which is slower than the technical work but more important. A tag removed without confirmation can break something. A tag that stays in REVIEW indefinitely is just a zombie with a label.
