Every analytics setup eventually runs into the same problem: the data is messy because the events were named
inconsistently. One developer sends signup, another sign_up, a third Signed Up
— now they’re three different events, and every funnel and retention report is wrong. Well-known events
fix this by standardizing the names (and often the properties) of the events products commonly track.
What makes an event “well-known”
A well-known event is a predefined event name with an agreed meaning and, ideally, a typed set of properties. Instead
of inventing a name, you pick the standard one — add_to_cart, purchase,
login — and fill in its expected properties. Free-form custom events still have their place for
things unique to your product; well-known events cover the common ground everyone needs.
Why they help
- Consistency. One canonical name per concept means no
signup/sign_updrift fragmenting your reports. - Typed properties + validation. A
purchasethat requires a product ID, amount, and currency catches malformed data at the source — before it pollutes a dashboard. - Faster setup. A shared vocabulary means less to invent and fewer decisions; new teammates already know what the events mean.
- Portability. Standard names map cleanly between analytics tools, so migrating or running two tools in parallel doesn’t mean re-instrumenting everything.
- Analysis out of the box. When a tool recognizes
checkout_started→purchase, funnels and revenue reports work without custom wiring.
A naming convention that scales
The single most valuable thing you can do is pick a naming convention and apply it to every event without
exception. The widely used pattern is object_action, in snake_case, past tense — the
thing, then what happened to it:
order_completed
subscription_started
video_played
invite_sent
The rules that matter: lowercase always (Signup and signup are two events
in most tools), one consistent separator (underscores), past tense for actions, and a noun-first object so related
events sort together (cart_viewed, cart_updated, cart_cleared). The specific
convention matters less than never deviating from it. Property names deserve the same discipline — pick
camelCase or snake_case for properties and keep it uniform, because
productId and product_id won’t merge either.
Properties: the data that makes events useful
An event name tells you what happened; properties tell you the details you’ll actually slice by. A bare
purchase event can answer “how many purchases?” — but with amount, currency,
and productId it can answer “what’s revenue by product this month?”. The art is attaching enough to be
useful without dumping everything:
- Required vs optional. Some properties are the point of the event — a
searchwithout aqueryis useless. Typed schemas mark these required so they’re never missing. - Consistent units and types. Always send amounts as numbers in a known currency, timestamps in one format, IDs as strings. Mixed types are the quiet killer of clean analysis.
- Identifiers, not labels. Prefer a stable
productIdover a display name that changes; you can always join names back in later.
The events most products should track
A practical taxonomy, grouped by what they describe:
- Navigation:
page_view - Interaction:
click,scroll,form_start,form_submit,rage_click,dead_click - Commerce:
add_to_cart,checkout_started,checkout_completed,purchase - Authentication:
signup,login,logout - Engagement:
search,video_play,video_pause,share,notification_received,notification_clicked - Errors:
error_occurred
A worked example: an e-commerce checkout
Standard names pay off most when several events describe one journey. A checkout flow maps cleanly onto four well-known events, each carrying the same shape of properties:
track('add_to_cart', { productId: 'sku_42', amount: 29, currency: 'USD' })
track('checkout_started', { productId: 'sku_42', amount: 29, currency: 'USD' })
track('checkout_completed', { productId: 'sku_42', amount: 29, currency: 'USD' })
track('purchase', { productId: 'sku_42', amount: 29, currency: 'USD' })
Because the names are standard and the properties are consistent, a funnel
from add_to_cart to purchase works immediately — you can see the drop-off at each step, and
break it down by product or source without renaming anything. Use the same names on web and server (a
server-confirmed purchase is more trustworthy than a client one), and the events line up on one
timeline per person.
Common event-tracking mistakes
- Naming drift. The same action under several names. A linter that enforces one convention prevents it.
- Inconsistent casing.
Purchase,purchase, andPURCHASEcounted separately. Lowercase everything. - Over-tracking. An event for every micro-interaction creates noise you’ll never analyze. Autocapture handles the long tail; reserve named events for moments that matter.
- PII in properties. Putting emails, names, or full addresses into event properties is a privacy and compliance risk. Keep identifiers on the profile, not scattered through events.
- Free-form everything. No standard names, no typed properties — every report becomes archaeology. Start from a known vocabulary instead.
Typed, validated events in Pug
In Pug, well-known events get typed properties and are validated at the moment you call track() — extra
properties are still allowed and sent alongside, so you’re never boxed in. A purchase missing its
currency is caught and logged rather than silently stored wrong. The schemas come from Pug’s shared event
definitions, so the same well-known names mean the same thing across the web, server, and mobile SDKs. For
autocaptured interactions like clicks and rage clicks, see autocapture; for the
full developer story, the Web SDK deep-dive.
Plan and lint your events
Good event hygiene starts before you write tracking code. Three free tools help: the
event tracking-plan generator gives you 127 well-known event
kinds with typed properties and PII flags to start from, the
event naming linter checks your names against a consistent
object_action, snake_case convention, and the
PII & GDPR event auditor flags properties that may carry personal data.
Decide the vocabulary once, and every report downstream gets cleaner for it.