I use UTM parameters to track incoming 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.com/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?
Here 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