One of the biggest structural changes GA4 made from Universal Analytics is that everything is an event. Page views, sessions, purchases, scroll depth, video plays — all of it flows through the same event model. No more hit types, no more special-cased pageview or transaction calls. Just events, with names and parameters.

That uniformity is powerful. But it introduces a question that Universal Analytics never really had to answer: where do events come from? In UA, most of what you tracked required explicit configuration. In GA4, significant amounts of data arrive without any setup at all — and knowing exactly which data that is, and which data still requires work, determines how much trust you can place in your reports from day one.

GA4 divides its events into four categories. Each has a different collection mechanism, a different configuration requirement, and different implications for how you should use the data.

This guide covers web implementations. GA4 also supports app tracking via Firebase, which has its own automatically collected events and slightly different category boundaries. The four event types described here apply to web properties — the most common context for GTM-based implementations.


The four event categories at a glance

Type 01

Automatically collected

Fired by the GA4 tag itself the moment it loads. No configuration required. Includes session_start, first_visit, and user_engagement. You cannot disable most of these.

Type 02

Enhanced measurement

Toggled on in GA4's admin UI — no code changes needed. Covers page views, scrolls, outbound clicks, site search, video engagement, and file downloads. Each can be enabled or disabled individually.

Type 03

Recommended

Pre-defined event names and parameter schemas that Google has specified for common actions. You implement these yourself — via GTM or gtag.js — but by following Google's naming conventions, you unlock automatic reporting in GA4's standard reports.

Type 04

Custom

Fully bespoke events with names and parameters you define from scratch. Maximum flexibility, but no automatic integration with GA4's standard reports. Require custom dimensions and metrics to surface in the UI.

The key distinction across all four is the relationship between who fires the event (GA4 automatically vs. your implementation) and how the data surfaces (standard reports vs. custom exploration vs. BigQuery only). We'll step through each in detail.


Type 1 — Automatically collected events

Automatically collected events fire the moment the GA4 tag initialises on a page. They require no additional code, no GTM configuration, and no settings to toggle — they simply arrive in GA4 as soon as your property is receiving data.

What's included

Event name When it fires Key parameters
session_start When a user begins a new session — first event after 30 minutes of inactivity, or at the start of a new day ga_session_id, ga_session_number
first_visit The very first time a user visits the site — fires once per browser and device combination ga_session_id
user_engagement When a user has the page in the foreground for at least one second — drives engaged session and engagement time metrics engagement_time_msec

These three events are the backbone of GA4's session and user metrics. session_start is what creates sessions; user_engagement is what drives engagement rate and average engagement time. Neither can be disabled, and both require no implementation work.

Do not mark session_start or first_visit as conversions. Both fire automatically on virtually every session, so marking either as a conversion inflates your conversion counts to match your total session count. It's one of the most common GA4 configuration mistakes — check Admin → Conversions if your conversion numbers look suspiciously high.

What automatically collected events don't cover

Despite the name, automatically collected events cover only the most fundamental session-level signals. They don't track page views, clicks, form submissions, purchases, or any content-specific interactions. Those come from the other three categories.


Type 2 — Enhanced measurement events

Enhanced measurement is GA4's most misunderstood feature. It uses JavaScript event listeners that GA4 injects into your page at tag load time to detect and fire events for common interactions — without any code on your part. But it has significant limitations that make it unsuitable as a replacement for proper GTM configuration in most production setups.

Enabling enhanced measurement

Go to GA4 Admin → Data Streams → your web stream → Enhanced Measurement. Toggle the overall switch on, then enable or disable individual event types. Each can be controlled independently.

What's included

Event name What it tracks Notable limitation
page_view Every page load, including history-based navigation in single-page applications SPA tracking relies on History API changes — may miss custom routing implementations
scroll Fires when a user reaches 90% scroll depth on a page Fixed at 90% only — cannot be adjusted to other thresholds without GTM
click Outbound link clicks that navigate away from your domain Only captures outbound clicks, not internal navigation or button clicks
view_search_results Site search results pages, detected from URL query parameters Requires search to append a query parameter to the URL — JavaScript-rendered results not captured
video_start, video_progress, video_complete YouTube embeds with JS API support enabled Only works with YouTube iframes — does not work with HTML5 video, Vimeo, or Wistia
file_download Clicks on links to common file types — PDF, CSV, DOCX, XLSX, ZIP Detects by file extension in the URL — misses downloads served through redirect URLs or API endpoints

Enhanced measurement page_view and a GTM page_view tag can conflict. If you have enhanced measurement's page_view toggle on and a GTM tag firing page_view events, you'll record two page views per page load. The standard fix is to disable the enhanced measurement page_view toggle and manage page views through your GTM GA4 Configuration tag — this gives you more control and avoids the duplication.

When to rely on enhanced measurement vs. GTM

Enhanced measurement is well-suited for low-traffic sites, quick proof-of-concept setups, and situations where a GTM deployment isn't feasible. For production analytics where data accuracy matters, GTM-based implementations of the same events give you more control, richer parameters, and behaviour that's easier to audit. The 90% scroll threshold is fixed in enhanced measurement; in GTM you can fire at 25%, 50%, 75%, and 90%. Outbound click tracking via enhanced measurement doesn't capture which element was clicked; a GTM trigger can capture the element, its text, and its CSS class.


Recommended events are where the GA4 event model gets genuinely powerful. Google has published a catalogue of standardised event names and parameter schemas for the most common business actions. You implement these yourself — they don't fire automatically — but by using Google's exact naming conventions, you get two significant advantages: automatic population of GA4's standard e-commerce and lifecycle reports, and a schema that BigQuery, Data Studio, and other tools already understand.

Why naming conventions matter

GA4's standard reports for e-commerce, monetisation, and the funnel exploration tool are built around specific event names. If you send a purchase event named order_complete instead of purchase, GA4's revenue reports show zero — because they look for the event named exactly purchase. Recommended events are Google's way of publishing the exact names that unlock built-in reporting.

Recommended events by category

Category Event name When to fire
E-commerce view_item_list When a product listing or category page is viewed
E-commerce view_item When a product detail page is viewed
E-commerce add_to_cart When a product is added to the shopping cart
E-commerce begin_checkout When a user initiates the checkout process
E-commerce add_payment_info When payment details are submitted during checkout
E-commerce purchase When a transaction is completed — requires transaction_id, value, currency
E-commerce refund When an order is refunded, fully or partially
Lead generation generate_lead When a lead form is submitted or a quote is requested
Lead generation sign_up When a user creates an account or signs up to a service
Content share When content is shared via a social share button
Content search When a user performs a search on your site
Content select_content When a user selects a piece of content — clicks a card or article

Required and recommended parameters

Each recommended event comes with parameters Google specifies. Some are required for the event to populate standard reports correctly; others are recommended to unlock additional dimensions. The purchase event is the most parameter-rich — here's what a complete implementation looks like via a dataLayer push:

JavaScript — Complete purchase event dataLayer push

// Always clear the ecommerce object before each push
window.dataLayer.push({ ecommerce: null });

window.dataLayer.push({
  event: 'purchase',
  ecommerce: {
    transaction_id: 'ORDER-20481',   // Required — must be unique per order
    value: 129.00,                   // Required — total order value
    currency: 'GBP',                  // Required — ISO 4217 currency code
    tax: 21.50,                       // Recommended
    shipping: 4.99,                   // Recommended
    coupon: 'SUMMER10',               // Recommended, if applicable
    items: [
      {
        item_id: 'SKU-001',           // Required
        item_name: 'Analytics Template',// Required
        item_category: 'Templates',    // Recommended
        item_brand: 'Web Analytics Driven',
        price: 129.00,               // Recommended
        quantity: 1                    // Recommended
      }
    ]
  }
});

Always clear the ecommerce object before pushing a new one. GA4 reads ecommerce parameters from the dataLayer cumulatively. If you push a view_item event and then a purchase event without clearing between them, the purchase can inherit item data from the earlier event. Push dataLayer.push({ ecommerce: null }) immediately before each ecommerce event push to reset the object cleanly.


Type 4 — Custom events

Custom events are any events you define yourself that don't fit the recommended event catalogue. You choose the name, you define the parameters, and you decide when they fire. There are no constraints on what you can track — but there are trade-offs to understand.

When to use custom events

Custom events are the right choice when the action you want to track doesn't map to any recommended event name, or when you need parameters that go beyond GA4's standard schema. Common examples:

  • A SaaS product tracking feature usage — feature_activated, report_exported, integration_connected
  • A media site tracking content engagement — article_bookmarked, paywall_reached, newsletter_widget_expanded
  • An internal tool tracking workflow steps — quote_drafted, approval_submitted, document_signed

In each case, the action is meaningful to the business but has no recommended event equivalent. Custom events fill that gap.

The trade-off: custom dimensions and metrics are required

Custom events and their parameters don't appear in GA4's standard reports automatically. To surface a custom event parameter in reports, you must first register it as a custom dimension or metric in GA4 Admin. For detailed guidance on this step, see our post on setting up custom definitions in GA4.

JavaScript — Custom event for a SaaS feature activation

window.dataLayer.push({
  event: 'feature_activated',
  feature_name: 'bigquery_export',    // Register as custom dimension in GA4 Admin
  user_plan: 'pro',                  // Register as custom dimension in GA4 Admin
  days_since_signup: 14              // Register as custom metric in GA4 Admin
});

Custom parameters are collected even before you register them. GA4 stores all event parameters in BigQuery from the moment they're sent — registration as a custom dimension only affects their visibility in the GA4 UI and Explore tool. This means you can implement and start collecting custom event data today, then register the dimensions at any point without losing historical data in BigQuery.

Naming rules for custom events

Rule Detail
Lowercase with underscores Event and parameter names must use lowercase letters and underscores only. featureActivated and Feature Activated are invalid — feature_activated is correct.
Max 40 characters Both event names and parameter names cannot exceed 40 characters.
Max 100 parameters per event Each event can carry up to 100 parameters. Keep it well below this in practice — leaner events are easier to work with in BigQuery.
Max 500 unique event names per property GA4 allows up to 500 distinct event names per property. Rarely a practical constraint, but worth knowing for large, complex implementations.
Reserved names are off-limits Names from the automatically collected and recommended catalogues are reserved. You cannot create a custom event named session_start, purchase, or any other event from the official lists.

Marking events as conversions

Any event from any of the four categories can be marked as a conversion in GA4 — but the choice of which events to mark matters significantly for how your reports read and how Google Ads optimises if your property is linked.

In GA4 Admin → Conversions, you toggle individual events as conversions. Once marked, GA4 counts every instance of that event as a conversion across your acquisition, engagement, and advertising reports.

Only mark events as conversions that represent genuine business value. Good candidates: purchase, generate_lead, sign_up, book_demo. Poor candidates: page_view, session_start, scroll, first_visit. The conversion count in your acquisition reports is one of the most frequently cited metrics in business reporting — keep it meaningful and defensible.


How GTM fits into the event hierarchy

Understanding where GTM sits relative to GA4's event categories clarifies what it is and isn't responsible for in your implementation.

GTM role 01

Not involved in automatic events

Automatically collected events fire directly from the GA4 tag — GTM has no role in them. They fire regardless of your GTM container configuration.

GTM role 02

Can replace enhanced measurement

Any enhanced measurement event can be reimplemented in GTM with more control — configurable scroll thresholds, richer click data, custom parameters — wherever the defaults aren't sufficient.

GTM role 03

Primary vehicle for recommended events

Recommended events require implementation, and GTM is the standard mechanism. A Custom Event trigger detects a dataLayer push; a GA4 Event tag sends the correctly named event with the right parameters.

GTM role 04

Sole mechanism for custom events

Custom events almost always flow through GTM. Your site code pushes to the dataLayer; GTM picks up the push and fires a GA4 Event tag with the event name and parameters you've configured.

A well-configured GA4 implementation uses all four event types together: automatic events for session infrastructure, enhanced measurement selectively for low-effort coverage, recommended events via GTM for all business-critical actions, and custom events via GTM for anything specific to the business that the recommended catalogue doesn't cover.


Choosing the right event type for a given action

When you're planning what to track for a specific user action, step through these questions in order:

  1. 1
    Does GA4 already collect it automatically? Check the automatically collected events list: session_start, first_visit, user_engagement. If it's on this list, no action is needed — and don't try to recreate it in GTM or you'll end up with duplicates.
  2. 2
    Is it covered by enhanced measurement — and is the default behaviour good enough? Check whether enhanced measurement covers the action. If it does and the default parameters are sufficient, toggle it on. If you need more control — different scroll thresholds, richer click data, additional parameters — implement it in GTM and turn the enhanced measurement toggle off for that event type to avoid duplication.
  3. 3
    Does Google have a recommended event name for this action? Search Google's recommended events documentation for a matching event. If one exists, use it exactly as specified — name, required parameters, and all. The benefit of unlocking standard reports is worth the care in matching the schema precisely.
  4. 4
    No match — define a custom event Define a custom event name using lowercase and underscores. Plan which parameters you'll collect, register them as custom dimensions or metrics in GA4 Admin, and implement the dataLayer push and GTM tag in parallel.

Common mistakes to avoid

Most GA4 event implementation problems come from the same handful of errors. These are the ones worth checking for in any audit:

  • Reimplementing automatically collected events. Creating a GTM tag to fire session_start or user_engagement on top of GA4's own automatic collection doubles those events in your reports and BigQuery data. Check your GTM container for any tags sending reserved event names.
  • Leaving enhanced measurement page_view on alongside a GTM page_view tag. Two page views per page load is one of the most common data quality issues in new GA4 implementations. Pick one mechanism and disable the other.
  • Using non-standard names for recommended events. order_placed, checkout_complete, and transaction all fail to populate GA4's e-commerce reports. The event must be named exactly purchase.
  • Not clearing the ecommerce object between events. Failing to push { ecommerce: null } before each ecommerce dataLayer push causes parameters from earlier events to contaminate later ones.
  • Not registering custom parameters as custom dimensions. Parameters sent with custom events are collected and stored in BigQuery immediately — but they're invisible in GA4's Explore tool until registered as custom dimensions in Admin.
  • Marking too many events as conversions. GA4 allows up to 30 conversion events per property. More importantly, marking low-value events as conversions pollutes acquisition and advertising reports with noise that obscures genuine business outcomes.

How event types appear in BigQuery

All four event types — automatic, enhanced measurement, recommended, and custom — land in the same BigQuery table: events_YYYYMMDD. There's no separate column that tells you which category an event belongs to. They're all rows in the same dataset, differentiated only by their event_name value.

This matters for two reasons. First, BigQuery queries need to filter carefully if you want to count only meaningful user interactions rather than session infrastructure events:

BigQuery SQL — Exclude automatic and infrastructure events from interaction counts

SELECT
  event_name,
  COUNT(*) AS event_count
FROM
  `your-project.analytics_XXXXXXXXX.events_*`
WHERE
  _TABLE_SUFFIX BETWEEN '20260601' AND '20260630'
  AND event_name NOT IN (
    'session_start',
    'first_visit',
    'user_engagement',
    'page_view',
    'scroll',
    'click'
  )
GROUP BY
  event_name
ORDER BY
  event_count DESC

Second, BigQuery doesn't validate whether your event parameters are correct — it stores whatever was sent. A misconfigured recommended event lands in BigQuery just like a correctly configured one. Validating your data in GA4 DebugView during implementation, and in BigQuery after deployment, is the only way to confirm that what's being collected matches what was intended.

Not sure whether your GA4 event setup is correct?

We audit GA4 implementations and identify exactly where the event setup is missing business-critical data, double-counting actions, or using the wrong event type for the job. Book a free 30-minute audit and we'll walk through your current setup and tell you specifically what needs fixing.