4

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?

Sr. Schneider
  • 647
  • 10
  • 20
  • Do you want to handle it in javascript only, or within php itself? – IncredibleHat Jan 29 '18 at 17:26
  • What's the difference? For users it's the same, isn't it? – Sr. Schneider Jan 29 '18 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 Jan 29 '18 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 Jan 29 '18 at 17:34
  • Google Analytics should remove campaign parameters by itself. If it doesn't you have another problem (malformed query string or something) that would warrant its' own question. But GA does not usually display utm parameters in an URL after it extracted the campaign information. – Eike Pierstorff Jan 30 '18 at 08:18
  • 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 Jan 30 '18 at 08:32

3 Answers3

6

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);
    }
  }
});
cambunctious
  • 8,391
  • 5
  • 34
  • 53
0

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

FMK
  • 1,062
  • 1
  • 14
  • 25
0

Copy urls into url.txt

sed 's/?utm[^ ]*//g' url.txt
Syscall
  • 19,327
  • 10
  • 37
  • 52
0x101
  • 1