Keep GA4 running and own every hit, in your own warehouse.
Set server_container_url in your gtag config and every GA4 hit lands in your own warehouse first, on your own domain, then goes on to Google. GA4 keeps working; your reports become models you own, joined to ad cost and the CRM.
- One setting changes in GA4
- Your history comes over
- Collected on your own domain
- First version in two weeks, at a fixed price
SegmentStream collects every GA4 hit into a warehouse you own by changing one setting, server_container_url, and passes each hit on to Google, so GA4 keeps working. Your reports become models you own, joined to ad cost and your CRM. Stay with GA4 alone if its reports answer every question you have; add SegmentStream when you need the raw data and the rest of the company beside it.
Stay on GA4 if
- GA4's standard reports answer every question your team asks.
- You do not need traffic joined to cost, leads or revenue.
Move to SegmentStream if
- You want every GA4 hit in your own warehouse, unsampled, as it arrives.
- You want traffic joined to ad cost and to the leads and deals in your CRM.
- You want collection on your own domain, so fewer hits are blocked.
We move you, if you want
Our engineers install the endpoint, serve it from your domain, bring your history over and rebuild your reports, then change the setting with you when the numbers match. It starts with a fixed-scope pilot.
Request a pilot →Last reviewed October 2026 · Sources: Google: server-side tagging, GA4 BigQuery export
Change server_container_url. Nothing else.
Your tracking stays as it is. Only the address changes: your workspace's endpoint on collect.segmentstream.com, or the same path served from your own domain. Every hit still reaches Google.
gtag('config', 'G-XXXXXXXXXX');gtag('config', 'G-XXXXXXXXXX', { server_container_url: 'https://collect.segmentstream.com/v1/e/WORKSPACE_ID/ga4',});Or take the Google tag off for a tracker of your own.
Your agent declares a stream in your repository and writes a small tracker for your site, sending the events your reports need. Nothing from Google loads on your pages. GA4 stops receiving data once the Google tag comes off, so you can run both until your reports match.
- Page views from the browser; requests and form submissions from your own server, with the IP address and user agent.
- A first-party cookie set by your own server on your domain, so it keeps its full lifetime.
- Bots and AI agents classified, sessions built and leads attributed, as models in your repository.
- This website is measured this way, with a tracker our own agent wrote.
from segmentstream.events import Stream, auth, protocolstreams = ( Stream( key="web", auth=(auth.WriteKey(), auth.Origin(("https://www.yourcompany.com",))), protocol=protocol.Json(batch=True), ),)const endpoint = 'https://collect.segmentstream.com/v1/e/WORKSPACE_ID/web';export function track(type: string, payload: Record<string, unknown> = {}) { navigator.sendBeacon(endpoint, JSON.stringify({ batch: [{ event_id: crypto.randomUUID(), event_time: new Date().toISOString(), event_type: type, schema_version: 1, payload: { url: location.href, referrer: document.referrer, ...payload }, }], }));}track('page_view');An event stream as its events/ folder declares it: the origins it accepts, batching, and the endpoint your tracker sends to.

Swipe the screen sideways to see all of it.
What comes over, and what stays
What you bring from GA4, and what you keep in the tools you like.
- Every new event, from the day the setting changes
- Your history, from your GA4 BigQuery export, read through a BigQuery connection
- Anonymous and user ids, so each person's history joins up
- Event names and properties as your developers sent them
- The reports your team relies on, rebuilt and compared
- GA4 itself: its reports, audiences and Google Ads links keep working on the hits passed on to Google
- The gtag.js script, which still loads from Google
Google Analytics alternative: what it does
Your marketing team keeps GA4 as it is, and every hit also lands in your own warehouse first, on your own domain. Reports join traffic to ad cost and to the leads and deals in your CRM, and nobody waits on sampling or thresholds again.
- Change server_container_url in your gtag config, or the Google tag in Tag Manager and events start arriving in your own warehouse. No new tags, no new tracking plan.
- Raw events keep the shape the tracker sends, and one normalised events table brings every tracker into the same model.
- Collection runs on your own domain, so more of your traffic is measured.
- GA4 keeps receiving every hit, so nothing your marketing team uses in Google changes.
- Your history comes over from your GA4 BigQuery export, read through a BigQuery connection.
- Sessions, channels and attribution join your events to ad cost and the CRM.
- The company agent answers questions from your events, within the roles of whoever asks.
What it covers
One setting, nothing re-instrumented
Point the GA4 tracker you already run at your workspace by changing server_container_url. The tracking calls your developers wrote keep working.
Every event in your own warehouse →
Every event lands in your own warehouse, in the region you choose, in the shape the tracker sends it, beside one normalised events table for every tracker you run.
Collected on your own domain
Collection is served from a path on your own domain, so ad blockers and browser tracking prevention cut less of it, and your first-party cookies keep their full lifetime.
GA4 keeps working
Each hit is passed on to Google as it arrives, so your GA4 reports, audiences and Google Ads links carry on unchanged.
Sessions, channels and attribution →
Sessions, channels, conversions and attribution built on your events and joined to ad cost and the CRM, which no single analytics tool sees.
Ask the company agent →
Your team asks about traffic, funnels and customers in plain language. The company agent answers from your warehouse, with the permissions of whoever asks.
Every GA4 concept, and where it lives in your workspace
For your engineers: every GA4 concept and where it lives once you have moved.
| In GA4 | In your workspace | What to know |
|---|---|---|
| Tracking calls in your code | Unchanged: the tracker sends to your workspace | Only server_container_url changes |
| Measurement ID and web data stream | A GA4 endpoint in events/ with your measurement IDs | Passing hits on to Google stays on |
| Events and parameters | Every hit and parameter kept as it arrives | With the IP and user agent your domain receives |
| BigQuery export | Loaded through a BigQuery connection | The history from the day you turned it on |
| Explorations and standard reports | SQL models and pages in your app | Unsampled, with no thresholds |
| Key events | Conversion models joined to the CRM | With the leads and deals GA4 never sees |
| Google tag in Google Tag Manager | The same tag, with its server container URL set | Set once in the tag's configuration |
| Raw events | bronze.events_ga4 in your own warehouse | In the shape the tracker sends, in your region |
| One model for every tracker | silver/events | Event names, ids, pages and revenue in one schema |
| Access to the data | Roles for people, apps and agents | The same roles everywhere, with no extra seats |
What you keep elsewhere, and what SegmentStream does not do
- GA4's own interface, audiences and Google Ads links. They keep working on the hits passed on to Google.
- The gtag.js script itself, which still loads from Google.
How a move off GA4 works
Each step is a pull request in your repository or a check in the console. Our engineers can do all of it with you.
- 01
Add the GA4 endpoint
One template adds the GA4 endpoint, the model that normalises its events and a guide to your repository. Your agent installs it and you review the pull request.
- 02
Bring your history
Your history comes over from your GA4 BigQuery export, read through a BigQuery connection, so your reports start with every month you already have.
- 03
Rebuild the reports and compare
The reports your team relies on are rebuilt on your history and compared with GA4, month by month, until every number matches or the difference is explained.
- 04
Serve collection from your domain
A path on your own domain is routed to the collector through your CDN or web server, so cookies keep their full lifetime and fewer events are blocked.
- 05
Change server_container_url
server_container_url changes in your gtag config, or the Google tag in Tag Manager, a test event is sent with the real tracker, and real traffic is checked arriving in your warehouse.
- 06
Switch your team
Your team opens the rebuilt reports and asks the company agent instead. Nothing is switched off before the numbers match.
We move your analytics off GA4, end to end, if you want us to.
Our engineers install the GA4 endpoint, serve it from your domain, bring your history over, rebuild the reports your team relies on and compare them with GA4, then change the setting with you. Or do it with your own agent and our help on call. It starts with a fixed-scope pilot.
Nothing switches until the numbers match.
Both systems run side by side. Every number your teams rely on is compared, and every difference is explained before anything is turned off.
| Metric · Sept | GA4 | Workspace | Status |
|---|---|---|---|
| Sessions | 412,880 | 414,016 | explained |
| Users | 301,442 | 301,442 | match |
| Key events: demo requests | 1,218 | 1,218 | match |
| Purchase revenue | £248,310 | £248,310 | match |
- GA4 as the place your data lives
- Sampled explorations
- Looker Studio dashboards on GA4
GA4 keeps running while you move. One setting sends every hit to your own domain first and on to Google, your BigQuery export brings the history, and the reports your team relies on are rebuilt and compared with GA4. We do the whole move for you if you want: see the offer below.
Enterprise, with our engineers
Our engineers install the GA4 endpoint, serve it from your domain, bring your history over, rebuild the reports your team relies on and compare them with GA4, then change the setting with you.
Self-serve, with your own agent
Tell your agent you run GA4. It installs the endpoint and its model, prepares the first-party path for your domain and shows you the one setting to change, and segmentstream deploy puts it live.
curl -fsSL https://cloud.segmentstream.com/install.sh | shRelated solutions
Read more
Questions
Is SegmentStream Cloud a GA4 alternative?
Yes, for collecting and owning your data. SegmentStream collects every GA4 hit into a warehouse you own by changing one setting, server_container_url, and passes each hit on to Google, so GA4 keeps working. Your reports become models you own, joined to ad cost and your CRM. Stay with GA4 alone if its reports answer every question you have; add SegmentStream when you need the raw data and the rest of the company beside it.
Do we have to re-instrument our product or website?
No. You change server_container_url in your gtag config, or the Google tag in Tag Manager, and the tracking calls already in your website, app and servers keep working. No new tags and no new tracking plan. Re-instrumenting only comes in if you choose a tracker of your own instead.
Can we take the Google tag off altogether?
Yes. Your agent declares a stream in your repository and writes a tracker of your own: page views from the browser, requests and form submissions from your own server, and a first-party cookie on your domain. GA4 stops receiving data once the Google tag comes off, so you can run both until your reports match. You can change the setting first and replace the SDK later, or do both at once.
What happens to GA4?
Nothing changes in GA4. Each hit is passed on to Google as it arrives, so its reports, audiences and Google Ads links keep working while you own every hit.
Can we keep our history?
Yes. Your GA4 property's BigQuery export loads into your workspace from the day you turned it on, and from the day the setting changes every hit is collected directly.
How is this different from reading the GA4 BigQuery export?
Rebuilding reports from the BigQuery export starts from what GA4 already collected. Collecting the hits yourself adds what the export lacks: every hit as it arrives, on your own domain, with the IP and user agent, joined to your CRM. Most teams do both.
Will SegmentStream do the migration for us?
Yes. Our forward-deployed engineers do the whole move if you want it: the endpoint, the first-party path, the history, the reports and the comparison, starting with a fixed-scope pilot. Request it on this page and your note goes to our founder, not a sales queue.
What does it cost to run?
Usage: events received, warehouse storage and queries, and the compute your pipelines and apps use. No seats and no charge per tracked user.
Who owns the data?
You do. The events sit in your workspace's warehouse in the region you choose, and the code lives in a private git repository you can clone, keep on GitHub and take with you. SegmentStream runs it.
Rather have it moved for you? Request a pilot.
Our engineers install the GA4 endpoint, serve it from your domain, bring your history over, rebuild the reports your team relies on and compare them with GA4, then change the setting with you.
- One solution, on your data, in your own workspace
- First version live in two weeks
- Parity proven before anything is switched off
- Fixed scope and price, credited to your contract if you continue
Not ready for a pilot? Send the form anyway with your question. An engineer will reply, not a sales rep.
How the pilot worksBuild your company’s own software. Let agents run it.
$ segmentstream workspace create acme --region eu --subdomain acme
▸ Created workspace acme · database, warehouse and a private git repository
$ segmentstream workspace WORKSPACE-ID clone acme && cd acme
▸ your coding agent builds what your team asked for and runs the checks
$ git add -A && git commit -m "First version"
$ segmentstream deploy
▸ app, company agent, API and MCP tools live for your invited members
Our engineers build the first version on your data in two weeks, at a fixed price.
Or build it yourself with your coding agent:
curl -fsSL https://cloud.segmentstream.com/install.sh | sh