User vs event properties: Structuring data

Mon Jun 23 2025

Ever wondered why your analytics dashboard shows confusing or contradictory results? The culprit might be how you're tagging your data.

Getting user properties and event properties mixed up is like trying to navigate with a compass that randomly switches between true north and magnetic north. You'll end up somewhere, but probably not where you intended. Let's fix that.

Understanding user and event properties

Think of user properties as the permanent markers on someone's profile - their subscription tier, country, or when they first signed up. These stick around and color every action that user takes. When someone from France clicks "purchase," their location property travels along with that event, giving you context without having to log it every single time.

Event properties are the opposite - they're the specific details about what just happened. The item someone purchased, which button they clicked, how long they watched that video. These properties capture the moment, not the person.

Here's where it gets interesting: user properties maintain their state across sessions while event properties are fleeting. A user's subscription status follows them from Monday to Friday, but the specific product they viewed changes with each click. Martin Kleppmann's work on event sourcing really drives this home - the distinction between state and events is fundamental to how we process data streams.

The practical difference? User properties help you segment and understand who is doing something. Event properties tell you what they're doing and how. Mix them up, and your data becomes a mess. You'll find yourself trying to filter by "purchase_amount" as if it were a user attribute, wondering why your cohort analysis makes no sense.

Statsig's event schema enforces this separation, which honestly saves you from yourself. Their StatsigUser object makes it clear what belongs where - no more guessing games about whether "referral_source" should be tied to the user or their first visit event.

Importance of structuring data correctly

Bad data structure is like building on quicksand - everything looks fine until you actually need to rely on it. I've seen teams waste weeks debugging "broken" analytics only to discover they've been logging user attributes as event properties (or vice versa).

Picture this scenario: You're trying to figure out why premium users aren't using your new feature. But wait - you've been logging "subscription_type" as an event property on login events. Now you can only see subscription status for users who logged in recently. Everyone else? Ghost town. Your analysis is shot before you even started.

The real cost of poor structure shows up in three places:

  • Query performance tanks when you're joining massive event tables to find what should have been a simple user property

  • Experiments become unreliable because you can't consistently target the right users

  • Your team loses trust in the data when numbers don't add up

A clean structure does the opposite. Queries run fast because user properties live in one place. You can segment users instantly - paid vs free, mobile vs desktop, new vs returning. Martin Fowler's writings on event-driven architectures emphasize this same principle: clear boundaries between entities and events make everything else possible.

The payoff is huge when you get it right. Netflix's engineering team discovered they could reduce query times by 90% just by properly separating user attributes from event data. That's not just faster dashboards - that's the difference between catching issues in real-time versus finding out about them next week.

Best practices for using user and event properties

Let's get practical. User properties belong to attributes that define someone over time. Here's what actually works:

Start with the basics that rarely change:

  • Sign-up date

  • Account type or subscription tier

  • Geographic location

  • Preferred language

  • Marketing attribution source

But don't stop there. Track properties that evolve but still represent the user's current state:

  • Lifetime value

  • Number of purchases

  • Last active date

  • Feature flags enabled

  • Current experiment groups

The key? Update these properties when they change. If someone upgrades from free to paid, update their account type immediately. Don't wait for the next login event. This keeps your segments accurate and your experiments targeting the right people.

Event properties need a different approach. They should capture the context of what just happened:

  • Which button was clicked

  • What product was viewed

  • Purchase amount and items

  • Page load time

  • Error messages encountered

Here's what I've learned the hard way: resist the urge to jam everything into event properties. I once worked with a team that was passing 47 properties with every event "just in case." Their event payload was larger than most people's profile photos. Performance was terrible, costs were through the roof, and nobody could find the data they actually needed.

Keep event properties focused and relevant. Ask yourself: "Does this describe what happened, or who did it?" If it's the latter, it's probably a user property.

Statsig's logging events guide has solid examples of this separation. Their approach to user attributes shows how to structure properties for maximum flexibility without the bloat.

Impact on analysis and experimentation

This is where proper structure pays dividends. When your properties are organized correctly, analysis becomes almost trivial. Want to know how paid users in Europe interact with your new feature? It's a simple query when "subscription_type" and "region" are user properties.

Clean data structure enables three critical capabilities:

  1. Precise experiment targeting - You can reliably split users into test and control based on stable attributes

  2. Accurate cohort analysis - Track how different user segments behave over time without data gaps

  3. Real-time personalization - Serve different experiences based on user properties without complex lookups

I've seen this transformation firsthand. One company I worked with couldn't figure out why their A/B tests showed wildly different results each time they ran them. Turns out they were segmenting based on event properties that weren't consistently logged. After restructuring their data to use proper user properties, their experiments became reproducible and trustworthy.

The impact on query performance is just as dramatic. Google's analytics team found that queries using well-structured user properties ran 50-100x faster than those trying to extract user attributes from event streams. That speed difference means you can actually iterate on analysis instead of waiting for queries to finish.

Event properties shine when you need to understand specific interactions. Which product pages lead to purchases? What's the typical path through your checkout flow? How long do users spend on each step? These questions require the detailed context that only event properties provide.

The magic happens when you combine both types effectively. User properties for the "who," event properties for the "what," and suddenly you have a complete picture of user behavior. You can answer questions like "Do enterprise users click the help button more often than free users?" or "Which features do users discover in their first week versus their first month?"

Closing thoughts

Getting user and event properties right isn't just about clean data - it's about being able to trust your analytics and make decisions quickly. Start simple: user properties for persistent attributes, event properties for moment-in-time details. Update user properties when they change. Keep event properties focused on the action, not the actor.

The teams that nail this distinction can answer questions in minutes that take others days to figure out. They run experiments with confidence, knowing their targeting is accurate. Their dashboards actually reflect reality instead of some weird approximation of it.

Want to dig deeper? Check out Statsig's guides on event schemas and user concepts. And if you're migrating from a messy setup, Martin Kleppmann's work on stream processing provides great frameworks for thinking about event data.

Hope you find this useful!



Please select at least one blog to continue.

Recent Posts

We use cookies to ensure you get the best experience on our website.
Privacy Policy