Updated: December 12, 2025
If you’ve ever looked at a GA4 report and wished you could drill down to see what a specific user did — across sessions, across devices, across your entire funnel — you’ve run into GA4’s biggest limitation. The Client ID is right there in your data, but by default, you can’t use it as a dimension in your reports.
So what do most people do? They export raw data to BigQuery and query it there. That works, but it’s slow, it requires SQL, and it’s not something you can do on a Tuesday morning when your boss asks, “Can you show me the behavior of user X?”
There’s a simpler way. You can pass the Client ID into GA4 as a user-scoped custom dimension (which GA4 calls a User Property). Once you do, it becomes available in your Explore reports, segment builders, and even some standard reports. Here’s exactly how to set it up.
Let’s get into it.
What’s the Client ID, and Why Pass It to a Custom Dimension?
Every user who visits your site gets a unique Client ID, stored in the _ga cookie. It looks something like 1234567890.9876543210. GA4 uses it internally to stitch sessions together, but it doesn’t expose it as a dimension in the UI.
That’s where a custom dimension comes in. By passing the Client ID as a User Property, you unlock a few genuinely useful things:
- User-level debugging: See exactly how a specific user moved through your site
- Segment creation: Build audiences based on behaviors of specific user cohorts identified by Client ID
- Cross-session analysis: Follow a single user across multiple sessions without BigQuery
You won’t use this every day. But when you need it, it’s invaluable.
Step 1 : Grab the Client ID Using GTM’s Analytics Storage Variable
GTM has a built-in variable type called Analytics Storage that can read the Client ID, Session ID, and Session Number directly from the GA4 client. No custom JavaScript, no cookie parsing, no headaches.
In GTM, click「Variables」——「New」——「Choose a variables type to begin setup…」——「 Analytics Storage」,Name it “Client ID”, and make the following settings:
Step 2 : Create an Event Settings Variable in GTM
Now that you have the Client ID in a GTM variable, you need to pass it to GA4. You do this through a User Property — which is GA4’s term for a user-scoped parameter attached to every event.
The cleanest way to do this is through a Google Tag: Event Settings variable. If you already use one for your common event parameters (and I highly recommend you do), you’ll just add one more entry.
Here’s the setup:
In GTM,click「Variables」——「New」——「Choose a variable type to begin setup…」——「Google Tag: Event Settings」,name it “Common Event Parameter”, and configure as follows:
Step 3 : Apply it to your GA4 tag
Go back to your GA4 configuration tag. In the tag configuration, set the Event Settings Variable field to
This ensures that the hashed Client ID is sent as a user-scoped parameter on every event.
Step 3 : Preview and Release
Finally, preview testing and release:
The test is as expected and can be released and data collected.
Step 4 : Register the Custom Dimension in GA4
This is the step most people forget. Sending the User Property from GTM is only half the work. GA4 won’t surface it in reports until you register it as a custom dimension.
In GA4,click「Admin」——「Custom definitions」——「Create custom dimension」, then do the following configuration:
That’s it. GA4 will now start collecting this dimension. A quick heads-up: it can take up to 24 hours for the dimension to appear in reports, and it won’t apply retroactively. Only new events after registration will carry the Client ID.
Step 5 : Verify Data in GA4 Report
After 24 hours (GA4 needs some time to process), you should be able to see the Client ID in your reports.
In GA4, click 「Explore」 – 「Free form」,configure the following:
- ROWS: Client ID
- VALUES: Event count,Toatl users
Final Words
Setting up the Client ID as a custom dimension is one of those small configurations that pays off disproportionately when you need it. It takes about 10 minutes to set up, and once it’s done, you have a direct line into user-level behavior without needing to export to BigQuery every time.
I’ve seen a few variations of this setup — some people pass the Client ID as an event-scoped parameter instead, or use a different variable source — but the method I’ve described here is the one I’ve found most reliable.


