Search code examples
javascriptjquerygoogle-analyticsoutbound

Track all outbound links in Google Analytics


I've been using a script to track outbound links for a couple of months now. The script WORKS, but in the report generated by Google Analytics many URLs are having a trailing ":80" (default port number) at their end. Read on for more details.

It's maybe important to mention that the website tracking these outbound links has a tremendous amount of outbound traffic (multiply your fantasy by ∞).

The script's purpose

It tracks ALL outbound links and tag them as "Outbound Links" in Google Analytics.

The script is heavily commented and has a few instances of console.log() to help debugging (these are kept commented out).

"Outbound Links" show on GA alright, under:

Content > Events > Top Events > "Outbound Links" [click on it] > [report showing all urls clicked]

The problem

Under the "Outbound Links" report, where I get all the links that were clicked, I get ":80" at the end of at least 2/3 of all links reported (probably more). GA treats http://example.com and http://example.com:80 as different links, separating them in the report. That's of course not desired.

Worth mentioning:

Links that end with ":80" always have more hits than their equivalent without ":80", anything from 40% to 60% more hits.

The wanted solution

  • Merge the links that end with ":80" with those without it, OR
  • Avoid appending ":80" to links, if possible.
  • Bonus: Understand why we get links ending with ":80" at all.

The script

// Outbound Link Tracking with Google Analytics
// Requires jQuery 1.7 or higher (use .live if using a lower version)
$(function() {
    $("a").on('click',function(e){
        var url = $(this).attr("href");
        // Console logs shows the domain name of the link being clicked and the current window
        // console.log('e.currentTarget.host: ' + e.currentTarget.host);
        // console.log('window.location.host: ' + window.location.host);
        // If the domains names are different, it assumes it is an external link
        // Be careful with this if you use subdomains
        if (e.currentTarget.host != window.location.host) {
            // console.log('external link click');
            // Outbound link! Fires the Google tracker code.
            _gat._getTrackerByName()._trackEvent("Outbound Links", e.currentTarget.host, url, 0);
            // Checks to see if the ctrl or command key is held down
            // which could indicate the link is being opened in a new tab
            if (e.metaKey || e.ctrlKey) {
                // console.log('ctrl or meta key pressed');
                var newtab = true;
            }
            // If it is not a new tab, we need to delay the loading
            // of the new link for a just a second in order to give the
            // Google track event time to fully fire
            if (!newtab) {
                // console.log('default prevented');
                e.preventDefault();
                // console.log('loading link after brief timeout');
                setTimeout('document.location = "' + url + '"', 100);
            }
        }
        /*
        else {
            console.log('internal link click');
        }
        */
    });
});

Solution

  • The reason for the :80 in your output is because of e.currentTarget.host

    http://www.w3schools.com/jsref/prop_area_host.asp

    I'm not sure why you are tracking that in addition to your already functional url variable, but you can always insure that :80 is not there with a simple string replace

    _gat._getTrackerByName()._trackEvent("Outbound Links", e.currentTarget.host.replace(':80',''), url, 0);