Event Schemas: Naming, Versioning, and Governing Product

An event schema defines the name, properties, and expected values of every product analytics event you emit.

Event Schemas: The Contract Between Your Product and Every Downstream System

An event schema is the explicit definition of what a product analytics event contains — its name, its properties, the type and expected values of each property, and when it should fire. Events like button_clicked, checkout_started, subscription_upgraded flow from your product into Amplitude, Mixpanel, PostHog, Segment, and your data warehouse. Without schema discipline, the event stream becomes a graveyard of near-duplicates (checkout_started, checkoutStarted, Checkout_Start) that nobody can trust and every analysis has to reconcile.

Naming conventions

Pick one convention and enforce it. The Segment recommendation — object_action in snake_case, past tense (user_signed_up, order_completed) — is the de facto standard and worth adopting even if you'd have chosen differently starting from scratch. Object first, action second so events group naturally when listed alphabetically. Past tense because events describe things that happened. Snake_case avoids the JavaScript vs. Ruby vs. Python casing debates. Whatever you pick, document it in a one-page tracking plan and reject PRs that violate it — inconsistency compounds fast.

The tracking plan

A tracking plan is a living document (spreadsheet, Notion page, or dedicated tool like Avo or Iteratively) listing every event, its properties, types, examples, and the trigger condition. Every new event proposal starts as a row in the plan reviewed by product and data; only approved events ship. This sounds bureaucratic and is worth it — the cost of correcting a bad event name after 6 months of data has accumulated (rename in code, backfill history, update every dashboard) is 10-100x the cost of getting the review right up front.

Property design

Two categories of properties: (a) event properties — specific to this event (plan_tier on subscription_upgraded). (b) user properties — attributes of the user that update over time and are attached to every event (plan_tier as a user property, email, signup_date). Send both. Common mistake: encoding state in event names ('upgraded_to_pro' as separate event from 'upgraded_to_enterprise') instead of one 'plan_upgraded' event with a new_plan property. The property-based version enables slicing without exploding your event count.

Versioning schema changes

Events evolve — properties get added, semantics shift. Handle changes explicitly: for additive changes (new optional property), just add it. For semantic changes (property meaning changes), version the event (checkout_started_v2) or add a schema_version property, and update dashboards to filter appropriately. Never silently redefine an existing event or property — every downstream analysis that assumed the old meaning will produce quietly wrong numbers, and nobody will know for months.

Validation and rejection

Validate events at the collection layer against the tracking plan schema. Options: Segment Protocols, PostHog's schema enforcement, or a custom middleware. Invalid events (unknown names, missing required properties, wrong types) get rejected or quarantined, not silently ingested. Without validation, well-intentioned engineers add events that mostly-work-except-one-property-is-a-string-when-it-should-be-a-number, and the analytics team discovers this when a dashboard breaks two weeks later.

Frequently asked questions

Do we need a tracking plan at 10 employees?
Yes, and it's much easier to start one now than to backfill one at 50 employees. A 20-event tracking plan takes an hour to write and prevents years of technical debt in your event data.
Who owns event names — product or data?
Product proposes, data reviews. Product owns the intent (what should we measure); data owns the shape (naming, structure, consistency with existing events). Neither should own alone — data-only naming produces events product doesn't understand, product-only naming produces the inconsistency mess.
Should we use auto-capture tools?
Auto-capture (PostHog, Heap) is useful for retroactive exploration but no substitute for a tracking plan for core business events. Best practice: auto-capture for the long tail of UI interactions, deliberate events for the metrics you actually plan to make decisions on.

Related fundraising guides (40)

Investor directory · Fundraising library · Articles A–Z · Company funding database