Anonymous vs identified events

Last updated:

|Edit this page

PostHog captures two types of events: anonymous and identified

Identified events enable you to attribute events to specific users, and attach person properties. They're best suited for logged-in users.

Scenarios where you want to capture identified events are:

  • Tracking logged-in users in B2B and B2C SaaS apps
  • Doing user segmented product analysis
  • Growth and marketing teams wanting to analyze the complete conversion lifecycle

Anonymous events are events without individually identifiable data. They're best suited for web analytics or mobile apps where users aren't logged in.

Scenarios where you want to capture anonymous events are:

  • Tracking a marketing website
  • Content-focused sites
  • B2C apps where users don't sign up or log in

Under the hood, the key difference between identified and anonymous events is that for identified events we create a person profile for the user, whereas for anonymous events we do not.

💡 Tip: Under our current pricing, anonymous events can be up to 4x cheaper than identified ones (due to the cost of processing them), so it's recommended you only capture identified events when needed.

Anonymous vs identified events

How to capture anonymous events

PostHog captures identified events by default. To change this and capture anonymous events, change the person_profiles config when initializing PostHog:

  1. person_profiles: 'always' (default) - Capture identified events for all events.

  2. person_profiles: 'identified_only' (recommended) - Anonymous events are captured by default. PostHog only captures identified events for users where person profiles have already been created.

For example:

Web
posthog.init(
'<ph_project_api_key>',
{
api_host: 'https://us.i.posthog.com',
person_profiles: 'identified_only'
}
)

How to capture identified events

Identified events are captured by default if you've set the person_profiles config to always (the default option).

If you've set the person_profiles to identified_only, anonymous events are captured by default. Then, to capture identified events, call any of the following functions:

When you call any of these functions, it creates a person profile for the user. Once this profile is created, all subsequent events for this user will be captured as identified events.

Frequently asked questions

What can and can't I do with anonymous events?

You can:

You cannot:

  • Set person properties
  • Create cohorts
  • Filter on person properties
  • Use person properties for targeting feature flags, A/B tests, or surveys
  • Query the persons table using SQL insights
  • Use group analytics

What can and can't I do with identified events?

You can use all of PostHog's features with identified events. There are no restrictions.

What happens to events when an anonymous user is identified?

All future events are associated with their person profile and are captured and billed as identified events.

Past events are attributed to the person, but are otherwise unchanged. This means that past events remain billed as anonymous.

Can identified events still be "anonymous"?

Yes, identified events can still be "anonymous" in the sense that they don't need to contain personal information such as name, email, or phone number. A person profile is still created for them, but it doesn't need to include any personal information.

Can I specify some events to be identified and others to be anonymous for the same users?

Not if you already identified them. Once a user is identified, all future events for that user are associated with their person profile and are captured as identified events.

How do I revert back to anonymous events after identifying?

Calling reset() will unlink the person profile from the user and create a new PostHog anonymous ID for capturing events. Any future events are captured as anonymous events.

However, if you capture events using the distinct_id used in their previously identified person profile, the events are captured as identified events. You need to use a new distinct_id to capture events as anonymous events.

Why are identified events so much more expensive?

Since identified events are associated with a person profile, processing and querying them requires using resource intensive table JOINs. On the other hand, anonymous events are stored in a single table and are more efficient to query.

This post goes into more detail.

Why does PostHog capture identified events by default?

This is required for backwards compatiability. Previously, all events were captured as identified events. When we added anonymous events, we didn't want to change the default behavior since that could cause issues with existing users.

However, since anonymous events are cheaper to capture, we recommend capturing them by default.

Why am I being charged for both "events" and "persons"

We're not charging you for both. The person profiles line item you see on your invoice is a number of identified events captured. The events line item is the total number of anonymous events captured.

How does my free allowance work for anonymous vs identified events?

Your first one million events each month are free, regardless if they are anonymous or identified.

Questions?

Was this page useful?

Next article

Ingestion warnings

Sometimes PostHog runs into problems during ingestion due to incorrect or suboptimal usage of PostHog. For example, if you capture an event with a generic ID like null , PostHog doesn't ingest it. If this happens, we do our best to still ingest the event and we log an ingestion warning. Note: These warnings are sampled. The actual number of events affected may exceed the total displayed. List of ingestion warnings: Refused to merge with an illegal distinct ID Refused to merge an already…

Read next article