Error Tracking Angular
PostHogOfficialCreated by PostHog
- Skill
- Tool integration
- Data and AI
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach to implementing PostHog error tracking within Angular applications. It covers the installation of the necessary SDK, initialization patterns for different Angular versions, and best practices for capturing exceptions. The guide emphasizes maintaining performance by running tracking outside the Angular zone, using singleton services for initialization, and ensuring proper source map uploads for readable stack traces.
What it does
- Guides the installation of the PostHog JavaScript library in Angular projects.
- Provides patterns for initializing PostHog as a singleton service to ensure consistent tracking.
- Outlines methods for enabling exception autocapture by overriding the default Angular ErrorHandler.
- Explains how to manually capture errors at specific boundaries using captureException.
- Details the importance of uploading source maps for effective debugging.
- Offers instructions for configuring alerts to notify teams of new or spiking issues.
When to use it
- When you need to monitor runtime errors in an Angular application.
- When you want to centralize error reporting and issue management in PostHog.
- When you need to set up automated alerts for application crashes or performance spikes.
- When you are migrating or setting up a new Angular project and require robust error observability.
Advantages
- Reduces performance overhead by initializing tracking outside the Angular zone.
- Promotes clean architecture by using singleton services and environment-based configuration.
- Improves debugging efficiency by linking minified errors to original source code via source maps.
- Enables proactive issue resolution through customizable alerting channels like Slack or webhooks.
Usage examples
- “How do I initialize PostHog in an Angular 17+ application?”
- The agent provides a code example for creating a PosthogService as a singleton root service and injecting it into the app.component.ts.
- “How can I get notified when a new error occurs in my app?”
- The agent explains how to configure alerts in the PostHog error tracking dashboard to send notifications to Slack, Discord, or via webhooks.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/posthog/error-tracking-angular/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip error-tracking-angular.zip -d .agents/skills
Documentation by PostHog
PostHog error tracking for Angular
This skill helps you add PostHog error tracking to Angular applications.
Reference files
references/angular.md- Angular error tracking installation - docsreferences/fingerprints.md- Fingerprints - docsreferences/alerts.md- Send error tracking alerts - docsreferences/monitoring.md- Monitor and search issues - docsreferences/assigning-issues.md- Assign issues to teammates - docsreferences/upload-source-maps.md- Upload source maps - docs
Consult the documentation for API details and framework-specific patterns.
Key principles
Environment variables: Always use environment variables for PostHog keys and host URLs. Never hardcode them.
Minimal changes: Add error tracking alongside existing error handling. Don't replace or restructure existing error handling code.
Autocapture first: Enable exception autocapture in the SDK initialization before adding manual captures.
Source maps: Upload source maps so stack traces resolve to original source code, not minified bundles.
Manual capture for boundaries: Use
captureException()at error boundaries and catch blocks for errors that don't propagate to the global handler.
Framework guidelines
Use inject() instead of constructor injection. PostHog service should be injected via inject() in components/services that need it.
Create a dedicated PosthogService as a singleton root service that wraps the PostHog SDK.
Always use standalone components over NgModules.
Configure PostHog credentials in src/environments/environment.ts files, as Angular reads environment variables from these configuration files
Files
- ATTRIBUTION.mdAdded by AutoGineer966 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md1.8 KiB
- references/alerts.md4.1 KiB
- references/angular.md8.2 KiB
- references/assigning-issues.md5.5 KiB
- references/fingerprints.md3.4 KiB
- references/monitoring.md8.6 KiB
- references/upload-source-maps.md2.7 KiB
references/angular.md
Angular error tracking installation - Docs
1
Install the package
Required
Install the PostHog JavaScript library using your package manager:
PostHog AI
npm
npm install posthog-jsyarn
yarn add posthog-jspnpm
pnpm add posthog-js2
Initialize PostHog
Required
In your
src/main.ts, initialize PostHog using your project token and instance address:Angular 17+
For Angular v17 and above, you can set up PostHog as a singleton service. To do this, start by creating and injecting a
PosthogServiceinstance.Create a service by running
ng g service services/posthog. The service should look like this:src/main.ts
PostHog AI
// src/app/services/posthog.service.ts import { DestroyRef, Injectable, NgZone } from "@angular/core"; import posthog from "posthog-js"; import { environment } from "../../environments/environment"; import { Router } from "@angular/router"; @Injectable({ providedIn: "root" }) export class PosthogService { constructor( private ngZone: NgZone, private router: Router, private destroyRef: DestroyRef, ) { this.initPostHog(); } private initPostHog() { this.ngZone.runOutsideAngular(() => { posthog.init(environment.posthogKey, { api_host: environment.posthogHost, defaults: '2026-01-30', }); }); } }The service is initialized outside of the Angular zone to reduce change detection cycles. This is important to avoid performance issues with session recording. Then, inject the service in your app's root component
app.component.ts. This will make sure PostHog is initialized before any other component is rendered.src/app/app.component.ts
PostHog AI
// src/app/app.component.ts import { Component } from "@angular/core"; import { RouterOutlet } from "@angular/router"; import { PosthogService } from "./services/posthog.service"; @Component({ selector: "app-root", styleUrls: ["./app.component.scss"], template: ` <router-outlet />`, imports: [RouterOutlet], }) export class AppComponent { title = "angular-app"; constructor(posthogService: PosthogService) {} }Angular 16 and below
In your
src/main.ts, initialize PostHog using your project API key and instance address. You can find both in your project settings.src/main.ts
PostHog AI
// src/main.ts import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; import { environment } from "./environments/environment"; import posthog from 'posthog-js' posthog.init(environment.posthogKey, { api_host: environment.posthogHost, defaults: '2025-11-30' }) bootstrapApplication(AppComponent, appConfig) .catch((err) => console.error(err));3
Send events
Click around and view a couple pages to generate some events. PostHog automatically captures pageviews, clicks, and other interactions for you.
If you'd like, you can also manually capture custom events:
JavaScript
PostHog AI
posthog.capture('my_custom_event', { property: 'value' })4
Setting up exception autocapture
Recommended
Exception autocapture can be enabled during initialization of the PostHog client to automatically capture any exception thrown by your Angular application.
This requires overriding Angular's default
ErrorHandlerprovider:src/app/posthog-error-handler.ts
PostHog AI
import { ErrorHandler, Injectable, Provider } from '@angular/core'; import { HttpErrorResponse } from '@angular/common/http'; import posthog from 'posthog-js'; @Injectable({ providedIn: 'root' }) class PostHogErrorHandler implements ErrorHandler { public constructor() {} public handleError(error: unknown): void { const extractedError = this._extractError(error) || 'Unknown error'; runOutsideAngular(() => posthog.captureException(extractedError)); } protected _extractError(errorCandidate: unknown): unknown { const error = tryToUnwrapZonejsError(errorCandidate); if (error instanceof HttpErrorResponse) { return extractHttpModuleError(error); } if (typeof error === 'string' || isErrorOrErrorLikeObject(error)) { return error; } return null; } } function tryToUnwrapZonejsError(error: unknown): unknown | Error { return error && (error as { ngOriginalError: Error }).ngOriginalError ? (error as { ngOriginalError: Error }).ngOriginalError : error; } function extractHttpModuleError(error: HttpErrorResponse): string | Error { if (isErrorOrErrorLikeObject(error.error)) { return error.error; } if ( typeof ErrorEvent !== 'undefined' && error.error instanceof ErrorEvent && error.error.message ) { return error.error.message; } if (typeof error.error === 'string') { return `Server returned code ${error.status} with body "${error.error}"`; } return error.message; } function isErrorOrErrorLikeObject(value: unknown): value is Error { if (value instanceof Error) { return true; } if (value === null || typeof value !== 'object' || Array.isArray(value)) { return false; } return 'name' in value && 'message' in value && 'stack' in value; } declare const Zone: any; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access const isNgZoneEnabled = typeof Zone !== 'undefined' && Zone.root?.run; export function runOutsideAngular<T>(callback: () => T): T { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access return isNgZoneEnabled ? Zone.root.run(callback) : callback(); } export function providePostHogErrorHandler(): Provider { return { provide: ErrorHandler, useValue: new PostHogErrorHandler(), }; }Then, in your
src/app/app.config.ts, import theprovidePostHogErrorHandlerfunction and add it to the providers array:src/app/app.config.ts
PostHog AI
// src/app/app.config.ts import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; import { providePostHogErrorHandler } from './posthog-error-handler'; export const appConfig: ApplicationConfig = { providers: [ ... providePostHogErrorHandler(), ], };5
Manually capture exceptions
Optional
If there are more errors you'd like to capture, you can manually call the
captureExceptionmethod:TypeScript
PostHog AI
posthog.captureException(e, additionalProperties)Verify error tracking
Recommended
Confirm events are being sent to PostHog
Before proceeding, let's make sure exception events are being captured and sent to PostHog. You should see events appear in the activity feed.
Image: Activity feed with eventsImage: Activity feed with events
6
Upload source maps
Required
Great, you're capturing exceptions! If you serve minified bundles, the next step is to upload source maps to generate accurate stack traces.
Let's continue to the next section.
Community questions
Ask a question
Was this page useful?
HelpfulCould be better
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- PostHog
- Publisher
- PostHog (Official)
- Source
- PostHog/skills · skills/posthog/error-tracking/skills/angular · commit a5d30e7
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Also distributed in
- PostHog/skills
AutoGineer is not affiliated with or endorsed by PostHog or PostHog.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download error-tracking-angular.zip