Platform Retargeting Suppression Onboarding Integrations Pricing Blog Sign in Request Access
Product

Event-Based Segmentation vs. Profile Attributes: When Each Wins

Visual comparing event stream data versus static user profile attributes

Build this audience in Segmentloom →

Request access

There are two fundamentally different things you can know about a user in your system: who they are, and what they just did. Profile attributes answer the first question. Events answer the second. Most CDP configurations — including many built by teams that know exactly what they're doing — end up over-weighted toward the first and under-weighted toward the second, not because the data is missing but because the tooling makes profile attributes easier to query.

This has consequences for audience quality that are worth understanding precisely, because the fix isn't "use events instead of profiles." It's "use the right one for the question you're actually asking."

Profile Attributes: What They Are and What They're Good For

Profile attributes are properties that describe a user at a point in time: plan_type, company_size, industry, country, signup_date, account_status. They're typically set during account creation or updated by CRM sync. They're stable, structured, and easy to filter on.

Profile attributes are the right segmentation tool when you're asking stable questions about your user base. "Show me all users on the Starter plan who signed up in Q3 and are based in the US" is a profile attribute query. That audience won't change much day to day. The segment definition is durable and the answer is consistent.

They're also the right tool when you're targeting based on firmographic or demographic fit — account-based marketing campaigns, tier-specific product announcements, re-engagement campaigns scoped to a particular cohort. If the question is about identity and classification rather than behavior, profile attributes are the cleaner answer.

The Problem With Over-Relying on Profile Attributes

The failure mode is using profile attributes as a proxy for intent when event data exists and would be more accurate. Consider a team that wants to identify users who are close to upgrading. They might filter on plan_type = 'free' and account_age_days >= 30 — a profile attribute segment that captures every free user who has been around for a month. That's probably 40-60% of their free user base.

That's a noisy audience. Among those users are people who signed up, never activated, and haven't logged in since. People who are happy staying on the free tier indefinitely. People who churned in spirit but haven't formally deactivated. None of those users are close to upgrading, but they're all in the segment.

The behavioral signal that actually indicates upgrade intent — viewed the pricing page, opened the upgrade modal, activated a feature that's gated to paid tiers and hit the paywall — lives in the event stream. Profile attributes can tell you who could upgrade. Events tell you who is actively considering it.

Events: The Temporal Advantage

Events carry a timestamp and a context that profile attributes don't have. upgrade_modal_opened tells you not just that a user has seen the upgrade prompt, but when they saw it, how many times, and potentially what they were doing just before (if you're tracking the preceding feature_activation_attempted event). That temporal precision is what makes behavioral segmentation genuinely predictive rather than descriptive.

The practical difference: a profile attribute like plan_type = 'free' doesn't change until something external happens (the user upgrades, the account is updated). An event like pricing_page_viewed fires in response to something the user did, right now. If you're trying to catch users in the moment of consideration — which is exactly when retargeting works best — event-based conditions give you a window the profile attribute can't.

Lookback windows are the key mechanism here. pricing_page_viewed with a count of two or more in the last seven days is a very different audience from pricing_page_viewed in the last 90 days. Profile attributes have no equivalent temporal control: plan_type = 'free' is just plan_type = 'free', with no indication of whether that's been true for two days or two years.

Where Each Actually Wins: A Decision Framework

The question worth asking before building any audience is: "Am I trying to describe who this user is, or what they're doing right now?"

Use profile attributes when:

  • The audience definition needs to be stable over days or weeks (e.g., a drip email campaign for new Starter plan users)
  • You're segmenting on firmographic or demographic criteria that don't change with behavior
  • You need to combine a behavioral segment with a profile filter (e.g., high-intent users on the free plan — start with the event condition, layer in the plan attribute as a filter)
  • You're building suppression audiences based on account status (subscription_status = 'active') — account status is a profile attribute, not an event

Use event-based conditions when:

  • You need temporal precision — the audience definition is only meaningful within a specific recency window
  • You're trying to identify users in an active decision state (viewed pricing, hit a paywall, started but didn't complete onboarding)
  • The signal you care about comes from product interaction, not from what you know about the user from external data sources
  • The audience needs to be dynamic — users should enter and exit based on recent behavior, not be frozen in a static cohort

The Composition Pattern That Works Best

The most effective behavioral audiences in practice are usually hybrid: an event condition sets the core intent signal, and profile attributes act as filters or exclusions. This pattern appears consistently across SaaS and e-commerce retargeting setups.

For example: an upgrade retargeting audience built as pricing_page_viewed >= 2 (last 14 days) as the base condition, filtered to plan_type = 'free' (profile attribute — excludes existing paid users automatically), and further filtered to subscription_created = false (profile attribute derived from account history). The event condition supplies the intent signal. The profile attributes supply the eligibility context.

This is also the pattern where the data engineering bottleneck tends to bite hardest. SQL-based approaches can express this composition with JOINs across events and profiles tables. But the tooling complexity is real, and when a growth manager can't express this without writing SQL, they default to the simpler profile-only query and accept the noisier audience.

A Common Misconception About Profile Recency

One thing worth addressing directly: some teams treat profile attributes as "current state" and assume they're inherently more reliable than events. That's not accurate. Profile attributes are only as fresh as your last sync. If your CRM syncs to your CDP once a day, then account_status = 'churned' could be 23 hours stale. Meanwhile, event data (if you're streaming rather than batch-loading) can be 15 minutes fresh.

We're not saying profile attributes are unreliable — they're essential for the use cases described above. We're saying "profile attributes are reliable, events are unpredictable" is a common assumption that doesn't hold once you understand how both types of data actually flow through a modern stack. For time-sensitive audience use cases, event data is often the more current source, not less.

The teams that get this right tend to have a clear mental model of data freshness for each attribute and event in their system. That model doesn't require a data engineer to maintain — it requires a growth team that's genuinely curious about where their data comes from and how often it updates.

Build audiences from your own events →

Request access to Segmentloom