What are the Enhanced Measurement in Google Analytics 4?
In Google Analytics 4, enhanced measurements are a set of features that automatically collect several types of interactions as soon as GA4 is installed on your website. No need to touch code or configure events in Google Tag Manager. In theory, this would seem to make Google Analytics a turnkey solution, but we’ll see in this article that this is far from the case.
In concrete terms, when you create a web data stream in GA4, enhanced measurements are enabled by default. To access them, go to Admin > Data Stream, select your web data stream, and you’ll see the dedicated section.
Attention
In the world of tracking, any automatic operation should be taken with a grain of salt. Enhanced measurements are easy to set up, but this solution has its limits and may not meet your requirements/needs.

Automatically collected events
When enhanced measurements are enabled (which they are by default), GA4 immediately starts tracking the following 7 types of interactions:
- Page views (
page_view) - Scroll beyond 90% of the page (
scroll) - Outbound clicks to other domains (
clickwithoutboundset totrue) - Internal searches (
view_search_results) - YouTube video engagement (
video_start,video_progress,video_complete) - File downloads (
file_download) - Form interactions (
form_start,form_submit)
Each event can be managed individually.
You can keep the ones you want and disable the others. This flexibility allows you to tailor your data collection to your needs.
Good to know
Beyond enhanced measurements, GA4 also collects 3 distinct automatic events that are also important to know about:
first_visiton a user’s very first visit (created automatically by GA4 when the_fvparameter is present in thepage_viewevent)session_startfor each new session (automatically created by GA4 when the_ssparameter is present in thepage_viewevent)user_engagementwhich is triggered after certain actions. It contains theengagement_time_msecparameter indicating the user’s engagement time in milliseconds.
Recap table of recommendations
| Events | GA4 parameters used | Recommendation |
|---|---|---|
page_view | page_location page_referrer page_title language screen_resolution | Mandatory (can be disabled with send_page_view set to false in Google Tag for SPAs) |
scroll | percent_scrolled | ⚠️ Disable (short pages = too many events, no 25/50/75% granularity => use GTM) |
click | link_id link_classes link_url link_domain outbound | ✅ Keep (works correctly) |
view_search_results | search_term | ✅ Keep (may require additional configuration) |
video_start video_progress video_complete | video_current_time video_duration video_percent video_provider video_title video_url visible | ❌ Disable (requires enablejsapi=1 and iframe_api, unreliable => use GTM) |
file_download | file_extension file_name link_text link_url link_id link_classes | ✅ Keep (fixed but sufficient list of extensions) |
form_start form_submit | form_id form_destination form_length first_field_id first_field_name first_field_type | ❌ Disable (imprecise, false positives => use GTM) |
Page views
The page_view event is triggered each time a page is loaded. This is by far the most important event to set up to obtain quality data in GA4.
Unlike other enhanced measurement events, it is not possible to disable page_view from the GA4 interface. It is an integral part of the measurement system.
Each page view automatically transmits essential contextual information: browser language, full page URL, visitor’s original page, page title and screen resolution. This data accompanies all GA4 events, not just page views.
The Google Tag contains a parameter that controls the automatic sending of page views. In certain specific cases (notably for Single Page Applications), you can disable this automatic sending by setting send_page_view to false, then manage page views manually via a dedicated event tag.
Page views in Single Page Applications (SPA)
Single page applications (often coded with React, Angular, Vue or NextJS) pose a particular challenge: the URL changes without the page actually reloading. GA4 attempts to handle this case by tracking history changes through the gtm.historyChange-v2 event, but this remains an automatic operation that you should test to make sure it meets your expectations and needs.
If this is not the case, you can manually listen for history changes using the History Change trigger in Google Tag Manager.
Tracking Single Page Applications with GTM and GA4
Discover the 3 ways to track SPAs
Scrolling
GA4 automatically registers when a visitor scrolls beyond 90% of the page height.
GA4 parameters used
| Parameter | Description | Available custom report | Available exploration |
|---|---|---|---|
percent_scrolled | Scroll depth | ✅ | ✅ |
Limitations to be aware of
If your page is short in height, the scroll event will be triggered very often, which can affect the quality of your analysis in GA4. Also, enhanced measurements don’t offer a more granular view of thresholds at 25, 50 and 75% scroll.
Solution
For more precise scroll tracking, I recommend that you manually configure scroll tracking with Google Tag Manager by following my dedicated guide.
Scroll tracking with GTM and Google Analytics
Track scroll manually from Google Tag Manager with my dedicated article on the subject
Outbound clicks
An outbound click occurs when a visitor clicks on a link that takes them to a domain other than your own. GA4 automatically registers these interactions via an event named simply click, distinguished by an outbound parameter with the value true.
GA4 parameters used
| Parameter | Description | Available custom report | Available exploration |
|---|---|---|---|
link_id | Value of id attribute of link | ✅ | ✅ |
link_classes | Value of class attribute of link | ✅ | ✅ |
link_url | href attribute value for link | ✅ | ✅ |
link_domain | Link domain | ✅ | ✅ |
outbound | true if link is outbound | ✅ | ✅ |
Example of an outbound link
<a id="outbound-link" class="bg-dark color-blue" href="https://www.example.com" target="_blank">Go to example.com</a>
<!--
link_id -> outbound-link
link_classes -> bg-dark color-blue
link_url -> https://www.example.com
link_domain -> www.example.com
outbound -> true
-->Solution
You can keep outbound clicks enabled, as it works fine. However, if you want to go further in your analysis, I recommend that you manually configure click tracking with Google Tag Manager.
Tracking clicks with Google Tag Manager and GA4
Track clicks manually with GTM and GA4
Site search
GA4 automatically detects when a user performs a search on your site with the view_search_results event by analyzing query parameters.
Default query parameters supported
| Query parameter | Example |
|---|---|
q | https://example.com/recherche?q=chaussures |
s | https://example.com/recherche?s=chaussures |
search | https://example.com/recherche?search=chaussures |
query | https://example.com/recherche?query=chaussures |
keyword | https://example.com/recherche?keyword=chaussures |
If your search URL looks like example.com/search?q=shoes, GA4 will automatically capture the term “shoes”.
Did you know?
Let’s imagine that on your site, the search is done with the term parameter like this example.com/search?term=shoes.
As term is not one of the query parameters listened to by GA4 by default, you can add it to the list in the enhanced measurement settings.
In all, 10 different parameters can be used.

GA4 parameters used
| Parameter | Description | Available custom report | Available exploration |
|---|---|---|---|
search_term | Search term | ✅ | ✅ |
Video engagement
If you embed YouTube videos on your site, GA4 can track the following interactions automatically under certain conditions:
- start viewing (
video_start) - progress over 10, 25, 50 and 75% (
video_progress) - complete viewing (
video_complete)
GA4 parameters used
| Parameter | Description | Custom report available | Exploration available |
|---|---|---|---|
video_current_time | Current time in video | ❌ | ❌ |
video_duration | Total time in video | ❌ | ❌ |
video_percent | Current time / total time * 100 | ❌ | ❌ |
video_provider | youtube every time | ✅ | ✅ |
video_title | Video title | ✅ | ✅ |
video_url | Video URL | ✅ | ✅ |
visible | true if the video is in the viewport | ✅ | ✅ |
Example of an embedded YouTube video
<script src="https://www.youtube.com/iframe_api"></script>
<iframe width="560" height="315" src="https://www.youtube.com/embed/nS8HLdwmVlY?enablejsapi=1"></iframe>
<!--
video_current_time -> 210
video_duration -> 517
video_percent -> 40
video_provider -> youtube
video_title -> Google Analytics MCP Setup Tutorial
video_url -> https://www.youtube.com/watch?v=nS8HLdwmVlY
visible -> true
-->Limitations to be aware of
This feature requires that the YouTube iframe on your site contains a specific parameter (?enablejsapi=1) in its URL and that the iframe API is enabled (iframe_api). These conditions are not always met by default and require additional action on your part.
For more technical profiles
Automatic tracking of YouTube videos will not work if:
window.YTis set toundefined, and- the iframe URL does not contain
enablejsapi=1.
Solution
The best thing to do here is to manually configure Google Tag Manager to track your YouTube (or other) videos.
Tracking YouTube videos with Google Tag Manager and GA4
Track YouTube videos manually via my dedicated article
Track Vimeo videos with Google Tag Manager and GA4
If you use Vimeo, take a look at my listener
File downloads
As soon as a visitor clicks on a link to a downloadable file, GA4 records the action via the file_download event.
Supported extensions
| Extension | Description |
|---|---|
pdf | Portable Document Format |
doc | Microsoft Word (Legacy) |
docx | Microsoft Word (Modern) |
txt | Plain Text File |
rtf | Rich Text Format |
xls | Microsoft Excel (Legacy) |
xlsx | Microsoft Excel (Modern) |
csv | Comma-Separated Values |
pps | PowerPoint Show (Legacy) |
ppt | PowerPoint Presentation (Legacy) |
pptx | PowerPoint Presentation (Modern) |
key | Apple Keynote |
zip | ZIP Archive |
rar | RAR Archive |
7z | 7-Zip Archive |
gz | GZIP Compressed |
pkg | Package File |
exe | Windows Executable |
mp3 | MP3 Audio |
wav | WAV Audio |
wma | Windows Media Audio |
mid | MIDI Audio (Short) |
midi | MIDI Audio |
mp4 | MPEG-4 Video |
avi | Audio Video Interleave |
mov | QuickTime Video |
mpeg | MPEG Video |
mpg | MPEG Video (Short) |
wmv | Windows Media Video |
GA4 parameters used
| Parameter | Associated value | Available custom report | Available exploration |
|---|---|---|---|
file_extension | File extension | ✅ | ✅ |
file_name | File name | ✅ | ✅ |
link_classes | Value of class attribute of clicked link | ✅ | ✅ |
link_id | id attribute value of clicked link | ✅ | ✅ |
link_text | Text of link present between a tags | ✅ | ✅ |
link_url | Value of id attribute of clicked link | ✅ | ✅ |
Example of a download link
<a href="./files/doc.pdf" download="document.pdf" id="dl_link" class="bg-black color-white">Download file</a>
<!--
file_extension -> pdf
file_name -> /files/doc.pdf
link_classes -> (empty) no value comes up in my test
link_id -> dl_link
link_text -> Download file
link_url -> https://example.com/files/doc.pdf
Document name when downloaded by visitor: document.pdf
-->Limitations to be aware of
The list of supported extensions is fixed. You cannot enrich it via the GA4 interface. If you distribute .jpg or .png files, for example, they won’t be counted automatically.
Solution
File downloads work correctly. You can keep this enhanced measurement enabled.
Using Google Tag Manager, you can create a custom trigger that detects missing extensions.
Form interactions
GA4 promises to track forms automatically with the following events:
form_startwhen a user starts filling in a fieldform_submitwhen the form is submitted.
GA4 parameters used
| Parameter | Description | Available custom report | Available exploration |
|---|---|---|---|
form_destination | form destination URL | ❌ | ❌ |
form_id | Form identifier (id attribute of HTML form tag) | ❌ | ❌ |
form_length | Number of fields present in the form (including the submit field) | ❌ | ❌ |
first_field_id | Attribute id of the first field to be filled in | ❌ | ❌ |
first_field_name | Attribute name of the first field to be filled in | ❌ | ❌ |
first_field_type | Attribute type of the first field to be filled in | ❌ | ❌ |
Limitations to be aware of
I wouldn’t recommend using this feature, as it’s too imprecise. Very few forms are supported and when they are, there can be false positives in the submissions detected.
Also, you’ll need to create custom dimensions to exploit form-related parameters in your GA4 reports or explorations.
Solution
To track your forms, I advise you to follow dedicated tutorials depending on the form you’re using.
Tracking Elementor forms
Complete guide to tracking Elementor forms
Tracking Hubspot forms
Complete guide to tracking Hubspot forms
Tracking Webflow forms
Complete guide to tracking Webflow forms
Tracking forms
General guide to tracking forms
Lessons learned
I generally disable GA4’s enhanced measurement completely on customer projects for several reasons:
- Lack of flexibility: enhanced measurement is too rigid.
- Data quality: automatically collected data may lack precision.
- Automatic behaviour: I prefer to have total control over what is tracked.
However, if you’re new to GA4 and don’t have the resources for a custom setup, the enhanced measurement may be a good place to start. They offer basic data collection without extra effort.
Let's talk about your tracking
A question about this article, need an audit of your setup or server-side migration? Drop me a line, I reply within 24h.



