I use UTM parameters to track ining links in Google Analytics.
Let's say my URL looks like this
/shop?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale
I want to clean the URL. The desired result is
/shop
On the web I found the following snippet
(function() {
var win = window;
var removeUtms = function(){
var location = win.location;
if (location.search.indexOf('utm_') != -1 && history.replaceState) {
history.replaceState({}, '', window.location.toString().replace(/(\&|\?)utm([_a-z0-9=]+)/g, ""));
}
};
ga('send', 'pageview', { 'hitCallback': removeUtms });
})();
At the moment my Google Analytics Template in my CMS looks like this
<?php
/**
* To use this script, please fill in your Google Analytics ID below
*/
$GoogleAnalyticsId = 'UA-bla-bla';
/**
* DO NOT EDIT ANYTHING BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING!
*/
if ($GoogleAnalyticsId != 'UA-XXXXX-X' && !BE_USER_LOGGED_IN && sha1(session_id() . (!Config::get('disableIpCheck') ? Environment::get('ip') : '') . 'BE_USER_AUTH') != Input::cookie('BE_USER_AUTH')): ?>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','.js','ga');
ga('create', '<?php echo $GoogleAnalyticsId; ?>', 'auto');
<?php if ($GLOBALS['TL_CONFIG']['privacyAnonymizeGA']): ?>
ga('set', 'anonymizeIp', true);
<?php endif; ?>
ga('send', 'pageview');
</script>
<?php endif; ?>
...and I have no idea how to bring those codes together.
Maybe there is even a better solution to my problem?
I use UTM parameters to track ining links in Google Analytics.
Let's say my URL looks like this
https://www.domain.tld/shop?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale
I want to clean the URL. The desired result is
https://www.domain.tld/shop
On the web I found the following snippet
(function() {
var win = window;
var removeUtms = function(){
var location = win.location;
if (location.search.indexOf('utm_') != -1 && history.replaceState) {
history.replaceState({}, '', window.location.toString().replace(/(\&|\?)utm([_a-z0-9=]+)/g, ""));
}
};
ga('send', 'pageview', { 'hitCallback': removeUtms });
})();
At the moment my Google Analytics Template in my CMS looks like this
<?php
/**
* To use this script, please fill in your Google Analytics ID below
*/
$GoogleAnalyticsId = 'UA-bla-bla';
/**
* DO NOT EDIT ANYTHING BELOW THIS LINE UNLESS YOU KNOW WHAT YOU ARE DOING!
*/
if ($GoogleAnalyticsId != 'UA-XXXXX-X' && !BE_USER_LOGGED_IN && sha1(session_id() . (!Config::get('disableIpCheck') ? Environment::get('ip') : '') . 'BE_USER_AUTH') != Input::cookie('BE_USER_AUTH')): ?>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','https://www.google-analytics./analytics.js','ga');
ga('create', '<?php echo $GoogleAnalyticsId; ?>', 'auto');
<?php if ($GLOBALS['TL_CONFIG']['privacyAnonymizeGA']): ?>
ga('set', 'anonymizeIp', true);
<?php endif; ?>
ga('send', 'pageview');
</script>
<?php endif; ?>
...and I have no idea how to bring those codes together.
Maybe there is even a better solution to my problem?
Share Improve this question asked Jan 29, 2018 at 17:23 Sr. SchneiderSr. Schneider 7971 gold badge11 silver badges23 bronze badges 6- Do you want to handle it in javascript only, or within php itself? – IncredibleHat Commented Jan 29, 2018 at 17:26
- What's the difference? For users it's the same, isn't it? – Sr. Schneider Commented Jan 29, 2018 at 17:29
- We handled it in PHP, because it also allows us to catch the utm data and store it in a database for further metric processing on our end. Then we do a header location redirect to the clean url. Its a real pain to do all the ajax calls in javascript only (and some users stupidly turn off js). So there is a difference. But it sounds like you just want GA to handle it all, so yeah, go with a javascript method. – IncredibleHat Commented Jan 29, 2018 at 17:31
- 1 Well, I got the idea, but in my case it's very simple: I want to send the information stored in the UTMs over to Google Analytics and after that I want a clean url. – Sr. Schneider Commented Jan 29, 2018 at 17:34
-
2
I never heard about this before. So if I add
?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale
to ANY url of ANY website using GA it automatically removes the query string? Are you sure? Source? – Sr. Schneider Commented Jan 30, 2018 at 8:32
3 Answers
Reset to default 6Here is a solution I came up with that uses the History API to remove any query parameters from the URL starting with utm_
. The important thing is to change the URL after the page view data is sent to Google Analytics with the utm parameters. To do that, we use the ga
function with a callback and put it after the call to ga('send', 'pageview')
, which is normally the last line of the Google Analytics tracking snippet. I used history.replaceState
instead of history.pushState
so that if the user navigates back to this page, the utm parameters will not be there again. This basically assumes that you want to report the request with utm parameters only once. I believe this fits most cases. I put in a feature check so it will do nothing if history.replaceState
is not supported by the browser.
// -- Google Analytics tracking snippet here --
// ...
// ga('send', 'pageview');
/**********************************************************************
* add the following code after the Google Analytics tracking snippet *
**********************************************************************/
// remove utm_* query parameters
ga(function() {
function paramIsNotUtm(param) { return param.slice(0, 4) !== 'utm_'; }
if (history && history.replaceState && location.search) {
var params = location.search.slice(1).split('&');
var newParams = params.filter(paramIsNotUtm);
if (newParams.length < params.length) {
var search = newParams.length ? '?' + newParams.join('&') : '';
var url = location.pathname + search + location.hash;
history.replaceState(null, null, url);
}
}
});
If you want to remove all query data from the url you could split the url string on the ?
sign as suggested here: Remove querystring from URL
Copy urls into url.txt
sed 's/?utm[^ ]*//g' url.txt