Skip to main content

Command Palette

Search for a command to run...

PostHog Self Hosted Review: Real-World Notes

Published
4 min read
J
Building autonomous AI systems for digital products

If you’re searching for a posthog self hosted review, you probably want two things at once: product analytics you can trust and control over where your event data lives. I’ve run PostHog self-hosted in production-like setups, and the big takeaway is this: it’s powerful, flexible, and surprisingly “engineer-friendly” — but you’re signing up to operate a real analytics stack, not a magical black box.

What you actually get with PostHog self-hosted

PostHog’s self-hosted offering isn’t just “events and dashboards.” It’s a full analytics toolbox that can cover multiple tools you might otherwise buy separately.

In practice, self-hosting gives you:

  • Product analytics (events, funnels, cohorts)
  • Session replay (depending on your setup and storage choices)
  • Feature flags & experiments (useful if you want to ship safely)
  • Data control (your infra, your retention, your compliance posture)

Compared to typical SaaS analytics tools, PostHog feels closer to an open product data platform than a single-purpose tracker. That’s both its strength and its complexity cost.

Architecture & ops reality: the hidden part of the bill

Self-hosting analytics is mostly boring until it isn’t. PostHog can be deployed via Docker Compose or Kubernetes, and it’s absolutely doable — but you should understand what you’re operating:

  • PostgreSQL: metadata and some core state
  • ClickHouse: the workhorse for event ingestion + query performance
  • Redis: queues/caching
  • Object storage (often) for replay assets and longer retention patterns

If you’re evaluating PostHog versus mixpanel or amplitude, the biggest differentiator is operational responsibility. With Mixpanel/Amplitude, you’re buying a hosted system and paying with dollars + vendor lock-in. With PostHog self-hosted, you’re paying with engineer time and on-call risk.

Opinionated take: if you don’t already have a basic observability posture (metrics, logs, alerting) and someone who can reason about ClickHouse performance, self-hosting will feel heavier than you expect.

Data governance, privacy, and why self-hosting can matter

A lot of teams get pushed into self-hosted analytics because of data residency rules or internal security reviews. That’s legit — but self-hosting doesn’t automatically make you “compliant.” It just gives you control.

Where PostHog shines:

  • You can enforce data minimization (capture only what you need)
  • You can tune retention and storage location
  • You can keep sensitive events out of third-party SaaS pipelines

Where you still need discipline:

  • PII handling: Decide what’s allowed in event properties and enforce it
  • Access control: analytics often becomes a shadow data warehouse if you’re not careful
  • Replay policies: session replay can create new privacy risks if not redacted

This is also where PostHog competes conceptually with tools like hotjar or fullstory (experience analytics / replay). If you’re replacing Hotjar/FullStory with PostHog replay, you’ll want to validate redaction, sampling, and storage costs early.

Quick start: capturing events without making a mess

The fastest way to ruin an analytics project is to ship tracking with no naming conventions, no versioning, and no ownership. Here’s a minimal, actionable example using posthog-js that’s strict enough to stay sane.

import posthog from 'posthog-js'

posthog.init(process.env.POSTHOG_KEY, {
  api_host: 'https://posthog.your-domain.com',
  capture_pageview: false, // be explicit
  capture_pageleave: true,
})

// Identify after login
export function identifyUser(user) {
  posthog.identify(user.id, {
    email_domain: user.email.split('@')[1],
    plan: user.plan,
  })
}

// Use a simple event naming convention: noun_verb or object_action
export function trackSignupStarted(method) {
  posthog.capture('signup_started', {
    method, // 'email' | 'google' | 'github'
    ui_version: '2026-04',
  })
}

export function trackCheckoutCompleted(totalCents) {
  posthog.capture('checkout_completed', {
    total_cents: totalCents,
    currency: 'USD',
  })
}

Practical rules that help long-term:

  • Turn off auto-capture until you’ve decided you want it
  • Add a ui_version (or schema_version) property to events that evolve
  • Track fewer events, but make them decision-grade

Who should choose PostHog self-hosted (and who shouldn’t)

Self-hosted PostHog is a good fit when:

  • You have clear data residency/security requirements
  • You want one platform for analytics + flags + experiments
  • You have the engineering maturity to operate ClickHouse-backed workloads

It’s a poor fit when:

  • You need “set it and forget it” analytics next week
  • Your team can’t spare ops time (or doesn’t have it)
  • You primarily want qualitative UX insights and don’t plan to invest in event design (in that case, hotjar-style workflows might be more natural)

If you’re currently happy with amplitude dashboards and just want better governance, self-hosting PostHog might feel like swapping a clean apartment for a fixer-upper house: more freedom, more maintenance.

In the end, I like PostHog self-hosted for teams that take product data seriously and are willing to own the system. If you’re not ready to run analytics infrastructure, PostHog’s hosted option can be a lower-friction way to get the same product capabilities and only move on-prem/self-hosted once you’ve proven value.

More from this blog

G

GhostBrand

100 posts