DEV Community

Alex Spinov
Alex Spinov

Posted on

PostHog Has a Free API — Product Analytics You Can Self-Host

PostHog is an open-source product analytics platform. Event tracking, session replays, feature flags, A/B testing, surveys — all self-hostable, all in one tool.

Why PostHog?

  • All-in-one — analytics, replays, feature flags, experiments, surveys
  • Self-hostable — Docker or Kubernetes, data stays on your servers
  • Free tier — 1M events, 5K sessions, unlimited feature flags
  • Open source — MIT license, no vendor lock-in

Quick Start

npm install posthog-js
Enter fullscreen mode Exit fullscreen mode
import posthog from 'posthog-js';

posthog.init('YOUR_API_KEY', {
  api_host: 'https://app.posthog.com',
  person_profiles: 'identified_only',
});
Enter fullscreen mode Exit fullscreen mode

Event Tracking

// Track custom events
posthog.capture('button_clicked', {
  button_name: 'signup',
  page: '/pricing',
});

// Track page views (auto or manual)
posthog.capture('$pageview');

// Identify users
posthog.identify('user_123', {
  email: 'alice@example.com',
  plan: 'pro',
  company: 'Acme Corp',
});

// Group analytics
posthog.group('company', 'acme-corp', {
  name: 'Acme Corp',
  industry: 'SaaS',
  employees: 50,
});
Enter fullscreen mode Exit fullscreen mode

Feature Flags

// Check feature flag
if (posthog.isFeatureEnabled('new-checkout')) {
  showNewCheckout();
} else {
  showOldCheckout();
}

// Get flag payload
const variant = posthog.getFeatureFlagPayload('pricing-test');
// { price: 29, title: 'Pro Plan' }

// React component
import { useFeatureFlagEnabled } from 'posthog-js/react';

function App() {
  const showNewUI = useFeatureFlagEnabled('new-ui');
  return showNewUI ? <NewUI /> : <OldUI />;
}
Enter fullscreen mode Exit fullscreen mode

Server-Side (Node.js)

import { PostHog } from 'posthog-node';

const posthog = new PostHog('YOUR_API_KEY', {
  host: 'https://app.posthog.com',
});

// Track event
posthog.capture({
  distinctId: 'user_123',
  event: 'order_completed',
  properties: { amount: 99.99, currency: 'USD' },
});

// Feature flag
const enabled = await posthog.isFeatureEnabled('new-api', 'user_123');

// Don't forget!
await posthog.shutdown();
Enter fullscreen mode Exit fullscreen mode

A/B Testing

const variant = posthog.getFeatureFlag('signup-button-test');

if (variant === 'control') {
  showButton('Sign Up', 'blue');
} else if (variant === 'test-green') {
  showButton('Get Started', 'green');
} else if (variant === 'test-orange') {
  showButton('Start Free Trial', 'orange');
}

// PostHog automatically tracks which variant converts better
Enter fullscreen mode Exit fullscreen mode

API

# Query events
curl -X POST 'https://app.posthog.com/api/projects/PROJECT_ID/query' \
  -H 'Authorization: Bearer YOUR_PERSONAL_API_KEY' \
  -d '{
    "query": {
      "kind": "EventsQuery",
      "select": ["event", "timestamp"],
      "where": ["event = '\''button_clicked'\''"]
    }
  }'
Enter fullscreen mode Exit fullscreen mode

Tracking product metrics? Check out my Apify actors for competitive analytics data, or email spinov001@gmail.com for custom analytics solutions.

PostHog, Mixpanel, or Amplitude — which analytics tool do you use? Share below!

Top comments (0)