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 Insights → Events 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.
// 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
});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.
// 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
});$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 Management → Event 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.
// 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 volumeFilter 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.
// 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.
// 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.
// 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();
}Common Pitfalls
- Autocapture enabled globally on a high-interaction page sends hundreds of
$clickevents 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 oncapture()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.