Google Tag Manager is where most startup tracking problems start. Someone adds a pixel, an agency adds a few more, a developer hard-codes the Google tag, and a year later conversions are counted twice and the site feels sluggish. This guide shows the setup we use to avoid that. It builds on our GA4 setup guide for marketing websites.
What is Google Tag Manager and does a startup need it?
Google Tag Manager is a free tool that loads and controls your marketing and analytics tags from one container, so you can add or change tracking without editing site code. A startup needs it once there's more than the GA4 tag: an ads pixel, a conversion tag, a CRM script or consent rules.
If your site only runs GA4 and nothing else, the Google tag in your code is fine. Most marketing sites outgrow that quickly, because Google Ads, LinkedIn and consent management all need tags that react to the same events. GTM gives them one shared set of triggers and one place to audit.
What does a clean Google Tag Manager setup look like, step by step?
You set up Google Tag Manager by creating one container, installing its snippet once, moving every existing tag into it, building events from a dataLayer and publishing only after a Preview test. Here's the order we follow on new builds and on cleanups.
Create one web container per site
Use a company-owned Google account, not a freelancer's, and add at least two admins. One container per site keeps permissions and versions simple.
Install the snippet once
Add the container snippet in the site's root layout so it loads on every page. In Next.js, use the official third-party scripts package or a single script component in the root layout.
Remove hard-coded tags
Search the codebase for gtag.js, Ads conversion snippets and pixels. Delete them once their GTM equivalents are live, or you'll count everything twice.
Set up consent first
Add your consent platform's tag on the Consent Initialization trigger before any other tag. Our Consent Mode v2 guide covers the details.
Add the Google tag and core events
Create one Google tag for GA4, then event tags for the conversions in your tracking plan, fired by custom event triggers.
Preview, then publish with notes
Test every change in Preview mode, check events in GA4 DebugView, and publish with a version name and a short description of what changed.
How should you name tags, triggers and variables?
Name every GTM item with one fixed pattern: Platform Type - Detail for tags, such as GA4 Event - demo_request_submit, and Item - Type - Detail for triggers and variables, such as Trigger - CE - form_submit. A consistent pattern lets anyone see what a container does without opening each tag.
Item | Pattern | Example |
|---|---|---|
Tag | Platform Type - Detail | GA4 Event - demo_request_submit |
Trigger | Trigger - Type - Detail | Trigger - CE - demo_request_submit |
Variable | Var - Type - Detail | Var - DLV - form_location |
Folder | Platform or purpose | Google Ads, LinkedIn, Consent |
Version | Date and change | Add pricing_plan_select event |
CE stands for custom event and DLV for dataLayer variable. Use folders by platform and delete paused tags instead of leaving them as clutter. A container with thirty clearly named tags is easier to trust than one with ten called Tag 1 to Tag 10.
Why do GTM setups create duplicate conversions?
GTM setups create duplicate conversions when the same action is sent by two sources or fired by two triggers. The usual causes are a hard-coded Google tag alongside GTM, a thank-you page trigger that fires on every reload, and enhanced measurement form events counted next to a custom form event.
- Two Google tags: gtag.js in the code and a Google tag in GTM both send page views and events.
- Thank-you page reloads: a page-view trigger on /thank-you fires again on refresh or back navigation.
- Overlapping form events: GA4's automatic form_submit is marked as a key event next to your own demo_request_submit.
- Click plus submit triggers: one tag fires on the button click and on the submit event.
- Imported and native conversions: Google Ads counts both its own tag and imported GA4 key events for the same action.
Does Google Tag Manager slow down your website?
Google Tag Manager itself is light, but the tags inside it can slow your site down, especially Interaction to Next Paint. Each third-party script competes for the main thread, so a container full of pixels, chat widgets and heatmap tools makes clicks and taps feel slower.
INP is the Core Web Vital sites struggle with most. Core Web Vitals field data for Q2 2026, compiled by corewebvitals.io, shows only about two-thirds of Next.js sites pass INP, with a median around 236ms. Third-party scripts are a common reason, which is why we treat every tag as a cost to justify. Google's web.dev guidance on INP explains how long tasks block interactions.
How to cut tag weight without losing data
Start by listing every tag and asking who uses its data. Remove anything without an owner. For the rest, fire marketing pixels only on the pages where they matter, such as conversion pages, instead of All Pages.
Delay non-critical tags like chat widgets until the page has loaded or the visitor scrolls. Avoid tags that inject heavy libraries on every interaction. For larger setups, server-side tagging moves some processing off the visitor's browser, but it adds hosting and maintenance, so it's rarely the first fix for a small marketing site.
Who should have access to GTM?
Give publish rights to one or two people who own tracking, and give everyone else edit or read access. Agencies and freelancers should get user access to your container, never their own container on your site.
Use workspaces for separate pieces of work, so two people don't overwrite each other. Review user access when people or vendors leave. When a container breaks, the version history is your record, so keep version notes useful. If you're handing a site over to an internal team, add GTM ownership to your CMS and editing setup documentation. When conversions stop showing, our GA4 troubleshooting guide walks through the checks in order.
