Google Analytics Data (GA4): Tips and best practices#

Data accuracy and estimates#

Google Analytics Data (GA4) uses estimates in some data calculations. When comparing data from Google Analytics Data (GA4) with data in Adverity, compare data at the row level rather than totals for greater accuracy.

Metric inflation with dimensions#

Metric values inflate when you add more dimensions to Google Analytics Data (GA4) data collection. This is common in web analytics tools because individual sessions and users can be counted multiple times.

This occurs for two reasons:

  1. Non-aggregatable metrics use estimates. The total row in a Google Analytics Data (GA4) UI report may not match the sum of all rows. For example, a report with 3 rows of 10 sessions each might show a total of 25 instead of 30.

  2. Values are counted multiple times, such as when a session spans more than one day or a user visits multiple pages in a single session.

The totals in your Google Analytics Data (GA4) UI report may not match the data in Adverity.

Why adding dimensions changes your totals#

Four separate mechanisms change the numbers a report returns as you add dimensions. Knowing which one you are looking at determines what to do about it.

Cardinality and the (other) row. Once a report exceeds Google’s row limit, GA4 groups the least common values into a single row with the literal value (other). This becomes likely above roughly 500 unique values per day for a dimension, so it affects page paths, URLs and search terms first. Filters are applied after this grouping and do not look inside the (other) row, so filtering cannot recover the detail.

Thresholding. GA4 withholds rows to prevent individual users being identified from demographics, interests or other signals. A metric that is not itself subject to thresholding can still be withheld because another metric in the same report is.

Sampling. GA4 can base a response on a subset of events for large or complex queries. The narrower the date range and the fewer the dimensions, the less likely this is.

Selecting more than ten metrics. GA4 reports on a maximum of ten metrics at a time, so a wider selection is collected in more than one pass and combined. Two consequences follow:

  • A metric value that GA4 does not return is recorded as 0 rather than left empty, so a 0 does not always mean the value is zero.

  • Whole columns of 0 can appear for the same reason.

Tip

The pattern that avoids all four: collect your headline metrics (sessions, totalUsers) at the lowest dimension count you can, in their own datastream, and collect detailed breakdowns in separate datastreams. Join them downstream rather than requesting one wide report.

Keep each datastream to ten metrics or fewer where you can, so that a report is collected in a single request.

Note

GA4 reports whether a given response was sampled, thresholded, or had rows grouped into (other). Adverity does not currently surface these indicators. When you need to establish which mechanism applies to a specific report, reproduce the same dimensions, metrics, filters and date range in the GA4 Query Explorer and inspect the response metadata.

Field compatibility and datastream strategy#

Not all fields are compatible with each other. Use a GA4 demo account to test field compatibility before configuring production datastreams.

Which combinations are rejected#

Adverity checks your selection against Google’s own compatibility service when you save the datastream, and applies further restrictions on top of it. The additional restrictions exist because some combinations pass Google’s check and then fail during collection, so a combination that the GA4 Query Explorer accepts can still be rejected here.

Page URL dimensions restrict the rest of the report. Selecting any of fullPageUrl, pageLocation, pagePathPlusQueryString or unifiedPageScreen limits the datastream to the following:

Allowed alongside a page URL dimension

Values

Dimensions

country, countryId, date, defaultChannelGroup, eventName, fullPageUrl, hostName, pageLocation, pagePathPlusQueryString, pageTitle, platform, sessionCampaignName, sessionManualAdContent, sessionSourceMedium, source, unifiedPageScreen

Metrics

activeUsers, averageSessionDuration, bounceRate, engagedSessions, eventCount, eventValue, keyEvents, newUsers, screenPageViews, sessions, totalSessions, totalUsers, userEngagementDuration

Anything outside these lists must go in a separate datastream. This is why a combination such as fullPageUrl with firstUserCampaignName is refused.

Ecommerce item fields cannot be combined with event-scoped traffic dimensions. Item dimensions such as itemName, itemId, itemBrand and itemCategory cannot be selected together with campaignName, source, medium, defaultChannelGrouping, sourcePlatform or the googleAds* dimensions.

Active user ratios cannot be combined with Google Ads dimensions. dauPerMau, wauPerMau and dauPerWau cannot be selected together with Google Ads dimensions such as googleAdsKeyword or sessionGoogleAdsCampaignType.

Ecommerce and engagement metrics cannot be combined with item dimensions. Metrics such as eventCount, screenPageViews, newUsers, transactions, purchaseRevenue and userEngagementDuration cannot be selected together with the item dimensions listed above.

Organic search metrics need a Search Console link. The organicGoogleSearch* metrics require an active Search Console link on the property. Without one, collection fails with a message naming the fields to remove.

Separate user metrics into dedicated datastreams. Consider your end report requirements before creating datastreams. Many clients reduce user metric requirements once they understand each breakdown requires a separate datastream.

Select and recast Events to report events as metrics using custom transformation scripts.

Filter visualization widgets by datastream to avoid double counting metrics.

Use datastream filters primarily for reporting unique users for specific segments (e.g., users with engagement).

Conversions use generic source fields rather than prefix fields such as firstUserSource or sessionSource.

Historical data and user reporting#

GA4 uses an event-based model while Universal Analytics (UA) uses a session-based model. Do not directly combine historic UA data with GA4 data due to different methodologies.

The GA4 API does not report new and returning users as metrics. Instead, it reports totalUsers and newUsers. Some analysts use firstSessionDate to calculate new versus returning users.

Alternatively, use the newVsReturning dimension to classify whether users are new or returning.

Source field variations#

The GA4 API separates common dimensions (source/medium/channel grouping, campaign) into multiple dimensions (sessionSource, sessionMedium, sessionChannelGrouping).

Dimensions without session or first user prefixes (source, medium, channelGrouping, campaign) are tied to conversion events and only return data for metrics associated with conversions.

To report on sessions, bounces, and page views at a total level, use dimensions prefixed with session or first user.

Advanced filtering configuration#

Datastream filters are not commonly used. For aggregate metrics, filter data using enrichments after fetching. However, for specific segments of the totalUsers metric, filter the API call because totalUsers is non-aggregatable.

Example filter:

{
  "filter":{
    "fieldName":"eventName",
    "stringFilter":{
      "matchType":"CONTAINS",
      "value":"user_engagement",
      "caseSensitive":false
    }
  }
}

Attribution and engagement metrics#

Attribution model outputs, such as Data-Driven Attribution and Last Click, are not available to this connector. Google offers attribution model selection only in a preview version of the Google Analytics Data API, and only for some properties. Adverity collects from the general availability version, so no datastream configuration retrieves these values.

There is no option to query each day separately. Adverity requests the whole date range in a single report per property.

API quota limitations#

Google applies quotas per property, in both an hourly and a daily bucket, and also limits how many requests a property can serve at once:

Quota

Standard property

Analytics 360 property

Tokens per hour

40,000

400,000

Tokens per day

200,000

2,000,000

Concurrent requests

10

50

For the current figures, see the Google documentation.

Because the quota belongs to the property rather than to your Adverity account, several datastreams collecting from the same property draw on the same allowance. Selecting more than ten metrics multiplies the number of requests, as does adding properties.

To reduce quota pressure, schedule datastreams that share a property at different times, and split wide reports by topic rather than collecting every metric in one datastream.

Engaged sessions and bounce rate#

An engaged session is one that:

  • Lasts 10 seconds or longer

  • Has one or more conversion events

  • Has two or more page or screen views

Bounce rate: (sessions - engagedSessions) / sessions Engagement rate: engagedSessions / sessions

Sessions calculation differences#

In Universal Analytics, a session represents the time a user actively engages with your site.

In GA4, the session_start event generates a session ID that associates all subsequent events during the session. Similar to UA, sessions end after 30 minutes of inactivity, but sessions can carry over past midnight and are not affected by new campaign parameters. For sites with global audiences, this can cause discrepancies between UA and GA4 session figures.

Data reconciliation and validation#

Google states that processing takes 24 to 48 hours, and that values change during that window. Daily data for the previous day is typically complete by mid-afternoon in the time zone configured on the property, not at a fixed UTC time. Schedule datastreams accordingly, and expect a re-fetch of a recent date range to return different values.

When comparing total session numbers with breakdowns (e.g., Channel Grouping), totals may differ because GA4 uses algorithms to calculate session numbers for breakdowns rather than summing them.

GA4 applies thresholds when Google Signals is enabled. Data thresholds prevent inferring individual user identity based on demographics, interests, or other signals. These cannot be changed, and they apply to data collected through the API as well as to the interface.

Page and URL field differences#

pageLocation is the full URL including all parameters. pagePath is the portion of the URL between the hostname and the query string, and excludes query parameters. pagePathPlusQueryString is the portion following the hostname and includes them. landingPagePlusQueryString is the page path and query string of the first page viewed in a session.

For landing page reports, use landingPagePlusQueryString and group by pagePath.

Session duration and time metrics#

The Time on Page metric is not available in GA4 and is replaced by average engagement time in the UI Pages and Screens report.

Average engagement time is improved because Time on Page did not calculate for all pages (exit pages, bounced pages), making it inaccurate.

To report average session duration, calculate total_duration as a target field using an enrichment:

total_duration = averageSessionDuration x sessions

Create a calculated KPI: averageSessionDuration = total_duration / sessions

Cross-channel attribution#

Google allows cross-channel attribution as part of data-driven models. They identify if users access your website across multiple channels (paid and organic). This feature means you will see multiple networks in conversion paths.

Setup best practices#

Visualization considerations#

Filter visualization widgets by datastream.

Schema clarity#

Use clear schema mapping (e.g., users_daily_by_page).

Account management#

Smaller clients: Fetch multiple accounts in one datastream. Larger clients: Split accounts into separate datastreams to optimize performance for large datasets.