Setting properties
The easiest way to set properties is to add the properties to the identify
function during the initial login.
- Identify the user and set the user properties
posthog.identify('user_id', {name: 'James PostHog', // also sets the display name in the PostHog UIemail: 'hey@posthog.com',})// { name: 'James PostHog', email: 'hey@posthog.com' }
To update the properties of a user you can use set
, set_once
, and $unset
. Depending on the integration library the actual function calls look a bit different, but internally they all work the same way.
set
: Set the property even if the property exists on the user
posthog.people.set( { location: 'London' })// { location: 'London' }
set_once
: Set the property if the property does not exist on the user
posthog.people.set_once( { initial_location: 'Rome'})posthog.people.set_once( { initial_location: 'London'})// { initial_location: 'Rome' }
All these methods can be used in properties with normal event capture:
- Set the properties through a capture
posthog.capture('Set some user properties',{$set: { location: 'London' },$set_once: { initial_location: 'London' },$unset: [ 'priority' ],}
When to use set
and set_once
?
Use set
when we want the value to be the most recently sent value. For example, to update the email for a user.
Use set_once
when we want to set the first value and it to never be updated afterwards, e.g. the first URL that referred a user to the site.
In summary: set
always overrides, set_once
only writes when the property doesn't already exist on the user.
For example:
posthog.people.set( { location: 'London' })posthog.people.set( { location: 'Rome' })// { location: 'Rome' }posthog.people.set_once( { initial_location: 'London' })posthog.people.set_once( { initial_location: 'Rome' })// { location: 'London' }
Note: that we ignore the event timestamps and just process everything at ingestion time.
Sometimes we might want to mix set
and set_once
usage. Imagine, when we have some heuristics that help us determine a value, but users can also specify it. In these cases it might be beneficial to use set_once
for the heuristically computed value and set
for user specified value. This way we can ensure that the user specified value is always used, but if the user doesn't specify it, we can still use the heuristically computed value.
How are properties managed when merging or aliasing users
When an anonymous user is identified as user (A), all the properties of the anonymous user are added to user (A). If there is a conflict, the properties of user (A) are kept.
client.identify({distinctId: 'user_A',properties: {name: 'User A',location: 'London',timezone: 'GMT',},})client.reset()// as an anonymous userposthog.people.set({ name: 'Anonymous User', phone: '0800-POSTHOG' })client.identify({distinctId: 'user_A',properties: {timezone: 'GMT+1', // daylight saving time},})// for user 'user_A', { name: 'User A', location: 'London', phone: '0800-POSTHOG', timezone: 'GMT+1' }
When a user (B) is merged into another user (A), all the properties of the user (B) are added to user (A). If there is a conflict, the properties of user (A) are kept.
client.identify({distinctId: 'user_A',properties: {location: 'London',name: 'User A',},})client.identify({distinctId: 'user_B',properties: {name: 'User B',location: 'Rome',phone: '0800-POSTHOG',},})posthog.alias('user_A', 'user_B')// for user 'user_A', { name: 'User A', location: 'London', phone: '0800-POSTHOG' }
Any events sent to either user_A
or user_B
will be received under the same person.
Note: that the '[alias ID]'
cannot be associated with multiple distinct ids.
Person Display Name
The person display name is the name that is shown in the PostHog UI. The person properties that are used as the display name can be configured in Project Settings.
Default user properties
It's often useful to set the email
property for a user. This is useful for many of the apps, filtering users in the PostHog UI and as the Person Display Name.
The following properties are automatically set for all users when using the posthog-js
library:
Property | Property Name | Description | Example |
---|---|---|---|
utm_campaign | UTM Campaign | UTM campaign tag (last-touch). | feature launch, discount |
utm_content | UTM Content | UTM content tag (last-touch). | bottom link, second button |
utm_medium | UTM Medium | UTM medium tag (last-touch). | Social, Organic, Paid, Email |
utm_source | UTM Source | UTM source tag (last-touch). | Google, Bing, Twitter, Facebook |
$browser | Browser | Name of the browser the user has used. | Chrome, Firefox |
$browser_version | Browser Version | The version of the browser that was used. Used in combination with Browser. | 70, 79 |
$initial_browser | Initial Browser | Name of the browser the user first used (first-touch). | Chrome, Firefox |
$initial_browser_version | Initial Browser Version | The version of the browser that the user first used (first-touch). Used in combination with Browser. | 70, 79 |
$initial_current_url | Initial Current URL | The first URL the user visited, including all the trimings. | https://example.com/interesting-article?parameter=true |
$initial_device_type | Initial Device Type | The initial type of device that was used (first-touch). | Mobile, Tablet, Desktop |
$initial_os | Initial OS | The operating system that the user first used (first-touch). | Windows, Mac OS X |
$initial_pathname | Initial Path Name | The path of the Current URL, which means everything in the url after the domain. Data from the first time this user was seen. | /pricing, /about-us/team |
$initial_referrer | Initial Referrer URL | URL of where the user came from most recently (last-touch). Data from the first time this user was seen. | https://google.com/search?q=posthog&rlz=1C... |
$initial_referring_domain | Initial Referring Domain | Domain of where the user came from most recently (last-touch). Data from the first time this user was seen. | google.com, facebook.com |
$initial_utm_campaign | Initial UTM Campaign | UTM campaign tag (first-touch). | feature launch, discount |
$initial_utm_content | Initial UTM Content | UTM content tag (first-touch). | bottom link, second button |
$initial_utm_medium | Initial UTM Medium | UTM medium tag (first-touch). | Social, Organic, Paid, Email |
$initial_utm_source | Initial UTM Source | UTM source tag (first-touch). | Google, Bing, Twitter, Facebook |
$os | OS | The operating system of the user. | Windows, Mac OS X |
$referrer | Referrer URL | URL of where the user came from most recently (last-touch). | https://google.com/search?q=posthog&rlz=1C... |
$referring_domain | Referring Domain | Domain of where the user came from most recently (last-touch). | google.com, facebook.com |
GeoIP Properties
By default, the GeoIP plugin is turned on which adds the following properties to all events.
Property | Property Name | Description | Example |
---|---|---|---|
$geoip_city_name | City Name | Name of the city matched to this event's IP address. | Sydney, Chennai, Brooklyn |
$geoip_continent_code | Continent Code | Code of the continent matched to this event's IP address. | OC, AS, NA |
$geoip_continent_name | Continent Name | Name of the continent matched to this event's IP address. | Oceania, Asia, North America |
$geoip_country_code | Country Code | Code of the country matched to this event's IP address. | AU, IN, US |
$geoip_country_name | Country Name | Name of the country matched to this event's IP address. | Australia, India, United States |
$geoip_latitude | Latitude | Approximated latitude matched to this event's IP address. | -33.8591, 13.1337, 40.7 |
$geoip_longitude | Longitude | Approximated longitude matched to this event's IP address. | 151.2, 80.8008, -73.9 |
$geoip_postal_code | Postal Code | Approximated postal code matched to this event's IP address. | 2000, 600004, 11211 |
$geoip_subdivision_1_code | Subdivision 1 Code | Code of the subdivision matched to this event's IP address. | NSW, TN, NY |
$geoip_subdivision_1_name | Subdivision 1 Name | Name of the subdivision matched to this event's IP address. | New South Wales, Tamil Nadu, New York |
$geoip_subdivision_2_code | Subdivision 2 Code | Code of the second subdivision matched to this event's IP address. | |
$geoip_subdivision_2_name | Subdivision 2 Name | Name of the second subdivision matched to this event's IP address. | |
$geoip_time_zone | Timezone | Timezone matched to this event's IP address. | Australia/Sydney, Asia/Kolkata, America/New_York |
$initial_geoip_city_name | Initial City Name | Name of the city matched to this event's IP address. Data from the first time this user was seen. | Sydney, Chennai, Brooklyn |
$initial_geoip_continent_code | Initial Continent Code | Code of the continent matched to this event's IP address. Data from the first time this user was seen. | OC, AS, NA |
$initial_geoip_continent_name | Initial Continent Name | Name of the continent matched to this event's IP address. Data from the first time this user was seen. | Oceania, Asia, North America |
$initial_geoip_country_code | Initial Country Code | Code of the country matched to this event's IP address. Data from the first time this user was seen. | AU, IN, US |
$initial_geoip_country_name | Initial Country Name | Name of the country matched to this event's IP address. Data from the first time this user was seen. | Australia, India, United States |
$initial_geoip_latitude | Initial Latitude | Approximated latitude matched to this event's IP address. Data from the first time this user was seen. | -33.8591, 13.1337, 40.7 |
$initial_geoip_subdivision_1_code | Initial Subdivision 1 Code | Code of the subdivision matched to this event's IP address. Data from the first time this user was seen. | NSW, TN, NY |
$initial_geoip_longitude | Initial Longitude | Approximated longitude matched to this event's IP address. Data from the first time this user was seen. | 151.2, 80.8008, -73.9 |
$initial_geoip_postal_code | Initial Postal Code | Approximated postal code matched to this event's IP address. Data from the first time this user was seen. | 2000, 600004, 11211 |
$initial_geoip_subdivision_1_name | Initial Subdivision 1 Name | Name of the subdivision matched to this event's IP address. Data from the first time this user was seen. | New South Wales, Tamil Nadu, New York |
$initial_geoip_subdivision_2_code | Initial Subdivision 2 Code | Code of the second subdivision matched to this event's IP address. Data from the first time this user was seen. | |
$initial_geoip_subdivision_2_name | Initial Subdivision 2 Name | Name of the second subdivision matched to this event's IP address. Data from the first time this user was seen. | |
$initial_geoip_time_zone | Initial Timezone | Timezone matched to this event's IP address. Data from the first time this user was seen. | Australia/Sydney, Asia/Kolkata, America/New_York |