6 min read

What Is Event Volume in PostHog

Event volume is the total number of events you're sending to PostHog. It directly impacts your billing and the noise-to-signal ratio in your analytics. Too much volume and you're paying for low-value clicks; too little and you're missing critical behavior.

Understanding Event Volume

In PostHog, every call to posthog.capture() counts as one event.

See Your Current Event Volume

Go to InsightsEvents to see a breakdown of events by name and date. You'll also see your total volume in the Billing page under Plan Usage. This is your baseline for understanding how much data you're actually tracking.

javascript
// Each capture() call increments your event volume by 1
posthog.capture('user_signup', {
  email: user.email,
  signup_method: 'google'
});

// This is also 1 event, regardless of property count
posthog.capture('page_view', {
  url: window.location.href,
  referrer: document.referrer,
  user_agent: navigator.userAgent
});
Every capture() sends one event, regardless of properties

Know What Counts and What Doesn't

Only capture() calls count toward your event quota. Calls to identify(), reset(), and feature flag evaluations don't add to your volume. This distinction matters when you're trying to reduce costs—sometimes a tracking refactor doesn't help because those calls weren't billable anyway.

javascript
// These do NOT count as billable events
posthog.identify('user_12345', {
  name: 'Alice',
  plan: 'pro'
});

// This does NOT count
const isNewCheckout = posthog.getFeatureFlag('new_checkout');

// Only this counts
posthog.capture('feature_flag_evaluated', {
  flag: 'new_checkout',
  value: isNewCheckout
});
Watch out: If you have autocapture enabled, PostHog automatically sends $click, $pageview, and $autocapture events. On high-interaction pages (dashboards, search results, real-time feeds), this alone can consume hundreds of events per user session.

Monitoring and Filtering Volume

Use Event Definitions to Track What Matters

Go to Data ManagementEvent Definitions to tag and organize your events. Group related captures by business metric—signups, payments, feature uses. This lets you filter noise and focus on volume that actually informs decisions.

javascript
// Define business-critical events explicitly
posthog.capture('subscription_plan_selected', {
  plan: 'professional',
  source: 'pricing_page',
  ab_test: 'copy_variant_b'
});

posthog.capture('payment_processed', {
  plan: 'professional',
  amount: 99.00,
  currency: 'USD',
  payment_method: 'card'
});

// Tag these in the Event Definitions UI to track funnel volume

Filter High-Volume Events in Insights

When viewing Insights, use the event filter dropdown to exclude low-signal events like $pageview or $autocapture. This clarifies whether your volume spike is from meaningful user actions or just autocapture noise.

javascript
// In Insights, filter to exclude autocapture
// UI: Select event → choose only custom events like:
// ✓ subscription_plan_selected
// ✓ payment_processed
// ✗ $click (uncheck autocapture)

// Or programmatically, only send intentional captures
function trackUserAction(action, context) {
  if (shouldTrack(action)) {
    posthog.capture(action, context);
  }
}

Reducing Unnecessary Volume

Capture Intentionally, Not Reactively

Instead of tracking every keystroke or scroll, wait for meaningful user intent—form submission, button click, navigation. Batch related events into a single capture when possible. This keeps your volume lean and your data clean.

javascript
// BAD: Fires on every keystroke, balloons volume
document.getElementById('search').addEventListener('input', (e) => {
  posthog.capture('search_query_changed', { query: e.target.value });
});

// GOOD: Fires once when user submits
document.getElementById('searchForm').addEventListener('submit', (e) => {
  e.preventDefault();
  const query = document.getElementById('search').value;
  posthog.capture('search_submitted', {
    query: query,
    results_count: getResultCount(query)
  });
});

Disable Autocapture Selectively

On pages with high interaction volume (live dashboards, chat interfaces, real-time feeds), disable autocapture and manually capture only the actions you care about. PostHog's opt_out_capturing() and opt_in_capturing() methods let you do this per route.

javascript
// Disable autocapture on high-volume pages
if (currentPage === '/live-dashboard') {
  posthog.opt_out_capturing();
  
  // Manually capture only intentional actions
  document.getElementById('exportBtn').addEventListener('click', () => {
    posthog.capture('dashboard_exported', {
      dashboard_id: dashId,
      format: 'csv'
    });
  });
} else {
  // Autocapture enabled for other pages
  posthog.opt_in_capturing();
}
Tip: Check your Billing page weekly to spot volume spikes early. If you're trending toward your plan limit, reduce autocapture or high-frequency events before you hit the cap and lose data.

Common Pitfalls

  • Autocapture enabled globally on a high-interaction page sends hundreds of $click events per session, consuming quota without actionable insights.
  • Duplicating events across multiple tracking libraries—if you have both PostHog and Google Analytics, each sends a page view, doubling unnecessary volume.
  • Tracking rapidly-changing state (dashboard filters, slider drags, autocomplete input) as separate events instead of final user intent.
  • Forgetting that identify() and feature flag calls are free—optimizing those won't reduce your event quota, so focus on capture() calls instead.

Wrapping Up

Event volume is the foundation of your PostHog analytics costs and data quality. Monitor it regularly in Insights and Billing, define meaningful events upfront, and capture only intentional user actions. If you want to track this automatically across tools, Product Analyst can help.

Track these metrics automatically

Product Analyst connects to your stack and surfaces the insights that matter.

Try Product Analyst — Free