14 September 2026·3 min read
Duplicate events: when page_view counts twice
Pageviews per session sitting at 2 and an implausibly low bounce rate mean the same action is being counted twice. How to find a double GA4 install or an overlap with Enhanced Measurement, and clean it up.
Symptom
Traffic suddenly looks great. Pageviews are up, bounce rate is down, conversions climb too. None of it reconciles with the clicks your ad platform reports or the orders in your payment system.
The easiest signal to read is pageviews per session. Most sites sit between 1.5 and 3. If yours has moved to roughly double that and you see many sessions with near-zero average engagement time, suspect duplication. People do not view a page twice the instant they open it.
Cause
Duplication arrives by two routes.
One: the tag is installed twice. A developer hard-coded the gtag.js snippet into the site, and later a marketer added a GA4 configuration tag through GTM. Each works correctly, and both send page_view to the same measurement ID. This is the shape we run into most often in real scans.
Two: the trigger fires twice. The GA4 configuration tag in GTM already sends a pageview, and a separate event tag was built on an All Pages trigger as well — or, in a single-page app, a history-change trigger and the initial load both fire for the same screen.
There is a further, even more common trap. Enhanced Measurement already collects certain interactions automatically, and sending a custom event for the same thing splits them. Scrolls, file downloads, outbound clicks and site search are the usual suspects. Here the number does not double — instead one behaviour lands under two different event names, and neither one represents the whole.
How to check in GA4
1) GTM preview. Open a page exactly once. Two page_view rows in the summary panel is the duplication, and the same screen names the tag that fired each one.
2) Network tab. With no GTM, filter the developer tools network tab for collect and reload. Two requests means two installations.
3) Realtime and DebugView. In Admin → DebugView, pin your own browser and navigate. The event timeline shows the same event stamped twice inside a second.
4) Compare against Enhanced Measurement. Note what is switched on under Admin → Data Streams → Enhanced measurement, then look in Reports → Engagement → Events for your own names such as scroll_depth or outbound_click sitting beside them. Both present means the behaviour is split.
How to fix it
Install through one path. If GTM is the choice, delete the gtag.js snippet from the site source. If the hard-coded install stays, pause the GA4 configuration tag in GTM. You can instead keep both and disable pageviews on one side, but whoever inherits the setup will be confused by it again.
Fire once in a single-page app. Keep either the configuration tag's "page changes based on browser history events" setting or your own history trigger — not both.
When a custom event overlaps Enhanced Measurement, delete the custom one. Automatic collection survives account handovers. If you need a parameter that only the custom event carried, attach the parameter to the automatic event rather than building a second event.
Check pageviews per session a day after the fix. The number is supposed to fall. GA4 does not correct history, so record the date and avoid comparing across it.
In one line
Pageviews per session pinned at 2 does not mean more visitors — it means the tag is installed twice. Install GA4 through exactly one path, and do not rebuild what Enhanced Measurement already does.