Alex Turpin
Alex Turpin

Reputation: 47776

Sending Google Analytics event then immediately navigating away

Can I send a Google Analytics event and immediately navigate away, like so?

_gaq.push(['_trackEvent', 'foobar']);
window.location = "/";

If Google Analytics does some kind of AJAX request when this is called then it should work whether we stay on the page or not. My concern is that it seems it may sometimes just be putting stuff in an array for later processing. I'm thinking this only happens initially, when Google Analytics hasn't had time to be initialized yet, but I'd like to be certain of this.

I did a test with GA debug, and it seemed to have worked, but I'm not sure if that means it always will depending on loading speed and what not.

Can I do this and never lose any events?

Upvotes: 10

Views: 3317

Answers (4)

Oleg
Oleg

Reputation: 24988

@mike mentions hitCallback method which is described in analytics.js documentation:

In some cases, like when you track outbound links, you might want to know when the tracker is done sending data. That way you can send a user to their destination only after their click has been reported to Google Analytics. To solve this, the send command allows you to specify a hitCallback function in the field name object that will execute as soon as analytics.js has completed sending data.

Which is fantastic, except the snippet is still in public beta. If for some reason (ahem technophobic policies ahem) you're limited to ga.js functionality, you can use this workaround:

_gaq.push(['_set', 'hitCallback', function(){
  document.location='someOtherPage.html';   
}]);
_gaq.push(['_trackEvent', 'category', 'event', 'value']);

Another sensible suggestion is to have a fallback to have the callback executed immediately if _gaq is not defined.

Upvotes: 1

mike
mike

Reputation: 7177

I add a slight delay (via setTimeout) if the new page isn't being opened in a new window.

I haven't had a chance to try this yet, but Google's new Universal Analytics has a hitCallback function that is executed after the data has been sent.

Upvotes: 6

emma.fn2
emma.fn2

Reputation: 239

The way I've done it is like so:

_gaq.push(['_trackEvent', '...', '...', '...']);
_gaq.push(function(){
    // do stuff here
});

$('#logo').on('click', function(){
    var curPage = window.location.href;
    _gaq.push(['_trackEvent', curPage, '#logo']);
    _gaq.push(function(){
        window.location.href = '/';
    });
});

The second push call will always run after the first one, because Google queues all push calls, so that the first one will run and complete, then the second one will run and complete. Google lets you put functions in the push method so you can queue them.

Source: https://developers.google.com/analytics/devguides/collection/gajs/#PushingFunctions

Upvotes: 8

Dan Wich
Dan Wich

Reputation: 4943

It looks like your concern about losing the event is legitimate, see this question. One answer there seems a little fragile with regards to Google changing their code, but would let you confirm the event tracking before navigating to the link. That would probably be "near-immediate".

Upvotes: 0

Related Questions