Dokumentation

Analytics (PostHog)

PostHog-Produktanalyse — Client- und Server-Tracking, Events und das Analytics-Dashboard.

Öffnen inChatGPT (öffnet in neuem Tab)Claude (öffnet in neuem Tab)Cursor (öffnet in neuem Tab)PostHog-Produktanalyse — Client- und Server-Tracking, Events und das Analytics-Dashboard.

Motoko Base nutzt PostHog für Produktanalyse. PostHog ist getrennt von Sentry (Fehler) — vermische sie nicht.

Official docs: PostHog documentation

Setup

  1. Erstelle ein PostHog-Projekt
  2. Kopiere den Project API key (Client-Capture)
  3. Für das Analytics-Dashboard (/dashboard/analytics) erstelle zusätzlich einen Personal API key mit Query Read
  4. Setze Env-Vars:
VariableScopePurpose
NEXT_PUBLIC_POSTHOG_PROJECT_TOKENClientEvent capture
NEXT_PUBLIC_POSTHOG_HOSTClientIngest host (US/EU)
POSTHOG_PERSONAL_API_KEYServerHogQL queries
POSTHOG_PROJECT_IDServerProject ID for queries
POSTHOG_HOSTServerAPI host for queries (not ingest)

Ohne Project-Token ist Analytics deaktiviert — die App funktioniert normal.

Client vs server tracking

LayerModuleUse for
Clientsrc/lib/analytics/client.tsBrowser events (sign-in, sign-up)
Serversrc/lib/analytics/server.tsServer actions, webhooks (links, files, billing)

Client-Init: src/instrumentation-client.ts. Der Server nutzt ein Modul-Singleton — fail-open, wirft nie.

Events

Event-Namen liegen in src/lib/analytics/events.ts:

export const ANALYTICS_EVENTS = {
  userSignedUp: "user_signed_up",
  linkCreated: "link_created",
  fileUploaded: "file_uploaded",
  checkoutStarted: "checkout_started",
  // ...
} as const;

Konvention: {object}_{past_tense_verb} (Kleinbuchstaben, Unterstriche).

Add a custom event

  1. Füge den Event-Namen zu ANALYTICS_EVENTS in events.ts hinzu
  2. Füge typisierte Properties zu AnalyticsEventProperties hinzu (optional)
  3. Capture von der richtigen Schicht:
// Client component
import { captureClientEvent } from "@/lib/analytics/client";
captureClientEvent(ANALYTICS_EVENTS.linkCreated, { link_id, slug, destination_host });

// Server action
import { captureServerEvent } from "@/lib/analytics/server";
captureServerEvent({ distinctId: userId, event: ANALYTICS_EVENTS.linkCreated, properties: { ... } });

Properties werden vor dem Senden bereinigt (src/lib/analytics/scrub.ts) — keine Passwörter, Tokens oder Roh-URLs mit Secrets.

Analytics dashboard

/dashboard/analytics führt HogQL-Queries über src/lib/analytics/query.ts aus. Erfordert POSTHOG_PERSONAL_API_KEY + POSTHOG_PROJECT_ID. Ergebnisse werden ~60s pro Benutzer gecacht.

Where to change this

WhatWhere
Event taxonomysrc/lib/analytics/events.ts
Client capturesrc/lib/analytics/client.ts
Server capturesrc/lib/analytics/server.ts
Config & enable checkssrc/lib/analytics/config.ts
Dashboard queriessrc/lib/analytics/query.ts
Analytics UIsrc/features/analytics/

Environment Variables — alle PostHog-Env-Vars.