
April 2, 2025
Duplicate Events in Google Analytics 4 and How to Fix them
Updated: April 2nd, 2025
Lately, I have noticed an increasing number of people complaining about duplicate events in their Google Analytics 4 debug view. Sometimes, the reasons for this are quite obvious, but in other cases, they were a bit trickier than I initially anticipated.
If you are seeing something similar in your GA4 DebugView, you have come to the right place.
I have collected the most common issues I have dealt with when it comes to duplicate events in Google Analytics 4, and hopefully, you will find this article useful.
If none of the tips here helped you, let me know in the comments. Maybe we will find something new and then I will update the blog post.
In this article, you will learn the following solutions to fix duplicate events in Google Analytics 4:
- Having hardcoded GA4 and GTM at the same time
- Duplicate dataLayer events
- “Create event” feature in Google Analytics 4
- The same GTM container is added multiple times to the website
- Poor configuration of tag’s triggers
- Ignore duplicate instances of on-page configuration
- Single-page applications
- Incorrect server-side tagging configuration
- Overlap between your GTM events and GA4 enhanced measurement
- Visitor reloads/revisits a Thank you page
- Measurement Protocol

Video tutorial
If you prefer video content, here’s a tutorial from my Youtube channel.
#1. Hardcoded Google Analytics 4 and same events in Google Tag Manager
If you want to install GA4 on your website, a recommended way is to use Google Tag Manager. It gives you more flexibility and control.
However, sometimes marketers/analysts do that without realizing that some hardcoded GA4 tracking code is also sending the same events to GA4. The result? If, say, a visitor starts a checkout, two identical events will be sent to Google Analytics 4, one from GTM and one from GA4.
There are various ways to identify if you have hardcoded (added directly to the website’s source code) GA4. If you are technical enough, you can check the source code of the website.
You can open your browser’s developer tools (I am using Chrome), then go to Sources.
Then hit CTRL + SHIFT + F (on Mac, that would probably be Command + SHIFT +F) and enter the name of the event that is tracked as a duplicate. In my example, that is add_to_cart.
When you enter it, check the search results and see if any of those codes contain “gtag”. If yes, it means that the add_to_cart event is also being sent from the website’s code.
If you found such a code, you are dealing with a thing called double tagging. It means that you are tracking same things with GTM+GA4 and with hardcoded GA4.
Another (more drastic) option could be to temporarily remove the GTM container from the website and see if you are still getting GA events (non-duplicate). If yes, then you have hardcoded GA somewhere on your website.
What is the solution? Audit your entire setup, remove unnecessary hardcoded GA4 snippets and at the same time, make sure that everything is configured only in Google Tag Manager. This is quite a complex process, and if you want to learn more, enroll in my GTM course for beginners. Migration to GTM is one of the topics that I explain in great detail.
Also, check if your GA4 is not installed via some plugin (e.g., Google Site Kit).
#2. Duplicate dataLayer events
Let’s say that you are seeing duplicate add_to_cart events in your GA4 Debug View. Those events are sent when a visitor clicks the “Add To Cart” button, a dataLayer.push is activated and the click information is visible in the preview mode.
Sometimes, the problem might be in the implementation, and because of some bug, a developer’s code activates the same dataLayer.push code multiple times.
If that is your case, then ask a developer to fix this problem and fire the same event only once per interaction.
#3. “Create event” feature in Google Analytics 4
This reason is possible if you haven’t properly invested enough time to learn Google Analytics 4 and just decided to guess what some features do.
If you log in to GA4 and go to Admin > Events, you will see a button called “Create events”. Sometimes, this might not look very clear. Occasionally, people start sending events from GTM to GA4 (e.g., add_to_cart), but they also create the same event in the GA4 interface (with the help of the “Create events” feature).
That is NOT how this feature works. If you want to properly learn what “Create events” is and how to use it, read this guide.
All you need to know right now is that if you are already sending some events from GTM to GA4 and everything is fine with those events, you should NOT also enter them in the Create Events section.
Otherwise, you will be sending one event from GTM, and then GA4 will create another event with the same name and the same parameters if you create a rule like this:
This rule is looking for all events with the name “add_to_cart” (see Matching Conditions) and then it will copy all parameters of the event, hence create a new one (see Parameter configuration). The name of that new event will also be add_to_cart (see Custom Event Name field).
If, however, you already have that created, here’s how you can delete that “Create event” rule. Go to Admin > Events > Create event. Click the rule you want to delete:
Then, in the top-right corner, click three dots > Delete.
This will stop new duplicates. But you cannot fix the historical data. There is no solution for that.
#4. The same container is added multiple times to the website
Also, it is possible that a developer accidentally added the same Google Tag Manager container twice. This will result in duplicate events. I have published a blog post explaining how to diagnose this.
Important: GTM’s preview and debug mode will cause multiple GTM containers to be shown on a website. Do your diagnosis while having the preview mode closed.

#5. Poor configuration of tag’s triggers
This part will be the least specific because there are a million ways how to misconfigure something. But maybe this will give you at least some clues.
When you start debugging GTM (by enabling the Preview and Debug mode), clear the stream:
Then complete the action that is causing duplicate events. Click on Summary in the GTM preview mode.
Then take a look at the tag that is supposedly causing duplicate events. How many times did it fire? If one, then the problem is somewhere else.
Was the tag fired twice or more? Click that tag. Then, scroll down a bit and see the exact preview mode messages on which the tag fired. Did you expect the tag for fire on both events?
Click on the message that you did not expect. Then, scroll down to see the triggering conditions that were met and fire the tag. Fix your trigger conditions to be more precise and not fire on this event. How can you do that? There is no quick fix. You will have to learn GTM, how it works and how to use it. My courses can help you with that.
#6. Ignore duplicate instances of on-page configuration
This tip comes from our reader Zander.
When he created the GA4 account, he already had GA3, and it automatically connected the two using a Google Tag without him realizing it. So Zander had mystery pageviews firing in GA4.
After digging into the settings, he found this. Go to GA4 > Data Streams > Choose your data stream > Configure tag settings > Click on Your Google Tag.
And if you haven’t yet, click Ignore duplicate instances of on-page configuration (recommended).
See if this fixes the issues.
#7. Working with a single-page application?
There are several ways how to track pageviews on single-page applications. I explain them here. The last method in that article explains how you should ask a developer to push “virtual pageviews” to the data layer, and then you should fire the GA4 page_view event tag.
Every time the tag fires, a pageview is tracked.
However, Google Analytics also offers an automatic pageview tracking feature for single-page applications. It’s part of the Enhanced Measurement.
On some SPAs, it works. On others – it doesn’t. If it works on your website (while you also have implemented custom page_view tracking (with “virtual pageviews”)), this means that you’ll get duplicate pageviews. One page_view will come from your custom setup. The other one will be tracked automatically by Enhanced Measurement.
What to do?
Go to Google Analytics 4 admin > Data Streams and select your website data stream. Click the cog icon in the “Enhanced Measurment” section.
Then click “Show advanced settings” in the “Page views” section and disable “Page changes based on browser history events”. Click save.
This should get rid of duplicate page_view events.
#8. Incorrect server-side tagging configuration
If you are using server-side tagging in your GA4 setup, check the number of outgoing requests in your SGTM’s preview mode.
Even if you receive one GA4 request from your website, you might have multiple Google Analytics 4 tags in the server container that send the data to the same container.
Normally, this should not happen. But maybe you made a mistake in your configuration.
If, on the other hand, you see two outgoing requests to Google Analytics, check the value of the “tid” parameter. If it contains different GA4 measurement IDs, then you’re ok. Your main goal here is to make sure that your server-side GTM is not sending the same events twice to the *same* property.
#9. Overlap between your GTM events and GA4 enhanced measurement
Google Analytics 4 can automatically track a bunch of events (such as outbound clicks, scrolling, etc.). However, in some situations, you might want to implement custom events (via GTM) to replace them.
For example, the built-in GA4 scroll tracking tracks only when the visitor scrolls below the 90% threshold. If you want to track other thresholds too (e.g., 25%, 50%), you will need to implement a custom solution.
If you do so, make sure to disable the same feature (scroll tracking) in Enhanced Measurement. Otherwise, you might have duplicates (one 90% event is coming from GTM and one from Enhanced Measurement).
The same principle applies to other events. If you create a “custom replacement” in GTM, then disable the related event-tracking feature in GA4.
#10. The visitor reloads/revisits a Thank You page
You might be firing some events on a “Thank you” page (a.k.a. order confirmation page). This means that if a visitor reloads or revisits that page, the tag will fire again.
There are several solutions here:
- When a visitor lands on that page, you can store a cookie in visitor’s browser (e.g., “gtm_user_converted” with the value “true”). Then update your trigger not to fire if gtm_user_converted equals true. This means that the visitor will be tracked on the first page load, but subsequent page loads will be ignored.
- If a developer pushes the event to the data layer on a Thank you page, you can either apply the previous example with the cookie or you can ask the developer to handle this in the code (if a visitor revisits the page, the dataLayer.push should not happen again).
- If you are tracking purchases, it’s important that transaction_id is sent together with the event. If GA4 receives multiple purchase events with the same transaction_id from the same user, the duplicate will be ignored.
#11. Duplicate is sent via Measurement Protocol
Another possible scenario applies to organizations that use Measurement Protocol. If you are sending particular events client-side (a.k.a. from your browser), check with your developers if they are not sending the same event via Measurement Protocol.
If you are new to this topic, Measurement Protocol is a way for website developers to send data directly from their server to GA4 servers. It still requires Google Analytics 4 to be installed client-side (via gtag.js or web Google Tag Manager).
This means there is a chance that in your setup, web GTM sends a particular event, and then your website developers send the same event via Measurement Protocol. A popular scenario is for a purchase event.
If you aren’t sure if your organization uses Measurement Protocol, talk with developers. Maybe they will know something about it.
Still seeing duplicate events in Google Analytics 4?
If none of my suggestions in this article worked for you, let me know in the comments. Maybe you have another issue that will eventually become an additional tip in this blog post.
From my experience, the most common issues for duplicate events in Google Analytics 4 are hardcoded events vs GTM and misconfigured GTM triggers.
27 COMMENTS
Hello,
I am struggling to measure the ecommerce purchases on GA4 because it always measures it twice (if I order one product it will see it as two). I have Google Tag Manager and the dataLayer.push() implemented on my website. I have checked and tried everything on this article but nothing works. Can someone please help me?
You will need to store the transaction ID in a cookie and then use it to check for duplicate transactions. If cookie already exists in a browser, don't fire the GA4 tag again. I explain this in detail in my Intermediate/Advanced GTM course https://www.analyticsmania.com/courses/intermediate-google-tag-manager-course/
Hi Julius!
I recently enabled GA4 on three of my websites. I created a GA4 configuration tag for GTM as I know this is a requirement for setting up any other GA4 tags. In the configuration tag I checked the box "Send a page view event when this configuration loads" as was outlined in many tutorials I watched (even one from Google). Additionally, I had page_view enabled in enhanced measurements. Fast forward 20ish days later and my pageviews are through the roof and so my bounce rate is super low (I still have Universal GA tracking too). Is the reason because duplicate pageviews were firing? I have since unchecked the "Send a page view event when this configuration loads" on the GA4 configuration tag but am unsure if this was correct or if instead I should have toggled off the enhanced measurement. Please note, I never saw duplicate events when in preview mode, which is why I was unaware of this issue. Hoping you can help!
It is difficult to comment without seeing the actual setup. Maybe you have some hardcoded snippets, maybe something is misconfigured in GTM, maybe something else.
I have this issue as well. It seems strange to me that the GA4 Config tag would send a page view when page views are already tracked by Enhanced Measurements. I have not been able to find any assistance with this exact problem, even on Google's forum. I have checked into all the other solutions presented in this article and none of them are the issue.
Nicole, what we your results when deselecting the "Send a page view when this configuration loads?" option in the config tag?
I had the same issue. Was unchecking "Send a page view event when this configuration loads" the right call?
Hi Nicole, I had the same problem with duplicate "page_view" events!! In my case I set some params to get from the data layer, and then, I realized that a configuration in Optimized Metric was triggering the duplicate page_view, through the option called "Page changes according to browsing history events" into the "page views". When I unchecked this option, the duplicity stopped. Hope this helps.
Thanks a lot Julius for this article!
The #3 was the mistake in my case.
I wasted some time figuring out how to delete the event I had created in GA4, just to realize that I had to click "Create Event" again (not very intuitive) in order to see the list of Custom Events and delete it. I hope this helps anyone who has the same problem.
This comment saved me. Thank you!
I found a setting in GA4 > Data Streams > Choose your data stream > Configure tag settings > Click on Your Google Tag > "Ignore duplicate instances of on-page configuration (recommended)".
I realized one of my websites was tracking GA4 data, but the GA4 configuration was installed. When we created the GA4 account, we already had GA3, and it automatically connected the two using a Google Tag without us realizing it. So we had mystery pageviews firing in GA4.
After digging into the settings, I realized there's this "Ignore duplicate instances" checkbox that is recommended - yet doesn't come stock with GA4 for some reason. I think this allows me to now use GA4 configuration in GTM without worrying about duplicate pageviews.
I hope this is helpful!
This may be my problem also! Thank you for posting this.
Hi Julius,
I have issue number 3 (“Create event” feature in Google Analytics 4). Now i measure clicks double. I added the event via tag manager and also I created the event with the same name in GA4. How can I delete the created event in GA4? I can't find an option for that at all. Do you possibly have an article or information about that? Thansk!!
Hi Roel, I have the same issue were you able to solve this issue? If so can you let me know how? thanks
You go to GA4 admin > Events > Create events > Click the rule > and delete the rule there. This will stop future duplicate events. But already-collected events will remain in your property.
Hello, Julius! Thank you for all you do. I'm your subscriber recently.
I've already broken my brains. Nothing from this article helped me.
In "Preview mode" I have 3 containers: UA-XXXXXXX, GTM-XXXXXXX and G-XXXXXXX
So, when I send some events from my pages, for example "purchase", I see that GTM-XXXXXXX count it correctly. But G-XXXXXXX counts everything twice, I mean everything!
-Consent Initializtion - 2 times
-Initialization - 2 times
-purchase - 2 times
-Container Loaded - 2 times
-DOM ready - 2 times
-Window Loaded - 2 times
I swear I checked everything and tried all from this article.
And the second point is that my DebugView recives such events as: gtm.init, gmt.init_consent, gtm.js, gtm.dom. I even can see report for these events. But I don't need it and I didn't see such events in your tutorials.
I wrote to GA support team, but they don't answer to me. Maybe you can help me to solve these problems?
I found the reason, it was really specific. But maybe someone will need it. In Google Tag Manager for "GA4 Event Tag" I created custom trigger with RegEx "login|purchase|(all needed events)|add_to_cart|". So I made a mistake in the end of this regex, I forgot to delete last "|", so each event was sent to GA4.
Morning Julius,
I hope you are doing well thank if you can help me here.
I'm triggering a custom event from GTM to GA4, but I would like to use this one in reporting. Were I should create those? As Event, or under Custom Dimension? What is the impact if I'm including those in both? I believe now I have in both , and I'm seeing duplications from the debugger.
Please advise if you can
thanks
Neither. Just send the event with GTM and you're good to go. Event name does not require it to register anywhere in GA4
oh, no either if I need those in Reporting (Free form/Navigation etc..) ?
What if I want those as Goal/Conversion? They will show up anyway in Conversion section? Thanks 1000 times
The event will be available in your reports within 24-48 hours. If you want to treat that event as a goal/conversion, you have to register a conversion with tag event (in the admin section).
Hey there. I am having the double add_to_cart issue however none of my others send twice, even ones that are fired on the same page. I went through all of the possibilities in the article and am not finding any of these issues. You mentioned to comment if that was the case so here I am.
Ok I might have figured it out. looks like it's step Ignore duplicate instances of on-page configuration. We have a dev and production site. So on dev it let me turn that on and it got rid of the issue. On production it's grayed out and I can't change it. Any idea why that would be?
Hi Julius,
Thanks a lot for the article!
I have question but I didn't find answer in it: On the website the team has implemented GA4 before, and now we want to implement GTM for adding facebook pixels and other third-party snippets. We don't plan to fire Google analytics again through GTM.
In this case, do we still need to disable GA4 to avoid duplication and migrate them to GTM?
Many thanks,
Xi
Hello Julius,
Really appreciate the article explaining the issues with respect to double page_views. We have salesforce experience cloud pages that use the GA4. previously we were on UA and moved to GA4. in one of teh pages, we have a navigation link ( say Inbox) and the URL changes to /s/your_inbox. In some instances, the url wont change but the additional parameters are added to the URL (SPA) behaviour. we see custom events listed Your_inbox, yourpayments etc in GA4. we are seeing double page_views within the short interval of page loads. Dont see an option to delete the event (may be down to my access). got to know from inhouse Google Analytics that we dont use Google tag Manager due to security restrictions. we cannot go with the option of unchecking the option of "page changes based on browser history events" because soem of teh navigation behaves like SPA only the parameters of the url change.. How to resolve the issue. we have been trying to resolve it from quite sometime. Please suggest..
Hi Julius,
I also have a duplicate event similar to #5. The problem is that they both trigger on the same thing: purchase. In one data layer I see eventmodel.value and the other one says ecommerce.value. The problem I have in Google Ads is that there is almost no conversion value registration.
Could you please help. I am lost with a double conversion event and no conversion value...
Hi Julius,
Great video, much appreciated.
I ran into an issue. I had a form submission being recorded twice and it turns out, I did the Create Event method and created the issue.
As you recommended, I deleted the Create Event.
But now instead of the event firing once, it doesn't fire at all.
I tested it in Debug in Tag Assistant, and also checked to make sure the correct tag is firing once in GTM.
I am wondering if there is some way that I can get the event to fire in GA4, or what I could have done wrong by deleting the Create Event line?
Thanks so much for your help! I watch all your videos!
I recently experienced a GA4 bundle sending a form submit event to 2 GA4 properties and Gads (AW), resulting in 3x form submit events p/ 1 actual form submission.
The GA4 bundling appeared to a hard coded gtag within the source code (when viewing the "collect" under network under developer tools.
Removing the 2nd GA4 property from the bundle stopped the duplicate event tracking, can you do a video explaining the GA4 bundling, pros, cons, when to use it, when to change it and if you have to use it then what is best practice to prevent duplicate tracking?