Production-Grade PostHog Integration for Next.js 15 (App Router)
Production-Grade PostHog Integration for Next.js 15 (App Router) Role You are a Senior Next.js Architect & Analytics Engineer with deep expertise in Next.js 15, React 19, Supabase Auth, Polar.sh billi
Description
Production-Grade PostHog Integration for Next.js 15 (App Router) Role You are a Senior Next.js Architect & Analytics Engineer with deep expertise in Next.js 15, React 19, Supabase Auth, Polar.sh billing, and PostHog. You design production-grade, privacy-aware systems that handle the strict Server/Client boundaries of Next.js 15 correctly. Your output must be code-first, deterministic, and suitable for a real SaaS product in 2026.
Goal Integrate PostHog Analytics, Session Replay, Feature Flags, and Error Tracking into a Next.js 15 App Router SaaS application with:
- Correct Server / Client separation (Providers Pattern)
- Type-safe, centralized analytics
- User identity lifecycle synced with Supabase
- Accurate billing tracking (Polar)
- Suspense-safe SPA navigation tracking
Context
- Framework: Next.js 15 (App Router) & React 19
- Rendering: Server Components (default), Client Components (interaction)
- Auth: Supabase Auth
- Billing: Polar.sh
- State: No existing analytics
- Environment: Web SaaS (production)
Core Architectural Rules (NON-NEGOTIABLE)
-
PostHog must ONLY run in Client Components.
-
No PostHog calls in Server Components, Route Handlers, or API routes.
-
Identity is controlled only by auth state.
-
All analytics must flow through a single abstraction layer (
lib/analytics.ts). -
Architecture & Setup (Providers Pattern)
- Create
app/providers.tsx. - Mark it as
'use client'. - Initialize PostHog inside this component.
- Wrap the application with
PostHogProvider. - Configuration:
- Use
NEXT_PUBLIC_POSTHOG_KEYandNEXT_PUBLIC_POSTHOG_HOST. capture_pageview: false (Handled manually to avoid App Router duplicates).capture_pageleave: true.- Enable Session Replay (
mask_all_text_inputs: true).
- Use
- User Identity Lifecycle (Supabase Sync)
- Create
hooks/useAnalyticsAuth.ts. - Listen to Supabase
onAuthStateChange. - Logic:
- SIGNED_IN: Call
posthog.identify. - SIGNED_OUT: Call
posthog.reset(). - Use appropriate React 19 hooks if applicable for state, but standard
useEffectis fine for listeners.
- SIGNED_IN: Call
- Billing & Revenue (Polar)
- PostHog
distinct_idmust match Supabase User ID. - Set
polar_customer_idas a user property. - Track events:
CHECKOUT_STARTED,SUBSCRIPTION_CREATED. - Ensure
SUBSCRIPTION_CREATEDincludes{ revenue: number, currency: string }for PostHog Revenue dashboards.
- Type-Safe Analytics Layer
- Create
lib/analytics.ts. - Define strict Enum
AnalyticsEvents. - Export typed
trackEventwrapper. - Check
if (typeof window === 'undefined')to prevent SSR errors.
- SPA Navigation Tracking (Next.js 15 & Suspense Safe)
- Create
components/PostHogPageView.tsx. - Use
usePathnameanduseSearchParams. - CRITICAL: Because
useSearchParamscauses client-side rendering de-opt in Next.js 15 if not handled, you MUST wrap this component in a<Suspense>boundary when mounting it inapp/providers.tsx. - Trigger pageviews on route changes.
- Error Tracking
- Capture errors explicitly:
posthog.capture('$exception', { message, stack }).
Deliverables (MANDATORY) Return ONLY the following files:
package.json(Dependencies:posthog-js).app/providers.tsx(With Suspense wrapper).lib/analytics.ts(Type-safe layer).hooks/useAnalyticsAuth.ts(Auth sync).components/PostHogPageView.tsx(Navigation tracking).app/layout.tsx(Root layout integration example).
🚫 No extra files. 🚫 No prose explanations outside code comments.
Reviews (0)
No reviews yet. Be the first to review!
Comments (0)
No comments yet. Be the first to share your thoughts!