Codelab
Designing an Event Taxonomy for Amplitude
How to name events and properties so analytics stays usable as the product grows, instead of becoming hundreds of one-off strings.
Start from verbs, not screens
The most common mistake is naming events after the screen they fire from (HomeScreenButtonClicked) instead of the action a user took (Call Started, Report Exported). Screen names change with every redesign; the underlying action usually doesn’t. A taxonomy organized around actions survives UI churn.
Object + Action, not free text
A convention that scales: Object Action, both in title case — Call Started, Export Requested, Plan Upgraded. This keeps the event list groupable in Amplitude’s UI by object (all Call * events together) without needing a separate naming registry to remember which events exist.
Properties carry the variance, not the event name
Don’t create Call Started — Cloud and Call Started — SIM as two events. Use one Call Started event with a medium: "cloud" | "sim" property. This keeps funnels and retention charts comparable across variants instead of fragmenting the same user action into events that can’t be summed.
User vs. event properties
- User properties (set once, persist) — plan tier, signup date, team size, platform.
- Event properties (per-event, contextual) — what changed this time: call medium, export format, error code.
Mixing these up shows up later as identical event properties repeated on every single event call, when they should have been set once via identify.
Deduplication is a taxonomy problem, not just a code problem
If the same logical action can fire from two code paths (a retry button and an automatic retry), give both a shared trigger property (manual / automatic) under the same event name, rather than letting the two call sites drift into separate, inconsistently named events over time.
A minimal taxonomy doc beats a perfect one
A spreadsheet with event name | trigger condition | properties | owner that’s actually kept up to date is worth more than a fully normalized schema nobody maintains. Treat the taxonomy doc as the thing PRs are reviewed against, not a one-time design exercise.
Review new events against the doc, not against vibes
The taxonomy doc only stays useful if it’s actually part of the review process for new events — otherwise it drifts out of sync with the codebase within a few sprints, and nobody trusts it enough to consult it, which makes it worthless even though it’s technically still there. Treating “does this new event fit an existing object, or does it need a genuinely new one” as a real review question, the same way a schema migration gets reviewed, keeps the taxonomy doc accurate enough to actually rely on months later.
Related topics
Keep exploring
Runo Product Analytics & Amplitude Instrumentation
Worked on a product analytics layer at Runo — Amplitude provider abstraction, event taxonomy, user/company traits, deduplication, and platform-aware tracking across auth, billing, CRM, and call workflows.
Amplitude's Event Taxonomy Documentation
Amplitude's own guidance on event/property naming and taxonomy planning — used as a reference while building out the analytics layer described in the Runo Product Analytics project.
Comparing Event-Deduplication Strategies for Client-Side Analytics
An open investigation into time-windowed vs. idempotency-key deduplication for client-emitted analytics events, prompted by dedup work on the Runo product analytics layer.
Turning scattered product behavior into systems
A recurring theme in product engineering: ambiguous, duplicated behavior across screens is more dangerous than it looks, and the fix is rarely glamorous.