Track Google Analytics events on outbound links

For a project we required tracking of events for various user interactions. The goal was to provide insights in user behaviour for certain sections of the site, but most of these interactions included "outbound links": hyperlinks pointing to a URL. Simply tracking the events with an onClick handler will not work in this case, so I wrote a simple wrapper to solve this problem.

The problem

When a user clicks a link pointing to a new URL, a browser will perform a request to that resource. If you perform any asynchronous requests, all of these will be aborted (at least on most of the modern browsers, as far as I know).

If you want to track a click on a link and you place an onClick handler on this <a> element, the request to Google Analytics will therefore be aborted before the request is completed. This results in incomplete statistics in your tracker.

The solution

Since the release of the universal tracking code (also "analytics.js" in contradiction to the old "ga.js") Google provides a callback for all requests send to Google Analytics. The so-called hitCallback is fired directly after the tracker request has been completed.

When you want to track clicks on outbound links (and also, form submits for instance) you need to use this callback. You cancel the default behaviour of the click, so the browser will not request the new page. Then you quickly send the event tracking request and when this is completed (using the callback), redirect the user to the new resource.

The script

Obviously you will not repeat this over and over again for every link you need to track. Some of the blog post point out this feature do this [1, 2] while others keep a fixed category, action and label of all clicks [3, 4, 5]. Therefore I created something myself, following the latest javascript module design pattern so hopefully it is reusable for others.

You have to load the script and instantiate a new Tracker object. You provide the tracker with a selector to find all <a> of <form> tags which need to be tracked. With data attributes you can supply the tag from specific event tracking data, so you can track different categories, actions, labels or values on one page.

You can find a .dist version here. I specifically appended the .dist extension, to prevent myself from becoming a CDN for all who want to load this. Please download it to your own server, minify it, merge it with other scripts you need and then serve it to your users. If you want to take a look at the code, a gist is provided on Github.

The example

If should be fairly trivial to follow the example and adjust it to your needs. A link as well as a form are provided. They both have different classes, but this doesn't matter for the Tracker itself.

<a href="http://bob.com" class="track-click"
    data-track-category="Friends"
    data-track-action="Follow reference"
    data-track-value="Bob">
Follow my friend Bob!
</a>

<form action="/subscribe" class="track-submit" method="post"
    data-track-category="Newsletter"
    data-track-action="Subscribe">
  <input name="email" placeholder="email@example.com"
  <input type="submit" value="Subscribe">
</form>

<script src="tracker.min.js"></script>
<script>
var tracker = new Tracker('.track-click, .track-submit');
</script>

The Tracker uses both selectors, but internally it looks at the tag name of the matching elements. All links are redirected after the event tracking, all forms are submitted. For the event data, the data-track-* properties are used.

Improvements

I am by far not a javascript expert. If you have any improvements how this can help you in your project, just let me know! The gist on Github is forkable, so just provide your modifications and let me know.