Naming events that won't bite you in 6 months
Conventions from teams that learned the hard way — so you don't have to.
Six months in, your event log is the most-queried table you have. Naming matters. Here's the convention that holds up under real load.
Rule 1: snake_case, past tense, subject_verbed
- Good: user_signed_up, checkout_completed, video_finished, invite_accepted.
- Bad: Signup, signupEvent, SignUp_v2, CheckoutFlow_StepThree_Completed_Final.
Rule 2: status goes in a property, not the name
One event: payment_attempted with a property { outcome: "succeeded" | "failed" | "pending" }. Not three events: payment_succeeded, payment_failed, payment_pending. The query "how often does payment fail?" gets answerable in one line instead of three.
Rule 3: never put IDs or timestamps in the name
user_signed_up_v2 is fine (you'll have a v3 eventually). user_signed_up_user_12345 is a debugging mess. Always put the IDs in properties.
Rule 4: page_viewed is a system event, not yours
Sheepit auto-captures $session_start, $page_leave, and rage/dead-click frustration signals — that's the SDK default, no code required. Page views are the one exception: track them yourself (or use the React <PageViewTracker>). Don't reinvent the frustration signals; you'll fight us in queries forever if you do.