Troubleshooting · part of Fix GA4Why your GA4 events are firing twice
Enhanced Measurement is switched on by default, and it already sends six of the events most people go on to build in Google Tag Manager.
When both are running, GA4 records both. There is no de-duplication, nothing in the interface flags the collision, and because the two events carry the same name, no report can tell them apart. Every count that includes them is roughly double, and if one of them is marked as a key event, so are your conversions.
The six collisions
Google’s documentation says that with the Google tag, “all event types are enabled” for automatic detection by default. These are the events that creates, and the tag that usually duplicates each one.
Scrolls scroll
A scroll depth trigger sending an event called scroll.
Outbound clicks click
Any tag sending an event literally named click, which is one of the most common names people give a generic click tag. The collision here catches people by surprise because nothing about the name suggests outbound links.
Site search view_search_results
A search tag firing on the results page.
Video engagement video_start, video_progress, video_complete
A YouTube trigger sending the same three events.
File downloads file_download
A click trigger matching PDF or document links.
Form interactions form_start, form_submit
A form submission tag, which almost every container has. This is the most common collision of the six, because form tracking is usually the first thing anyone builds in GTM and Enhanced Measurement covers it already.
Why nobody catches it
Because nothing goes wrong. Both events are valid, both arrive, and the number they produce is plausible. A form that gets 400 submissions a month showing 800 does not look like an error, it looks like a good month, and the people most likely to notice are the ones who compare it against the CRM, which is usually nobody until a quarterly review.
The sequence that creates it is also entirely reasonable. Enhanced Measurement is on by default, so the events exist before anyone touches GTM. Then someone is asked to track form submissions, builds a tag, tests it, sees the event arriving, and ships. Nothing about that process surfaces the fact that GA4 was already recording it.
How to tell which source fired
This is the useful part, because the event names are identical and the reports cannot separate them. The parameters can. Enhanced Measurement attaches a documented set to every event it sends, and a hand-built tag usually sends none of them. If you see the same event name arriving both with and without this signature, you have two sources.
file_downloadfile_extension, file_name, link_classes, link_id, link_text, link_url
clicklink_classes, link_domain, link_id, link_url, outbound
form_startform_id, form_name, form_destination
form_submitform_id, form_name, form_destination, form_submit_text
video_startvideo_current_time, video_duration, video_percent, video_provider, video_title, video_url, visible
Check it in DebugView, where two of the same event appearing back to back is the giveaway, or in any report that lets you break the event down by one of these parameters: the rows with the parameter set are Enhanced Measurement, and the ones recorded as not set are your tag.
What it actually costs
Doubling an event count is the least of it. If the duplicated event is marked as a key event, your conversion count doubles too, and conversion rate rises with it, which makes every channel and campaign look better than it is. Anything downstream inherits the error: budget decisions, landing page tests, the report that goes to the board.
The expensive case is Google Ads. If those conversions are imported and Smart Bidding is optimising against them, the algorithm is bidding on a signal that is twice reality, and it will keep doing so until somebody notices. That is not a reporting inconvenience, it is money spent on the strength of a number that was never true.
The fix: pick one source per event
Enhanced Measurement is free, needs no maintenance and already carries useful parameters, so it wins by default. Keep the GTM tag only where you need parameters Enhanced Measurement does not send, or trigger conditions it cannot express, such as firing on one specific form rather than all of them.
To switch an option off: Admin, then Data streams, open the web stream, then Enhanced measurement, then the settings icon, and untick the one that collides. It applies to that data stream only, so a property with several streams needs the change on each one.
One caution. Turning the option off stops the duplication from that moment and does nothing to the data already collected, so expect a visible step down in the affected event the day you ship it. Annotate it, and warn whoever reads the reports before they see the drop and conclude the tracking has broken.
Can the historical data be salvaged?
Not inside GA4, where the two sources are indistinguishable by name and there is no way to retrospectively drop one. With the BigQuery export running, you can, because the parameter signature above survives into the raw event data: filter on the presence of link_url or form_id and you can count each source separately and rebuild the real number. It is the same reason the export is worth linking early, which also applies to parameters that never reach a report.
Tracking Auditor cross-references your Enhanced Measurement settings against the live tags in your container and names the events both are sending, which is a check nothing in GA4 or GTM performs. A free audit every month.
Run a free audit →FAQs
Why are my GA4 events firing twice?
The usual cause is that Enhanced Measurement and a Google Tag Manager tag are both sending the same event. Enhanced Measurement is on by default and covers scrolls, outbound clicks, site search, video engagement, file downloads and form interactions, so a container that tracks any of those duplicates it. GA4 records both events, does not de-duplicate them, and gives no warning anywhere in the interface.
Does GA4 de-duplicate identical events?
No. Both events are recorded and counted. Google's own documentation on enhanced measurement does not mention the interaction with your own tags at all, which is a large part of why this goes unnoticed for so long.
How do I tell which source sent an event?
Look at the parameters. Enhanced Measurement attaches a documented set to each event it sends: file_download carries file_extension and link_url, the outbound click event carries link_domain and outbound, form_submit carries form_id and form_submit_text. A hand-built GTM tag usually sends none of them. If you see the same event name both with and without that parameter signature, both sources are firing.
Should I turn off Enhanced Measurement or remove the GTM tag?
Pick whichever gives you the data you actually need, then disable the other for that event. Enhanced Measurement is free, maintenance-free and already carries useful parameters, so it wins unless you need custom parameters or different trigger conditions, in which case keep the tag and switch the matching option off on the data stream.
Can I fix the historical double counting?
Not in the GA4 interface. Turning an option off applies from that moment onward and does not clean up what was already collected. If you have the BigQuery export running, you can separate the two sources retrospectively by filtering on the parameter signature, because the Enhanced Measurement version carries parameters the hand-built tag does not.
Event names, the default-on behaviour and every parameter listed above are from Google’s own enhanced measurement and automatically-collected-events documentation, checked on 20 October 2026.