GTM server side and GA4 user location - google-analytics

While implementing GA4 with GTM server side all users are reported from same location where server instance is located.
In Universal Analytics there was uid parameter to send users IP and in UA tag it’s added. But for GA4 no such parameter added and I can’t find it in parameter reference.
Maybe it’s available but not documented yet?

GA4 Measurement Protocol does not support setting user IP in the payload. That's why for now there no way to correctly track user location thru the server side.
A few months ago, I created an issue in Google Bug Tracker according to this. https://issuetracker.google.com/issues/179160710
It will be great if more people vote for this feature there.

Related

Google Tag Manager, are params persisted when redirecting to/from Stripe Checkout?

Heyo! This might be the dumbest question ever, but I really find Tag Manager confusing.
I have an app which receives UTM params to do campaign tracking, when the user reaches the payment page we use Stripe Checkout and then the user is redirected to/from the Stripe domain.
Once the user has been redirected back and there is a successful purchase, are UTM params still persisted in Google Tag Manager?
Is there anyway I can check which UTM params are currently applied in
the browser session? I haven't found any snippet that could do this
Many many thanks!
This is not a dumb question at all. However, GTM by itself does not persist anything, unless you create a tag that writes the utm parameters to cookies or local storage. But then this is probably not relevant for your case, because with the proper configuration, Google Analytics does persist the values by itself (in a manner of speaking).
GA calculates sessions on the GA server by connecting requests with the same client id (or user if, if set). It can look at the first pageview in the session and inspect the url for campaign information such as utm parameters. That way, it does not require that utm parameters are persisted in the browser, the only thing that needs to be stored (by default in a cookie) is the client id.
There is one caveat, that GA starts a new session when the campaign info changes. When you visitor is rerouted via an external domain for payment, a new session will start with the external domain as referrer and the marketing channel set to referrer. To avoid that, you need to add the payment gateway domain to the referral exclusion list (if you use Universal Analytics, there is a similar mechanism for Google Analytics 4), so GA ignores the external domain when the session and channel attribution is calculated. But that's a setting in the Google Analytics interface, you do not need to make changes to GTM for that.

Firebase+GTM SDK - accessing GA tracker Client ID

I am implementing v5 Firebase+GTM SDK with the sole purpose of tracking the events in Google Analytics.
I can't seem to find a way to access GA Client ID (using previous versions of GTM SDK, I was able to access tracker object and get or set the value).
I am talking about this value:
https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#clientId
https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#cid
Is there a way to reach to GA object hidden inside FIRAnalytics?
Yeah, I don't think tracker object is surfaced.
What you can do is to generate your own clientID (a simple guid would do) and in Google Tag Manager configure a tag to set it as a field. This way you will fully control the cliend id (&cid) and therefore change it as you see fit
This is not possible as of today, since Firebase does not expose data via a REST API. There is no API to even pass on the GA client ID.
From GTM's side of things, that is again a closed system since the data from Firebase is intercepted by GTM but cannot be pulled out or tweaked before it is passed to GA.

Avoiding Google Tag Manager blocking by AdBlockers

I have used Amplitude analytics in the past in my react Web app to send event data. However I just started with Google Tag Manager and noticed it does not run because being blocked by adBlockers. Amplitude was always functional because I loaded their Javascript SDK through NPM install 'github:amplitude/Amplitude-Javascript' and initialized it at app load with client API key. I like the approach of Google Tag manager where I dont have redeploy app to make changes to my analytics logic. How can I take a similar approach to avoiding being blocked by adblockers.
It may very well be that Google products are popular so Adblock specifically just block google analytics products not other analytics products.
You don't. If people don't want to be tracked, that is their decision. You should not be forcing people to provide you with any data they do not want to provide. Especially by using some shady "bypassing" measures. Instead-
You could use a cookie to permanently disable your tracking of those who do not wish to be tracked, to help you preserve reliable analytics. See: http://www.multiminds.eu/2016/05/19/how-to-disable-tracking-via-google-tag-manager/
Or, better yet, simply measure the percentage of visitors who have disabled tracking so your analytical data can remain accurate. See: https://marthijnhoiting.com/detect-if-someone-is-blocking-google-analytics-or-google-tag-manager/
Yes, it's possible.
You can use reverse proxy for Google Tag Manager.
First, download the Google Analytics JavaScript library itself and host it on your server.
Then alter the code in the downloaded library to change the target host from www.google-analytics.com to your own domain name using find-replace.
Replace the link from the default Google Analytics script in your codebase to modified one.
Create a proxy endpoint to Google Analytics servers on your back end. One important step here is to additionally detect the client’s IP address and write it explicitly in requests to Google Analytics servers to preserve correct location detection.
Test the results. You’re done!
more detail info on freecodecamp.org/news/save-your-analytics-from-content-blockers and https://analytics-bypassing-adblockers.netlify.com
There's dataunlocker.com as well as some other open source alternatives (1, 2) which can help to fix reporting accuracy of Google Tag Manager, Amplitude, Google Analytics etc.
Talking about ethics and privacy, tools like DataUnlocker are just tools which allow you to bypass ad blockers as if you have implemented server-side analytics. I think by correctly implementing that "we use cookies" consent one can solve any privacy concerns.
I've managed to get around some blockers with the following in a node app:
var request = require('request');
app.get('/proxy*', function(req,res) {
const newurl = req.url.split('/proxy/')[1];
const data = request(newurl);
//data.on('response', function(response){console.log(JSON.stringify(response))});
data.pipe(res);
});
Then in your snippets for GTM prepend: "/proxy/" in the url and now the call goes via your server.
The caveat with the above is that without additional code you can't preview the container, but the container does load correctly. Lack of preview is a different issue to deal with.

Google UA not connecting event to previous sessions

I am sending an offline event to Google UA using their measurement protocol. I am trying to tie it to the users previous visits to get attribution and using Google's own Client ID from their cookie to do that. While the event does appear in Google UA, it is not tied to other client id sessions.
Here an example of the API call
In this example, "1859919454.1455744839" are the X.Y elements parsed from the _ga cookie's client id.
Am I doing something wrong or making some wrong assumptions about google analytics accepting their own Client ID instead of creating and using my own as suggested in their measurement protocol's parameter reference? I have seen plenty of forum threads that suggest google's own client id is acceptable.
I checked your API call and you are missing a measurement protocol parameter in the URL "t" (https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#t)
which defines what type of hit you are trying to send i.e. event or pageView
Google has created a debug tool to check whether the url generated is valid or not. You can also send hits to your GA using the tool.
https://ga-dev-tools.appspot.com/hit-builder/
turns out there is an unpublished parameter in the newer UA interface that allows for strict or loose userid. If strictly enforced, the userid MUST be a UUID. If strict is false it will accept google's own user id. Once that parameter is passed everything worked

Combining Google Analytics client- and server side tracking

I track my users behavior using Google Analytics client side. At some point the user is redirected to one of my partners and I receive a callback from the partner about the value the user has generated.
The question is: How do I append that value from the callback as a goal with a value to the users session?
The objective is to be able to get insights about which of my traffic sources generate the most value (and not just most conversions - as that could be tracked with event tracking).
The solution might be similar to this one, but I'm not sure it's still the best solution - and there could be others as well.
Using Google Analytics to track the same session in client javascript and server side tracking calls?
Thanks in advance.
So it seems that this is now possible with the new Universal Analytics from Google by saving/syncing the users UUID to the server and then tracking any relevant events.
https://developers.google.com/analytics/devguides/collection/analyticsjs/user-id
This package seems like a nice wrapper: https://www.npmjs.org/package/universal-analytics
Another option is to use same userId (not clientId). That works for multi-device tracking https://support.google.com/analytics/answer/3123662
Universal-analytics is better in that you can use it for anonymous users as well as signed-in users
But tracking by userId is better in that you can send events even if user is not currently on your website doing http or websocket requests.

Resources