Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google Tag Manager with AngularJS?

How do I use GTM with Angular?

I'm trying to fire a (virtual) pageview event when I load a new partial using this code:

dataLayer.push({
    'event' : 'pageview',
    'pageview' : $location.path(),
    'virtualUrl' : $location.path()
 });

But I don't see the event firing (I'm using the Google Analytics Chrome debug extension to view fired events).

like image 339
Christian THC Avatar asked Jan 28 '14 05:01

Christian THC


3 Answers

I find the Chrome extension unreliable. Simply run the global variable dataLayer in the console to print the array of events. One of the objects should be your pageview event.

Here is an example of how we are using it:

Note: we're not simply using $location.path(), instead everything in the url after the domain. Which includes the .search() & .hash().

$location in the Angular docs

modules/analytic.js

(function(window, angular) {
    'use strict';
    angular.module('Analytic.module', ['Analytic.services']).
        run(function($rootScope, $window, $location, GoogleTagManager) {
            $rootScope.$on('$viewContentLoaded', function() {
                var path= $location.path(),
                    absUrl = $location.absUrl(),
                    virtualUrl = absUrl.substring(absUrl.indexOf(path));
                GoogleTagManager.push({ event: 'virtualPageView', virtualUrl: virtualUrl });
            });
        });
})(window, window.angular);

services/analytic.js

(function() {
    angular.module('Analytic.services', []).
        service('GoogleTagManager', function($window) {
            this.push = function(data) {
                try {
                    $window.dataLayer.push(data);
                } catch (e) {}
            };
        });
})();

In GTM

You'll need {{virtualUrl}} and {{event}} Macros which listen for the dataLayer variables of the same name.

You'll need a Google Analytics Event Tracking Tag with a Firing Rule which triggers when {{event}} equals 'virtualPageView'. Make sure you remove the default 'All Pages' Rule which makes it run on every page load. Instead, you want it to run when you dataLayer.push() the event, which may happen multiple times per page refresh.

The Tag should be configured with:

  1. Track Type == 'Page View'
  2. More Settings > Basic Configuration > Virtual Page Path == '{{virtualUrl}}'
like image 194
Mike Causer Avatar answered Oct 16 '22 22:10

Mike Causer


Similar to the accepted answer, we created a simpler, more explicit solution using a pagename variable in a Javascript in our controller for our single-page app,

// Note, this may not be how your app works, YMMV
var pagename = $location.path().substr(1,$location.path().length);

and push them to the dataLayer like this:

window.dataLayer.push({'event':pagename+'-page'})

Then in GTM we added triggers in GTM like so:

Trigger: Custom Event
Event Name: home-page

... about-page, faq-page, etc.

For more complex angular apps, there are some available extensions for using Google Analytics and Google Tag Manager with Angular.

See Angulartics (which also supports web analytics solutions other than Google Analytics via its plugin architecture) and the related NPM package for GTM.

like image 2
phpguru Avatar answered Oct 16 '22 21:10

phpguru


I would highly recommend you to use the angulartics library. I have used it on multiple sites. It gets you running pretty quickly.

It includes support for Virtual Page Views and events out of the box. It does not support GA eCommerce but has support for extensibility.

Also - I have used with both GTM and Piwik.

like image 1
Kunal Avatar answered Oct 16 '22 22:10

Kunal