Skip to content
← All articles

Analytics & Tracking

GA4 Double Counting: When gtag.js and Google Tag Manager Both Fire

September 12, 2026 · 8 min read

Your GA4 page views look healthy, maybe too healthy. Views per session sit oddly high, key events outnumber the leads in your CRM, and Google Ads is reporting conversions nobody on the sales team recognizes.

The cause is often mundane. GA4 is installed twice: once as a hardcoded gtag.js snippet in the site template, and again as a tag in Google Tag Manager. Both fire, both send the same events, and every report built on them is inflated.

This is how to confirm it, how to tell a real duplicate from something that only looks like one, and how to fix it without breaking anything else.

What causes GA4 double counting?

Almost always, two pieces of code sending the same events to the same measurement ID. The classic case is a hardcoded gtag.js snippet with a gtag('config') call, plus a GA4 Google tag in GTM configured with the same measurement ID. Each one sends its own page_view on every page load.

It happens for ordinary reasons. A developer added GA4 directly to the site before GTM existed on it. A CMS plugin or theme setting installed it quietly. An agency later set up GTM properly and nobody removed the original snippet. Nothing looks broken, because data is flowing, so nobody checks.

The same pattern shows up in other forms:

Two GTM containers. A site migration or an agency handover leaves an old container on the page alongside the new one, both with GA4 tags.

Two tags inside one container. A GA4 Google tag and a separate GA4 event tag both sending page_view, or two Google tags for the same ID created at different times.

Plugin plus GTM. An ecommerce or CMS plugin sends GA4 events, including purchases, while GTM sends the same events from the dataLayer.

Is a gtag.js snippet without a config call a duplicate?

No. The gtag.js library on its own sends nothing to GA4. Measurement starts only when a gtag('config', 'G-XXXXXXX') call, or an explicit gtag('event') call, tells it where to send data. A snippet without one is often there on purpose.

The most common legitimate reason is consent. Consent Mode defaults need to be set before any tags fire, and many implementations do this with a small gtag snippet in the page head that defines the dataLayer and calls gtag('consent', 'default', ...) ahead of the GTM container. Removing it because it "looks like a second GA4 install" can break consent handling, which is a compliance problem, not just a data problem.

So before removing anything, read the snippet. Look for a gtag('config') line with a G- measurement ID. If it is there and GTM also has a Google tag for the same ID, you have a duplicate. If the snippet only sets consent defaults, or only configures a Google Ads ID you handle nowhere else, it is doing a job and should stay.

How do I check for duplicate GA4 page_view hits?

Open Chrome DevTools, go to the Network tab, filter for "collect", and reload the page. GA4 sends events to a URL containing /g/collect. If you see two requests carrying en=page_view for the same measurement ID on a single page load, you are double counting.

Some details make this more reliable.

Check the tid parameter. Each request carries the measurement ID as tid. Two page_views with the same tid are a duplicate. Two with different IDs mean you are sending to two properties, which may or may not be intended.

Look in the payload, not only the URL. GA4 can batch several events into one request, with events listed in the request body. Click each request and check both the query string and the payload for page_view.

Test with consent granted. If your banner blocks analytics until consent, accept it first, or you may see nothing at all and conclude the problem does not exist.

Repeat on key pages. A duplicate that appears only on the checkout confirmation page, from an ecommerce plugin, will not show up on the homepage.

GTM preview mode helps with the GTM side, showing which tags fired on each event. It does not show hardcoded tags, which is why the Network tab is the check that catches both sources at once. An audit or scan that loads your pages and inspects the requests can do the same across a whole site.

What about multiple GA4 measurement IDs?

Sending to more than one GA4 property is not automatically wrong. A rollup property for a group of brands, or a separate property for a regional team, can be deliberate. The problem is when nobody knows why the second ID is there.

Stray measurement IDs usually come from a test property that was never removed, a previous agency's property that is still collecting, or a staging configuration that shipped to production. They do not inflate the numbers in your main property, but they send your visitors' data to a property you may not control, and they add a library request to every page.

List every measurement ID that appears in your collect requests, confirm the owner and purpose of each, and remove the ones nobody can account for.

How does duplicate tracking affect Google Ads and smart bidding?

Directly. If a key event fires twice in GA4 and you import it into Google Ads, bidding can see two conversions where one happened. Smart bidding then treats the traffic behind it as more valuable than it is, raises bids on it, and spends more for the same real outcomes.

Duplicate conversions happen in several ways:

The GA4 event fires twice because of the double installation, so the imported key event doubles.

Two conversion sources count the same action. A native Google Ads conversion tag and an imported GA4 key event, both set as primary conversion actions for the same form submission, both feed bidding.

Two events describe one action. An enhanced measurement form_submit and a custom generate_lead event both marked as key events.

The Google Ads counting setting can soften some of this. Setting a lead conversion action to count "One" per click means repeated conversions from the same click count once. That is the right setting for most lead actions anyway, but it is not a fix. Purchases are usually counted as "Every", duplicates there inflate revenue directly, and the underlying GA4 data stays wrong regardless.

The cost is not only a misleading report. Target CPA and target ROAS strategies set bids from conversion data. Doubled conversions make a campaign look twice as efficient as it is, so it wins budget it has not earned, while campaigns with clean tracking look worse by comparison and get cut.

How do I fix GA4 double counting safely?

Choose one source of truth for each event, remove the other, and verify before and after. In most cases that source should be GTM, because it keeps tag changes in one versioned place rather than in the site code.

Work through it in order.

Inventory first. Record every place GA4 is installed: hardcoded snippets, plugins, theme settings, each GTM container, each Google tag and event tag. Note which measurement IDs and which events each one sends.

Decide which source stays. Keep the implementation that is most complete and easiest to maintain. If the hardcoded snippet also sets consent defaults, remove only its gtag('config') call and keep the consent code.

Handle Google Ads before changing GA4. Check which conversion actions are primary. If a native Google Ads tag and an imported GA4 key event cover the same action, pick one as primary and set the other to secondary rather than deleting it, so you keep its history.

Remove, then verify. Make the change, reload in DevTools, and confirm one page_view per load and one of each key event per action. Check GA4 DebugView and GTM preview for the event side.

Annotate the date. Page views, events per session and conversion counts will drop. That drop is the correction, and it needs to be recorded so nobody reads it later as a performance decline. Tell whoever manages bidding, because target CPA and ROAS goals set against inflated numbers will need adjusting.

The plain summary

GA4 double counting is usually two installs doing the same job. Confirm it in the Network tab by looking for two page_view requests with the same measurement ID, and do not mistake a consent defaults snippet for a duplicate.

Then fix the source, clean up the conversion actions feeding Google Ads, and record the date so the drop in numbers is understood as a correction rather than a decline.

FAQ

Why is GA4 counting page views twice?

Usually because GA4 is installed twice with the same measurement ID, most often a hardcoded gtag.js snippet with a gtag('config') call plus a GA4 Google tag in Google Tag Manager. Each one sends its own page_view. Other causes include two GTM containers on the page or two tags in one container both sending page_view. Check the Network tab for two /g/collect page_view requests on one page load.

Can I use gtag.js and Google Tag Manager together?

Yes, as long as they are not both sending the same events to the same measurement ID. A gtag snippet that only sets Consent Mode defaults before GTM loads is a common and legitimate setup. It becomes a problem only when the snippet includes a gtag('config') call for a GA4 property that GTM also configures, because both will then send page views and events.

How do I check if GA4 is installed twice?

Open Chrome DevTools, select the Network tab, filter for "collect", accept any consent banner, and reload the page. Look for requests to /g/collect carrying en=page_view. Two with the same tid, which is the measurement ID, on one page load means GA4 is double counting. Check the request payload as well, since GA4 can batch several events into one request.

Do duplicate GA4 conversions affect Google Ads?

Yes, if you import those key events into Google Ads as conversions. Duplicates make campaigns look more efficient than they are, and smart bidding strategies such as target CPA and target ROAS use that data to set bids. The result is higher bids on traffic that is not delivering the extra value. Setting lead conversions to count "One" per click limits the damage but does not fix the source.

Will fixing double counting make my GA4 numbers drop?

Yes. Page views, events per session and any duplicated key events will fall once only one source is sending them. That drop reflects what actually happened, not a loss of traffic. Add an annotation with the date of the change, tell anyone who reports on the numbers, and review Google Ads bidding targets that were set against the inflated conversion counts.

Want help with Conversion Tracking Setup & Implementation?

Accurate, deduplicated conversions wired into every platform you buy media on, so bidding optimizes toward revenue rather than noise.

More reading

Advanced Tracking

September 17, 2026 · 10 min read

Is Google Tag Manager Slowing Down Your Site?

PageSpeed Insights often blames Google Tag Manager, but the tags inside it are usually the weight. How to read the report, what to fix first, and what server-side tagging really changes.

Read article