We need a minimal service for tracking router navigation events with Google Analytics.
Approach
First setup a property in Google Analytics and obtain the tracking code for it.
It will give you something like this when clicking on Tracking Info > Tracking Code in the admin area of Google Analytics. It should look like this:
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-140430388-3"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-140430388-3');
</script>
Add the script to the head
tag in index.html
of your Angular project.
Service
First declare gtag
in app.component.ts
. This lets Typescript know that the gtag function has been defined elsewhere:
declare var gtag
The service looks like this:
/**
* Google Analytics.
*/
import { Injectable } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
import { filter, map } from 'rxjs/operators';
declare var gtag
@Injectable({
providedIn: 'root'
})
export class AnalyticsService {
constructor(private r: Router) {
const navEndEvents =
r.events.pipe(
filter(event => event instanceof NavigationEnd),
map((event: NavigationEnd) => event.url))
navEndEvents.subscribe(url => {
if (gtag) {
gtag('event', url, {
'event_category': 'APP_NAVIGATION'
})
}
})
}
}
Whenever the user navigates the navEndEvents
subscription will fire and track the navigation event for us.