Skip to main content
Support home / Integrations

Angular

Fathom Analytics works great with Angular applications. Since Angular is a single-page application framework, you'll want to properly track page views as users navigate between routes.

Simple setup with data-spa

The quickest way to add Fathom to your Angular app is by adding the script to your index.html with the data-spa attribute:

<script src="https://cdn.usefathom.com/script.js" data-site="YOUR-SITE-ID" data-spa="auto" defer></script>

Note: Replace `YOUR-SITE-ID` with your actual Fathom site ID. You can find this in your Fathom site settings.

Add this just before the closing </head> tag in src/index.html.

Using a service for more control

For more control over tracking, create a dedicated Fathom service:

  1. Install fathom-client:
npm install fathom-client
  1. Create a Fathom service at src/app/services/fathom.service.ts:
import { Injectable } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
import { filter } from 'rxjs/operators';
import * as Fathom from 'fathom-client';
 
@Injectable({
providedIn: 'root'
})
export class FathomService {
constructor(private router: Router) {}
 
initialize(siteId: string) {
Fathom.load(siteId, {
auto: false
});
 
// Track page views on route changes
this.router.events
.pipe(filter(event => event instanceof NavigationEnd))
.subscribe((event: NavigationEnd) => {
Fathom.trackPageview({
url: event.urlAfterRedirects
});
});
}
 
trackEvent(name: string, value?: number) {
if (value !== undefined) {
Fathom.trackEvent(name, { _value: value });
} else {
Fathom.trackEvent(name);
}
}
}
  1. Initialize the service in your app.component.ts:
import { Component, OnInit } from '@angular/core';
import { FathomService } from './services/fathom.service';
 
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent implements OnInit {
constructor(private fathom: FathomService) {}
 
ngOnInit() {
this.fathom.initialize('YOUR-SITE-ID');
}
}

For standalone components (Angular 17+)

If you're using standalone components, you can initialize Fathom in your app config:

// app.config.ts
import { ApplicationConfig, APP_INITIALIZER, inject } from '@angular/core';
import { FathomService } from './services/fathom.service';
 
export const appConfig: ApplicationConfig = {
providers: [
{
provide: APP_INITIALIZER,
useFactory: () => {
const fathom = inject(FathomService);
return () => fathom.initialize('YOUR-SITE-ID');
},
multi: true
}
]
};

Tracking events

Use the Fathom service to track custom events:

import { Component } from '@angular/core';
import { FathomService } from './services/fathom.service';
 
@Component({
selector: 'app-signup',
template: `<button (click)="onSignup()">Sign Up</button>`
})
export class SignupComponent {
constructor(private fathom: FathomService) {}
 
onSignup() {
this.fathom.trackEvent('Signup Button Clicked');
// ... rest of your signup logic
}
}

For events with monetary values (in cents):

this.fathom.trackEvent('Purchase Completed', 9900); // $99.00

Environment configuration

Store your site ID in Angular's environment files:

// src/environments/environment.ts
export const environment = {
production: false,
fathomSiteId: '' // Empty for development
};
 
// src/environments/environment.prod.ts
export const environment = {
production: true,
fathomSiteId: 'YOUR-SITE-ID'
};

Then use it when initializing:

import { environment } from '../environments/environment';
 
if (environment.fathomSiteId) {
this.fathom.initialize(environment.fathomSiteId);
}

Further customization

To learn about all the options we offer, read our advanced documentation here.


If you still have questions or require help with anything, please reach out to us and we'll happily get things sorted out for you.


Can't find what you're looking for?