tl;dr: don't track too many events (<20), just main features. Place your tracking in the backend, ad-blockers won't affect your analytics. Invest on good traits (5 to 10 it's a good number).
A good tracking plan is the first step toward getting the most out of your data.
It’s the backbone of every visualization/dashboard you’ll use to steer your company.
A good tracking plan has the following characteristics:
It is simple and informative, yet not exhaustive
It is KPI oriented
The first point refers to the fact that tracking every single action users can do in your app is counterproductive. To get started just limit yourself to the most important actions and the main workflows.
The second point is partially related to the first one: just track what is useful for you to move your KPI. For example, if your goal is now to improve your onboarding flow just go deep into that, don’t spend energy in other places.
To run your analytics, you’ll use the following API calls to build your tracking plan:
Identify call: this call lets you "create" a user and tie a user to their actions and record traits (attributes) about them. It requires unique User ID and any optional traits you know about the user, like their email, name, and more.
Group call (optional): this is how you associate an individual user with a group— company, organization, account, project, or team - you name it. It includes a unique Group ID and any optional traits you know about the group, like the plan they are on, name, members etc.
Track event: this is how you record any actions your users perform, along with any properties that describe the action.
How and when to use these calls
Identify users first
The first thing you should do is to identify your users. You’ll do this every time a user comes to your app, from the sign-up onwards, typically when you check a user has the right credentials to access your app.
The first identify call should be triggered just after the sign-up action. This will create a user through the unique User ID that you use in your database.
Every other time a user connects to your app make sure to fire an identify call. This will make sure that the user is known and that all the actions performed will be assigned to that particular User ID. If you don’t do this, you’ll not be able to know who did “X”.
In the identify call you can include some additional information which are known as traits.
As a general rule, you should attach as traits all the information that are useful to classify and segment your users.
Example of typical user traits:
user permissions (admin, viewer, editor etc)
location (New York, San Francisco, London)
role (engineer, product manager, sales, customer success
Here's the documentation for the following sources: Segment, June SDK, Rudderstack
Identify groups
If you’re B2B or selling to group of users then probably you should be organizing users into groups (companies, accounts, workspaces, projects, organisation). Learn how and when it makes sense
This will enable you to check what’s the global behavior of a group of users. For example, you’ll be able to see how many users are active in that particular account you're meeting tomorrow, which features your top customers are not using etc.
Something like this:
Similar to what happens at a user level, you can add some additional information to the group in the form of traits.
Typically information like the ones below are great group traits :
technical setup (hubspot integration installed, connected stripe etc)
plan (free, pro, enterprise)
seats purchased (10, 25, 80)
As a general rule, you should attach as traits all the information that are useful to classify and segment your customers.
Here’s an in-depth article about traits.
Here’s an in-depth article about how to do it and here the documentation for the following sources: Segment, June SDK, Rudderstack
Track events
Now that you know who your users and companies are, you should start to track their behavior.
Specific actions that users perform can be tracked using track events. As a general rule, you should track only the actions that map to your main features and other core interactions like upgrade button clicked, invited a teammate, signed up etc.
To get started, try not to track more than 15-20 events and make sure that the most important ones are tracked in the back-end. In this way, ad blockers will not prevent the actions to be tracked.
Additional information about that particular action can be attached as an event property. Here’s an in-depth article about how and when to use event properties.
Make sure to name the events in a human-readable way. Here’s how we do it.
Here's the documentation for the following sources: Segment, June SDK, Rudderstack
If you're not really sure which source to use read this article
Here’s how our own tracking plan looks like
Identify calls and user traits
When people sign-up we ask them a couple of questions to get to know them better.
These information (role, industry, source of the sign up etc) are attached as traits in the identify call and then displayed in the user profile in June
Having these information (traits) allows us to run analytics on groups of users that have traits in common to answer questions like:
Are product managers more likely to retain compared to founders?
How many of my paying customers are from a B2B company? How many from a B2C?
After the first session, we keep sending identify calls every time someone comes to June to make sure that all the events performed are assigned to the right user.
Group calls and company traits
We’re selling product analytics to other companies so for us, company-level metrics are more important than user-level ones.
When someone signs up we first check if the someone else with the same domain already signed up. If not we create a new workspace and relative group ID for that company.
As group traits, we attach all the details relative to the data setup and the billing details so that we can create different reports on the basis of these data points.
In this way we can answer questions like:
What's the size of this company?
What is the MRR contribution?
Did they connect Segment as a data source?
Event tracking plan
General interactions
To capture the initials interactions with the product we track the following events:
signed_up: this event is triggered just after the first identify call
properties:
the source of the sign up (invited vs not invited) is passed as a property of this event
The authentication method (Google vs confirmation email) is passed as a property of this event
invited_a_temmate: this event is triggered when a user invites another one to its workspace
data_connected: this event is triggered when a user connects a data source to June
Property: the source is specified (Segment vs SDK vs Rudderstack vs Freshpaint) as a property. This information is also passed as a company trait by triggering a group call.
slack_connected: this event is triggered when a user connects Slack to June to receive updates and metrics. This information is also passed as a company trait by triggering a group call
hubspot_connected: this event is triggered when a user connects HubSpot to June to push traits and usage from June to HubSpot
plan_upgraded: this event is triggered when a user decides to upgrade the plan. This information is also passed as a company trait by triggering a group call.
property: the type of plan (Growth vs Scale) is specified as a property
Main workflow
The main value of June is around looking at a company dashboard and creating audiences based on their behaviour.
For this reason, we track the following events:
viewed_company: triggered when a user views a company dashboard
audience_created: triggered when a user creates a segment of users
properties:
filters ( 3, 5, 10) is the number of filters added by the users so that we understand how complex these audiences are
object_type (user, group) is the type of object selected for the audience
audience_viewed: triggered when a user opens an audience that already exists.
user_trait_filter_added: triggered when a user changes the setup of a report by adding some user traits filters
group_trait_filter_added: triggered when a user add a group filter on the people list
added_crm_mapping: triggered when a user maps a new trait to be synced.
properties:
crm (Attio, Salesforce or Hubspot) tells us which integration the customer is using