Skip to content
accs-net.com

Press Esc to close

Data Stream

A GA4 data stream is the collection endpoint that pipes data from one of your platforms – a website, an Android app, or an iOS app – into a single Google Analytics 4 property. It carries a unique Measurement ID (web) or Firebase App ID (mobile), governs which GA4 events get collected, and is where you toggle Enhanced Measurement, set internal traffic filters, and configure cross‑domain tracking. This guide covers the three stream types, the property → stream hierarchy, the step‑by‑step web stream setup, the Measurement ID vs Stream ID distinction that trips up most beginners, the six Enhanced Measurement events, multi‑stream patterns, and the most‑asked questions about GA4 data streams.

What Is a Data Stream in GA4?

In GA4, a data stream is the boundary between a platform and a property. Each stream represents one source of hits – a domain or an app bundle – and gives that source its own credentials and configuration. Web streams use gtag.js (loaded directly or through GTM) and identify themselves with a G‑XXXXXXX Measurement ID. App streams use the Firebase SDK and identify themselves with the app’s package name (Android) or bundle ID (iOS).

The model replaces what Universal Analytics called views. UA had one tracking ID per property and views were filtered slices of that single firehose. GA4 inverts the relationship: one property holds many streams, and each stream is a clean source. You no longer apply post‑collection filters to carve out subsets – instead, you decide at collection time which platform sends what.

Three Stream Types: Web, Android App, iOS App

GA4 supports exactly three stream types. The decision of which to use is dictated by the platform, not by preference:

GA4 hierarchy diagram showing Account, Property, three data streams (Web, Android, iOS) and the events each stream collects
How an Account, a Property, multiple Data Streams, and Events nest inside one another
Stream type Library ID format Default events collected
Web gtag.js / Google Tag Manager G‑XXXXXXX (Measurement ID) page_view, scroll, click, video_engagement, file_download, optional site search
Android app Firebase SDK for Android Firebase App ID + package name screen_view, app_open, session_start, first_open, in_app_purchase, app_remove
iOS app Firebase SDK for iOS Firebase App ID + bundle ID screen_view, app_open, session_start, first_open, in_app_purchase, ad‑impression events

The two app streams look identical from the GA4 reporting side because they share the Firebase event schema. The web stream is the odd one out: page_view is its primary event, while the app streams center on screen view and lifecycle events. That asymmetry is the reason cross‑platform reports often need custom dimensions to align web and app behavior on the same axis.

Property → Stream Hierarchy

The GA4 hierarchy is four levels deep: Account → Property → Data Stream → Event. Account is the top container (one organization, billing relationship, user permissions). A property is one logical product or business unit and holds your reports. A data stream is one collection endpoint per platform. An event is a single recorded interaction.

The limits Google publishes in the GA4 admin reference are worth memorizing:

  • Up to 100 properties per account (Standard) or unlimited (Analytics 360).
  • Up to 50 data streams per property, of which max 1 web stream as of 2024 (Google quietly capped multi‑web‑stream creation in most accounts).
  • Up to 500 distinct event names per property (web + app streams share this pool).
  • One Google Tag can serve multiple destinations, but each destination is still a separate stream.

The practical implication: if you have a marketing site and a SaaS app on different domains, you put both web flows under one property as a single web stream (using cross‑domain configuration) – not as two streams. If you have a website plus an Android app plus an iOS app, you have one web stream, one Android stream, and one iOS stream – three streams sharing one property.

Setting Up a Web Data Stream – Step by Step

The first stream you create is created automatically when you set up the property; subsequent streams (for example adding an app stream later) follow the same flow:

  1. Open Admin → Data Streams. In the left‑hand admin panel, navigate to the property column and click Data Streams. You’ll see existing streams listed by platform.
  2. Click “Add stream” → choose Web. Pick the platform. The setup form differs for Web, Android, iOS.
  3. Enter the website URL and stream name. The URL is the canonical hostname (https://example.com) – not a path. The stream name is internal and only shows up in the streams list, so use something descriptive like “example.com production.”
  4. Toggle Enhanced Measurement. Default is on. The six events (page_view, scroll, click, video, file_download, site_search) start firing as soon as the tag loads. You can flip individual toggles via the gear icon.
  5. Save and grab your Measurement ID. The new stream appears with a G‑XXXXXXX ID. Copy it – this is what you paste into your gtag.js snippet, GTM container, or Shopify analytics field.
  6. Install the Google tag. Either paste the gtag.js snippet directly into the <head>, or send the Measurement ID to a GA4 Configuration tag in GTM. The data layer should be initialized before the tag fires so custom dimensions populate from the first hit.
  7. Verify in DebugView. Open Admin → DebugView on the GA4 side and trigger an action. Events should appear within seconds. If nothing shows up, the stream is misconfigured (wrong ID, blocked by an ad blocker, or the data layer is not pushing).

Two settings worth configuring on day one: Configure tag settings → Define internal traffic (add your office and home IP ranges so QA visits don’t pollute reports) and List unwanted referrals (so payment gateways like checkout.stripe.com don’t fragment user sessions when they bounce back to your domain).

Measurement ID vs Stream ID – the Distinction

This is the single biggest source of confusion. They are not the same identifier:

Field Where you see it What it does
Measurement ID Top of the web stream details page; format G‑XXXXXXX Goes into your gtag.js / GTM tag config. This is what your website actually sends data to.
Stream ID Below the Measurement ID; numeric, ~10 digits Internal identifier used by the GA4 API, BigQuery export schema, and Measurement Protocol requests as ?tid= in some contexts.
Firebase App ID App stream details page; format 1:NUMBER:android:HASH Identifies the app to Firebase. Mobile equivalent of the Measurement ID.

Use the Measurement ID for tag installation. Use the Stream ID only when you’re writing API queries, scripting BigQuery joins, or sending events server‑to‑server via the Measurement Protocol, where the request URL takes ?measurement_id=G‑XXXXXXX&api_secret=... against the stream. Mixing the two is the most common “why are no hits arriving” question on the GA4 community forum.

Enhanced Measurement Settings – Auto‑Tracked Events

Enhanced Measurement is six toggles that bolt onto every web data stream. Flip them on and GA4 starts capturing engagement signals without any extra code:

Six Enhanced Measurement events on a GA4 web data stream: page_view, scroll, click, video_engagement, file_download, view_search_results, with toggle indicators
The six default Enhanced Measurement events – one toggle per row in stream settings
  • page_view – fires on initial load and on every history.pushState in single‑page apps. Cannot be turned off; it’s required.
  • scroll – fires once per page when the user crosses the 90% depth threshold. No way to add 25/50/75 percent thresholds without a custom event.
  • click (outbound) – fires on any link click leading to a different domain. Parameters include link_url, link_domain, outbound: true.
  • video_engagement – fires only for embedded YouTube iframes at 10%, 25%, 50%, 75% progress. Self‑hosted players (Vimeo, native HTML5) need a custom video_play event.
  • file_download – fires on clicks to extensions like PDF, DOC, XLS, ZIP, MP3, MP4, MOV, plus a few more. Parameters include file_name, file_extension.
  • view_search_results – off by default. Turn it on, then specify which URL query parameters represent the search term (q, s, search, query, keyword).

The trade‑off: Enhanced Measurement is a baseline, not a complete tracking plan. Names are reserved, you can’t add parameters, and the thresholds are fixed. Anything beyond – form submissions, custom video providers, scroll milestones at non‑default depths – needs a custom event built via the data layer and GTM. See the enhanced measurement reference for parameter details.

Multiple Streams in One Property – When and Why

The right rule of thumb: one stream per platform, one property per business unit. The legitimate reasons to have multiple streams are:

  1. Cross‑platform product. Your SaaS has a web app, an Android client, and an iOS client. Three streams in one property let you trace a single user’s journey across devices using a unified user_id.
  2. Web + companion mobile app. An e‑commerce site with a native shopping app. Web stream captures pre‑purchase research, app stream captures repeat purchases, both feed unified retention reports.
  3. Adding a new platform later. You launched with web‑only and now you’re shipping mobile. Add the second stream to the same property so historical web data stays comparable.

The illegitimate reasons – cases where people try to use multiple streams as a workaround and shouldn’t:

  • Staging vs production. Use a separate property, not a separate stream. Otherwise QA traffic pollutes production conversions.
  • Multiple unrelated websites. If acme‑corp.com and acme‑blog.com are different brands, use two properties. Reporting them as one property loses the ability to compare them as channels.
  • Subdomains as separate streams. Subdomains share cookies and should be in one web stream with cross‑domain configured. Splitting them fragments sessions.

If you find yourself wanting separate retention or conversion tracking for two slices, that’s a property‑level distinction. If you want unified reporting with platform breakdown, that’s a stream‑level distinction. The choice is one‑way: you cannot merge two properties later, but you can always add a stream.

Cross‑Stream Analysis – When Streams Merge Data

Once multiple streams report to the same property, GA4 stitches their data automatically along three axes: user identity, session, and events. The stitching mechanisms are:

  • User‑ID. If your app and your web both call gtag('set', { user_id: 'abc123' }) with the same value when a user logs in, GA4 collapses sessions across streams into one user.
  • Google signals. When a user is signed into a Google account with Ads Personalization enabled, GA4 uses that signal to deduplicate across devices – even without a User‑ID. Aggregated only; subject to thresholding.
  • Device modeling. GA4 estimates cross‑device behavior using machine learning when neither User‑ID nor Google signals is available. Powers the “Blended” identity space in reports.

The reports that benefit from cross‑stream stitching: the User Acquisition report (web visitors who later install the app), Path exploration in the Explore module, audience definitions that span platforms, and BigQuery export joins. Streams without a unifier (no User‑ID, signed‑out users, app installs in countries with strict consent) stay isolated; you’ll see them as separate stream_id rows in BigQuery.

If you plan to build dashboards in Looker Studio or pipelines via BigQuery export, the stream_id field is your dimension for splitting traffic by platform. Filtering or grouping by it produces the same web‑vs‑app split GA4’s standard reports show.

Frequently Asked Questions

What is a data stream in GA4?

A GA4 data stream is the connection between one of your platforms (a website, an Android app, or an iOS app) and a single GA4 property. It collects events using gtag.js or the Firebase SDK, identifies itself with a Measurement ID or Firebase App ID, and is where you configure Enhanced Measurement, internal traffic filters, and cross‑domain tracking.

What’s the difference between a property and a stream?

A property is the container where your data lives and reports are built. A stream is one source of data feeding into the property. One property can have up to 50 streams; each stream represents one platform (one website domain, one Android app, or one iOS app). Reports aggregate across streams within the same property.

Can you have multiple streams in GA4?

Yes. A single GA4 property supports up to 50 data streams, though Google now limits most accounts to one web stream per property. The typical pattern is one web stream plus one Android stream plus one iOS stream – three streams in one property – for cross‑platform products. Use separate properties (not separate streams) for staging, unrelated brands, or test environments.

Where do I find my Measurement ID?

Open Admin → Data Streams → click on your web stream. The Measurement ID is at the top of the stream details panel in the format G‑XXXXXXX. Copy it and paste it into your gtag.js snippet, GTM GA4 Configuration tag, or your platform’s analytics field (Shopify, WooCommerce, etc.).

What is the difference between Stream ID and Measurement ID?

Measurement ID (G‑XXXXXXX) is the public identifier you put into your tracking tag – it tells gtag.js where to send data. Stream ID is the numeric internal ID GA4 uses for API queries, BigQuery export schemas, and some Measurement Protocol contexts. They refer to the same stream but are used in different places. Most users only ever need the Measurement ID.

What events does a GA4 web stream collect by default?

With Enhanced Measurement on (default), a web stream collects six events automatically: page_view (always on), scroll (90% depth), click (outbound links), video_engagement (embedded YouTube), file_download (PDF/DOC/ZIP/MP3/MP4 etc.), and view_search_results (off by default, requires URL parameter configuration). All other events – form submits, custom CTAs, ecommerce – need a data layer push or GTM tag.

Can I send data to a GA4 stream without using gtag.js?

Yes. The Measurement Protocol lets you send events directly from a server to a GA4 stream via HTTPS POST, using the stream’s Measurement ID and an API secret. Useful for offline conversions, payment redirects, server‑rendered pages, and cross‑device stitching. The Firebase SDK is the equivalent path for app streams.

  • GA4 events – the atomic unit of measurement; every stream collects events
  • Data layer – the structured object that feeds custom events from your site code into a web stream
  • Measurement Protocol – server‑to‑server alternative to gtag.js for sending events to a stream
  • Enhanced measurement – the six‑event auto‑tracking layer on every web data stream
  • Looker Studio – reporting layer that consumes stream data via the GA4 connector
  • BigQuery – raw export destination where stream_id is a dimension column
  • Screen view – the app‑stream equivalent of page_view
  • Pageview – the web‑stream primary event captured by Enhanced Measurement

Tom Martin
Written by

Tom Martin

Web analytics specialist with deep expertise in Google Analytics, Tag Manager, and e-commerce tracking. Helping businesses understand their data without the noise — practical guides, honest reviews, and real-world implementation experience.