Google Tag Manager checker
See every Tag Manager container a site loads, and whether each one is installed the way Google asks. No login, no access to the container.
Free, no sign-up. Reads the site's public homepage once, the way a search engine does. Works on any site, not just yours.
What a good install looks like
Google's install steps give a Tag Manager container two pieces of code, and say exactly where each one goes. The checker reads the page and tells you where yours are.
- The script, high in the head. Google asks for it as close to the opening
<head>tag as possible, below any dataLayer declarations. The lower it sits, the later every tag in the container starts. - The noscript fallback, straight after the body tag. An
<iframe>inside<noscript>, for browsers with JavaScript turned off. Pasted into the head by mistake, it is invalid there, and browsers move or drop it. - The dataLayer, added to and never replaced. Tag Manager listens on the array it found when it started. A later script that writes
dataLayer = []swaps in a new array, and every push after that goes unseen. - Consent defaults first. Google says consent defaults do not work if they are called out of order, so a
gtag('consent', 'default', ...)call belongs above the container snippet.
On Shopify
A container pasted into theme.liquid runs on the storefront and nowhere else. Shopify does not load theme code on the checkout or the thank-you page, so tags in that container never see a purchase. The checker says so when it finds a theme-only container on a Shopify store. A Tag Manager container added as a custom pixel runs in Shopify's sandbox instead, on checkout too, and does not appear in the page source at all. More on the theme.liquid trap.
What this can and cannot tell you
What it reads
- Every Tag Manager container ID the page loads, and how it is installed
- Where the snippet sits, and how many scripts run before it
- Whether the noscript fallback is there, and where
- A dataLayer replaced after the container starts, and a renamed dataLayer
- A consent default in the page code, and whether it comes before the container
- Containers loaded from a host that is not googletagmanager.com, and custom loaders that hide the ID
What it cannot see
What is inside the container: its tags, triggers and variables, and whether any tag fires. It reads one page, the homepage, as served, so a container a script adds later, or one added as a Shopify custom pixel, is not in it. For firing, open Tag Manager's Preview mode on your own site and watch each tag.
Questions people ask
How do I check if Google Tag Manager is installed on a site?
Enter the address above. The checker reads the homepage once and lists every Tag Manager container it loads, with its GTM ID, where the snippet sits and whether the noscript fallback is in place. On your own site, Tag Manager's Preview mode shows the same container running, along with every tag in it.
Where should the Google Tag Manager code go?
Google asks for the script as close to the opening <head> tag as possible, below any dataLayer declarations, and the noscript code immediately after the opening <body> tag. The checker tells you where both are on the page it reads.
Does the checker show which tags are in my container?
No. A container is downloaded from Google when the page runs, and the checker reads the page as served, so it sees the container being loaded but not what is inside it. Tag Manager's own Preview mode shows every tag, trigger and variable.
What does a hidden container ID mean?
The page loads Tag Manager with Google's snippet, but the GTM ID has been replaced with an encoded string. Custom loaders, such as the one Stape offers for server-side tagging, do this so ad blockers cannot recognise Tag Manager. It is deliberate, so it is not a fault, and it means the ID cannot be read from the page.
Is it a problem to have two Tag Manager containers?
Two different containers on one page is allowed. It becomes a problem when both carry a tag for the same thing, a GA4 tag for one measurement ID, say, because each sends its own hit and the numbers double. The same container loaded twice is a problem on its own, and the checker flags it.