How to Design an Event Taxonomy That Scales (And Doesn't Become a Mess)
Bad event naming breaks analytics. Here's the naming convention and taxonomy structure that keeps data clean as your tracking grows.Complete setup guide with tracking plans, data models, and report...
Six months into your analytics implementation, someone asks a simple question: "How many users created a report last month?" You search your event data and find three events that might answer this: report_created, create_report, and Report - New. They were created by three different engineers at three different times. They have different property schemas. One tracks the report type, one tracks the user plan, and one tracks both but with different property names. You cannot combine them, and you cannot trust any single one to be comprehensive. Your analytics are broken, and the root cause is not a technical failure. It is a taxonomy failure.
An event taxonomy is the naming convention, structure, and governance system for every event your analytics tracks. It is the layer between raw user actions and usable data. A well-designed taxonomy makes data self-documenting: anyone on the team can find, understand, and query the right event without tribal knowledge. A poorly designed taxonomy, or worse, no taxonomy at all, turns your analytics platform into a junk drawer of inconsistently named, partially implemented, undocumented events that nobody trusts and everybody avoids.
- Inconsistent event naming is the top reason analytics implementations fail to deliver value. Fix the taxonomy before adding more events.
- Use Object-Action naming (Report Created, Button Clicked) with consistent casing and a controlled vocabulary for objects and actions.
- Every event needs a defined set of properties with standardized names, types, and required/optional designations.
- Governance is more important than the initial design. Without enforcement, any taxonomy degrades within months.
Why Taxonomies Break
Event taxonomies do not start broken. They become broken over time through a predictable sequence of decay. Understanding this sequence helps you build a taxonomy that resists it.
Phase 1: The Wild West
In the beginning, there is no taxonomy. A developer needs to track a button click. They name the event btn_click. Another developer tracks a form submission as formSubmit. A product manager asks for signup tracking and it becomes User Signed Up. Three events, three naming conventions, zero consistency. Each event works in isolation, but they cannot be queried together, compared, or managed as a system.
Phase 2: The Duplicate Explosion
As more people implement events, duplicates appear. A new developer does not know that btn_click exists and creates button_clicked. The mobile team tracks the same action as Button Tapped. Now you have three events that represent the same user action. Event volumes become unreliable because the same action is split across multiple event names. Funnel analysis breaks because the events cannot be combined without manual mapping.
Phase 3: The Trust Collapse
When analysts discover inconsistencies and duplicates, they lose trust in the data. They start building their own tracking or relying on database queries instead of the analytics tool. Product managers stop referencing analytics in decisions because the numbers do not add up. The analytics tool becomes an expensive data sink that nobody uses. The company has analytics infrastructure but not analytics capability. This is the most common outcome, and it is almost always preventable with a well-designed and enforced taxonomy.
Source: Analytics implementation audits across 150+ SaaS companies
The Naming Convention: Object-Action Format
The foundation of a scalable taxonomy is a consistent naming convention. The most widely adopted and most effective convention is Object-Action, where the object is the thing being acted upon and the action is what happened to it. Report Created, Button Clicked, Page Viewed, Account Upgraded.
Why Object-Action Works
Object-Action naming has three advantages over alternatives. First, it groups events naturally. When you list events alphabetically, all report-related events cluster together: Report Created, Report Exported, Report Shared, Report Viewed. This makes the event list navigable without a search function. Second, it separates the "what" (the object) from the "how" (the action), allowing you to query all actions on a specific object or all instances of a specific action across objects. Third, it reads as natural language, making events self-documenting. A non-technical stakeholder can read "Report Created" and understand what it tracks without consulting documentation.
Casing Rules
Choose one casing style and enforce it universally. The three common options are Title Case (Report Created), snake_case (report_created), and camelCase (reportCreated). Title Case is the most readable and is the standard in tools like Mixpanel and Amplitude. snake_case is preferred by engineering teams and works better with SQL queries. camelCase is common in JavaScript codebases but reads poorly in reports. Pick one. The specific choice matters less than the consistency. Mixing cases is the most common and most destructive taxonomy violation.
Controlled Vocabulary for Actions
Define a fixed set of allowed actions and use only those. This prevents the synonyms that create confusion. Your controlled vocabulary might include: Viewed (user saw something), Clicked (user tapped a specific element), Created (user made something new), Updated (user changed something existing), Deleted (user removed something), Started (user began a process), Completed (user finished a process), Submitted (user sent a form or request), Failed (a process errored), Searched (user queried for something). With this vocabulary, there is no ambiguity. "Viewed" is always used for seeing something, never "Seen," "Opened," or "Loaded." "Created" is always used for making something new, never "Made," "Added," or "Generated." The vocabulary eliminates synonyms that splinter your data.
| Action | Definition | Examples | Do NOT use |
|---|---|---|---|
| Viewed | User saw a screen/element | Page Viewed, Modal Viewed | Seen, Opened, Loaded |
| Clicked | User tapped a specific element | Button Clicked, Link Clicked | Pressed, Tapped, Hit |
| Created | User made something new | Report Created, Project Created | Made, Added, Generated |
| Updated | User modified something existing | Profile Updated, Settings Updated | Changed, Edited, Modified |
| Completed | User finished a multi-step process | Onboarding Completed, Checkout Completed | Finished, Done, Ended |
| Submitted | User sent a form or request | Form Submitted, Feedback Submitted | Sent, Posted, Filed |
Designing the Property Schema
Event names tell you what happened. Event properties tell you the context: which button was clicked, on which page, by which type of user, with what result. Properties are where the analytical power lives. A well-designed property schema makes events infinitely queryable. A poorly designed one makes events a black box.
Global Properties
Global properties attach to every event automatically. They provide context without requiring each event to define them individually. Standard global properties include: platform (web, iOS, Android), app_version, environment (production, staging), page_url, session_id, and user_id (when available). These are typically set once in the analytics initialization and included automatically. Never rely on individual event implementations to include global properties.
Event-Specific Properties
Each event should have a defined set of properties with standardized names and types. For Button Clicked, the properties might include: button_text (string, required), button_location (string, required, enum: header/hero/sidebar/footer/inline), destination_url (string, optional). For Report Created: report_type (string, required, enum: funnel/retention/segmentation/custom), report_name (string, optional), data_source (string, optional).
Property Naming Rules
Properties should follow their own naming convention, which should be different from event names to avoid confusion. The standard is snake_case for properties regardless of the event name casing. This is because properties are used in code, queries, and API calls where snake_case is most practical. Use descriptive, specific names: button_text instead of text, report_type instead of type. Generic names like "type," "name," and "value" cause collisions and ambiguity when querying across events.
The Event Categories Framework
Organize your events into categories that map to your business model. Categories provide a higher-level structure that makes the taxonomy navigable. For a B2B SaaS product, five categories cover the entire user lifecycle.
Event Category Framework
Track how users find and first interact with your product: Page Viewed, CTA Clicked, Form Submitted, Content Downloaded. These events live on the marketing site and track the journey from visitor to lead.
Track the onboarding journey: Account Created, Onboarding Step Completed, First Action Completed. These events measure whether new users reach the 'aha moment' where they experience your product's core value.
Track ongoing product usage: Feature Used, Report Created, Dashboard Viewed, Search Performed. These events measure depth and breadth of usage after initial activation.
Track revenue-related actions: Plan Viewed, Upgrade Started, Payment Completed, Subscription Changed. These events connect usage to revenue and identify expansion opportunities.
Track technical and operational events: Error Occurred, API Called, Integration Connected, Notification Sent. These events support debugging and operational monitoring rather than product analytics.
Each category should have an owner: a person or team responsible for defining, implementing, and maintaining the events in that category. Without ownership, categories become dumping grounds where anyone can add events without oversight. The acquisition events are typically owned by the marketing team. Activation and engagement events by the product team. Monetization events by the growth or revenue team. System events by the engineering team.
Building the Tracking Plan
The tracking plan is the single source of truth for your event taxonomy. It is a document (spreadsheet, Notion page, or dedicated tool) that defines every event, its properties, its implementation status, and its ownership. Think of it as the database schema for your analytics data: just as you would never create database columns without defining them in a schema, you should never create analytics events without defining them in a tracking plan.
What the Tracking Plan Contains
For each event, the tracking plan should document: the event name (using your naming convention), the category it belongs to, a human-readable description of when the event fires, the trigger condition (what user action or system state causes the event), all properties with their name, type, required/optional status, and enum values where applicable, the platforms where the event is implemented (web, iOS, Android), the implementation status (planned, in development, live, deprecated), and the owner (person or team responsible).
| Event Name | Category | Description | Properties | Status |
|---|---|---|---|---|
| Page Viewed | Acquisition | User views any page | page_url, page_title, referrer | Live |
| Account Created | Activation | User completes signup | signup_method, plan_type, referral_source | Live |
| Report Created | Engagement | User creates a new report | report_type, report_name, data_source | Live |
| Upgrade Started | Monetization | User begins upgrade flow | current_plan, target_plan, trigger | In dev |
| Error Occurred | System | Application error fires | error_type, error_message, page_url | Live |
How Many Events to Track
The instinct is to track everything. Resist it. More events means more implementation work, more QA requirements, more maintenance burden, and more noise in your data. The goal is not maximum coverage. It is maximum signal-to-noise ratio. Start with the minimum number of events needed to answer your most important business questions, and add events only when a specific question cannot be answered with existing data.
The Phased Approach
Phase 1 (launch month): 15-20 events covering the core user journey from signup to first value. These events should let you build your primary funnel and measure activation. Phase 2 (months 2-3): add 10-15 events for engagement depth, feature usage, and monetization actions. These events support cohort analysis and feature adoption tracking. Phase 3 (months 4-6): add events based on specific questions the team is asking that cannot be answered with existing data. This demand-driven approach ensures every event has a purpose and an audience.
Governance: Keeping the Taxonomy Clean
A taxonomy without governance is a taxonomy with an expiration date. Within six months of launch, undisciplined teams will have introduced naming inconsistencies, undocumented events, broken implementations, and orphaned properties. Governance is the system that prevents this decay. It is not bureaucracy. It is the maintenance that keeps your analytics infrastructure reliable.
The Tracking Plan Review Process
Every new event must go through a review before implementation. The process should be lightweight: a developer or PM proposes a new event by adding it to the tracking plan with a "Proposed" status. The analytics owner reviews it within 48 hours, checking for naming convention compliance, property schema completeness, and potential duplication with existing events. If approved, the status changes to "Approved" and the developer implements it. If rejected, the reviewer explains why and suggests alternatives. This process adds one to two days to implementation but prevents months of data cleanup.
Automated Validation
Implement automated checks that validate event data against the tracking plan. Tools like Avo, Iteratively, and Amplitude's Data Management features can validate that event names match the defined taxonomy, that required properties are present and have the correct types, and that property values fall within defined enums. When a violation is detected, the system can alert the responsible team, log the violation for review, or in strict mode, block the event from being sent. Automated validation turns the tracking plan from a document that people might read into a contract that the system enforces.
Quarterly Taxonomy Audits
Every quarter, audit the live event data against the tracking plan. Identify events that are in the tracking plan but not firing (broken implementations). Identify events that are firing but not in the tracking plan (rogue implementations). Check property completeness rates: if a "required" property is missing from 30% of events, the implementation has a bug. Check for new enum values that appeared outside the defined set. The audit takes 2-4 hours per quarter and catches problems before they become entrenched.
Connect your event data to revenue outcomes
OSCOM unifies event data from multiple tools, standardizes naming, and connects user actions to business results.
Connect your analyticsHandling Taxonomy Changes
As your product evolves, the taxonomy must evolve with it. Features get renamed, new product areas launch, and older events become irrelevant. Managing these changes without breaking historical data is one of the hardest aspects of taxonomy management.
Renaming Events
Never rename an event in place. Renaming Dashboard Viewed to Analytics Dashboard Viewed creates a break in your time series. All historical data is under the old name; all new data is under the new name. Instead, keep the old event running and add the new event alongside it. Run both for a transition period (at least one month). Update all reports, funnels, and dashboards to use the new event name. Then deprecate (but do not delete) the old event. Mark it as "Deprecated" in the tracking plan with a note pointing to the replacement event.
Adding Properties to Existing Events
Adding a new property to an existing event is safe, but the new property will only be present on events fired after the change. Do not make the new property "required" immediately, because historical events will not have it and some analyses will break. Add it as "optional" initially, then upgrade to "required" after the implementation has been deployed to all platforms and you have confirmed it is consistently populated.
Deprecating Events
When an event is no longer relevant (the feature was removed, the event was superseded by a better one), mark it as "Deprecated" in the tracking plan. Stop sending it from all platforms. But do not delete the historical data. It may be needed for year-over-year comparisons, audit trails, or retroactive analysis. In your analytics tool, move deprecated events to an "Archive" folder or tag them so they do not appear in the default event list.
Multi-Platform Consistency
If your product exists on multiple platforms (web, iOS, Android), the taxonomy must be identical across all platforms. Same event names, same property names, same property types, same enum values. Platform-specific properties (like device_model or os_version) can be added as platform-specific optional properties, but the core event and its required properties must be consistent.
The biggest cross-platform challenge is ensuring that the same user action triggers the same event with the same properties on every platform. A "Report Created" event on web and mobile must fire at the same logical moment in the user flow, include the same required properties, and use the same enum values for categorical properties. Without this consistency, cross-platform analysis becomes impossible: you cannot build a funnel that spans web and mobile if the events have different names or different property schemas.
Taxonomy Design Patterns
The Feature Tracking Pattern
Instead of creating a separate event for every feature interaction, use a generic Feature Used event with a feature_name property. This keeps the event count low while providing complete feature usage data. You can query "how many users used the search feature?" just as easily as you can query "which features are most used?" The trade-off is that the Feature Used event has very high volume, which may affect analytics tool costs. For features that need deep analysis (many properties, complex interactions), create dedicated events. For simple usage tracking, the generic pattern works well.
The Lifecycle Event Pattern
For processes with distinct stages (onboarding, checkout, upgrade), use started/completed event pairs: Onboarding Started and Onboarding Completed, Checkout Started and Checkout Completed. The difference between the started count and completed count is the drop-off for that process. Add a step_number or step_name property to the started event to track progress within multi-step processes without creating a separate event for each step.
The Error Tracking Pattern
Use a single Error Occurred event with properties for error_type (validation, server, network, permission), error_code, error_message, and error_location (the page or component where the error occurred). This makes it easy to build error monitoring dashboards, track error rates over time, and correlate errors with user churn. A user who encounters three errors in their first session is dramatically more likely to churn than one who encounters none. Tracking errors as analytics events connects technical health to user health.
Tools for Taxonomy Management
Dedicated taxonomy management tools have emerged to solve the governance problem. Avo provides a visual tracking plan builder with cross-platform code generation and real-time validation. Iteratively (now part of Amplitude) offers a similar tracking plan with CI/CD integration that validates events in your codebase at build time. Amplitude's Data Management and Mixpanel's Lexicon provide in-platform taxonomy management with data quality monitoring.
For teams that do not need a dedicated tool, a well-structured Google Sheet or Notion database works as a tracking plan. The key fields are: event name, category, description, trigger, properties (with types and enums), platforms, status, and owner. Add a "last verified" date to track when each event was last confirmed to be working correctly. Share the tracking plan widely and make it the first stop for anyone asking "do we track this?"
Key Takeaways
- 1Use Object-Action naming (Report Created, Button Clicked) with consistent casing. Title Case for events, snake_case for properties.
- 2Define a controlled vocabulary of 10-15 actions. Eliminate synonyms that splinter your data.
- 3Every event needs documented properties with names, types, required/optional status, and enum values.
- 4Organize events into categories: Acquisition, Activation, Engagement, Monetization, and System.
- 5Start with 15-20 events. Add more only when a specific question cannot be answered with existing data.
- 6Governance is mandatory. Every new event goes through a review. Automated validation enforces the schema. Quarterly audits catch drift.
- 7Never rename events in place. Run old and new versions in parallel, transition reports, then deprecate the old version.
- 8The tracking plan is the single source of truth. If it is not in the tracking plan, it should not be in the codebase.
Data architecture that scales with your product
Event taxonomies, tracking plans, and analytics governance frameworks for teams that want data they can trust. Weekly.
An event taxonomy is not a technical implementation detail. It is the foundation of your analytics capability. Every funnel analysis, every cohort comparison, every retention curve, every feature adoption metric depends on consistently named, well-documented, properly governed events. The taxonomy is invisible when it works: analysts find the data they need, build the reports they need, and make the decisions they need. It becomes painfully visible when it fails: nobody trusts the data, every analysis requires a detective session, and the analytics tool becomes an expensive ornament. Invest the time upfront in designing a taxonomy that scales. Your future analysts will thank you.
Prove what's working and cut what isn't
Oscom connects GA4, Kissmetrics, and your CRM so you can tie every marketing activity to revenue in one dashboard.