From 7cbbe9ba45d0ff641b84a43a86a9b41c779c6ec5 Mon Sep 17 00:00:00 2001
From: Vijay Jayaram
+
+
[Learn more about Event Properties](https://help.mixpanel.com/hc/en-us/articles/360001355266)|
+|Super Properties|Super Properties are a type of Event Property that you can initialise to automatically attach to every subsequent Event you’re tracking at client side.
[Learn more about Super Properties](https://help.mixpanel.com/hc/en-us/articles/360001355266#super-properties-for-events)|
+|User Profile Properties|User Profile Properties describe your users (they typically store current demographical information). User profiles are joined to events on `event.distinct_id = user_profile.distinct_id`
[Learn more about User Profile Properties](https://help.mixpanel.com/hc/en-us/articles/115004708186)|
+|Group Profile Properties|Group Profile Properties describe group level information (similar to User Profiles Properties at user level). With Mixpanel’s Group Analytics, multiple users can be grouped and behavioural data analysed at a customised group level (such as company, account). Group profiles are joined to events on your chosen group key. For example, if you create a new group key for `company_id` your events will be joined on `event.company_id = group_profile.company_id`
[Learn more about Group Analytics](https://help.mixpanel.com/hc/en-us/articles/360025333632-Group-Analytics) and [Group Profile Properties](https://help.mixpanel.com/hc/en-us/articles/360025333632-Group-Analytics#group-profiles)|
+|Lookup Tables|Lookup Tables allow you to dynamically extend additional properties mapped to an exiting Event or User Property. For example, if you create a lookup table for "Songs" (with additional properties like `hash_tags`, `top_10`, `all_time_favorite`) and specify the mapped event property as `song_id`; you can use these additional properties when doing filtering or breakdowns for events that has `song_id` as an event property.
[Learn more about Lookup Tables](https://help.mixpanel.com/hc/en-us/articles/360044139291-Lookup-tables)|
+|Default Properties|Default Properties (for Events and User Profiles) are collected and populated with values automatically in Mixpanel. This can happen upon data ingestion or when using certain Mixpanel client-side SDKs. Typically, they have a dollar sign ($) or “mp_” as prefix to distinguish them from normal properties.
[Learn more about Default Properties](https://help.mixpanel.com/hc/en-us/articles/115004613766-What-properties-do-Mixpanel-s-libraries-store-by-default-)|
+|Reserved Properties|Mixpanel reserves certain property names (for Events and User Profiles) for special use cases, and these may or may not be automatically populated with values. The purpose of these Reserved Properties are for processing (eg time) or specific system features (cohort exports). Examples: time, $email, $phone, $name, $created.
Learn more about reserved properties for [Events](https://help.mixpanel.com/hc/en-us/articles/360001355266#reserved-properties-for-events) and [User Profiles](https://help.mixpanel.com/hc/en-us/articles/115004708186#reserved-properties-for-user-profiles)|
+
+## Properties: Supported Data Types
+Mixpanel supports five data types for event and user profile properties: String, Numeric, Boolean, Date and List. By choosing the most suitable data type for your properties, you'd be able to apply a set of functions or operators that are most relevant to your properties in Mixpanel reports, and this will give you richer insights about your data.
+
+**String**
+- Alphanumeric value e.g. Plan Type = "Free", Artist Name = "Bruno Mars"
+- String properties have a character limit of 255 bytes.
+- Mixpanel will treat any property value that doesn’t match any other data type as a String.
+
+**Numeric**
+- Numeric (integer or decimal) value e.g. Cost = 15.00, Quantity = 5
+- You can apply operators such as sum, median and percentile on numeric properties.
+
+**Boolean**
+- Mixpanel treats properties as boolean if the value is either the JSON constant `true` or `false` e.g. Favorited = true, Bookmarked = false.
+- On Mixpanel, you can typecast any non-boolean property to boolean,
+- "false", 0, null, undefined, and empty string will be typecasted to boolean `false`
+- "true" and any set value that is not 0 or empty string will be typecasted to boolean `true`
+
+**Date**
+- An ISO formatted date `YYYY-MM-DDTHH:MM:SS` in UTC e.g. Last Purchase = "2022-10-30T13:30:25", Last Login = "2022-10-29". Note that all timestamps need to be sent in UTC timezone in an ISO format.
+- Mixpanel treats unix timestamps as Numeric property, however, you can typecast it to Date data type.
+
+**List**
+- A list of values as a JSON array e.g Favourite Genres = ["Folk","Alternative"] or Favourite Numbers = [1,5,10.0]
+- Here are the size limits of List property,
+- List event property: 8KB
+- List user profile property: 256KB
+- Each item in the list: 255 bytes
+
+## Updating User Profile Properties
+Mixpanel user profile properties are mutable and they can be updated in a timely manner to reflect the latest state of the users.
+
+You can update user profile properties via [Mixpanel SDK](https://developer.mixpanel.com/docs/javascript#setting-profile-properties) or [Engage API](https://developer.mixpanel.com/reference/profile-set). The following are the operations supported in Mixpanel.
+
+**Setting profile property**
+`$set` - Sets a profile property or update a profile property value.
+`$set_once` - Sets a profile property only if they do not yet exist on Mixpanel. This ensures that the previous profile property value is not overwritten.
+
+**Updating numeric profile property**
+`$add` - Increments or decrements a numeric profile property.
+
+**Updating list profile property**
+`$union` - Merges a given list into a List profile property and it ensures there are no duplicate values in the profile property.
+`$append` - Appends a value to the end of a List profile property
+`$remove` - Removes a value from a List profile property
+
+**Removing profile properties**
+`$unset` - Remove a profile property from the user profile
+`$delete` - Remove all profile properties from the user profile.
From 0e9ee1bd2365871830dbe610ce59dd7dbb562b1c Mon Sep 17 00:00:00 2001
From: Naitik Soni <91239827+naitik-mixpanel@users.noreply.github.com>
Date: Fri, 28 Apr 2023 17:56:59 +0530
Subject: [PATCH 017/123] Create mixpanel-for-developers-implementation.md
---
.../mixpanel-for-developers-implementation.md | 38 +++++++++++++++++++
1 file changed, 38 insertions(+)
create mode 100644 pages/tutorials/mixpanel-for-developers-implementation.md
diff --git a/pages/tutorials/mixpanel-for-developers-implementation.md b/pages/tutorials/mixpanel-for-developers-implementation.md
new file mode 100644
index 0000000000..f2e7505fb1
--- /dev/null
+++ b/pages/tutorials/mixpanel-for-developers-implementation.md
@@ -0,0 +1,38 @@
+## Implement via the Mixpanel SDK
+[Implement via the Mixpanel SDK](https://www.loom.com/share/659097217a0c41d189b67f47356d3831)
+
+## Initialise SDK
+[Initialise SDK](https://www.loom.com/share/e3df729308114aa4bbf14ee74f37c0f8)
+
+## Super Properties and Track Event
+[Super Properties and Track Event]()
+
+## Setting Profile Properties
+[Setting Profile Properties]()
+
+## Other Ingestion methods
+[Other Ingestion methods](https://www.loom.com/share/089c6b39964745c9b208fd81336bc0bc)
+
+## FAQs
+#### What are the different SDKs available by Mixpanel
+- Supported client-side libraries: [JavaScript](https://developer.mixpanel.com/docs/javascript), [iOS - Objective-C](https://developer.mixpanel.com/docs/ios), [iOS - Swift](https://developer.mixpanel.com/docs/swift), [Android](https://developer.mixpanel.com/docs/android), [React Native](https://developer.mixpanel.com/docs/react-native), [Flutter](https://developer.mixpanel.com/docs/flutter), [Unity](https://developer.mixpanel.com/docs/unity)
+- Supported server-side libraries: [Python](https://developer.mixpanel.com/docs/python), [Java](https://developer.mixpanel.com/docs/java), [PHP](https://developer.mixpanel.com/docs/php), [Ruby](https://developer.mixpanel.com/docs/ruby), [NodeJS](https://developer.mixpanel.com/docs/nodejs)
+- [REST HTTP API](https://developer.mixpanel.com/reference/ingestion-api)
+
+
+#### Does Mixpanel have auto-track?
+Mixpanel does not have autotrack. You can read more about it in [our article](https://help.mixpanel.com/hc/en-us/articles/115004600343).
+
+
+#### Browser Cookies are unreliable, is there another way?
+You can switch from cookie to local storage. You can read more about it [our article](https://help.mixpanel.com/hc/en-us/articles/115004546863#switch-from-cookies-to-localstorage).
+
+
+#### What’s the difference between $mp_api_timestamp_ms and $time and $mp_processing_time_ms?
+`$mp_api_timestamp_ms` - the timestamp when the data is available for querying in reports.
+`$mp_processing_time_ms` - when it was actually processed (think of the remap service where we drop the events and props that are dropped via lexicon, where we change the distinct and and so on
+`time` - actual time of the event (which could be from days in the past), typically set when mixpanel.track() is called in the SDKs or filled in directly as part of a API payload.
+
+
+#### How to handle Date of Birth before 1/1/1970?
+While the timestamp values are recommended to send in the ISO format, for dates before 1st January 1970, you can send the value like “YYYY-MM-DD”.
From c598275749392c8497bd12468e7dccb408d050f7 Mon Sep 17 00:00:00 2001
From: Naitik Soni <91239827+naitik-mixpanel@users.noreply.github.com>
Date: Fri, 28 Apr 2023 17:57:53 +0530
Subject: [PATCH 018/123] Create mixpanel-for-developers-id-management.md
---
pages/tutorials/mixpanel-for-developers-id-management.md | 8 ++++++++
1 file changed, 8 insertions(+)
create mode 100644 pages/tutorials/mixpanel-for-developers-id-management.md
diff --git a/pages/tutorials/mixpanel-for-developers-id-management.md b/pages/tutorials/mixpanel-for-developers-id-management.md
new file mode 100644
index 0000000000..3d949414a3
--- /dev/null
+++ b/pages/tutorials/mixpanel-for-developers-id-management.md
@@ -0,0 +1,8 @@
+## ID Management Overview
+[ID Management Overview](https://www.loom.com/share/01dcff45ee91473a9e6ddb1670fd6cba)
+
+## Basic concepts in ID Merge
+[Basic concepts in ID Merge](https://www.loom.com/share/f8f0ee64496a402d83246b111cdd051c)
+
+## ID Merge implementation Overview
+[ID Merge implementation Overview](https://www.loom.com/share/9941b613dd044536ba1962ddb6a32ccd)
From 3f3ebd956b0b3803a0bce16e53c95d8eaebdfcd6 Mon Sep 17 00:00:00 2001
From: Naitik Soni <91239827+naitik-mixpanel@users.noreply.github.com>
Date: Fri, 28 Apr 2023 18:13:07 +0530
Subject: [PATCH 019/123] Update mixpanel-for-developers-implementation.md
Updated all Loom Links
---
pages/tutorials/mixpanel-for-developers-implementation.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/pages/tutorials/mixpanel-for-developers-implementation.md b/pages/tutorials/mixpanel-for-developers-implementation.md
index f2e7505fb1..364e827b49 100644
--- a/pages/tutorials/mixpanel-for-developers-implementation.md
+++ b/pages/tutorials/mixpanel-for-developers-implementation.md
@@ -5,10 +5,10 @@
[Initialise SDK](https://www.loom.com/share/e3df729308114aa4bbf14ee74f37c0f8)
## Super Properties and Track Event
-[Super Properties and Track Event]()
+[Super Properties and Track Event](https://www.loom.com/share/d651d02c989542c390ba3df6739de941)
## Setting Profile Properties
-[Setting Profile Properties]()
+[Setting Profile Properties](https://www.loom.com/share/c382d447568d4cca9db2da8fefba1176)
## Other Ingestion methods
[Other Ingestion methods](https://www.loom.com/share/089c6b39964745c9b208fd81336bc0bc)
From 368294587810e4db2609f50dc9f3f21c98099df8 Mon Sep 17 00:00:00 2001
From: Naitik Soni <91239827+naitik-mixpanel@users.noreply.github.com>
Date: Fri, 28 Apr 2023 18:16:20 +0530
Subject: [PATCH 020/123] Update mixpanel-for-developers-implementation.md
---
.../mixpanel-for-developers-implementation.md | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/pages/tutorials/mixpanel-for-developers-implementation.md b/pages/tutorials/mixpanel-for-developers-implementation.md
index 364e827b49..b092e15786 100644
--- a/pages/tutorials/mixpanel-for-developers-implementation.md
+++ b/pages/tutorials/mixpanel-for-developers-implementation.md
@@ -14,25 +14,25 @@
[Other Ingestion methods](https://www.loom.com/share/089c6b39964745c9b208fd81336bc0bc)
## FAQs
-#### What are the different SDKs available by Mixpanel
+#### 1. What are the different SDKs available by Mixpanel
- Supported client-side libraries: [JavaScript](https://developer.mixpanel.com/docs/javascript), [iOS - Objective-C](https://developer.mixpanel.com/docs/ios), [iOS - Swift](https://developer.mixpanel.com/docs/swift), [Android](https://developer.mixpanel.com/docs/android), [React Native](https://developer.mixpanel.com/docs/react-native), [Flutter](https://developer.mixpanel.com/docs/flutter), [Unity](https://developer.mixpanel.com/docs/unity)
- Supported server-side libraries: [Python](https://developer.mixpanel.com/docs/python), [Java](https://developer.mixpanel.com/docs/java), [PHP](https://developer.mixpanel.com/docs/php), [Ruby](https://developer.mixpanel.com/docs/ruby), [NodeJS](https://developer.mixpanel.com/docs/nodejs)
- [REST HTTP API](https://developer.mixpanel.com/reference/ingestion-api)
-#### Does Mixpanel have auto-track?
+#### 2. Does Mixpanel have auto-track?
Mixpanel does not have autotrack. You can read more about it in [our article](https://help.mixpanel.com/hc/en-us/articles/115004600343).
-#### Browser Cookies are unreliable, is there another way?
+#### 3. Browser Cookies are unreliable, is there another way?
You can switch from cookie to local storage. You can read more about it [our article](https://help.mixpanel.com/hc/en-us/articles/115004546863#switch-from-cookies-to-localstorage).
-#### What’s the difference between $mp_api_timestamp_ms and $time and $mp_processing_time_ms?
+#### 4. What’s the difference between $mp_api_timestamp_ms and $time and $mp_processing_time_ms?
`$mp_api_timestamp_ms` - the timestamp when the data is available for querying in reports.
`$mp_processing_time_ms` - when it was actually processed (think of the remap service where we drop the events and props that are dropped via lexicon, where we change the distinct and and so on
`time` - actual time of the event (which could be from days in the past), typically set when mixpanel.track() is called in the SDKs or filled in directly as part of a API payload.
-#### How to handle Date of Birth before 1/1/1970?
+#### 5. How to handle Date of Birth before 1/1/1970?
While the timestamp values are recommended to send in the ISO format, for dates before 1st January 1970, you can send the value like “YYYY-MM-DD”.
From 8534416e94c5f7104f2b18383aa704d02fd40f87 Mon Sep 17 00:00:00 2001
From: Naitik Soni <91239827+naitik-mixpanel@users.noreply.github.com>
Date: Fri, 28 Apr 2023 18:22:11 +0530
Subject: [PATCH 021/123] Update mixpanel-for-developers-id-management.md
---
.../mixpanel-for-developers-id-management.md | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/pages/tutorials/mixpanel-for-developers-id-management.md b/pages/tutorials/mixpanel-for-developers-id-management.md
index 3d949414a3..74ec877c97 100644
--- a/pages/tutorials/mixpanel-for-developers-id-management.md
+++ b/pages/tutorials/mixpanel-for-developers-id-management.md
@@ -6,3 +6,24 @@
## ID Merge implementation Overview
[ID Merge implementation Overview](https://www.loom.com/share/9941b613dd044536ba1962ddb6a32ccd)
+
+---
+
+# FAQs
+#### 1. How does Original ID Merge work under the hood?
+ID Merge is essentially the process of merging two users into one user on Mixpanel via Identify, Alias or Merge methods. You can also think of ID Merge as the process of merging two Distinct IDs (or two Identity Clusters) into one Identity Cluster pointing to an individual user on Mixpanel.
+Under the hood, out of the two profiles that are chosen for merging, only one will become the “winning” profile and be retained on Mixpanel whereas the other one will be hidden away. The events on the hidden profile will be migrated over to the winning profile to give you the complete user journey view in the merged profile (take note that the profile properties on hidden profiles will remain hidden).
+The Canonical Distinct ID on the winning profile will become the new Canonical Distinct ID of the merged profile.
+
+
+#### 2. Can I set my User ID as the Canonical Distinct ID? I have already called mixpanel.identify("User ID") but I don't see User ID shows up as the (main) Canonical ID on Mixpanel profiles.
+No, you have no control of the **[Canonical Distinct ID](https://help.mixpanel.com/hc/en-us/articles/360041039771#:~:text=Canonical%20Distinct%20ID)** when on Original ID Merge. It is decided by Mixpanel system. In Original ID Merge, the Canonical Distinct ID is re-decided whenever there are new ID merges to an existing Identity Cluster via **[Identify, Alias or Merge methods](https://help.mixpanel.com/hc/en-us/articles/360041039771#:~:text=and%20data%20exports.-,User%20Identification,-While%20Mixpanel%20ultimately)**, so the user’s Canonical Distinct ID may change over time.
+That being said, as long as the User ID had been added to the Identity Cluster, you can send events and profile properties to Mixpanel via User ID. Upon receiving these data, Mixpanel will resolve the User ID to the Canonical Distinct ID within the same Identity Cluster to link the data to the correct user. This is solved in Simplified ID Merge.
+
+
+#### 3. Is ID Merge retroactive? I’m planning to merge 2 separate users on Mixpanel via ID Merge and I want to visualise their events in a single activity feed.
+Yes, ID Merge is retroactive. During an ID Merge, Mixpanel merges the historical events of both users into a single user profile. New events will also be added to the merged profile going forward.
+
+
+#### 4. There is a limit of 500 Distinct IDs per Identity Cluster. What happens when the limit is hit?
+In Original ID Merge, once the Identity Cluster accumulates up to 500 Distinct IDs, you will no longer be able to merge new ID into the Identity Cluster via Identify, Alias or Merge methods. The new ID will end up as a separate user profile on Mixpanel.
From 9e2cd38313fafb5f1d1abc0202c592b1e17ec27d Mon Sep 17 00:00:00 2001
From: Naitik Soni <91239827+naitik-mixpanel@users.noreply.github.com>
Date: Fri, 28 Apr 2023 18:40:59 +0530
Subject: [PATCH 022/123] Update mixpanel-for-developers-id-management.md
---
.../mixpanel-for-developers-id-management.md | 44 ++++++++++++++++++-
1 file changed, 43 insertions(+), 1 deletion(-)
diff --git a/pages/tutorials/mixpanel-for-developers-id-management.md b/pages/tutorials/mixpanel-for-developers-id-management.md
index 74ec877c97..303ed197fd 100644
--- a/pages/tutorials/mixpanel-for-developers-id-management.md
+++ b/pages/tutorials/mixpanel-for-developers-id-management.md
@@ -7,9 +7,49 @@
## ID Merge implementation Overview
[ID Merge implementation Overview](https://www.loom.com/share/9941b613dd044536ba1962ddb6a32ccd)
+
+## Understanding Original ID Merge
+Learn more about how [Original ID Merge](https://help.mixpanel.com/hc/en-us/articles/360041039771) works.
+
+## Understanding Simplified ID Merge
+Learn more about how [Simplified ID Merge](https://help.mixpanel.com/hc/en-us/articles/14377628688788) works.
+
+
+## ID Merge Implementation Best Practices
+#### Call mixpanel.identify upon a successful sign-up / login or when an app is re-opened in a logged in state
+By calling mixpanel.identify at these specific points in user journeys, you would be able to link the pre and post-login events to the same user on Mixpanel. Besides, calling mixpanel.identify when the users re-open the app in a logged in state ensures that all events in the session are tracked with the user's identifier such as user id.
+
+
+#### Identify your users consistently on Mixpanel
+Once the users are assigned a unique identifier such as user id upon successful registration, you should call mixpanel.identify with the same user id going forward.
+That being said, you can call mixpanel.identify with a different identifier if your users are identified differently on another platforms. However, you would need to merge multiple identifiers belong to the same user into one Identity Cluster. This ensures that events with different identifiers are linked to the same user on Mixpanel.
+
+
+#### Track the unique identifier as a super property and user property to assist troubleshooting
+You can track the user's unique identifier as a [super property via mixpanel.register](https://developer.mixpanel.com/docs/javascript#super-properties) and [user property via mixpanel.people.set](https://developer.mixpanel.com/docs/javascript#setting-profile-properties) as soon as it is available in the app i.e. on a successful sign-up / login or when an app is re-opened in a logged in state.
+In the cases when ID Merge is not implemented properly, you can rely on these properties for troubleshooting purpose.
+
+
+#### Avoid creating profiles for anonymous users
+Avoid creating profiles for anonymous users via [mixpanel.people.set()](https://developer.mixpanel.com/docs/javascript#setting-profile-properties) followed by [identify(anonymous_id)](https://developer.mixpanel.com/docs/javascript#identify).
+If possible, cache user profile properties updates in cookie or local storage and only send them to Mixpanel after the users identify themselves via mixpanel.identify(user_id).
+
+
+#### QA your ID management implementation during development phase
+Here are a few things to look out for during QA:
+- Ensure that cross-platform, pre and post-registration events are linked to the same user on Mixpanel.
+- Ensure that no duplicate profiles are created as the users go through the onboarding, registration, login and cross-platform user journey.
+- Ensure that all the user’s identifiers are stored in the same Identity Cluster and all their events are displayed on a single profile on Mixpanel.
+
+
+#### Keep a record of your ID management implementation
+We encourage you to document your implementation (or create a diagram of the implementation). This will come in handy when you need to re-implement this on a new platform or troubleshoot ID management issue.
+
+Read more about [ID Merge Implementation Best Practices](https://help.mixpanel.com/hc/en-us/articles/9648680824852)
+
---
-# FAQs
+## FAQs
#### 1. How does Original ID Merge work under the hood?
ID Merge is essentially the process of merging two users into one user on Mixpanel via Identify, Alias or Merge methods. You can also think of ID Merge as the process of merging two Distinct IDs (or two Identity Clusters) into one Identity Cluster pointing to an individual user on Mixpanel.
Under the hood, out of the two profiles that are chosen for merging, only one will become the “winning” profile and be retained on Mixpanel whereas the other one will be hidden away. The events on the hidden profile will be migrated over to the winning profile to give you the complete user journey view in the merged profile (take note that the profile properties on hidden profiles will remain hidden).
@@ -27,3 +67,5 @@ Yes, ID Merge is retroactive. During an ID Merge, Mixpanel merges the historical
#### 4. There is a limit of 500 Distinct IDs per Identity Cluster. What happens when the limit is hit?
In Original ID Merge, once the Identity Cluster accumulates up to 500 Distinct IDs, you will no longer be able to merge new ID into the Identity Cluster via Identify, Alias or Merge methods. The new ID will end up as a separate user profile on Mixpanel.
+
+Read more FAQs on [Originial vs Simplified ID Merge](https://help.mixpanel.com/hc/en-us/articles/14383975110292)
From 4577be730834e9ed1e4b34fd75de3fdb677516b1 Mon Sep 17 00:00:00 2001
From: Naitik Soni <91239827+naitik-mixpanel@users.noreply.github.com>
Date: Fri, 28 Apr 2023 18:41:28 +0530
Subject: [PATCH 023/123] Update mixpanel-for-developers-implementation.md
---
pages/tutorials/mixpanel-for-developers-implementation.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/pages/tutorials/mixpanel-for-developers-implementation.md b/pages/tutorials/mixpanel-for-developers-implementation.md
index b092e15786..14eeaa03be 100644
--- a/pages/tutorials/mixpanel-for-developers-implementation.md
+++ b/pages/tutorials/mixpanel-for-developers-implementation.md
@@ -13,6 +13,8 @@
## Other Ingestion methods
[Other Ingestion methods](https://www.loom.com/share/089c6b39964745c9b208fd81336bc0bc)
+---
+
## FAQs
#### 1. What are the different SDKs available by Mixpanel
- Supported client-side libraries: [JavaScript](https://developer.mixpanel.com/docs/javascript), [iOS - Objective-C](https://developer.mixpanel.com/docs/ios), [iOS - Swift](https://developer.mixpanel.com/docs/swift), [Android](https://developer.mixpanel.com/docs/android), [React Native](https://developer.mixpanel.com/docs/react-native), [Flutter](https://developer.mixpanel.com/docs/flutter), [Unity](https://developer.mixpanel.com/docs/unity)
From f5ef1ebadbbf796f875023c9401f995f91775d6d Mon Sep 17 00:00:00 2001
From: yc
+ +
+ +### Analyzing User Trends ++ +
+ +### Insights Advanced Data Functions ++ +
+ +### Insights Cohorts User Profile ++ +
+ ## Funnels: Understanding Conversions [Introduction to Mixpanel's Funnels Reports](https://www.loom.com/share/085c4a16c3f74abf92db185ae55aaf6c) @@ -38,4 +52,7 @@ Log in to your Mixpanel account to follow along. Don't have an account yet? Get [Signal](https://www.loom.com/share/53f01027582b4b8f891a0da0bb6a05b3) [Impact](https://www.loom.com/share/d5e7875bbcfd46908898905a096da8e7) +## Data Management: Lexicon +[Lexicon](https://www.loom.com/share/29d018c3ad894d1fb9b7be08bc3ee06a) + From 9e77381c686890aa35f926876a8ec9b6b0b215b6 Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 12:56:12 +0800 Subject: [PATCH 032/123] Update creating-a-tracking-plan.md --- pages/tutorials/creating-a-tracking-plan.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tutorials/creating-a-tracking-plan.md b/pages/tutorials/creating-a-tracking-plan.md index 371f59c890..16dedeee68 100644 --- a/pages/tutorials/creating-a-tracking-plan.md +++ b/pages/tutorials/creating-a-tracking-plan.md @@ -30,4 +30,4 @@ Mixpanel provides the following templates for vertical-specific tracking plans: - [SaaS](https://docs.google.com/spreadsheets/d/1A5wm5MKzRfSOZfUfCAg8YpePiz8Jn3Ar_u8KBo5lD6g/edit?usp=sharing) - [Financial Services](https://docs.google.com/spreadsheets/d/1oGv6vbIFiYbima9IX4ItpBJvuChs-zzh83MRt_dSPgg/edit?usp=sharing) -You can also access a copy of a [blank Tracking Plan from here](https://docs.google.com/spreadsheets/d/1ZdOZ6TMtRPxy7qRxiLsvH9HWcHJM6nZydWKoThRxFKc/edit#gid=1641519238). Save a copy to your device to get started on your tracking plan. +You can also access a copy of a [blank Tracking Plan from here](https://docs.google.com/spreadsheets/d/1ZdOZ6TMtRPxy7qRxiLsvH9HWcHJM6nZydWKoThRxFKc/edit#gid=1641519238). Save a copy to your device to get started on your tracking plan From d38f1aa073e409f42bab318ca2aff63141dccfc6 Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 12:58:30 +0800 Subject: [PATCH 033/123] Update creating-a-tracking-plan.md --- pages/tutorials/creating-a-tracking-plan.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tutorials/creating-a-tracking-plan.md b/pages/tutorials/creating-a-tracking-plan.md index 16dedeee68..371f59c890 100644 --- a/pages/tutorials/creating-a-tracking-plan.md +++ b/pages/tutorials/creating-a-tracking-plan.md @@ -30,4 +30,4 @@ Mixpanel provides the following templates for vertical-specific tracking plans: - [SaaS](https://docs.google.com/spreadsheets/d/1A5wm5MKzRfSOZfUfCAg8YpePiz8Jn3Ar_u8KBo5lD6g/edit?usp=sharing) - [Financial Services](https://docs.google.com/spreadsheets/d/1oGv6vbIFiYbima9IX4ItpBJvuChs-zzh83MRt_dSPgg/edit?usp=sharing) -You can also access a copy of a [blank Tracking Plan from here](https://docs.google.com/spreadsheets/d/1ZdOZ6TMtRPxy7qRxiLsvH9HWcHJM6nZydWKoThRxFKc/edit#gid=1641519238). Save a copy to your device to get started on your tracking plan +You can also access a copy of a [blank Tracking Plan from here](https://docs.google.com/spreadsheets/d/1ZdOZ6TMtRPxy7qRxiLsvH9HWcHJM6nZydWKoThRxFKc/edit#gid=1641519238). Save a copy to your device to get started on your tracking plan. From aa96ff1a9ed00aa3a38cfaa9b913e85fa28514a2 Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 13:16:24 +0800 Subject: [PATCH 034/123] Creating sub-folder for Mixpanel for Developers --- .../mixpanel-for-developers-fundamentals.md | 77 +++++++++++++++++++ .../mixpanel-for-developers-id-management.md | 71 +++++++++++++++++ .../mixpanel-for-developers-implementation.md | 40 ++++++++++ 3 files changed, 188 insertions(+) create mode 100644 pages/tutorials/developers/mixpanel-for-developers-fundamentals.md create mode 100644 pages/tutorials/developers/mixpanel-for-developers-id-management.md create mode 100644 pages/tutorials/developers/mixpanel-for-developers-implementation.md diff --git a/pages/tutorials/developers/mixpanel-for-developers-fundamentals.md b/pages/tutorials/developers/mixpanel-for-developers-fundamentals.md new file mode 100644 index 0000000000..24b437cb32 --- /dev/null +++ b/pages/tutorials/developers/mixpanel-for-developers-fundamentals.md @@ -0,0 +1,77 @@ +## Tutorial Overview +Hello and welcome to Mixpanel for Developers Tutorial. + +This tutorial is going to consist of a couple of modules designed to help everyone understand events and properties in Mixpanel, help developers understand the Data Type it supports and how to send events to Mixpanel and enrich user data that have been documented in your Tracking Plan. + +We will also explore Mixpanel’s ID management Solution for Product Managers and Analysts to identify visitors as they go from an anonymous state to a known state and even when visitors use different devices. + +## Mixpanel Data Model +Mixpanel data is stored and isolated within a project. Mixpanel recommends tracking 1 product with multiple platforms (mobile, web, etc.) into one project, but create separate projects for development and production. + +There may be other factors where implementing separate projects is required, but do note that querying data across projects is not possible. Mixpanel supports a few different categories of data that can be used for analysis: events, user profiles, group profiles, and lookup tables. In data warehouse terminology, events make up the fact table while user profiles, group profiles, and lookup tables are dimension tables. + +[Mixpanel Data Model](https://www.loom.com/share/fc9390690f1e4d84ab926dcf54914118) + +## Mixpanel Property Types +Properties are attributes that help you define the specifics of an **Event** or a **User.** +Mixpanel has many Properties defined in its Data Model. + +||| +|------------- |:-------------| +|Event Properties|Event Properties describes the events that are tracked within your product.+ +
## Insights -### Intro to Mixpanel Insights Report +### Insights Report Overview +### Analyzing User Trends +
### Insights Advanced Data Functions +
-### Insights Cohorts User Profile +### Visualizing User Cohorts and Profiles +
- ## Funnels: Understanding Conversions -[Introduction to Mixpanel's Funnels Reports](https://www.loom.com/share/085c4a16c3f74abf92db185ae55aaf6c) -[Funnels Conversion Criteria](https://www.loom.com/share/56c79ac257f343d98bd9eef1f7271299) -[Funnels Advanced Data Functions](https://www.loom.com/share/1c5da3ec08cd4aa090b90359cbcd8a34) +### Funnels Reports Overview + +
+ +
+ +### Funnels Conversion Criteria + ++ +
+ +### Funnels Advanced Data Functions + ++ +
+ +## Retention + ++ +
+ +### Retention Report Overview + ++ +
-## Retention: xxx -[Retention](https://www.loom.com/share/15457e2f5d2a4d0983b535931582cd17) -[Retention Criteria](https://www.loom.com/share/565ed521880d4d7e9f68c821645b99cc) -[Interpreting Retention](https://www.loom.com/share/c5c83d9dd0c24d5a8ab9596c8d592e95) -[Retention Frequency Analysis](https://www.loom.com/share/f70e5ef9f6c0439ab558a5181d89bb51) +### Retention Criteria -## Flows: xxx ++ +
+ +### Interpreting Mixpanel Retention Report + ++ +
+ +### Retention Frequency Analysis -[Flows](https://www.loom.com/share/2dc0c322fd2d4000a4507a1a9c8d6fa7) ++ +
-## Other Reports -[Signal](https://www.loom.com/share/53f01027582b4b8f891a0da0bb6a05b3) -[Impact](https://www.loom.com/share/d5e7875bbcfd46908898905a096da8e7) +## Flows +### Flows Report Overview + ++ +
+ +## Signal +### Signal Report Overview + ++ +
+ + +## Impact +### Impact Report Overview + ++ +
## Data Management: Lexicon -[Lexicon](https://www.loom.com/share/29d018c3ad894d1fb9b7be08bc3ee06a) +### Lexicon Overview ++ +
+ +## Cohort +### Cohort Overview + ++ +
From d09d09b36bb1ced7c2b84c7d9c01ef48e75e0bb4 Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 13:17:41 +0800 Subject: [PATCH 036/123] Update _meta.json --- pages/tutorials/_meta.json | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/tutorials/_meta.json b/pages/tutorials/_meta.json index 67f8693bb8..7f894fa34d 100644 --- a/pages/tutorials/_meta.json +++ b/pages/tutorials/_meta.json @@ -1,6 +1,7 @@ { "plan-your-implementation": "Plan Your Implementation", "creating-a-tracking-plan": "Creating a Tracking Plan", + "developers": "Mixpanel for Developers", "mixpanel-101": "Mixpanel 101", "migrating-to-mixpanel-from-amplitude": "Migrating to Mixpanel from Amplitude" } From 4c8714b986acefbfcee1e1709b67cd7561e279a5 Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 13:20:52 +0800 Subject: [PATCH 037/123] Add files via upload --- pages/tutorials/developers/_meta.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 pages/tutorials/developers/_meta.json diff --git a/pages/tutorials/developers/_meta.json b/pages/tutorials/developers/_meta.json new file mode 100644 index 0000000000..1cf0ac2d00 --- /dev/null +++ b/pages/tutorials/developers/_meta.json @@ -0,0 +1,5 @@ +{ + "mixpanel-for-developers-fundamentals": "Fundamentals", + "mixpanel-for-developers-implementation": "Implementation", + "mixpanel-for-developers-id-management": "Identity Management" +} From db1e839f38935e33b9e08c3692d2535aad14583e Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 13:26:15 +0800 Subject: [PATCH 038/123] Delete mixpanel-for-developers-fundamentals.md Moving into a main section Mixpanel for Developers --- .../mixpanel-for-developers-fundamentals.md | 77 ------------------- 1 file changed, 77 deletions(-) delete mode 100644 pages/tutorials/mixpanel-for-developers-fundamentals.md diff --git a/pages/tutorials/mixpanel-for-developers-fundamentals.md b/pages/tutorials/mixpanel-for-developers-fundamentals.md deleted file mode 100644 index 24b437cb32..0000000000 --- a/pages/tutorials/mixpanel-for-developers-fundamentals.md +++ /dev/null @@ -1,77 +0,0 @@ -## Tutorial Overview -Hello and welcome to Mixpanel for Developers Tutorial. - -This tutorial is going to consist of a couple of modules designed to help everyone understand events and properties in Mixpanel, help developers understand the Data Type it supports and how to send events to Mixpanel and enrich user data that have been documented in your Tracking Plan. - -We will also explore Mixpanel’s ID management Solution for Product Managers and Analysts to identify visitors as they go from an anonymous state to a known state and even when visitors use different devices. - -## Mixpanel Data Model -Mixpanel data is stored and isolated within a project. Mixpanel recommends tracking 1 product with multiple platforms (mobile, web, etc.) into one project, but create separate projects for development and production. - -There may be other factors where implementing separate projects is required, but do note that querying data across projects is not possible. Mixpanel supports a few different categories of data that can be used for analysis: events, user profiles, group profiles, and lookup tables. In data warehouse terminology, events make up the fact table while user profiles, group profiles, and lookup tables are dimension tables. - -[Mixpanel Data Model](https://www.loom.com/share/fc9390690f1e4d84ab926dcf54914118) - -## Mixpanel Property Types -Properties are attributes that help you define the specifics of an **Event** or a **User.** -Mixpanel has many Properties defined in its Data Model. - -||| -|------------- |:-------------| -|Event Properties|Event Properties describes the events that are tracked within your product.+ +
## Mixpanel Property Types Properties are attributes that help you define the specifics of an **Event** or a **User.** From d7b3af99d6f4f574eab6c076a3082b0ba3365cbb Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 13:48:31 +0800 Subject: [PATCH 042/123] Update mixpanel-for-developers-id-management.md Update loom videos as embedded --- .../mixpanel-for-developers-id-management.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pages/tutorials/developers/mixpanel-for-developers-id-management.md b/pages/tutorials/developers/mixpanel-for-developers-id-management.md index 303ed197fd..f1db35c008 100644 --- a/pages/tutorials/developers/mixpanel-for-developers-id-management.md +++ b/pages/tutorials/developers/mixpanel-for-developers-id-management.md @@ -1,12 +1,17 @@ ## ID Management Overview -[ID Management Overview](https://www.loom.com/share/01dcff45ee91473a9e6ddb1670fd6cba) ++ +
## Basic concepts in ID Merge -[Basic concepts in ID Merge](https://www.loom.com/share/f8f0ee64496a402d83246b111cdd051c) ++ +
## ID Merge implementation Overview -[ID Merge implementation Overview](https://www.loom.com/share/9941b613dd044536ba1962ddb6a32ccd) - ++ +
## Understanding Original ID Merge Learn more about how [Original ID Merge](https://help.mixpanel.com/hc/en-us/articles/360041039771) works. From 19e08504224c42259383e3211f4e9d92090ca296 Mon Sep 17 00:00:00 2001 From: yc+ +
diff --git a/pages/tutorials/mixpanel-analysis/flows.mdx b/pages/tutorials/mixpanel-analysis/flows.mdx new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pages/tutorials/mixpanel-analysis/funnels.mdx b/pages/tutorials/mixpanel-analysis/funnels.mdx new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pages/tutorials/mixpanel-analysis/impact.mdx b/pages/tutorials/mixpanel-analysis/impact.mdx new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pages/tutorials/mixpanel-analysis/insights.mdx b/pages/tutorials/mixpanel-analysis/insights.mdx new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pages/tutorials/mixpanel-analysis/retention.mdx b/pages/tutorials/mixpanel-analysis/retention.mdx new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pages/tutorials/mixpanel-analysis/signal.mdx b/pages/tutorials/mixpanel-analysis/signal.mdx new file mode 100644 index 0000000000..e69de29bb2 From b553624e61afafd207dd77146659b1a870e0e50f Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 13:50:31 +0800 Subject: [PATCH 044/123] Update mixpanel-for-developers-implementation.md Update loom videos as embedded --- .../mixpanel-for-developers-implementation.md | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/pages/tutorials/developers/mixpanel-for-developers-implementation.md b/pages/tutorials/developers/mixpanel-for-developers-implementation.md index 14eeaa03be..28cd0cf151 100644 --- a/pages/tutorials/developers/mixpanel-for-developers-implementation.md +++ b/pages/tutorials/developers/mixpanel-for-developers-implementation.md @@ -1,17 +1,27 @@ ## Implement via the Mixpanel SDK -[Implement via the Mixpanel SDK](https://www.loom.com/share/659097217a0c41d189b67f47356d3831) ++ +
## Initialise SDK -[Initialise SDK](https://www.loom.com/share/e3df729308114aa4bbf14ee74f37c0f8) ++ +
## Super Properties and Track Event -[Super Properties and Track Event](https://www.loom.com/share/d651d02c989542c390ba3df6739de941) ++ +
## Setting Profile Properties -[Setting Profile Properties](https://www.loom.com/share/c382d447568d4cca9db2da8fefba1176) ++ +
## Other Ingestion methods -[Other Ingestion methods](https://www.loom.com/share/089c6b39964745c9b208fd81336bc0bc) ++ +
--- From ce3a1965206047bfa17c5d0e8f22b958a4395b35 Mon Sep 17 00:00:00 2001 From: yc
Date: Mon, 8 May 2023 14:25:47 +0800
Subject: [PATCH 055/123] Update overview.md
---
pages/tutorials/mixpanel-analysis/overview.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pages/tutorials/mixpanel-analysis/overview.md b/pages/tutorials/mixpanel-analysis/overview.md
index 08c4f489c1..657c0fa289 100644
--- a/pages/tutorials/mixpanel-analysis/overview.md
+++ b/pages/tutorials/mixpanel-analysis/overview.md
@@ -1,3 +1,3 @@
-In this tutorial, we explore the fundamentals of how Mixpanel works and highlight some of the key features to get you started.
+In this tutorial, we will explore the fundamentals of how Mixpanel works and highlight some of the key features to get you started.
Log in to your Mixpanel account to follow along. Don't have an account yet? Get your free Mixpanel demo account [here](https://mixpanel.com/project/3/view/79/app/boards) to access the demo datasets.
From 267b10605463e6de62f7676240417df7964a35a1 Mon Sep 17 00:00:00 2001
From: yc
+
+
Date: Mon, 8 May 2023 14:34:21 +0800
Subject: [PATCH 059/123] Update board.mdx
---
pages/tutorials/mixpanel-analysis/board.mdx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pages/tutorials/mixpanel-analysis/board.mdx b/pages/tutorials/mixpanel-analysis/board.mdx
index 2b827f9bfe..9367178384 100644
--- a/pages/tutorials/mixpanel-analysis/board.mdx
+++ b/pages/tutorials/mixpanel-analysis/board.mdx
@@ -1,7 +1,7 @@
## Boards Overview
A Board is a collection of reports, text, and images or videos. Boards can also be created using the Mixpanel Templates feature.
-
+
+
+
+
+
+
+
Date: Mon, 8 May 2023 14:38:54 +0800
Subject: [PATCH 064/123] Update board.mdx
---
pages/tutorials/mixpanel-analysis/board.mdx | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/pages/tutorials/mixpanel-analysis/board.mdx b/pages/tutorials/mixpanel-analysis/board.mdx
index 9367178384..56300d1d1b 100644
--- a/pages/tutorials/mixpanel-analysis/board.mdx
+++ b/pages/tutorials/mixpanel-analysis/board.mdx
@@ -1,7 +1,8 @@
## Boards Overview
A Board is a collection of reports, text, and images or videos. Boards can also be created using the Mixpanel Templates feature.
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Lexicon is a data dictionary that stores descriptions of events and their properties.
+
+
+
+
[Learn more about Event Properties](https://help.mixpanel.com/hc/en-us/articles/360001355266)|
-|Super Properties|Super Properties are a type of Event Property that you can initialise to automatically attach to every subsequent Event you’re tracking at client side.
[Learn more about Super Properties](https://help.mixpanel.com/hc/en-us/articles/360001355266#super-properties-for-events)|
-|User Profile Properties|User Profile Properties describe your users (they typically store current demographical information). User profiles are joined to events on `event.distinct_id = user_profile.distinct_id`
[Learn more about User Profile Properties](https://help.mixpanel.com/hc/en-us/articles/115004708186)|
-|Group Profile Properties|Group Profile Properties describe group level information (similar to User Profiles Properties at user level). With Mixpanel’s Group Analytics, multiple users can be grouped and behavioural data analysed at a customised group level (such as company, account). Group profiles are joined to events on your chosen group key. For example, if you create a new group key for `company_id` your events will be joined on `event.company_id = group_profile.company_id`
[Learn more about Group Analytics](https://help.mixpanel.com/hc/en-us/articles/360025333632-Group-Analytics) and [Group Profile Properties](https://help.mixpanel.com/hc/en-us/articles/360025333632-Group-Analytics#group-profiles)|
-|Lookup Tables|Lookup Tables allow you to dynamically extend additional properties mapped to an exiting Event or User Property. For example, if you create a lookup table for "Songs" (with additional properties like `hash_tags`, `top_10`, `all_time_favorite`) and specify the mapped event property as `song_id`; you can use these additional properties when doing filtering or breakdowns for events that has `song_id` as an event property.
[Learn more about Lookup Tables](https://help.mixpanel.com/hc/en-us/articles/360044139291-Lookup-tables)|
-|Default Properties|Default Properties (for Events and User Profiles) are collected and populated with values automatically in Mixpanel. This can happen upon data ingestion or when using certain Mixpanel client-side SDKs. Typically, they have a dollar sign ($) or “mp_” as prefix to distinguish them from normal properties.
[Learn more about Default Properties](https://help.mixpanel.com/hc/en-us/articles/115004613766-What-properties-do-Mixpanel-s-libraries-store-by-default-)|
-|Reserved Properties|Mixpanel reserves certain property names (for Events and User Profiles) for special use cases, and these may or may not be automatically populated with values. The purpose of these Reserved Properties are for processing (eg time) or specific system features (cohort exports). Examples: time, $email, $phone, $name, $created.
Learn more about reserved properties for [Events](https://help.mixpanel.com/hc/en-us/articles/360001355266#reserved-properties-for-events) and [User Profiles](https://help.mixpanel.com/hc/en-us/articles/115004708186#reserved-properties-for-user-profiles)|
+|Property Type|Description|
+|:--- |:---|
+|[Event Properties](https://help.mixpanel.com/hc/en-us/articles/360001355266)|Event Properties describes the events that are tracked within your product.|
+|[Super Properties](https://help.mixpanel.com/hc/en-us/articles/360001355266#super-properties-for-events)|Super Properties are a type of Event Property that you can initialise to automatically attach to every subsequent Event you’re tracking at client side.|
+|[User Profile Properties](https://help.mixpanel.com/hc/en-us/articles/115004708186)|User Profile Properties describe your users (they typically store current demographical information). User profiles are joined to events on `event.distinct_id = user_profile.distinct_id`.|
+|[Group Profile Properties](https://help.mixpanel.com/hc/en-us/articles/360025333632-Group-Analytics#group-profiles)|Group Profile Properties describe group level information (similar to User Profiles Properties at user level). With Mixpanel’s [Group Analytics](https://help.mixpanel.com/hc/en-us/articles/360025333632), multiple users can be grouped and behavioural data analysed at a customised group level (such as company, account). Group profiles are joined to events on your chosen group key. For example, if you create a new group key for `company_id` your events will be joined on `event.company_id = group_profile.company_id`.|
+|[Lookup Tables](https://help.mixpanel.com/hc/en-us/articles/360044139291-Lookup-tables)|Lookup Tables allow you to dynamically extend additional properties mapped to an exiting Event or User Property. For example, if you create a lookup table for "Songs" (with additional properties like `hash_tags`, `top_10`, `all_time_favorite`) and specify the mapped event property as `song_id`; you can use these additional properties when doing filtering or breakdowns for events that has `song_id` as an event property.|
+|[Default Properties](https://help.mixpanel.com/hc/en-us/articles/115004613766-What-properties-do-Mixpanel-s-libraries-store-by-default-)|Default Properties (for Events and User Profiles) are collected and populated with values automatically in Mixpanel. This can happen upon data ingestion or when using certain Mixpanel client-side SDKs. Typically, they have a dollar sign ($) or “mp_” as prefix to distinguish them from normal properties.|
+|Reserved Properties|Mixpanel reserves certain property names (for [Events](https://help.mixpanel.com/hc/en-us/articles/360001355266#reserved-properties-for-events) and [User Profiles](https://help.mixpanel.com/hc/en-us/articles/115004708186#reserved-properties-for-user-profiles)) for special use cases, and these may or may not be automatically populated with values. The purpose of such Reserved Properties are for processing (ie event time stamping) or for specific system features (eg: cohort exports). Examples: `time`, `$email`, `$phone`, `$name`, `$created`.|
-## Properties: Supported Data Types
-Mixpanel supports five data types for event and user profile properties: String, Numeric, Boolean, Date and List. By choosing the most suitable data type for your properties, you'd be able to apply a set of functions or operators that are most relevant to your properties in Mixpanel reports, and this will give you richer insights about your data.
+### Supported Data Types
+Mixpanel supports five [data types](https://help.mixpanel.com/hc/en-us/articles/115004547063) for properties: String, Numeric, Boolean, Date and List. By choosing the most suitable data type for your properties, you'd be able to apply a set of [operators](https://help.mixpanel.com/hc/en-us/articles/115004547063#data-type-operators) that are most relevant to your properties in Mixpanel reports, and this will give you richer insights about your data.
**String**
- Alphanumeric value e.g. Plan Type = "Free", Artist Name = "Bruno Mars"
@@ -52,10 +52,7 @@ Mixpanel supports five data types for event and user profile properties: String,
**List**
- A list of values as a JSON array e.g Favourite Genres = ["Folk","Alternative"] or Favourite Numbers = [1,5,10.0]
-- Here are the size limits of List property,
-- List event property: 8KB
-- List user profile property: 256KB
-- Each item in the list: 255 bytes
+- Limits of a List property: Event Property = 8KB, User Profile Property = 256KB, Each item in the list: 255 bytes
## Updating User Profile Properties
Mixpanel user profile properties are mutable and they can be updated in a timely manner to reflect the latest state of the users.
@@ -63,17 +60,17 @@ Mixpanel user profile properties are mutable and they can be updated in a timely
You can update user profile properties via [Mixpanel SDK](https://developer.mixpanel.com/docs/javascript#setting-profile-properties) or [Engage API](https://developer.mixpanel.com/reference/profile-set). The following are the operations supported in Mixpanel.
**Setting profile property**
-`$set` - Sets a profile property or update a profile property value.
-`$set_once` - Sets a profile property only if they do not yet exist on Mixpanel. This ensures that the previous profile property value is not overwritten.
+- `$set` - Sets a profile property or update a profile property value.
+- `$set_once` - Sets a profile property only if they do not yet exist on Mixpanel. This ensures that the previous profile property value is not overwritten.
**Updating numeric profile property**
-`$add` - Increments or decrements a numeric profile property.
+- `$add` - Increments or decrements a numeric profile property.
**Updating list profile property**
-`$union` - Merges a given list into a List profile property and it ensures there are no duplicate values in the profile property.
-`$append` - Appends a value to the end of a List profile property
-`$remove` - Removes a value from a List profile property
+- `$union` - Merges a given list into a List profile property and it ensures there are no duplicate values in the profile property.
+- `$append` - Appends a value to the end of a List profile property.
+- `$remove` - Removes a value from a List profile property.
**Removing profile properties**
-`$unset` - Remove a profile property from the user profile
-`$delete` - Remove all profile properties from the user profile.
+- `$unset` - Remove a profile property from the user profile
+- `$delete` - Remove all profile properties from the user profile.
From 96bad5567617b30c38f7f512018ce2c2d1b0b0c8 Mon Sep 17 00:00:00 2001
From: yc
From cc34687fc4a1822146bab73ce2e61b57027c7bca Mon Sep 17 00:00:00 2001
From: yc
From 4d0853a192c00b59bb3071808b0717d553cfc10b Mon Sep 17 00:00:00 2001
From: yc
-## Funnels Advanced Data Functions +## Applying Advanced Data Functions
From bb3bb19ceed39b1dc7808bfb87e54f572d292bef Mon Sep 17 00:00:00 2001
From: yc
From f4f58ff967ff1edfa44c9ad16435bcf375445792 Mon Sep 17 00:00:00 2001
From: yc
From cea5640e5494e232bd2a8e64df2b13c5481c513a Mon Sep 17 00:00:00 2001
From: yc
From aa3e3fe058abf9dd72c5177510260ad237318df3 Mon Sep 17 00:00:00 2001
From: yc
- -## References -For more information about boards, go to: [https://help.mixpanel.com/hc/en-us/articles/115004565746](https://help.mixpanel.com/hc/en-us/articles/115004565746) From 5fcc99853a442540408c1f89cb26a1d093cbe752 Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 15:24:46 +0800 Subject: [PATCH 090/123] Update mixpanel-for-developers-implementation.mdx Update Links, added some text and formatting --- ...mixpanel-for-developers-implementation.mdx | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx b/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx index 28cd0cf151..7143aec35c 100644 --- a/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx +++ b/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx @@ -1,24 +1,30 @@ ## Implement via the Mixpanel SDK + +In this section, we will be going through an example of an event in your Tracking Plan to show how a developer can implement that event using Mixpanel’s Javascript SDK. We’ll also look at how you can update your user profiles. +
-## Initialise SDK +### Initialise Mixpanel's SDK
-## Super Properties and Track Event +### Initializing Super Properties and Tracking an Event
-## Setting Profile Properties +### Setting User Profile Properties
## Other Ingestion methods + +Apart from Mixpanel SDKs, there are also [other ways](https://docs-git-tutorials-for-cs-mixpanel.vercel.app/docs/getting-started/plan-your-implementation#already-collect-data-with-a-cdp-or-in-house-tools) to send data into Mixpanel. +
@@ -26,25 +32,18 @@ --- ## FAQs -#### 1. What are the different SDKs available by Mixpanel +### What are the different SDKs available by Mixpanel - Supported client-side libraries: [JavaScript](https://developer.mixpanel.com/docs/javascript), [iOS - Objective-C](https://developer.mixpanel.com/docs/ios), [iOS - Swift](https://developer.mixpanel.com/docs/swift), [Android](https://developer.mixpanel.com/docs/android), [React Native](https://developer.mixpanel.com/docs/react-native), [Flutter](https://developer.mixpanel.com/docs/flutter), [Unity](https://developer.mixpanel.com/docs/unity) - Supported server-side libraries: [Python](https://developer.mixpanel.com/docs/python), [Java](https://developer.mixpanel.com/docs/java), [PHP](https://developer.mixpanel.com/docs/php), [Ruby](https://developer.mixpanel.com/docs/ruby), [NodeJS](https://developer.mixpanel.com/docs/nodejs) - [REST HTTP API](https://developer.mixpanel.com/reference/ingestion-api) - -#### 2. Does Mixpanel have auto-track? -Mixpanel does not have autotrack. You can read more about it in [our article](https://help.mixpanel.com/hc/en-us/articles/115004600343). - - -#### 3. Browser Cookies are unreliable, is there another way? +### Browser Cookies are unreliable, is there another way? You can switch from cookie to local storage. You can read more about it [our article](https://help.mixpanel.com/hc/en-us/articles/115004546863#switch-from-cookies-to-localstorage). +### What’s the difference between $mp_api_timestamp_ms and $time and $mp_processing_time_ms? +- `$mp_api_timestamp_ms` - the timestamp when the data is received by our ingestion api. +- `mp_processing_time_ms` - the timestamp when the data is processed and ready for queries. +- `time` or `$time` - actual time of the event (which could be from days in the past), typically set when mixpanel.track() is called in the SDKs or filled in directly as part of a API payload. -#### 4. What’s the difference between $mp_api_timestamp_ms and $time and $mp_processing_time_ms? -`$mp_api_timestamp_ms` - the timestamp when the data is available for querying in reports. -`$mp_processing_time_ms` - when it was actually processed (think of the remap service where we drop the events and props that are dropped via lexicon, where we change the distinct and and so on -`time` - actual time of the event (which could be from days in the past), typically set when mixpanel.track() is called in the SDKs or filled in directly as part of a API payload. - - -#### 5. How to handle Date of Birth before 1/1/1970? +### How to handle Date of Birth before 1/1/1970? While the timestamp values are recommended to send in the ISO format, for dates before 1st January 1970, you can send the value like “YYYY-MM-DD”. From 9b0d57eb128de8ebf8150bcdabdf6dc770bcb642 Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 15:35:30 +0800 Subject: [PATCH 091/123] Update mixpanel-for-developers-implementation.mdx edited formatting --- .../mixpanel-for-developers-implementation.mdx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx b/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx index 7143aec35c..1f4b62c2b0 100644 --- a/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx +++ b/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx @@ -32,18 +32,19 @@ Apart from Mixpanel SDKs, there are also [other ways](https://docs-git-tutorials --- ## FAQs -### What are the different SDKs available by Mixpanel + +#### What are the different SDKs available by Mixpanel - Supported client-side libraries: [JavaScript](https://developer.mixpanel.com/docs/javascript), [iOS - Objective-C](https://developer.mixpanel.com/docs/ios), [iOS - Swift](https://developer.mixpanel.com/docs/swift), [Android](https://developer.mixpanel.com/docs/android), [React Native](https://developer.mixpanel.com/docs/react-native), [Flutter](https://developer.mixpanel.com/docs/flutter), [Unity](https://developer.mixpanel.com/docs/unity) - Supported server-side libraries: [Python](https://developer.mixpanel.com/docs/python), [Java](https://developer.mixpanel.com/docs/java), [PHP](https://developer.mixpanel.com/docs/php), [Ruby](https://developer.mixpanel.com/docs/ruby), [NodeJS](https://developer.mixpanel.com/docs/nodejs) - [REST HTTP API](https://developer.mixpanel.com/reference/ingestion-api) -### Browser Cookies are unreliable, is there another way? +#### Browser Cookies are unreliable, is there another way? You can switch from cookie to local storage. You can read more about it [our article](https://help.mixpanel.com/hc/en-us/articles/115004546863#switch-from-cookies-to-localstorage). -### What’s the difference between $mp_api_timestamp_ms and $time and $mp_processing_time_ms? +#### What’s the difference between $mp_api_timestamp_ms and $time and $mp_processing_time_ms? - `$mp_api_timestamp_ms` - the timestamp when the data is received by our ingestion api. - `mp_processing_time_ms` - the timestamp when the data is processed and ready for queries. - `time` or `$time` - actual time of the event (which could be from days in the past), typically set when mixpanel.track() is called in the SDKs or filled in directly as part of a API payload. -### How to handle Date of Birth before 1/1/1970? +#### How to handle Date of Birth before 1/1/1970? While the timestamp values are recommended to send in the ISO format, for dates before 1st January 1970, you can send the value like “YYYY-MM-DD”. From 8dc4c074502c9d17de1b625a81d2a85744f765ea Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 15:40:11 +0800 Subject: [PATCH 092/123] Update mixpanel-for-developers-implementation.mdx fix formatting issues --- .../developers/mixpanel-for-developers-implementation.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx b/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx index 1f4b62c2b0..b185775db3 100644 --- a/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx +++ b/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx @@ -41,10 +41,10 @@ Apart from Mixpanel SDKs, there are also [other ways](https://docs-git-tutorials #### Browser Cookies are unreliable, is there another way? You can switch from cookie to local storage. You can read more about it [our article](https://help.mixpanel.com/hc/en-us/articles/115004546863#switch-from-cookies-to-localstorage). -#### What’s the difference between $mp_api_timestamp_ms and $time and $mp_processing_time_ms? +#### What’s the difference between $time, $mp_api_timestamp_ms, and mp_processing_time_ms? +- `time` or `$time` - actual time of the event (which could be from days in the past), typically set when mixpanel.track() is called in the SDKs or filled in directly as part of a API payload. - `$mp_api_timestamp_ms` - the timestamp when the data is received by our ingestion api. - `mp_processing_time_ms` - the timestamp when the data is processed and ready for queries. -- `time` or `$time` - actual time of the event (which could be from days in the past), typically set when mixpanel.track() is called in the SDKs or filled in directly as part of a API payload. #### How to handle Date of Birth before 1/1/1970? While the timestamp values are recommended to send in the ISO format, for dates before 1st January 1970, you can send the value like “YYYY-MM-DD”. From 2d941362be2d206f9bfce5af2914be7195b4a4b9 Mon Sep 17 00:00:00 2001 From: yc
- -
- -## Boards -- -
- -## Insights -### Insights Report Overview - -- -
- -### Analyzing User Trends - -- -
- -### Insights Advanced Data Functions - -- -
- -### Visualizing User Cohorts and Profiles - -- -
- -## Funnels: Understanding Conversions -### Funnels Reports Overview - -- -
- -### Funnels Conversion Criteria - -- -
- -### Funnels Advanced Data Functions - -- -
- -## Retention - -- -
- -### Retention Report Overview - -- -
- -### Retention Criteria - -- -
- -### Interpreting Mixpanel Retention Report - -- -
- -### Retention Frequency Analysis - -- -
- -## Flows -### Flows Report Overview - -- -
- -## Signal -### Signal Report Overview - -- -
- - -## Impact -### Impact Report Overview - -- -
- -## Data Management: Lexicon -### Lexicon Overview - -- -
- -## Cohort -### Cohort Overview - - -- -
From 7313f781dd33c4852fb92eead7eca19ca16ded2a Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 15:48:04 +0800 Subject: [PATCH 094/123] Update mixpanel-for-developers-implementation.mdx fix formatting error --- .../developers/mixpanel-for-developers-implementation.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx b/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx index b185775db3..8c35fd20a1 100644 --- a/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx +++ b/pages/tutorials/developers/mixpanel-for-developers-implementation.mdx @@ -33,7 +33,7 @@ Apart from Mixpanel SDKs, there are also [other ways](https://docs-git-tutorials ## FAQs -#### What are the different SDKs available by Mixpanel +#### What are the different SDKs available by Mixpanel? - Supported client-side libraries: [JavaScript](https://developer.mixpanel.com/docs/javascript), [iOS - Objective-C](https://developer.mixpanel.com/docs/ios), [iOS - Swift](https://developer.mixpanel.com/docs/swift), [Android](https://developer.mixpanel.com/docs/android), [React Native](https://developer.mixpanel.com/docs/react-native), [Flutter](https://developer.mixpanel.com/docs/flutter), [Unity](https://developer.mixpanel.com/docs/unity) - Supported server-side libraries: [Python](https://developer.mixpanel.com/docs/python), [Java](https://developer.mixpanel.com/docs/java), [PHP](https://developer.mixpanel.com/docs/php), [Ruby](https://developer.mixpanel.com/docs/ruby), [NodeJS](https://developer.mixpanel.com/docs/nodejs) - [REST HTTP API](https://developer.mixpanel.com/reference/ingestion-api) @@ -41,7 +41,7 @@ Apart from Mixpanel SDKs, there are also [other ways](https://docs-git-tutorials #### Browser Cookies are unreliable, is there another way? You can switch from cookie to local storage. You can read more about it [our article](https://help.mixpanel.com/hc/en-us/articles/115004546863#switch-from-cookies-to-localstorage). -#### What’s the difference between $time, $mp_api_timestamp_ms, and mp_processing_time_ms? +#### What’s the difference between time, \$mp_api_timestamp_ms, and mp_processing_time_ms? - `time` or `$time` - actual time of the event (which could be from days in the past), typically set when mixpanel.track() is called in the SDKs or filled in directly as part of a API payload. - `$mp_api_timestamp_ms` - the timestamp when the data is received by our ingestion api. - `mp_processing_time_ms` - the timestamp when the data is processed and ready for queries. From 8a05f179ff8179d8d7e5468d024f46ce54d98d93 Mon Sep 17 00:00:00 2001 From: yc-## Basic concepts in ID Merge +## Basic Concepts in ID Merge
-## ID Merge implementation Overview +## ID Merge Implementation (using Client-side SDK)
-## Understanding Original ID Merge -Learn more about how [Original ID Merge](https://help.mixpanel.com/hc/en-us/articles/360041039771) works. - -## Understanding Simplified ID Merge -Learn more about how [Simplified ID Merge](https://help.mixpanel.com/hc/en-us/articles/14377628688788) works. - - ## ID Merge Implementation Best Practices #### Call mixpanel.identify upon a successful sign-up / login or when an app is re-opened in a logged in state By calling mixpanel.identify at these specific points in user journeys, you would be able to link the pre and post-login events to the same user on Mixpanel. Besides, calling mixpanel.identify when the users re-open the app in a logged in state ensures that all events in the session are tracked with the user's identifier such as user id. - -#### Identify your users consistently on Mixpanel -Once the users are assigned a unique identifier such as user id upon successful registration, you should call mixpanel.identify with the same user id going forward. -That being said, you can call mixpanel.identify with a different identifier if your users are identified differently on another platforms. However, you would need to merge multiple identifiers belong to the same user into one Identity Cluster. This ensures that events with different identifiers are linked to the same user on Mixpanel. - - #### Track the unique identifier as a super property and user property to assist troubleshooting You can track the user's unique identifier as a [super property via mixpanel.register](https://developer.mixpanel.com/docs/javascript#super-properties) and [user property via mixpanel.people.set](https://developer.mixpanel.com/docs/javascript#setting-profile-properties) as soon as it is available in the app i.e. on a successful sign-up / login or when an app is re-opened in a logged in state. In the cases when ID Merge is not implemented properly, you can rely on these properties for troubleshooting purpose. - #### Avoid creating profiles for anonymous users -Avoid creating profiles for anonymous users via [mixpanel.people.set()](https://developer.mixpanel.com/docs/javascript#setting-profile-properties) followed by [identify(anonymous_id)](https://developer.mixpanel.com/docs/javascript#identify). -If possible, cache user profile properties updates in cookie or local storage and only send them to Mixpanel after the users identify themselves via mixpanel.identify(user_id). - +Avoid creating profiles for anonymous users. If possible, cache user profile properties updates in cookie or local storage and only send them to Mixpanel after the user is identified (ie logged-in state). #### QA your ID management implementation during development phase -Here are a few things to look out for during QA: +Here are a few things to look out for: - Ensure that cross-platform, pre and post-registration events are linked to the same user on Mixpanel. - Ensure that no duplicate profiles are created as the users go through the onboarding, registration, login and cross-platform user journey. - Ensure that all the user’s identifiers are stored in the same Identity Cluster and all their events are displayed on a single profile on Mixpanel. - #### Keep a record of your ID management implementation We encourage you to document your implementation (or create a diagram of the implementation). This will come in handy when you need to re-implement this on a new platform or troubleshoot ID management issue. @@ -74,3 +60,12 @@ Yes, ID Merge is retroactive. During an ID Merge, Mixpanel merges the historical In Original ID Merge, once the Identity Cluster accumulates up to 500 Distinct IDs, you will no longer be able to merge new ID into the Identity Cluster via Identify, Alias or Merge methods. The new ID will end up as a separate user profile on Mixpanel. Read more FAQs on [Originial vs Simplified ID Merge](https://help.mixpanel.com/hc/en-us/articles/14383975110292) + +## Understanding Original ID Merge +Learn more about how [Original ID Merge](https://help.mixpanel.com/hc/en-us/articles/360041039771) works. + +## Understanding Simplified ID Merge +Learn more about how [Simplified ID Merge](https://help.mixpanel.com/hc/en-us/articles/14377628688788) works. + + + From 88bea7f558e1da3e22d529e655295bcb3da2ec6e Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 8 May 2023 17:23:01 +0800 Subject: [PATCH 102/123] Update mixpanel-for-developers-id-management.mdx cleaned up FAQ section --- .../mixpanel-for-developers-id-management.mdx | 32 ++++--------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/pages/tutorials/developers/mixpanel-for-developers-id-management.mdx b/pages/tutorials/developers/mixpanel-for-developers-id-management.mdx index fa926ba0ac..fb69b1e008 100644 --- a/pages/tutorials/developers/mixpanel-for-developers-id-management.mdx +++ b/pages/tutorials/developers/mixpanel-for-developers-id-management.mdx @@ -41,31 +41,11 @@ Read more about [ID Merge Implementation Best Practices](https://help.mixpanel.c --- ## FAQs -#### 1. How does Original ID Merge work under the hood? -ID Merge is essentially the process of merging two users into one user on Mixpanel via Identify, Alias or Merge methods. You can also think of ID Merge as the process of merging two Distinct IDs (or two Identity Clusters) into one Identity Cluster pointing to an individual user on Mixpanel. -Under the hood, out of the two profiles that are chosen for merging, only one will become the “winning” profile and be retained on Mixpanel whereas the other one will be hidden away. The events on the hidden profile will be migrated over to the winning profile to give you the complete user journey view in the merged profile (take note that the profile properties on hidden profiles will remain hidden). -The Canonical Distinct ID on the winning profile will become the new Canonical Distinct ID of the merged profile. - - -#### 2. Can I set my User ID as the Canonical Distinct ID? I have already called mixpanel.identify("User ID") but I don't see User ID shows up as the (main) Canonical ID on Mixpanel profiles. -No, you have no control of the **[Canonical Distinct ID](https://help.mixpanel.com/hc/en-us/articles/360041039771#:~:text=Canonical%20Distinct%20ID)** when on Original ID Merge. It is decided by Mixpanel system. In Original ID Merge, the Canonical Distinct ID is re-decided whenever there are new ID merges to an existing Identity Cluster via **[Identify, Alias or Merge methods](https://help.mixpanel.com/hc/en-us/articles/360041039771#:~:text=and%20data%20exports.-,User%20Identification,-While%20Mixpanel%20ultimately)**, so the user’s Canonical Distinct ID may change over time. -That being said, as long as the User ID had been added to the Identity Cluster, you can send events and profile properties to Mixpanel via User ID. Upon receiving these data, Mixpanel will resolve the User ID to the Canonical Distinct ID within the same Identity Cluster to link the data to the correct user. This is solved in Simplified ID Merge. - - -#### 3. Is ID Merge retroactive? I’m planning to merge 2 separate users on Mixpanel via ID Merge and I want to visualise their events in a single activity feed. -Yes, ID Merge is retroactive. During an ID Merge, Mixpanel merges the historical events of both users into a single user profile. New events will also be added to the merged profile going forward. - - -#### 4. There is a limit of 500 Distinct IDs per Identity Cluster. What happens when the limit is hit? -In Original ID Merge, once the Identity Cluster accumulates up to 500 Distinct IDs, you will no longer be able to merge new ID into the Identity Cluster via Identify, Alias or Merge methods. The new ID will end up as a separate user profile on Mixpanel. - -Read more FAQs on [Originial vs Simplified ID Merge](https://help.mixpanel.com/hc/en-us/articles/14383975110292) - -## Understanding Original ID Merge -Learn more about how [Original ID Merge](https://help.mixpanel.com/hc/en-us/articles/360041039771) works. - -## Understanding Simplified ID Merge -Learn more about how [Simplified ID Merge](https://help.mixpanel.com/hc/en-us/articles/14377628688788) works. - +#### Is ID Merge retroactive? +Yes, ID Merge is retroactive. During merging distinct IDs that are added to the same cluster will be considered as the same user going forward. +#### There are two types of ID Merge? +Yes, you can read more about the [difference between Original vs Simplified ID Merge](https://help.mixpanel.com/hc/en-us/articles/14383975110292) and for more details how each one works, see the links below: +- [Getting Started with Original ID Merge](https://help.mixpanel.com/hc/en-us/articles/360041039771) (default for new projects) +- [Getting Started with Simplified ID Merge](https://help.mixpanel.com/hc/en-us/articles/14377628688788) From 94c7c4264098cfbc17e89af882a7211140c40a44 Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 15 May 2023 14:27:11 +0800 Subject: [PATCH 103/123] Add files via upload --- pages/tutorials/setting-up-mixpanel.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 pages/tutorials/setting-up-mixpanel.md diff --git a/pages/tutorials/setting-up-mixpanel.md b/pages/tutorials/setting-up-mixpanel.md new file mode 100644 index 0000000000..edc2bf3db2 --- /dev/null +++ b/pages/tutorials/setting-up-mixpanel.md @@ -0,0 +1,10 @@ +## Setting Up Mixpanel + +### Mixpanel Organization +Each Mixpanel customer is assigned an organization which serves as the controlling entity for managing all your Mixpanel analytics needs. + +- [Pricing / Billing Plan](https://help.mixpanel.com/hc/en-us/categories/115000963103#billing-and-plans) - determines data volume limits and features available across all projects in the organization +- [Mixpanel Project(s)](https://help.mixpanel.com/hc/en-us/categories/115000963103#project-configuration) - container for product's analytics data (events, properties, user profiles, reports, etc.) +- [User Account(s)](https://help.mixpanel.com/hc/en-us/categories/115000963103#account-and-organization) - used to sign into Mixpanel given the appropriate role for organization and project level access +- Other organization settings - [teams](https://help.mixpanel.com/hc/en-us/articles/360020731831-Create-and-Manage-Teams), [service accounts](https://developer.mixpanel.com/reference/service-accounts), [access security (SSO/ 2FA)](https://help.mixpanel.com/hc/en-us/categories/115000963103#access-and-security), [data & privacy](https://help.mixpanel.com/hc/en-us/sections/115001299023-Data-Security-and-Privacy), etc. + From 27d3722106a9da187e65540b91b7604e68f42bca Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 15 May 2023 14:28:34 +0800 Subject: [PATCH 104/123] Update _meta.json Added Setting Up Mixpanel section --- pages/tutorials/_meta.json | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/tutorials/_meta.json b/pages/tutorials/_meta.json index fbf60818e4..f574b3eab3 100644 --- a/pages/tutorials/_meta.json +++ b/pages/tutorials/_meta.json @@ -1,4 +1,5 @@ { + "setting-up-mixpanel": "Setting Up Mixpanel", "analytics-strategy": "Analytics Strategy", "creating-a-tracking-plan": "Creating a Tracking Plan", "mixpanel-analysis": "Mixpanel Analysis", From f6e83b0bee807c046e250c27f042006758ce36c2 Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 15 May 2023 14:55:58 +0800 Subject: [PATCH 105/123] Update setting-up-mixpanel.md --- pages/tutorials/setting-up-mixpanel.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pages/tutorials/setting-up-mixpanel.md b/pages/tutorials/setting-up-mixpanel.md index edc2bf3db2..2fd3f91736 100644 --- a/pages/tutorials/setting-up-mixpanel.md +++ b/pages/tutorials/setting-up-mixpanel.md @@ -1,10 +1,21 @@ ## Setting Up Mixpanel ### Mixpanel Organization -Each Mixpanel customer is assigned an organization which serves as the controlling entity for managing all your Mixpanel analytics needs. +Each Mixpanel customer is assigned an [Organization](https://help.mixpanel.com/hc/en-us/articles/360020461952#organizations-introduction) which serves as the controlling entity for managing all your Mixpanel analytics needs. - [Pricing / Billing Plan](https://help.mixpanel.com/hc/en-us/categories/115000963103#billing-and-plans) - determines data volume limits and features available across all projects in the organization - [Mixpanel Project(s)](https://help.mixpanel.com/hc/en-us/categories/115000963103#project-configuration) - container for product's analytics data (events, properties, user profiles, reports, etc.) - [User Account(s)](https://help.mixpanel.com/hc/en-us/categories/115000963103#account-and-organization) - used to sign into Mixpanel given the appropriate role for organization and project level access - Other organization settings - [teams](https://help.mixpanel.com/hc/en-us/articles/360020731831-Create-and-Manage-Teams), [service accounts](https://developer.mixpanel.com/reference/service-accounts), [access security (SSO/ 2FA)](https://help.mixpanel.com/hc/en-us/categories/115000963103#access-and-security), [data & privacy](https://help.mixpanel.com/hc/en-us/sections/115001299023-Data-Security-and-Privacy), etc. +### Mixpanel Projects +Each Mixpanel organization contains one or more [Projects](https://help.mixpanel.com/hc/en-us/articles/115004505106-Create-and-Manage-Projects) that house events, properties, user profiles, and other reporting metadata that can be created with EU data residency if applicable. + +- [Timezone](https://help.mixpanel.com/hc/en-us/articles/115004547203-Manage-Timezones-for-Projects-in-Mixpanel) - [dates](https://help.mixpanel.com/hc/en-us/articles/115004547063#date) (including timestamps) are ingested in UTC and converted to the project’s configured timezone for reporting. +- Access Keys + - [Project Token](https://help.mixpanel.com/hc/en-us/articles/115004502806) - used solely for ingestion to identify (not authenticate) a project when collecting data in front-end implementations (client-side SDKs or Ingestion API) + - [API/Project Secret](https://help.mixpanel.com/hc/en-us/articles/115004490503#api-secret) - legacy authentication for importing and exporting data, Service Accounts are the preferred and should be used where possible as API SDecret will be deprecated over time +- Other project settings - [group keys](https://help.mixpanel.com/hc/en-us/articles/360025333632#implementation), [data views](https://help.mixpanel.com/hc/en-us/articles/360043782572), [service accounts](https://developer.mixpanel.com/reference/service-accounts), [public dashboard](https://help.mixpanel.com/hc/en-us/articles/4402022733844), [sessions](https://help.mixpanel.com/hc/en-us/articles/115004695223), etc. + +#### Create at least 2 Mixpanel Projects (Production/Live and Development/Sandbox) +Mixpanel recommends tracking 1 product with multiple platforms (mobile, web, etc.) into one project, but [separate projects for development and production](https://help.mixpanel.com/hc/en-us/articles/360001354886-Automatically-Separate-Development-Data). There may be [factors](https://help.mixpanel.com/hc/en-us/articles/115004491683-When-To-Use-Multiple-Projects#factors-to-consider) where implementing separate projects is required, please refer to the Mixpanel Help. From 1ab8fd3db434c24f191fabc8e800ac692bece050 Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 15 May 2023 15:53:06 +0800 Subject: [PATCH 106/123] Update setting-up-mixpanel.md --- pages/tutorials/setting-up-mixpanel.md | 39 +++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/pages/tutorials/setting-up-mixpanel.md b/pages/tutorials/setting-up-mixpanel.md index 2fd3f91736..84251802fa 100644 --- a/pages/tutorials/setting-up-mixpanel.md +++ b/pages/tutorials/setting-up-mixpanel.md @@ -17,5 +17,42 @@ Each Mixpanel organization contains one or more [Projects](https://help.mixpanel - [API/Project Secret](https://help.mixpanel.com/hc/en-us/articles/115004490503#api-secret) - legacy authentication for importing and exporting data, Service Accounts are the preferred and should be used where possible as API SDecret will be deprecated over time - Other project settings - [group keys](https://help.mixpanel.com/hc/en-us/articles/360025333632#implementation), [data views](https://help.mixpanel.com/hc/en-us/articles/360043782572), [service accounts](https://developer.mixpanel.com/reference/service-accounts), [public dashboard](https://help.mixpanel.com/hc/en-us/articles/4402022733844), [sessions](https://help.mixpanel.com/hc/en-us/articles/115004695223), etc. -#### Create at least 2 Mixpanel Projects (Production/Live and Development/Sandbox) +#### Create at least 2 Mixpanel Projects (Production and Development) Mixpanel recommends tracking 1 product with multiple platforms (mobile, web, etc.) into one project, but [separate projects for development and production](https://help.mixpanel.com/hc/en-us/articles/360001354886-Automatically-Separate-Development-Data). There may be [factors](https://help.mixpanel.com/hc/en-us/articles/115004491683-When-To-Use-Multiple-Projects#factors-to-consider) where implementing separate projects is required, please refer to the Mixpanel Help. + + + +### Mixpanel User Accounts +Each Mixpanel user account belongs to an organization and may be assigned with multiple projects with varying permissions / roles. + +- [Organization Role](https://help.mixpanel.com/hc/en-us/articles/360025387911-Organization-Roles-and-Permissions) - each user will have a single organization role per organization + - Owner (at least one) - super user for the organization and all projects underneath + - Admin - manage projects, members, and roles in the organization (with [certain exceptions](https://help.mixpanel.com/hc/en-us/articles/360025387911-Organization-Roles-and-Permissions#admin)) + - Billing Admin - primarily for managing Billing Plans + - Member - *basic membership* for a user to have access to Project(s) and or Team(s) + +- [Project Role](https://help.mixpanel.com/hc/en-us/articles/360024613412-Project-Roles-and-Permissions-) - each user can have multiple project roles, where it conflicts [permissions are additive](https://help.mixpanel.com/hc/en-us/articles/360024613412-Project-Roles-and-Permissions-#having-multiple-roles-at-once) + - Owner - super user for the project, default for organization owners + - Admin - manage project (except delete, reset, and security) and members within, default for organization admins + - Analyst - create, save, edit reports + share and make public dashboards (*most common role for users*) + - Consumer - create, save, edit reports but unable to share or create public dashboards + +#### User Access Management Approach +There are two general approaches to user management in Mixpanel + + + +#### Using Mixpanel Teams +Mixpanel enables assignment of projects and project roles to groups of users called [Teams](https://help.mixpanel.com/hc/en-us/articles/360020731831-Create-and-Manage-Teams) with the flexibility to also assign such projects and project roles to individual user accounts if required. + + + +#### Basic User Account Setup +Organization Owners and Admins can assign projects or teams directly to user accounts at the organization level by minimally provisioning them with an organization Membership. + + + +Project Owners and Admins can be created to delegate access provisioning privileges at the project level. A [default project role](https://help.mixpanel.com/hc/en-us/articles/360020731811-Invite-and-Manage-Users#setting-a-default-role-on-a-project) can also be set for All Users in the Organization as a baseline access. Teams are not available at the project level. + + + From b080cabaa0cc9292dd67056585a43db2c2bc9fdb Mon Sep 17 00:00:00 2001 From: kurbycchua <50901466+kurbycchua@users.noreply.github.com> Date: Mon, 15 May 2023 15:58:43 +0800 Subject: [PATCH 107/123] Update setting-up-mixpanel.md --- pages/tutorials/setting-up-mixpanel.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pages/tutorials/setting-up-mixpanel.md b/pages/tutorials/setting-up-mixpanel.md index 84251802fa..9d9df40e27 100644 --- a/pages/tutorials/setting-up-mixpanel.md +++ b/pages/tutorials/setting-up-mixpanel.md @@ -56,3 +56,10 @@ Project Owners and Admins can be created to delegate access provisioning privile  +#### Single Sign-On (SSO) and 2FA +Mixpanel provides [Single Sign-On (SSO)](https://help.mixpanel.com/hc/en-us/articles/360036428871-Single-Sign-On) access to enterprise accounts using either an [Identity Provider (IDP)](https://help.mixpanel.com/hc/en-us/articles/360036428871-Single-Sign-On#set-up-your-idp) or a custom SAML implementation such as [Okta](https://help.mixpanel.com/hc/en-us/articles/115004474143) or [Microsoft Azure](https://help.mixpanel.com/hc/en-us/articles/360040323292). +- Enabling [Just in Time (JIT)](https://help.mixpanel.com/hc/en-us/articles/360036428871-Single-Sign-On#just-in-time-provisioning) provisioning using SAML removes the need for organization admins to invite individual users to an organization. +- IDPs (Okta, Onelogin, and Azure) that have auto-provisioning integrations with Mixpanel enables syncing of access provisioning and deprovisioning for users. +- To give provisioned users default access to projects, invite all users in the organization by [Setting a Default Role on a Project](https://help.mixpanel.com/hc/en-us/articles/360020731811-Invite-and-Manage-Users#setting-a-default-role-on-a-project). + +Mixpanel also provides [Two Factor Authentication (2FA)](https://help.mixpanel.com/hc/en-us/articles/115004485966-Two-Factor-Authentication-2FA-) feature requiring users to provide a security code sent via SMS to their configure mobile number to verify their identity. From cfb2198ccbfab482835b6938ac8d739ac109486c Mon Sep 17 00:00:00 2001 From: PeishanFromMixpanel <129823695+PeishanFromMixpanel@users.noreply.github.com> Date: Wed, 17 May 2023 00:14:10 +0800 Subject: [PATCH 108/123] Create tutorials --- pages/docs/tutorials | 1 + 1 file changed, 1 insertion(+) create mode 100644 pages/docs/tutorials diff --git a/pages/docs/tutorials b/pages/docs/tutorials new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/pages/docs/tutorials @@ -0,0 +1 @@ + From 30942706145ccea7c850ad985026e3d2b963f12e Mon Sep 17 00:00:00 2001 From: PeishanFromMixpanel <129823695+PeishanFromMixpanel@users.noreply.github.com> Date: Wed, 17 May 2023 00:21:14 +0800 Subject: [PATCH 109/123] Delete tutorials --- pages/docs/tutorials | 1 - 1 file changed, 1 deletion(-) delete mode 100644 pages/docs/tutorials diff --git a/pages/docs/tutorials b/pages/docs/tutorials deleted file mode 100644 index 8b13789179..0000000000 --- a/pages/docs/tutorials +++ /dev/null @@ -1 +0,0 @@ - From 5b8271fc90434281137c017ab77db6663288c476 Mon Sep 17 00:00:00 2001 From: PeishanFromMixpanel <129823695+PeishanFromMixpanel@users.noreply.github.com> Date: Wed, 17 May 2023 01:08:56 +0800 Subject: [PATCH 110/123] Moved tutorials from header to under docs --- pages/docs/tutorials/_meta.json | 8 + pages/docs/tutorials/analytics-strategy.md | 2 + .../tutorials/creating-a-tracking-plan.md | 33 ++ pages/docs/tutorials/developers/_meta.json | 5 + .../mixpanel-for-developers-fundamentals.mdx | 76 +++++ .../mixpanel-for-developers-id-management.mdx | 51 +++ ...mixpanel-for-developers-implementation.mdx | 50 +++ .../tutorials/migration-guides/_meta.json | 3 + .../migrating-to-mixpanel-from-amplitude.md | 300 ++++++++++++++++++ .../tutorials/mixpanel-analysis/_meta.json | 13 + .../tutorials/mixpanel-analysis/board.mdx | 8 + .../tutorials/mixpanel-analysis/cohort.mdx | 15 + .../mixpanel-analysis/data-management.mdx | 7 + .../mixpanel-analysis/data-model.mdx | 30 ++ .../tutorials/mixpanel-analysis/flows.mdx | 7 + .../tutorials/mixpanel-analysis/funnels.mdx | 19 ++ .../tutorials/mixpanel-analysis/impact.mdx | 6 + .../tutorials/mixpanel-analysis/insights.mdx | 25 ++ .../tutorials/mixpanel-analysis/overview.md | 3 + .../tutorials/mixpanel-analysis/retention.mdx | 24 ++ .../tutorials/mixpanel-analysis/signal.mdx | 6 + pages/docs/tutorials/setting-up-mixpanel.md | 65 ++++ 22 files changed, 756 insertions(+) create mode 100644 pages/docs/tutorials/_meta.json create mode 100644 pages/docs/tutorials/analytics-strategy.md create mode 100644 pages/docs/tutorials/creating-a-tracking-plan.md create mode 100644 pages/docs/tutorials/developers/_meta.json create mode 100644 pages/docs/tutorials/developers/mixpanel-for-developers-fundamentals.mdx create mode 100644 pages/docs/tutorials/developers/mixpanel-for-developers-id-management.mdx create mode 100644 pages/docs/tutorials/developers/mixpanel-for-developers-implementation.mdx create mode 100644 pages/docs/tutorials/migration-guides/_meta.json create mode 100644 pages/docs/tutorials/migration-guides/migrating-to-mixpanel-from-amplitude.md create mode 100644 pages/docs/tutorials/mixpanel-analysis/_meta.json create mode 100644 pages/docs/tutorials/mixpanel-analysis/board.mdx create mode 100644 pages/docs/tutorials/mixpanel-analysis/cohort.mdx create mode 100644 pages/docs/tutorials/mixpanel-analysis/data-management.mdx create mode 100644 pages/docs/tutorials/mixpanel-analysis/data-model.mdx create mode 100644 pages/docs/tutorials/mixpanel-analysis/flows.mdx create mode 100644 pages/docs/tutorials/mixpanel-analysis/funnels.mdx create mode 100644 pages/docs/tutorials/mixpanel-analysis/impact.mdx create mode 100644 pages/docs/tutorials/mixpanel-analysis/insights.mdx create mode 100644 pages/docs/tutorials/mixpanel-analysis/overview.md create mode 100644 pages/docs/tutorials/mixpanel-analysis/retention.mdx create mode 100644 pages/docs/tutorials/mixpanel-analysis/signal.mdx create mode 100644 pages/docs/tutorials/setting-up-mixpanel.md diff --git a/pages/docs/tutorials/_meta.json b/pages/docs/tutorials/_meta.json new file mode 100644 index 0000000000..ff481de5c1 --- /dev/null +++ b/pages/docs/tutorials/_meta.json @@ -0,0 +1,8 @@ +{ + "setting-up-mixpanel": "Setting Up Mixpanel", + "analytics-strategy": "Analytics Strategy", + "creating-a-tracking-plan": "Creating a Tracking Plan", + "mixpanel-analysis": "Mixpanel Analysis", + "developers": "Mixpanel for Developers", + "migration-guides": "Migration Guides" +} diff --git a/pages/docs/tutorials/analytics-strategy.md b/pages/docs/tutorials/analytics-strategy.md new file mode 100644 index 0000000000..bb2099e4ef --- /dev/null +++ b/pages/docs/tutorials/analytics-strategy.md @@ -0,0 +1,2 @@ +## Overview +Defining the right metrics to track product performance can be a challenging task for any business. Companies have different goals and unique products that require a customized approach to analytics. To help you define your metrics, we have crafted a framework that outlines the types of metrics, how to organize them, and the key categories to consider. In [How to Determine Your Goals And Metrics guide](https://help.mixpanel.com/hc/en-us/articles/360035109991), we will explore the focus metric, Level 1 and Level 2 metrics, and how to organize them to ensure each team understands how their metrics contribute to the overall product performance. diff --git a/pages/docs/tutorials/creating-a-tracking-plan.md b/pages/docs/tutorials/creating-a-tracking-plan.md new file mode 100644 index 0000000000..f11c2b151e --- /dev/null +++ b/pages/docs/tutorials/creating-a-tracking-plan.md @@ -0,0 +1,33 @@ +## Creating a Tracking Plan + +### Utilise a Tracking Plan to Tie Key Goals to Events Tracked +Mixpanel recommends creating a tracking plan based on the key business goals identified from your analytics strategy. It should: + +- Be a centralized document that should serve as the source of truth on your Mixpanel implementation +- Define your business goals / KPIs and analytics strategy metrics +- Outline the events, event properties, and user profile properties aligned to your metrics +- Be treated as a living and shared document that is continuously updated with any implementation changes +- Include notes that are referenced across teams (product, marketing, data science, tech / dev teams, etc.) + +This will be important for team members who are involved in defining use cases to be implemented in Mixpanel as well as, tech teams involved in the actual implementation of the codes. + +### Tracking Plan Methodology +Be intentional with your data. Prioritize the most critical data you'll need based on your analytics strategy and KPIs, then iterate. Tracking everything and anything your user can do in your product can lead to unnecessary development effort and unused data. + +#### Define and prioritize KPIs +Define the top KPIs and metrics that will help measure success and inform decisions about your product. + +#### Map KPIs to User Flows +Map each KPI / metric to the steps or actions that users take to influence each KPI / metric. For example, sign up flow will be important when measuring KPIs related to new user acquisition. Consider also the different paths that users can take to achieve the same outcomes. + +#### Translate Flows into Events / Properties +Breakdown your user flows into events (actions) and properties (context of these actions) in your tracking plan. This will ensure that you have scoped out the data you need to achieve your KPIs / metrics in Mixpanel. + +Mixpanel provides the following templates for vertical-specific tracking plans: + +- [Retail and E-commerce](https://docs.google.com/spreadsheets/d/1Kyys37m_GEL79_1BKKEnU5KxK91NF04kY-L_bFfcfqE/edit#gid=1484002407) +- [Media and Entertainment](https://docs.google.com/spreadsheets/d/1K9t53kJJjaBG36kCIbZn_qKjXR9Iy306zYZAqDrv_AM/edit?usp=sharing) +- [SaaS](https://docs.google.com/spreadsheets/d/1A5wm5MKzRfSOZfUfCAg8YpePiz8Jn3Ar_u8KBo5lD6g/edit?usp=sharing) +- [Financial Services](https://docs.google.com/spreadsheets/d/1oGv6vbIFiYbima9IX4ItpBJvuChs-zzh83MRt_dSPgg/edit?usp=sharing) + +You can also access a copy of a [blank Tracking Plan from here](https://docs.google.com/spreadsheets/d/1ZdOZ6TMtRPxy7qRxiLsvH9HWcHJM6nZydWKoThRxFKc/edit#gid=1641519238). Save a copy to your device to get started on your tracking plan. diff --git a/pages/docs/tutorials/developers/_meta.json b/pages/docs/tutorials/developers/_meta.json new file mode 100644 index 0000000000..1cf0ac2d00 --- /dev/null +++ b/pages/docs/tutorials/developers/_meta.json @@ -0,0 +1,5 @@ +{ + "mixpanel-for-developers-fundamentals": "Fundamentals", + "mixpanel-for-developers-implementation": "Implementation", + "mixpanel-for-developers-id-management": "Identity Management" +} diff --git a/pages/docs/tutorials/developers/mixpanel-for-developers-fundamentals.mdx b/pages/docs/tutorials/developers/mixpanel-for-developers-fundamentals.mdx new file mode 100644 index 0000000000..90665d75dc --- /dev/null +++ b/pages/docs/tutorials/developers/mixpanel-for-developers-fundamentals.mdx @@ -0,0 +1,76 @@ +## Tutorial Overview +Hello and welcome to Mixpanel for Developers Tutorial. + +This tutorial is going to consist of a couple of modules designed to help everyone understand events and properties in Mixpanel, help developers understand the Data Type it supports and how to send events to Mixpanel and enrich user data that have been documented in your Tracking Plan. + +We will also explore Mixpanel’s ID management Solution for Product Managers and Analysts to identify visitors as they go from an anonymous state to a known state and even when visitors use different devices. + +## Mixpanel Data Model +Mixpanel data is stored and isolated within a project. Mixpanel recommends tracking 1 product with multiple platforms (mobile, web, etc.) into one project, but create [separate projects for development and production](https://help.mixpanel.com/hc/en-us/articles/360001354886-Automatically-Separate-Development-Data). + +There may be [other factors where implementing separate projects](https://help.mixpanel.com/hc/en-us/articles/115004491683-When-To-Use-Multiple-Projects#factors-to-consider) is required, but do note that querying data across projects is not possible. Mixpanel supports a few different categories of data that can be used for analysis: events, user profiles, group profiles, and lookup tables. In data warehouse terminology, events make up the fact table while user profiles, group profiles, and lookup tables are dimension tables. + +
+ +
+ +### Property Types +Properties are attributes that help you define the specifics of an **Event** or a **User.** +Mixpanel has many Properties defined in its Data Model. + +|Property Type|Description| +|:--- |:---| +|[Event Properties](https://help.mixpanel.com/hc/en-us/articles/360001355266)|Event Properties describes the events that are tracked within your product.| +|[Super Properties](https://help.mixpanel.com/hc/en-us/articles/360001355266#super-properties-for-events)|Super Properties are a type of Event Property that you can initialise to automatically attach to every subsequent Event you’re tracking at client side.| +|[User Profile Properties](https://help.mixpanel.com/hc/en-us/articles/115004708186)|User Profile Properties describe your users (they typically store current demographical information). User profiles are joined to events on `event.distinct_id = user_profile.distinct_id`.| +|[Group Profile Properties](https://help.mixpanel.com/hc/en-us/articles/360025333632-Group-Analytics#group-profiles)|Group Profile Properties describe group level information (similar to User Profiles Properties at user level). With Mixpanel’s [Group Analytics](https://help.mixpanel.com/hc/en-us/articles/360025333632), multiple users can be grouped and behavioural data analysed at a customised group level (such as company, account). Group profiles are joined to events on your chosen group key. For example, if you create a new group key for `company_id` your events will be joined on `event.company_id = group_profile.company_id`.| +|[Lookup Tables](https://help.mixpanel.com/hc/en-us/articles/360044139291-Lookup-tables)|Lookup Tables allow you to dynamically extend additional properties mapped to an exiting Event or User Property. For example, if you create a lookup table for "Songs" (with additional properties like `hash_tags`, `top_10`, `all_time_favorite`) and specify the mapped event property as `song_id`; you can use these additional properties when doing filtering or breakdowns for events that has `song_id` as an event property.| +|[Default Properties](https://help.mixpanel.com/hc/en-us/articles/115004613766-What-properties-do-Mixpanel-s-libraries-store-by-default-)|Default Properties (for Events and User Profiles) are collected and populated with values automatically in Mixpanel. This can happen upon data ingestion or when using certain Mixpanel client-side SDKs. Typically, they have a dollar sign ($) or “mp_” as prefix to distinguish them from normal properties.| +|Reserved Properties|Mixpanel reserves certain property names (for [Events](https://help.mixpanel.com/hc/en-us/articles/360001355266#reserved-properties-for-events) and [User Profiles](https://help.mixpanel.com/hc/en-us/articles/115004708186#reserved-properties-for-user-profiles)) for special use cases, and these may or may not be automatically populated with values. The purpose of such Reserved Properties are for processing (ie event time stamping) or for specific system features (eg: cohort exports). Examples: `time`, `$email`, `$phone`, `$name`, `$created`.| + +### Supported Data Types +Mixpanel supports five [data types](https://help.mixpanel.com/hc/en-us/articles/115004547063) for properties: String, Numeric, Boolean, Date and List. By choosing the most suitable data type for your properties, you'd be able to apply a set of [operators](https://help.mixpanel.com/hc/en-us/articles/115004547063#data-type-operators) that are most relevant to your properties in Mixpanel reports, and this will give you richer insights about your data. + +**String** +- Alphanumeric value e.g. Plan Type = "Free", Artist Name = "Bruno Mars" +- String properties have a character limit of 255 bytes. +- Mixpanel will treat any property value that doesn’t match any other data type as a String. + +**Numeric** +- Numeric (integer or decimal) value e.g. Cost = 15.00, Quantity = 5 +- You can apply operators such as sum, median and percentile on numeric properties. + +**Boolean** +- Mixpanel treats properties as boolean if the value is either the JSON constant `true` or `false` e.g. Favorited = true, Bookmarked = false. +- On Mixpanel, you can typecast any non-boolean property to boolean, +- "false", 0, null, undefined, and empty string will be typecasted to boolean `false` +- "true" and any set value that is not 0 or empty string will be typecasted to boolean `true` + +**Date** +- An ISO formatted date `YYYY-MM-DDTHH:MM:SS` in UTC e.g. Last Purchase = "2022-10-30T13:30:25", Last Login = "2022-10-29". Note that all timestamps need to be sent in UTC timezone in an ISO format. +- Mixpanel treats unix timestamps as Numeric property, however, you can typecast it to Date data type. + +**List** +- A list of values as a JSON array e.g Favourite Genres = ["Folk","Alternative"] or Favourite Numbers = [1,5,10.0] +- Limits of a List property: Event Property = 8KB, User Profile Property = 256KB, Each item in the list: 255 bytes + +## Updating User Profile Properties +Mixpanel user profile properties are mutable and they can be updated in a timely manner to reflect the latest state of the users. + +You can update user profile properties via [Mixpanel SDK](https://developer.mixpanel.com/docs/javascript#setting-profile-properties) or [Engage API](https://developer.mixpanel.com/reference/profile-set). The following are the operations supported in Mixpanel. + +**Setting profile property** +- `$set` - Sets a profile property or update a profile property value. +- `$set_once` - Sets a profile property only if they do not yet exist on Mixpanel. This ensures that the previous profile property value is not overwritten. + +**Updating numeric profile property** +- `$add` - Increments or decrements a numeric profile property. + +**Updating list profile property** +- `$union` - Merges a given list into a List profile property and it ensures there are no duplicate values in the profile property. +- `$append` - Appends a value to the end of a List profile property. +- `$remove` - Removes a value from a List profile property. + +**Removing profile properties** +- `$unset` - Remove a profile property from the user profile +- `$delete` - Remove all profile properties from the user profile. diff --git a/pages/docs/tutorials/developers/mixpanel-for-developers-id-management.mdx b/pages/docs/tutorials/developers/mixpanel-for-developers-id-management.mdx new file mode 100644 index 0000000000..fb69b1e008 --- /dev/null +++ b/pages/docs/tutorials/developers/mixpanel-for-developers-id-management.mdx @@ -0,0 +1,51 @@ +## Overview + +This section provides details on implementing Mixpanel's Identity Management called Identity Merge (ID Merge for short). Note that the [Legacy Identity Management](https://help.mixpanel.com/hc/en-us/articles/115004497803-Identity-Management-Pre-Identity-Merge-Overview) is not covered in this section as Identity Merge is enabled by default for all new organizations since March 2020. + ++ +
+ +## Basic Concepts in ID Merge ++ +
+ +## ID Merge Implementation (using Client-side SDK) ++ +
+ +## ID Merge Implementation Best Practices +#### Call mixpanel.identify upon a successful sign-up / login or when an app is re-opened in a logged in state +By calling mixpanel.identify at these specific points in user journeys, you would be able to link the pre and post-login events to the same user on Mixpanel. Besides, calling mixpanel.identify when the users re-open the app in a logged in state ensures that all events in the session are tracked with the user's identifier such as user id. + +#### Track the unique identifier as a super property and user property to assist troubleshooting +You can track the user's unique identifier as a [super property via mixpanel.register](https://developer.mixpanel.com/docs/javascript#super-properties) and [user property via mixpanel.people.set](https://developer.mixpanel.com/docs/javascript#setting-profile-properties) as soon as it is available in the app i.e. on a successful sign-up / login or when an app is re-opened in a logged in state. +In the cases when ID Merge is not implemented properly, you can rely on these properties for troubleshooting purpose. + +#### Avoid creating profiles for anonymous users +Avoid creating profiles for anonymous users. If possible, cache user profile properties updates in cookie or local storage and only send them to Mixpanel after the user is identified (ie logged-in state). + +#### QA your ID management implementation during development phase +Here are a few things to look out for: +- Ensure that cross-platform, pre and post-registration events are linked to the same user on Mixpanel. +- Ensure that no duplicate profiles are created as the users go through the onboarding, registration, login and cross-platform user journey. +- Ensure that all the user’s identifiers are stored in the same Identity Cluster and all their events are displayed on a single profile on Mixpanel. + +#### Keep a record of your ID management implementation +We encourage you to document your implementation (or create a diagram of the implementation). This will come in handy when you need to re-implement this on a new platform or troubleshoot ID management issue. + +Read more about [ID Merge Implementation Best Practices](https://help.mixpanel.com/hc/en-us/articles/9648680824852) + +--- + +## FAQs +#### Is ID Merge retroactive? +Yes, ID Merge is retroactive. During merging distinct IDs that are added to the same cluster will be considered as the same user going forward. + +#### There are two types of ID Merge? +Yes, you can read more about the [difference between Original vs Simplified ID Merge](https://help.mixpanel.com/hc/en-us/articles/14383975110292) and for more details how each one works, see the links below: +- [Getting Started with Original ID Merge](https://help.mixpanel.com/hc/en-us/articles/360041039771) (default for new projects) +- [Getting Started with Simplified ID Merge](https://help.mixpanel.com/hc/en-us/articles/14377628688788) + diff --git a/pages/docs/tutorials/developers/mixpanel-for-developers-implementation.mdx b/pages/docs/tutorials/developers/mixpanel-for-developers-implementation.mdx new file mode 100644 index 0000000000..8c35fd20a1 --- /dev/null +++ b/pages/docs/tutorials/developers/mixpanel-for-developers-implementation.mdx @@ -0,0 +1,50 @@ +## Implement via the Mixpanel SDK + +In this section, we will be going through an example of an event in your Tracking Plan to show how a developer can implement that event using Mixpanel’s Javascript SDK. We’ll also look at how you can update your user profiles. + ++ +
+ +### Initialise Mixpanel's SDK ++ +
+ +### Initializing Super Properties and Tracking an Event ++ +
+ +### Setting User Profile Properties ++ +
+ +## Other Ingestion methods + +Apart from Mixpanel SDKs, there are also [other ways](https://docs-git-tutorials-for-cs-mixpanel.vercel.app/docs/getting-started/plan-your-implementation#already-collect-data-with-a-cdp-or-in-house-tools) to send data into Mixpanel. + ++ +
+ +--- + +## FAQs + +#### What are the different SDKs available by Mixpanel? +- Supported client-side libraries: [JavaScript](https://developer.mixpanel.com/docs/javascript), [iOS - Objective-C](https://developer.mixpanel.com/docs/ios), [iOS - Swift](https://developer.mixpanel.com/docs/swift), [Android](https://developer.mixpanel.com/docs/android), [React Native](https://developer.mixpanel.com/docs/react-native), [Flutter](https://developer.mixpanel.com/docs/flutter), [Unity](https://developer.mixpanel.com/docs/unity) +- Supported server-side libraries: [Python](https://developer.mixpanel.com/docs/python), [Java](https://developer.mixpanel.com/docs/java), [PHP](https://developer.mixpanel.com/docs/php), [Ruby](https://developer.mixpanel.com/docs/ruby), [NodeJS](https://developer.mixpanel.com/docs/nodejs) +- [REST HTTP API](https://developer.mixpanel.com/reference/ingestion-api) + +#### Browser Cookies are unreliable, is there another way? +You can switch from cookie to local storage. You can read more about it [our article](https://help.mixpanel.com/hc/en-us/articles/115004546863#switch-from-cookies-to-localstorage). + +#### What’s the difference between time, \$mp_api_timestamp_ms, and mp_processing_time_ms? +- `time` or `$time` - actual time of the event (which could be from days in the past), typically set when mixpanel.track() is called in the SDKs or filled in directly as part of a API payload. +- `$mp_api_timestamp_ms` - the timestamp when the data is received by our ingestion api. +- `mp_processing_time_ms` - the timestamp when the data is processed and ready for queries. + +#### How to handle Date of Birth before 1/1/1970? +While the timestamp values are recommended to send in the ISO format, for dates before 1st January 1970, you can send the value like “YYYY-MM-DD”. diff --git a/pages/docs/tutorials/migration-guides/_meta.json b/pages/docs/tutorials/migration-guides/_meta.json new file mode 100644 index 0000000000..12280fbe28 --- /dev/null +++ b/pages/docs/tutorials/migration-guides/_meta.json @@ -0,0 +1,3 @@ +{ + "migrating-to-amplitude": "Migrating from Amplitude", +} diff --git a/pages/docs/tutorials/migration-guides/migrating-to-mixpanel-from-amplitude.md b/pages/docs/tutorials/migration-guides/migrating-to-mixpanel-from-amplitude.md new file mode 100644 index 0000000000..05eadc2e2b --- /dev/null +++ b/pages/docs/tutorials/migration-guides/migrating-to-mixpanel-from-amplitude.md @@ -0,0 +1,300 @@ +# Migrating to Mixpanel from Amplitude + +If you’re reading this, congrats on considering making the switch from Amplitude to Mixpanel 🎊 This guide is intended to outline how the migration works, what to expect, and how to mitigate the risks and switching costs of a migration whilst accelerate time to value. + +## What a migration will solve ✅ + +- Cut-over sending live data to Mixpanel and stop sending to Amplitude +- Historical backfill of existing data +- Integrates easily with existing event data collection methods - SDKs, CDPs, DWH, RETL +- Migrates all existing/new data in entirety - full access to all events and properties you had in Amplitude + +## What a migration won’t solve ⛔ + +- Existing issues with data trust/quality or data governance → As part of the migration, we recommend a [data audit](https://www.notion.so/Migrating-to-Mixpanel-from-Amplitude-723407166fbf4f7ba9365034691502da) as the first step to only transfer your valuable data and clean up trust/quality issues +- Reporting, Dashboards, and Saved Entities → As part of the migration, we can review your top used reports and dashboards then [sit down with each team](https://www.notion.so/Migrating-to-Mixpanel-from-Amplitude-723407166fbf4f7ba9365034691502da) to re-build them in Mixpanel + +## What level of effort does the migration take? ⚖️ + +A migration primarily consists of 3 phases: + +1. Technical migration of data → Data audit, Live data cutover, Historical data import +2. Change management migration of end users → Champion identification, User interviews, Team by team specific trainings, Ensuring adoption for each team +3. Ongoing success planning → Improving data governance, Optimizing analysis, Building a product analytics practice + +From a technical perspective, the migration process is relatively straightforward. If you have an engineer with access to your data and the ability to write code/transforms to send data to new destinations, this can be done in a single sprint (1-2 weeks). + +From an end user perspective, Mixpanel is simpler and easier to learn than Amplitude but there of course will be a learning curve. The largest hurdle is copying over key saved reports, dashboards, etc. which the team is familiar with in Amplitude and teaching them how to rebuild these in Mixpanel. We recommend doing this process in detail for each team, showing them how to recreate key analyses side-by-side in Mixpanel. You can then leverage your team champions to force multiply your adoption efforts. + +When going through this migration, there is no better time to audit your own data and reports to only migrate what matters. Most data and reporting is stale after some time anyways, prioritize the data and reports your team uses every day for their Top 10 key questions. These can be easily copied over and Mixpanel also provides Customer Success resources during Onboarding to assist with this. + +## Getting started: Identify your implementation method 🚦 + +Mixpanel accepts event data from a variety of different sources. Choose your implementation method first and then you can follow the below steps for sending data to Mixpanel. + +We support the following data collection mechanisms: + +- Client-side SDKs & Server-side SDKs: Simply replace Amplitude code calls to track events with Mixpanel calls instead + + Fortunately, Mixpanel and Amplitude’s client side SDKs have *very similar* developer facing APIs. This makes it fairly easy to “find and replace” embedded Amplitude calls and swap them for Mixpanel calls. + + This section will detail the Javascript SDKs (for the sake of brevity), although both analytics platforms have fairly uniform tracking APIs for other SDKs (mobile, server-side). + + Amplitude JS Docs: [https://amplitude.github.io/Amplitude-JavaScript/](https://amplitude.github.io/Amplitude-JavaScript/) + + Mixpanel JS Docs: [https://developer.mixpanel.com/docs/javascript-full-api-reference](https://developer.mixpanel.com/docs/javascript-full-api-reference) + + ## Installing the Mixpanel SDK: + + [https://developer.mixpanel.com/docs/javascript-quickstart#1-initialize-the-library](https://developer.mixpanel.com/docs/javascript-quickstart#1-initialize-the-library) + + # Migrating Amplitude ⇒ Mixpanel + + ### Initialization + + Amplitude’s `init()` method: + + ```jsx + var amplitudeClient = new AmplitudeClient(); + amplitudeClient.init('API_KEY') + ``` + + Mixpanel’s `init()` method: + + ```jsx + mixpanel.init('new token') + ``` + + docs: [https://developer.mixpanel.com/docs/javascript-full-api-reference#mixpanelinit](https://developer.mixpanel.com/docs/javascript-full-api-reference#mixpanelinit) + + init options: [https://developer.mixpanel.com/docs/javascript-full-api-reference#mixpanelset_config](https://developer.mixpanel.com/docs/javascript-full-api-reference#mixpanelset_config) + + ### Events + + Amplitude’s `logEvent()` method: + + ```jsx + amplitudeClient.logEvent('Clicked Button', {'finished_flow': false }); + ``` + + Mixpanel’s `track()` method: + + ```jsx + mixpanel.track('Clicked Button', {'finished_flow': false }) + ``` + + docs: [https://developer.mixpanel.com/docs/javascript-full-api-reference#mixpaneltrack](https://developer.mixpanel.com/docs/javascript-full-api-reference#mixpaneltrack) + + ### Identity Management + + Amplitude’s `setUserId()` method: + + ```jsx + amplitudeClient.setUserId('joe@gmail.com'); + ``` + + Mixpanel’s `identify()` method: + + ```jsx + mixpanel.identify('joe@gmail.com') + ``` + + docs: [https://developer.mixpanel.com/docs/javascript-full-api-reference#mixpanelidentify](https://developer.mixpanel.com/docs/javascript-full-api-reference#mixpanelidentify) + + ### User Properties + + Amplitude’s `setUserProperties()` method: + + ```jsx + amplitudeClient.setUserProperties({'gender': 'female', 'sign_up_complete': true}) + ``` + + Mixpanel’s `people.set()` method: + + ```jsx + mixpanel.people.set({'gender': 'female', 'sign_up_complete': true}) + ``` + + docs: [https://developer.mixpanel.com/docs/javascript-full-api-reference#mixpanelpeople](https://developer.mixpanel.com/docs/javascript-full-api-reference#mixpanelpeople) + + notes: `identify()` should be called at some point in the user’s session to propagate people methods + + ### Group Analytics + + Amplitude’s `setGroup()` method: + + ```jsx + amplitudeClient.setGroup('orgId', 15); + ``` + + Mixpanel’s `set_group()` method: + + ```jsx + mixpanel.set_group('orgId', 15) + ``` + + docs: [https://developer.mixpanel.com/docs/javascript-full-api-reference#mixpanelset_group](https://developer.mixpanel.com/docs/javascript-full-api-reference#mixpanelset_group) + +- Customer Data Platforms (CDPs) like [Segment](https://segment.com/): Go into your CDP settings to add Mixpanel as a destination, and point your data stream to Mixpanel + + Since CDPs already collect all your data via 1 SDK and route to many downstream destinations, enabling Mixpanel is straightforward. Simply go to your CDP settings and add Mixpanel as a destination: + +  + + + Once you set up the connection to Mixpanel, you can proceed with configuring key settings like: + + - which events and properties to send → only send what matters + - edit any mappings/editing/filtering that has to be done on the data → ensure high data quality and governance + - connection settings, or CDP specific settings for data syncs → control over how data is sent + + We provide Mixpanel as a destination and setup guides for all of the most popular CDPs: + + - [Segment](https://segment.com/docs/connections/destinations/catalog/actions-mixpanel/) + - [mParticle](https://docs.mparticle.com/integrations/mixpanel/audience/) + - [Rudderstack](https://www.rudderstack.com/docs/destinations/streaming-destinations/mixpanel/) + +- [Import API](https://developer.mixpanel.com/reference/import-events): Point your event ingestion pipeline to [Mixpanel’s robust API](https://developer.mixpanel.com/reference/import-events) for data ingestion + + If you currently send data to Amplitude directly to their API, you can simply swap out the Amplitude API with the Mixpanel API. + + ### Sending Events + + Amplitude’s `/track` API Endpoint is `[https://api2.amplitude.com/2/httpapi](https://api2.amplitude.com/2/httpapi)` (documented [here](https://www.docs.developers.amplitude.com/analytics/apis/http-v2-api/)). A sample request from your server for this API would look like: + + ```bash + curl -X POST https://api2.amplitude.com/2/httpapi \ + -H 'Content-Type: application/json' \ + -H 'Accept: */*' \ + --data '{ + "api_key": "YOUR_API_KEY", + "events": [{ + "user_id": "203201202", + "device_id": "C8F9E604-F01A-4BD9-95C6-8E5357DF265D", + "event_type": "watch_tutorial" + }] + }' + ``` + + Mixpanel’s `/track` API endpoint is [`https://api.mixpanel.com/import`](https://api.mixpanel.com/import) (documented [here](https://developer.mixpanel.com/reference/import-events)). A sample request from your server for this API would look like: + + ```bash + curl --request POST \ + --url 'https://api.mixpanel.com/import?strict=1&project_id=%3CYOUR_PROJECT_ID%3E' \ + --header 'Content-Encoding: gzip' \ + --header 'Content-Type: application/json' \ + --header 'accept: application/json' \ + --header 'authorization: Basic cnlhbjpyeWFu' \ + --data ' + [ + { + "event": "string", + "properties": { + "time": 0, + "distinct_id": "string", + "$insert_id": "string" + } + } + ] + ' + ``` + + The big difference between the APIs are: + + - **Authentication:** Amplitude authenticates in the request payload, whereas Mixpanel uses your project token in the request URL alongside basic auth. Mixpanel authentication can be done via a service account as described [here](https://developer.mixpanel.com/reference/ingestion-api-authentication). Be sure to move the authentication outside the payload. + - **Event JSON Structure:** Amplitude and Mixpanel have slightly different structures (explained further below). You will want to remap the Amplitude event format to the expected Mixpanel JSON payload as described [here](https://www.notion.so/Migrating-to-Mixpanel-from-Amplitude-723407166fbf4f7ba9365034691502da). + +- [Reverse ETL](https://mixpanel.com/blog/what-is-reverse-etl-product-data/) (RETL) tools like [Census](https://getcensus.com): Go into your RETL settings to add Mixpanel as a destination, and point your syncs to Mixpanel + + If you already send data to Amplitude with your data warehouse as the source of truth using reverse ETL, sending data to Mixpanel requires adding a new destination and syncing the same models you have been syncing to Amplitude. This option is like a hybrid between the CDP and Import API options above - you can use the reverse ETL tool to set Mixpanel up simply as a destination and then the tool will handle all of the remapping at the API level for you. + + Simply go to your RETL settings and add Mixpanel as a connection: + +  + + + We provide Mixpanel as a destination and setup guides for all of the most popular RETL tools: + + - [Census](https://docs.getcensus.com/destinations/mixpanel) + - [Hightouch](https://hightouch.com/docs/destinations/mixpanel) + - [Segment](https://segment.com/docs/connections/reverse-etl/) + + +## Differences in the data models ☯️ + +Both Mixpanel and Amplitude are product analytics tools which collect event-based behavioral data about your users. [Events](https://developer.mixpanel.com/reference/import-events) are commonly expressed as JSON which represent the name of the user action, the ID of the user, the time at which the action took place, and all associated metadata. Events are immutable, and represent data at the time of which an action takes place. + +```json +{ + "event": "Signup", + "properties": + { + "time": 1618716477000, + "distinct_id": "91304156-cafc-4673-a237-623d1129c801", + "$insert_id": "29fc2962-6d9c-455d-95ad-95b84f09b9e4", + "Referred by": "Friend", + "URL": "mixpanel.com/signup" + } +} +``` + +In addition to events, Mixpanel supports an additional type of data that Amplitude does not. This data is known as [user profiles](https://developer.mixpanel.com/reference/profile-set), which represents dimensional data that is always updated to the most recent value for a user. User data allows you to segment your reporting by both historical point-in-time data as well as real-time dimensional data about your users. + +```json +{ + "$distinct_id": "13793", + "$set": + { + "name": "Robert" + } +} +``` + +We also support additional data for extending your use cases with Mixpanel: + +- [Group profiles](https://developer.mixpanel.com/reference/group-set-property): Used with our Group Analytics product add-on to allow you to pivot quickly between users and other entities in your analysis. A common use case is for a B2B company to pivot between analyzing users and analyzing accounts. +- [Lookup tables](https://developer.mixpanel.com/reference/lookup-tables): For event data which was already sent, you can use these to extend the data already sent into Mixpanel. A common use case is taking an identifier like a transaction ID, item ID, etc. and using lookup tables to enrich the data with additional information like the amount, category, etc. from your data warehouse. + +## Data audit: Cleaning up the mess 🧹 + +We’ve found from experience that <20% of the data in a product analytics tool is used for 80%+ of the queries. This is especially true the longer you have been using a tool - over time teams add more and more tracking for new events and properties, and without strong data governance practices, you will inevitably have some messy data in Amplitude. + +In the spirit of making sense of the mess, it is not recommended that you bring all historical data in from Amplitude. A common practice is to leverage Amplitude’s [Data](http://data.amplitude.com) Product to first understand which events and properties are queried by your users. No queries in the past 30 days? These events and properties have probably gone stale - there is low value and high effort in brining them to Mixpanel, so cut them from your import and do not migrate the existing tracking. + +After you’ve gotten rid of the obvious (the events and properties no one uses), you can fine tune this approach by doing user interviews with your top users/champions. These users can help you explicitly define the data they need brought along to Mixpanel (mapped to their key questions and KPIs) so you can focus on what matters. Because these users are the ones building reporting others use, capturing their use cases and making them change agents can be highly beneficial to your migration. + +This data audit step is optional, but highly recommended - It is a larger upfront investment to avoid higher maintenance costs in the future. + +## Loading historical data 📊 + +We recommend loading a year’s worth (or less) of historical data during your migration. This will allow your team to review year-over-year trends easily and do historical analysis as needed. + +To backfill data, we recommend: + +- If you have a data warehouse with Amplitude data: Leverage the Import API or a Reverse ETL tool to import to Mixpanel +- If you have a data warehouse without Amplitude data: Export your data to the data warehouse so you have a record, and then Import API or Reverse ETL +- If you do not have a data warehouse: Since there is no historical record of data, for this method you will need to export your data from Amplitude and move it into Mixpanel - we provide an easy to use helper function for this [here](https://github.com/mixpanel/mixpanel-utils#import-from-amplitude) + +It is also recommended you load the data into a test project with a limited subset (for ex, a single day or data or a sample of the entire dataset) to get started. This will help you identify any errors in the end to end process before you do a full historical data load. + +## Change management: Moving the users 👥 + +It is recommended your Mixpanel champion or owner first set up your [Organization settings](https://help.mixpanel.com/hc/en-us/articles/360021085271-Organization-Settings) and [Project settings](https://help.mixpanel.com/hc/en-us/articles/115004490503-Project-Settings). This will ensure the right access level for your team and enable you to prepare the workspace for ingestion. This can be done later but doing it up front will allow for you to set key settings for data ingestion (US vs EU servers, project timezone, etc.). + +Once data is live, we shift our focus to change management and migrating the existing users. We mitigate risk here by: + +- Going team by team to assess current Amplitude reports, and bringing over only what really matters +- Running targeted trainings where we re-build Amplitude reports side-by-side in Mixpanel to teach users to fish +- Building a product with awesome UI/UX that will make up for the up-front costs in simpler, more powerful analysis down the line + +Our goal is to focus on each team individually, and we can process multiple in parallel. A team is the perfect unit to focus on as they have shared context and goals, so their needs as far as metrics and analysis will be similar. We can then help each team to the point they can self-serve answers from Mixpanel to answer their questions. + +## Ongoing Success 🎡 + +After the migration, we often focus on longer term goals like: + +- Improving Data Governance → Creating scaleable processes and strategies for managing data at scale +- Optimizing Analysis → Helping end users analyze data for more use cases, faster +- Building a Product Analytics Practice → Cultural change to be a self-serve, data democratized organization + +Mixpanel Customer Success will work with you to define your ongoing needs and build a plan specific to the outcomes you need to drive. You can read more about how we do this [here](https://mixpanel.com/blog/establish-a-product-analytics-practice/). diff --git a/pages/docs/tutorials/mixpanel-analysis/_meta.json b/pages/docs/tutorials/mixpanel-analysis/_meta.json new file mode 100644 index 0000000000..5c32149738 --- /dev/null +++ b/pages/docs/tutorials/mixpanel-analysis/_meta.json @@ -0,0 +1,13 @@ +{ + "overview": "Overview", + "data-model": "Data Model", + "board": "Boards", + "cohort": "Cohort", + "insights": "Insights", + "funnels": "Funnels", + "retention": "Retention", + "flows": "Flow", + "impact": "Impact", + "signal": "Signal", + "data-management": "Lexicon" +} diff --git a/pages/docs/tutorials/mixpanel-analysis/board.mdx b/pages/docs/tutorials/mixpanel-analysis/board.mdx new file mode 100644 index 0000000000..9f8d6a60ec --- /dev/null +++ b/pages/docs/tutorials/mixpanel-analysis/board.mdx @@ -0,0 +1,8 @@ +## Overview + +A Board is a collection of reports, text, and images or videos. Boards can also be created using the Mixpanel Templates feature. + + ++ +
diff --git a/pages/docs/tutorials/mixpanel-analysis/cohort.mdx b/pages/docs/tutorials/mixpanel-analysis/cohort.mdx new file mode 100644 index 0000000000..83cdb8540f --- /dev/null +++ b/pages/docs/tutorials/mixpanel-analysis/cohort.mdx @@ -0,0 +1,15 @@ +## Overview + +Cohorts are groups of users defined by a chosen set of criteria, like a shared property or sequence of events. When you define a cohort, you can use it to group and filter data in the Analysis reports. You can also use cohorts to target groups of users via messaging integrations. + ++ +
+ +## Note on cohorts whose filters contain user properties + +Because user profile properties only store the most recent value, cohorts involving user profile properties will use the current value for those properties (even if the value changed over time). + +For example, suppose the cohort’s filter criteria is: users where user[“City”] == “SF” and “Did Event: Order Ride 3 times in Last 7 days”. + +Mixpanel computes the above over the last 30 days and then groups the set of users who have property user[“City”] == “SF” as of right now and intersect that with the daily cohort of users who did Order Ride 3 times in the last 7 days. diff --git a/pages/docs/tutorials/mixpanel-analysis/data-management.mdx b/pages/docs/tutorials/mixpanel-analysis/data-management.mdx new file mode 100644 index 0000000000..680cbae7ef --- /dev/null +++ b/pages/docs/tutorials/mixpanel-analysis/data-management.mdx @@ -0,0 +1,7 @@ +## Lexicon +### Overview +Lexicon serves as a data dictionary where you can store descriptions of your events and their properties. Discover how to effectively manage your data on Lexicon. + ++ +
diff --git a/pages/docs/tutorials/mixpanel-analysis/data-model.mdx b/pages/docs/tutorials/mixpanel-analysis/data-model.mdx new file mode 100644 index 0000000000..aa940a7e3d --- /dev/null +++ b/pages/docs/tutorials/mixpanel-analysis/data-model.mdx @@ -0,0 +1,30 @@ +## Overview + +Unlike some other analytics tools which are limited to tracking pre-defined measures of engagement, such as page views and browser sessions, Mixpanel employs an event-based, user-centric model that tracks the specific actions that individual users take within your product. + +This event-based approach to analytics captures a deeper understanding of user engagement, which allows for more granular analysis and effective targeting of messages and experiments. + +As for the actual structure of the Mixpanel data model, it is built on three key concepts: events, properties, and user profiles. + + ++ +
diff --git a/pages/docs/tutorials/mixpanel-analysis/flows.mdx b/pages/docs/tutorials/mixpanel-analysis/flows.mdx new file mode 100644 index 0000000000..de2fe220cf --- /dev/null +++ b/pages/docs/tutorials/mixpanel-analysis/flows.mdx @@ -0,0 +1,7 @@ +## Overview +Flows identifies the most frequent paths taken by users to or from any event. Use Flows to understand how your users sequentially perform events in your product, and analyze drop-offs or unsuccessful behavior. + + ++ +
diff --git a/pages/docs/tutorials/mixpanel-analysis/funnels.mdx b/pages/docs/tutorials/mixpanel-analysis/funnels.mdx new file mode 100644 index 0000000000..2ed71f2efd --- /dev/null +++ b/pages/docs/tutorials/mixpanel-analysis/funnels.mdx @@ -0,0 +1,19 @@ +## Overview +Mixpanel’s Funnels allows you to examine how end-users perform events in a series. Funnels calculate and display the amount of users who convert from one event to another within a particular time window. This allows you to identify where your users drop off, what segments convert the most, and other important facets of the user journey. + + ++ +
+ +## Configuring Conversion Criteria + ++ +
+ +## Applying Advanced Data Functions + ++ +
diff --git a/pages/docs/tutorials/mixpanel-analysis/impact.mdx b/pages/docs/tutorials/mixpanel-analysis/impact.mdx new file mode 100644 index 0000000000..219d6b8799 --- /dev/null +++ b/pages/docs/tutorials/mixpanel-analysis/impact.mdx @@ -0,0 +1,6 @@ +## Overview +Mixpanel’s Impact report measures the effects of product or marketing launches on your key metrics. Impact calculates the user adoption of the launch, the impact of the launch on an important event, and the differences between users that adopt the launch and those that do not. + ++ +
diff --git a/pages/docs/tutorials/mixpanel-analysis/insights.mdx b/pages/docs/tutorials/mixpanel-analysis/insights.mdx new file mode 100644 index 0000000000..221fe65c3a --- /dev/null +++ b/pages/docs/tutorials/mixpanel-analysis/insights.mdx @@ -0,0 +1,25 @@ +## Overview +Insights is a powerful and flexible tool designed to visualize trends and compositions within your data. You can analyze events, cohorts, and user profiles, and display the data in a wide variety of chart types. + ++ +
+ +## Analyzing User Trends + ++ +
+ +## Applying Advanced Data Functions + ++ +
+ +## Visualizing User Cohorts and Profiles + ++ +
+ diff --git a/pages/docs/tutorials/mixpanel-analysis/overview.md b/pages/docs/tutorials/mixpanel-analysis/overview.md new file mode 100644 index 0000000000..657c0fa289 --- /dev/null +++ b/pages/docs/tutorials/mixpanel-analysis/overview.md @@ -0,0 +1,3 @@ +In this tutorial, we will explore the fundamentals of how Mixpanel works and highlight some of the key features to get you started. + +Log in to your Mixpanel account to follow along. Don't have an account yet? Get your free Mixpanel demo account [here](https://mixpanel.com/project/3/view/79/app/boards) to access the demo datasets. diff --git a/pages/docs/tutorials/mixpanel-analysis/retention.mdx b/pages/docs/tutorials/mixpanel-analysis/retention.mdx new file mode 100644 index 0000000000..99bb60e202 --- /dev/null +++ b/pages/docs/tutorials/mixpanel-analysis/retention.mdx @@ -0,0 +1,24 @@ +## Overview +The Retention report in Mixpanel is designed to assess user engagement over a specified period of time. Retention of your users is critical to achieving product-market fit and sustainable long-term growth, and this report will help you understand how long users continue to come back and find value from your product. + ++ +
+ +## Understanding Retention Criteria + ++ +
+ +## Interpreting Mixpanel Retention Report + ++ +
+ +## Retention Frequency Analysis + ++ +
diff --git a/pages/docs/tutorials/mixpanel-analysis/signal.mdx b/pages/docs/tutorials/mixpanel-analysis/signal.mdx new file mode 100644 index 0000000000..1729ac2b75 --- /dev/null +++ b/pages/docs/tutorials/mixpanel-analysis/signal.mdx @@ -0,0 +1,6 @@ +## Overview +Signal measures the association between a correlation event and a goal event and quantifies the correlation between the two. This facilitates a deeper understanding of the behaviors that drive customer conversions, and can help guide product decisions. + ++ +
diff --git a/pages/docs/tutorials/setting-up-mixpanel.md b/pages/docs/tutorials/setting-up-mixpanel.md new file mode 100644 index 0000000000..9d9df40e27 --- /dev/null +++ b/pages/docs/tutorials/setting-up-mixpanel.md @@ -0,0 +1,65 @@ +## Setting Up Mixpanel + +### Mixpanel Organization +Each Mixpanel customer is assigned an [Organization](https://help.mixpanel.com/hc/en-us/articles/360020461952#organizations-introduction) which serves as the controlling entity for managing all your Mixpanel analytics needs. + +- [Pricing / Billing Plan](https://help.mixpanel.com/hc/en-us/categories/115000963103#billing-and-plans) - determines data volume limits and features available across all projects in the organization +- [Mixpanel Project(s)](https://help.mixpanel.com/hc/en-us/categories/115000963103#project-configuration) - container for product's analytics data (events, properties, user profiles, reports, etc.) +- [User Account(s)](https://help.mixpanel.com/hc/en-us/categories/115000963103#account-and-organization) - used to sign into Mixpanel given the appropriate role for organization and project level access +- Other organization settings - [teams](https://help.mixpanel.com/hc/en-us/articles/360020731831-Create-and-Manage-Teams), [service accounts](https://developer.mixpanel.com/reference/service-accounts), [access security (SSO/ 2FA)](https://help.mixpanel.com/hc/en-us/categories/115000963103#access-and-security), [data & privacy](https://help.mixpanel.com/hc/en-us/sections/115001299023-Data-Security-and-Privacy), etc. + +### Mixpanel Projects +Each Mixpanel organization contains one or more [Projects](https://help.mixpanel.com/hc/en-us/articles/115004505106-Create-and-Manage-Projects) that house events, properties, user profiles, and other reporting metadata that can be created with EU data residency if applicable. + +- [Timezone](https://help.mixpanel.com/hc/en-us/articles/115004547203-Manage-Timezones-for-Projects-in-Mixpanel) - [dates](https://help.mixpanel.com/hc/en-us/articles/115004547063#date) (including timestamps) are ingested in UTC and converted to the project’s configured timezone for reporting. +- Access Keys + - [Project Token](https://help.mixpanel.com/hc/en-us/articles/115004502806) - used solely for ingestion to identify (not authenticate) a project when collecting data in front-end implementations (client-side SDKs or Ingestion API) + - [API/Project Secret](https://help.mixpanel.com/hc/en-us/articles/115004490503#api-secret) - legacy authentication for importing and exporting data, Service Accounts are the preferred and should be used where possible as API SDecret will be deprecated over time +- Other project settings - [group keys](https://help.mixpanel.com/hc/en-us/articles/360025333632#implementation), [data views](https://help.mixpanel.com/hc/en-us/articles/360043782572), [service accounts](https://developer.mixpanel.com/reference/service-accounts), [public dashboard](https://help.mixpanel.com/hc/en-us/articles/4402022733844), [sessions](https://help.mixpanel.com/hc/en-us/articles/115004695223), etc. + +#### Create at least 2 Mixpanel Projects (Production and Development) +Mixpanel recommends tracking 1 product with multiple platforms (mobile, web, etc.) into one project, but [separate projects for development and production](https://help.mixpanel.com/hc/en-us/articles/360001354886-Automatically-Separate-Development-Data). There may be [factors](https://help.mixpanel.com/hc/en-us/articles/115004491683-When-To-Use-Multiple-Projects#factors-to-consider) where implementing separate projects is required, please refer to the Mixpanel Help. + + + +### Mixpanel User Accounts +Each Mixpanel user account belongs to an organization and may be assigned with multiple projects with varying permissions / roles. + +- [Organization Role](https://help.mixpanel.com/hc/en-us/articles/360025387911-Organization-Roles-and-Permissions) - each user will have a single organization role per organization + - Owner (at least one) - super user for the organization and all projects underneath + - Admin - manage projects, members, and roles in the organization (with [certain exceptions](https://help.mixpanel.com/hc/en-us/articles/360025387911-Organization-Roles-and-Permissions#admin)) + - Billing Admin - primarily for managing Billing Plans + - Member - *basic membership* for a user to have access to Project(s) and or Team(s) + +- [Project Role](https://help.mixpanel.com/hc/en-us/articles/360024613412-Project-Roles-and-Permissions-) - each user can have multiple project roles, where it conflicts [permissions are additive](https://help.mixpanel.com/hc/en-us/articles/360024613412-Project-Roles-and-Permissions-#having-multiple-roles-at-once) + - Owner - super user for the project, default for organization owners + - Admin - manage project (except delete, reset, and security) and members within, default for organization admins + - Analyst - create, save, edit reports + share and make public dashboards (*most common role for users*) + - Consumer - create, save, edit reports but unable to share or create public dashboards + +#### User Access Management Approach +There are two general approaches to user management in Mixpanel + + + +#### Using Mixpanel Teams +Mixpanel enables assignment of projects and project roles to groups of users called [Teams](https://help.mixpanel.com/hc/en-us/articles/360020731831-Create-and-Manage-Teams) with the flexibility to also assign such projects and project roles to individual user accounts if required. + + + +#### Basic User Account Setup +Organization Owners and Admins can assign projects or teams directly to user accounts at the organization level by minimally provisioning them with an organization Membership. + + + +Project Owners and Admins can be created to delegate access provisioning privileges at the project level. A [default project role](https://help.mixpanel.com/hc/en-us/articles/360020731811-Invite-and-Manage-Users#setting-a-default-role-on-a-project) can also be set for All Users in the Organization as a baseline access. Teams are not available at the project level. + + + +#### Single Sign-On (SSO) and 2FA +Mixpanel provides [Single Sign-On (SSO)](https://help.mixpanel.com/hc/en-us/articles/360036428871-Single-Sign-On) access to enterprise accounts using either an [Identity Provider (IDP)](https://help.mixpanel.com/hc/en-us/articles/360036428871-Single-Sign-On#set-up-your-idp) or a custom SAML implementation such as [Okta](https://help.mixpanel.com/hc/en-us/articles/115004474143) or [Microsoft Azure](https://help.mixpanel.com/hc/en-us/articles/360040323292). +- Enabling [Just in Time (JIT)](https://help.mixpanel.com/hc/en-us/articles/360036428871-Single-Sign-On#just-in-time-provisioning) provisioning using SAML removes the need for organization admins to invite individual users to an organization. +- IDPs (Okta, Onelogin, and Azure) that have auto-provisioning integrations with Mixpanel enables syncing of access provisioning and deprovisioning for users. +- To give provisioned users default access to projects, invite all users in the organization by [Setting a Default Role on a Project](https://help.mixpanel.com/hc/en-us/articles/360020731811-Invite-and-Manage-Users#setting-a-default-role-on-a-project). + +Mixpanel also provides [Two Factor Authentication (2FA)](https://help.mixpanel.com/hc/en-us/articles/115004485966-Two-Factor-Authentication-2FA-) feature requiring users to provide a security code sent via SMS to their configure mobile number to verify their identity. From e94162944ff942eb95f065fdb0826726db9247e7 Mon Sep 17 00:00:00 2001 From: PeishanFromMixpanel <129823695+PeishanFromMixpanel@users.noreply.github.com> Date: Wed, 17 May 2023 01:11:43 +0800 Subject: [PATCH 111/123] Update _meta.json added tutorials section in docs --- pages/docs/_meta.json | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/docs/_meta.json b/pages/docs/_meta.json index 3bb58f6228..c06ad1a466 100644 --- a/pages/docs/_meta.json +++ b/pages/docs/_meta.json @@ -3,5 +3,6 @@ "tracking": "Tracking", "analysis": "Analysis", "admin": "Admin", + "tutorials": "Tutorials", "other-bits": "Other Bits" } From 64e61707b6aa2f3cd00cb5153e70be126b2131c5 Mon Sep 17 00:00:00 2001 From: PeishanFromMixpanel <129823695+PeishanFromMixpanel@users.noreply.github.com> Date: Wed, 17 May 2023 01:21:57 +0800 Subject: [PATCH 112/123] Update _meta.json --- pages/docs/tutorials/migration-guides/_meta.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/docs/tutorials/migration-guides/_meta.json b/pages/docs/tutorials/migration-guides/_meta.json index 12280fbe28..837df61e4f 100644 --- a/pages/docs/tutorials/migration-guides/_meta.json +++ b/pages/docs/tutorials/migration-guides/_meta.json @@ -1,3 +1,3 @@ { - "migrating-to-amplitude": "Migrating from Amplitude", + "migrating-to-mixpanel-from-amplitude": "Migrating from Amplitude", } From 36af550fc14908c29a35b3e399d599bb5b6942d3 Mon Sep 17 00:00:00 2001 From: Vijay Jayaram%KFE1}`V(*izwVj>I{5_NiYUkur^FW(7 z=w>*^-%MKmYf{h7PC1b!n)1m?9j%Qi1_QclP+IvP&06Ax7LJ#FX~BCFj&aF`#KFDy zbLs)5e4W{I_?qhUBuZnj&X8sqIU O`DQB!R zeZ4R5`27#4EXAW!~^Br1Kzj{heW~*1Q^Rp|u4jDiX@%n;4=Dec%t2ihPucybpd- z8-OroG3%#+tkUiwR?n(iOs6rv2i1D==1d&w vXm-OMfH`D3K6kC&_{`0eU|agD2i5V7l(h3*{`Hqhfnf}O!q zX>dmi5f! m zF8SOhNd_w|W)p%m2_;`#T#TFjDh`FfvY=l=_%>;iKOVKHIi*#RSLCLr{vUZ#rQYBx zvN%^8{K{{=A>$2MCCdU`&)F6*^B xfIn)rKG0r&4AqZ-yUlQ zZ*Ol4#W%$D*Y?3P!n+O|Iy~!~`};x7>fF@nvJVqMe9}|I=I2Pl5h{0E13q-@|dD zPRRJyVQK~*Zzi*aY&mKYU0Z8N=jA<)mdzMz&Xd0<12l5_xud6UKpTf2T;4@vEjm?$ zaJHOHL)kn6AHeBwx6rUe&uUGK?-g?lr>CR)zv=V!A;uoWz$&dH?cgIZ;4ZYNvbuAa zKaZ#ZrD=x=sqjbPYPqTEOoKr*nDnar=g%5b rW$oVvaC_WLhP!xO^~fhBqLi~T&(kCX#80xDK~-`nj0Ik?zK`nC%ZOT zk58+q^+`xTdlWf&RYn^gdHr?J0=-vO#Du1`&dnjC<2t1zXS1`h3T+M?E8^>0SXi~X zb#$}{Kf^VRAz3tio4k esI!gS@Obd5H;k&L+z+EK&EOhd;yb#T2>Rc@ z)mc`mtJG^+Do@Z}8r3MZqt#zt@w>pL5Vnib{G{1}4F_NxonVDi15L39PToMYxw>ve zeDC*|S2NbG?ZHRzb~28qm+$%tmRtXD+>H(eVr1j9Tq=Z*{2=U}g})B#)Wq-pbTX_e zzJQcdOmP8UvEoS<9Wb u^*R|sXHR~MgFysNm0PF)-`n=w^c1s)sbk% 4|RWqji-=-H36q zc5j!_$=4@ukHVMg9U|sBHFWHnapzsmvvs1BP#^)eWt|tt5BxSWC~!%rT2hd2{Z3+~DzK6(&-Bma;5-@=69)bnM%2e`oFjye=Xq7s${7cPjdfQ=n5&%9Z} z?scv&Dc`>@!>&x_U7sKCI3Z3I))@khxq5q3FjO1n{(37V`;#^Q31(*zbvK>=%=9Es z?r{*+MEj6XPae89Ayt!;+|drGs$bfp?Ym7Re;cguDCcuK I#-uu=x^plUo0_=u@X+;UEXXLY zDTirhnDj>&di0gBd3$VsXTZ r^mT-;!46Qs+?%rr@1Qgur)&c21Z4z-}uJ{q-q z ()O!y`-_L}kFD~D(p 0H7k@02SHs!2Q7H*#aC22dnTGw! zt+QBHa<^Cnkp7IkEbQlAG-E n<>3iH3u4I zY0sP|^3Cf*5fnO`LFo^EKlyEWA@|`+0zi-Da;e#|JL^NY&GK8NAg3MOJAWLhzpVy; zGfC9AFYHu}32OqRcw&sApv^&0qI@qX5Kgb@68Xiv2Irzswf)!&b|N+!6#H<0AQ&y= znKd5fo)))4UG_SV%W@*yB=B(<(ir#%0r3NjAzl~u3tFeV`M1Fic3tPGT+4BLvpG5w zBBWo&-nzQF9^G_bsXXjWKI8NyzdM#bljj>ye*_zL+)B2Sr KDmelQ;M =r!y_=%h*b zw5CZksG@L~&C@?!T~}fLs&}o5-&yrZ7Q_#?>U;bm2?jh_zzk}H7yVontz}Eak`DD& zlXa{bOzl3Z!;Y|7HI7=C(Jhzn_ME_BW%0>pzWs^E+lQAPEJk5bbg5N`KtsMD2-v77uVTPAp!=G9IA4C1}O>h~Rgx^-uAiwVf`!!TQ z(iIQw3+UE3)Bk$Or{b?jWV}&j=f%W>PB1ra=#)Q~T_(cpG35u#;Vg&bnVS8tRK3rH zK`Q??1`;S$ 0hr)V`8#LB1yQc zWh3lw$&>>E&)`i8k;2QD1_+oWEk*a8=G=VL+&TxmSP$}JqnoepH+Odx!MU!h Vv0 ze1=sBIX~A8s0i2PvaO$Ajb->1T@k3RHTL*OdwYj>zVy0eA@vey58MnE8G?PMGEb~% zvlmgPhey;Igk6`2Hv{U9HMsp&aVbSHc*e+J*B&>=t4)?yx>@3zOupB#YT%Am*Xj&a zHJNq)BHNm2d>(g!)8?qOPvxg^v#YX%6-+rpC}*)XF{fijPo+-}-7jn_LCS4V^UKuV zlCc=9I^X&rc5S8yqdn(UVVY59@(Cip5XCY*nrEP|MOXL#nu7lZsr?AwaC{p_4{W|# zIr@+djaIK26w2ET8-5&Sl_~&J1;7Gmo=Dt(Juf^A0xO3GrU#M&DGtC1J0vtZE!;ZR zt`AY0`WbvxA_ J_@?C*a>IE2}%>{^8)CxlEdJ> zs(!5&{W#cKJ;uz4vf1}~iJ7i2<4DGps_gZw-+38xwrpa;S#u{9l4@H)(fT%jl$cE! zBSoQdgklQQ@=ezbGk$&-cC&oD2{{)MG)C`elu>OFKFprfvlw P-ki2huM8GBGpO0=Yhon*%@G!~75s2ge@VAjIdf3S1x&6Pzq$#$X};dK zt(HXTn114Pb%wM!Zys$#(zq3B>*kr{w }&sQ-;A~*ffE5PtoAz^BZ<6uDW9{oqao?3rBayQ=@4?IE%XC& zjzzW?jh ZUCuCrZDUYo?q8~q0_y$kwhrw8apiV;5BZRy3FYQ)#( z!0w6RRkbmm=&5X4H%C`_<7y#Kgl4uhTE4xGhlGCYHGzdmhO+Yoqe?1&&(y27mf z7#$LVyg4=COs-r~pE7|6fve>Xi3wEgAA&ZG&(*Y69y$!Zq~Ow?oyLc*wQS4m=7 z$?X-*xq=msX6c)jqbDoR+?-l5v+6wf2diO2Un{GlrK`pEwc}jX<4*=c>cKi&AA%H+ zP^4&4SYS0L51qo$_X-O6L1Ak~bKBXz$C%w0t@1Nm9gv$bevDPrMZ>*Hj(4WVZPF`* zoVb|#a 5seephkoCuG8J! zYN_nxcRXXv8=MRr2&>w=fBHsSIrOOOO)*FpyLGTO2DQ8I%WphMIP`akLY6XqLc_=m z3~_14kyj~~ $WtpwPUikcf_R9~ z9@&X}=f#?Dli9Gt!|spDCa-DJ%N)Ws4Dj)e?v1U{nl|o$Ekt7fYe%N{nwqG`VaC&5 z-gB!O%WNi-2nEqCGK-t>{m_BY4P>)y7Zl%ezO^8wDP=^K`gZXZttVx6a{Mu-&=2E} zVy}5I2Uvg^DBxFi0eA0W9UL2306<+@(*iG4rBnh5TKx16VN$h E zd2V*Gm~aPuDLyK=h02UERBN}2Z_#2}xIQ%@gP5KAkPqS^9*@q$G3~kWWd?vqs *%aJ!p827QD$@x5vO$KhzlgZI{T)(NvDu`KX z^c5(?ns~@RMv-~b@p!I8ojH`^bZ$PG>mT(jXqx{1y*_r|1cOL$T;j<1XfV$H`>hHN z31%W>N|SB) ;$zU){#oqu~cv_wFO=ht5 zTJeZ_hu@t`LNYce{(#c1GHl&)A>M$jM|@{k;IF`~$8!HHV}y`vI&Dk@5s*FZ_rrQ9 z9)XH0#(YV-AH~bv`4|y?r61&Cn<>9PJ1Z+zA#;J9fXWD06_^_qE>uXU#F=i~EiB{u z+UxjA7K?OA`e4DMmg7XUOzXdyBjX^H#rSrY?U=dwzimImk3dZqIw9K#Ts-WN=tMjf zd?$3gg*VX&CS@PENKM2x2^u>9S}(xN4n)rcF{8t)>+SFh7|-a8CHggun^j*&M`mYs z@yU4h+rlVcQ+eQ9=G1c9lKf3mx{t5E8MH?Lk%|05N-^xOh?rGd*rZid-hCuixn? NR7UfXCX#rUqT6 z!%N%pa (R7(FZ{`Fm53A1owenSwkfDC6yVUPGOt=7s~6Ss*#=A91)QE#&Fd{J;$^ cvp^B zu0hy2D*Gn?45vkZQcxE0IN!2)Tq~E$+qV^TD7^X6C3;?Lz`}Vw+G9gi)^)3VDzbGV zEH`)I%Mz{-J;~6Wb$0=~ySdvyr&*d;6K~}6GQ7Pw6L xdGZv~Mh}0C>R-oI zouBA)6(v0`))2lQ7W21Hy7exlz&i=`HxW0>{<($n#m1(rdX^`skh$&k>0Nu!!D+`~ z>HVah^DgY`)3S~z*HQ~jz=TzFc*=n9_2Jd%Oyt?0b76Mo>2A@83&Soq^2xwhl`QeO z`Kr&G-9)z!!61f;*q69`$JL 0pUHK9_t65~h6qj h)>co*#jHofbvMizq5mEBd4(>P3epZF8LpsC4KJ<_V zk`~kH#2vGW5g(5sly?CFna^dNF~N+I6mK2{9X1#B-vhuziU!x4klN#LB ?tV)yjYS`ISKUHl&r8 z6Nz{KkVb<=2-kZ^sboW>YB5E0DD&H~+b=xV0wzJw9y=zq&i##@^U?W9{f3zce-gN? zf$Xpnt I7VVj0s#zgs-ryXPQpuS6pIyCr$! zU9Z#lUt*%XWnQTq Qcu59^ZlgcNVPpBd9VGyga@^t z5L3DMdvg%_>a_TNB}!RzA4r}LjRonP-EA`(xGr{x5mEj^8L#&)iO5IF|K6 zfL%B<;K`)|nfY`w2jrMw?*l|iV9l`OY8D8%D2c7a0ssz0_mv3{!Z{9TbR#h@Y&;0< z?E!8j44T#qg9kcRZ$d^jnC`axh-YLBy8KWJgT|;ES7rw&9+0xvODTTCVQ?JpI0grK zN>%fkW|BYJt}I%|l5kx59Iv)7To;ayU$`LczF*QL-SOK_P1gs0!bQYFz3zS-tnR?; zRct!Q_*r=H-ZA{>1&T##fM4&j{T{=~^1+kva5B0M)%t|b|C5xIHPi_@posta&*fjh zNuNnrq1Uw{OUHT 4CGq8fsD))5q%T;R>B8=seQ=_oBeAgh3YoJzGE^ z--V@=)ATzDll{MCoI$4e2oJ%Un%ajNq7;V-7Ahl`c?8cD7oHz@2H5i)!Ir?LflzN0 zrWLN^qWkDCyeM^F9$X~qOc7CX?o2>DE+4tpFcD9!X zr?AV5$!5tzXL8o? v#h=7q ze?MQ|1cd*k^1k!V#f?wN1Gd&c#y?3oc0S?ezKrFP#Nw7)(MhrP@%VM!>Yv^GF6fVZ z$~0YO2k1>?i-+b-Cwz6^svm)HSxx3%Js dQeM;9jTs zpa#(jBZhrdl1lstbqNxzBnhnB%gdYm(ub2eoZ<47V2SkrLW-8WAnkQODGw6|mZMuS z{{u1c17Mz0PM$l)Cp7TW7VaF)G|jYn#9qm9@z$o}M7jKUT2HYB3b4u3hp2Hy>FS;# zWBuKUC1rW_(}U}{Z)>`*SV`%9wvg+5`0%5@3iEfXJnx|#SD$t{H5l1$m%sDj(c?1b zzg3POysaS@pKnY4XWp}tgkYdp)$5Y77pfzOuN8|}-|3_+6h0zIB1gr0&k-ej`jzVC zEuHRJXo7fOk8z47LyQAjVSiy^p%{ey$AtBjB6=##%dJ)JY}y0|JR4o3F@8ECXPAe} zN$UKxe*=<0F&8^r9&Ro63>1!|WGTAZtIBCVs)Te{FmoHf3LVASIVv7|&%gwLgAk6E z-LXG7H2YxB@XR;}Q|gnc4?h(D+{TjWdODQ{Nq*Cd>VJ*hRPrN!cfmJTZ+U=ba7*H@ zk@we75AzQsp!I`-+fU_A6}K96sf&$P>c%O?) iim&cbq)mpy9Z$vQMd^!&z;`Ly(cMa#Yhe4WN%poE8sP`qM%UYSnk<;^8cz25?~G zifT6rE2>n;L9vs>iVe8g{>DQvd^tNGRPz$lnZPe7%c=GQM;Ns)mLy7b5zm;S35b+R z|2K8=4<_73+Es!d5kdl(Epsn?KpsSJ^Ve@Ok1nPQhiM7^ S$;f97v_FIyKTVw0)}SG;pq;`IwwsiBLrj6gWKi$u}!pJ05TbWsEw8 zgyR uuSKCjNU|&zaA=uzwRvR><4gYOr zfj!=ts+lyH-tl4tlsr6@n&xeLy$n?cZnAc>xD`wVSF2?4w;d=2-V3fC@P0aB^;-Ar zJ>l+1gp9{ztr-c&k9M6xh}4}36%|#T1rndvu(~G+F}`LL22bB^z&73Q9#Kt6V@^8~ z& !{Mp=R)8=-MOf>VdKdPFnLLTT2Lfn@_EG-(9PjQZ5sIXp-QLr&%9W}eAPF@Mo)+@ zgyDXVWHzfNyt}ljpt=PIWcK*EOfK)9Q09%00!JN6Jo_OHf8*P`CZ?6m%`BRF3ok7e zyRv@1LD+NWjd%?#&lhdMaD$!#(A0FYh#5I4^H2%7k7#Uc_I^q8x8yY~K(J;G6FaP~ z{@e+8nqa|L6tBBk^M){47IfWaZcmP=1)lR=!Zr^_nR9Dw_)0!whFJkefjMI6CfdOq z{gbmoQD#+!o%_L*LPA2vmu_m^W~_h6j<)%4QUqh2dNGg34b)jAHn2{RofTmZBCT-1 z?jw~3IX%*&__5UDOnhE?)H}WPiSwwXzbka*-&94CF`cqg0)MgI`nt`^MS0QmL5c#} zK7HMy&{+Mq!beMm?;Z?|(O@R}r<(9(b|Rmkr~K3v*2{@I)My$6ck!h}9gEs5;HM4| zh6c+mTh2Ds``YvbF)#>`a}2!&jd3fCAPy?-lDVvl0H01H@J`QkaFyXdgAh69*JDOq zoh`mk2VT~tl+2Q*&uel9!IyKc7bNwBGfs@Xfbr9tm2_nHm&=#OdT{P6()YWug(`!i zYgo4EVgiPmt`T3d+ho_%wHby^*TpKt^T8JP%dF~C_u~_2kr8{{g*G*`gtEcXjRVWT z(&KP381Y;wD!x4)Ge|m$T?{q&4-nj8lcFLK1`a4 )d<4Gt9rlHz|H(|FUg;GQ$%-!I@6NUL)iRYhfEz zY;bQijEMGW6LdO%VnJEFAf32rVBF+Je9H!^uHQeD7ez|yot+d7|0eg9lj-HM-X1>+ z;&i3}i>G39ixJXun`cfj41A(U%SzdtWO^U~JuOWh3F=$yw)O7r4d*RFk4fF^OqMfj ztPd7?HlU&?{C7W*QKb&MD?Zo%&h@?i?C5LMu5}DEqbcZ&gk@gY_j>l6(7!5t+}#C7 zmfik2E5i!l_reZG)^L8xQSiOI7CBjjysQS+GUxiO82WFs@sl2NJO-po #qlWn_KOUQaV(FtrqD@*Hy;xZ?jvUh5fTkNavdo29 z_&+OjTK{MmPpQ8KfgpJ%B~5LJ&1xm-_x+$p?b{-pW3h!Jrd&oqb;kFovc+9|KKCz8 z#Z09>5-8!E>>_kuSl *IRvfYU1$0+}+(_vk|uyl?}CJ9d~JAL~yH zk#T>WiMk@CgRBnatxQBhd3M~2K!9BT`LilOj!eWa88f8soK(jFgcvG)gUoarn5ZlU zt7 V!6)Jmr%|NlV-GNVNEw~tYJeduIDdy>IQ zB8HS(<9`&INsWBgE;3zDD|{7SrJHk!zGQcv?`!M-=|il+kP&p|_9rbIh99A;-XpPG zqK=bdHx+nNu6g`A?A5xReb4*V&+`llnX_4;2Mw~EL5zYIbC5D_mFZ!cK!EMu$2{7M zxRIICyZ``lNcWLDY<*Ww=i|$1_tT;gWsmPe&JEl`6F823n$Z`PHU(E&0gNTGKIBb1 zT=}`IBOHIuS?G25&d;+1ARZ4^awpDHi3Fi56CJ|>_|s$ on%36 zg~g`cCGPoV1f
45xq`v2W_)gu%Ri`` s}UAI#0YJ3jpw{;jmpNu!8}VHOEheIAHblQZ$Gpcd{=Swj3?1{Bff-c_Q8S4;`G zwt7RRCH~4Gk=<^1b|c(D5dIhzmfGHnVCZ@D2)Xct5!_jWH8S`dCqzk^vgPthNI2h; z#&GpiGOUtt=^jd@uRoeujGm;0zyT!W7;jr5V9Z-C 08{WnSiG;pNHbXuY7{=|`D#H;GLMZA(lrMj }BN3Zv~XyT8XpvRP0u@)nu0eWTMflm^h#Md{s7rg=20ft@Zk+0WbL4B+x zN?5thZ3yGx*6b^o;r_;J+P&F+o{Bj4JDamZda4s{o*3nWo%Mm#z?iwkW=6FVx;EV4 zg~*e@b(-dUBgHey9IvV#R+z4L=0Y$cr5mGh!4$I&UKNZ6dkCZ;G*^6zhcU?PChSZA zKxL%jItFj}xS)a})iF2Ok#GS?I&y=|rkPO|A+k{7U^9P3IshuRen@)^h8y8}y<6nW zhnkf)mK?P)6*ip0 pWq`|Q1(AR1*`8DU{EX1*TmbrN zS}%X*w8<>~+z_IooUsSjSQ=L&qf%PShu5OZN%Qk@ )QVzHx1|5v`>q)(yjr+7E zgMf}`W;{$KPB!9>Yn-g@WnxZ?ejsGxM1-73<9C`A`+1j>kAj{$MmNMZf~M5{zbtPu z7DUxovpm5mzn=TTKw$RX2V8rlDZleERH9ns&g)gmlfG03bSJ%Z?Szlf4(MMun(b&D zhr>WQ987)DCYBDkD3sA@*e3k56Q_exCCZ&HsAcjQU16MpZr1uC4T_Gmt7FtfW*g42 z>nnnM%nMXB9!JkeM;C$(Hl?>HezbOqk|H9wDYw0Rv(wl&2bY&>uV!AjQ8nH%T~-^m zLha3uhd*&HBr(0CPMNoBpIzGCtjxQ8*Zr^xs>xoVgzvSq3%n3`89kthz2={NUCY(u ze-~FjMVDkstonTOX>n&Fc#0ks$rTQ2iEWT~JH=SO6otssIH30T?;^8DI6W&qymY-F z{|X_CoQQX8Gd7BjPj#y+Xva1%pQ-)Y=XagJGT$B4HuNLl0-o5NRpJ-FE{ujb{l= zt}1>1-gbR9;>Q+(&ZLrS9r)M@YKY b&ciaxU%^n?6aO zJhLc5HUlLE6Fe^A0uEH2-@EY6+)m_~WzqOz7dC7MI6k&owwYYp-@y+>>_O3D{Mhjv zy>$>wIZ~+r_n|@&V>hY?5~{$xaT4yt)O&UOCG)$(b!i|Bm*qHYMh!jPw8#v4Lj_+q zF&jD{)go2mH-B5$Z-bHxdMFdkG|PPo`csY$&N zd+f5s{z~Hx)^z;uZV`CyJzxHx=QT=};-7DgZ!x*sT;x=7=>_T^p_F8=A`$IzU#sQ5 z9d$7gQN^;xWp_UPSz3qCw7pXOu+B7#ZP58~r;q?QL#4Opm4RwV@94VzV_Z^EgG5P9 zaY4a9+x(IupOcK!4bySR5=A0EDO8emn6a|4Nq;F`b>O24n8MNdFiV&lp5#EvW#AIK z4bb^M+sMS??cGWy_@_n1xX;H`BB}VnA8q)$QF(xNl`zVTWnih6XfMynAVv?qI0ji{ zzctq^2TCqCU;e*3Xk&tW?#yGV?AO~eY|LDr7n=^A0Zk9M{f~IepFa1c>*ED}HCGwK z3%q5>qs5*19=0hG_}oDi;)_DX+;!c!&T>Vv%8qMTAkq#CXLzFJ~kJ s9TRC(a*ZyK7{d={uB#cXX4>?j6s zfJ2kPQ(+Dq%6u}@7^uQ= 77Q7m!_k{a>Eo1WG69_fUHj2Io3{g 9ACBpZQZ)`q|RMs~??a~9O zTn} ^At*~Eb;3#AK6LV^?^hX1Xt8S 0HVa2V#v>i|F`G_n*$No#eVS=|8RixF8rr~$rdTPj|QEC$)%1_I6+qME`y(u z9LGF#5E?p6MtPtDOpZEuO$+#1+}b*aUXxk!v%2q6Op{E% v)6I8QIi{p&*&aRIfE}My&NXOfUCBQW|&5sN+)zOUD>> z>xi2I<)VddAquuW?xoM_iR8(@XT}f-B0y??JxIa?!6+LAcbP03e|v!C$Fo0g+5wdm z=|`x~hd!-PmC$Y(gMK9#IDS01rMR+lJO}+&yd!>Nc&+-X&=r<=y$M*Md$ThA`sXle zlqx5QQ9~!(3IZ&upgjDD$=u^_tv%x%Za=!b?30DUGc@!yVe$LBUm{=#+=z!ippuFo zZd4-x@tXZeYbca(Rc1X_{kidX_>LdvB05V@%~rjdxNE@#b_<8gNB`rM)+WyraZfSx z`^i(60~<`p^20q!)PZ(|4x+#ypy*=7cA+}GeHR9hIRnny>2$9dFz!+&rKiI}a;QW+ z+7wDD%Pa+#CYpHjRN6j@w%PpXJUf6a!jWhvoD9IOZz1xI;gh%zj0e+rg;+z+$msg( zeO(B$r nZ8*kT+30iRnat +Iaxu~jh z#qWXdKS72zT&!t#st3$kZY=qnM-S%^Q>ovvB@Ls)yv#TIwZgxdloE*c{xt!f1AnYZ zzGP3Hy+uh9z4$YGY ^sUC0IOAfzzqqJN#v}4h&C?W$PclXRYN#1 z@-`mM9hKunETaDsxXWrAEUk19W@na#Se}-oZ#Jj$-_eSUF%Uno#scW4SY8OPG8btR zV=z?ZBAq3!4FTw3!zTDip{uJ{RPT{$0XTUF`?g{qOG=}ohVIddgaAvuyl)bc%o`$) zf616gWa08Hn3Sp7U>O*d(3_?ZSZy$7U~ll_hPZyDqoz;SS)|t(A^P@x{}r|bgnF=F z(jE7U3&NR)v+4rk!jz2i!f59DV;qa0^{Va|e5Ri2-bB?yD@ @lv9Y=|9bj^pYe^`BacW*GFxIs{bO{$Pj{JsL&_)x&nB)DyQkIwm?+%-e?~t( zM{X;yNIr}cMXu-G=CYc8Irw6**yBbV++*_k?+twU ctK@mD25_XopE?DKr}%L|geJ1^XHy zGFtKIXB#nw8Gcr<`6DUBtpiJYW+SHef@gcu?k_W%f8_2i*@*}om%IYrP$rPB#pzZn zIrPSWMie{6Y`7{mXR0JPgi(w;kcM6?t=^6>aB^qxbATtMt oDLA_tz<%JDUEhl{y)0D0xGKY{aU)ayGt2DC8Qgq zOQch}OS&6LQ9x2aS{jD#?v(EC?)(n-UgLl7?^}z7hZ*P0dHad|?A`2;QAQr7T5jU= zVdM*7!3~5;>-5wl32`M$!mr^mYU&O)9)7>b_Dv-kkJk5IlMw#|@RE0S(4a3!pV^14 zc})hnZl*bk9igW-+oPZ91e$j#yGMRFx@CnKx2P(KqMEZ=A54X_?ZK84#~QF?(p0;= z0YN}UyvUYow#^)i-+sT6fz}FRpMsPg&$p9HmwLDefoOt=xK2JdrpejrzLcAPX`vup zika*7l%kLeHRvPfsTLlP^Ms_$ioAB8VaFT%mPLDWQHRRlcyjdpLYaOjZAU@fECET% zbvkH ?tPnB>;CrcRJ>j38NAQOFA zzU!>Lka>4D;N*QpW}gwDYmrE{U{R*95I>2Z=&f8+RCip;KSLLF9wNOtDRMLegtXQ? z-iHzc>Mtt;+JM%PEeGBGu1wS5!`|J(;k3CHv>2+-_}fN Z`lcmzANuUK zC(8_Ju~RJ5)^(57Dd&6>l)iLXm+;?|@gppZRS(oC1mnP0 zBv70N2RKvRR_jeCA9x(-TwPuD9kw4&zt!2|K}$WMkq8pmP(&1N@xqO7F>ehFaxKu= zc+I5}KfN*daJ%5R;68Ihm+C%yxt%LND|Cdcvx=#0y+3FivE>)95@E%-YhD%wm;B{& znQzxAM%;O+n*Pbn+`?V#0o1APd<9zXUG@s!rR!BD-kq^eSdACQ(#DS(_^_9dd#pAK zYfy#1&{lud`uIr*w8RSf=PEsx?={^~FAhi6hY{F+O&m^IA*a@BJCu U1}AdV{(5*Y~tH2 zgPO1}^llB1w=%DF-Ae$8zg&D)R2K?yXb}mS>ER-eUoRFd%?8wh#qiPtRD^{dht1-} z?~6(dgG1f6bLni+%Fr3`HqK;TzeaiQIJ0gxYwf&5zVevC^h4t>mXhEHa$t5hRML<( z-bY`IQ;sFJ)6?y33QR?y_e?8OQ2DiYegV5FhsYo;q=qs9KK2zp)-8SQU=Y0(0 dir8JtjvdF&cPD2(9lM7HsB>6F=HV@Sf?020V_x^hd!D$v zE45|5J3Ty4%iqY9fBeEGKS^M);m#6&cs!1_06qk2@Y?$7Bmgf1=#f1($LGjAFQaFO zn0-GxaeZ&!k}oyCu;O+;EM}unw7R`KDke`wO5ETf+eGHpip&SlMpoQ+SLb^w4q*5~ z=80W^fW#>cUQ0)R>ARx)(Z{`3fyFrSNOf*ld1G=!5G^gDpN|4M_}g_w{QXAXmoieA z+kNhXYHle(L7&0(r1o>b*jzlJltyQ}`8E{W$&taACh=7n-nn#fS;#oyy>vM?9^Q;N znWqH@%VxaKo)Y?N9vFqMk8I|=Zs#u3)bmb6sHtqv(1hZon2eTC?7Tn5?h$`d{!I(z z<3=NJ1V?8ym8E;*D@)0@6>_0@&D9PvX|&-78>m)!HX@0F1dq-lE|}gobM17EkxB1h zz(pV3<=Eqn=sfQqjLztcYFJN4N>MXLESrioe8I|&8@)mgM9GmA-LX%l%J<-qNBJ-O zG^{Jf-)dc7^Ke>wT_BwwG}I-o92hO^PY`S!004$PD+y$M{GJ=)F#ClqVyA1yTkcKE z#(8iM88`M0uU2Jg>4=?CU-6m5M!DIKQ0>OJln9g}1D#a3n{%f|T`$ltPvoD}*P ?$zVR4&ei9x{udlpDnOuH~V z>^|^rw-QficqO;hEN3F0N5Td*v&ewm{3yUqRmW7`X}o`)o$4`dpFG;UZnuS#`o!g= zztRE#lgi=9yRIRoXJuIM*d>p8CTx9F{+;hzv_fF%;X_$oQY$ldsSVUe2eWF l{nc*iG8Peahh zS$GYfDNfYg?7K-^DF@ZeVbV@0zpZr+KGUnM#NKQCT3%5(#mc$;lATSJecIR5BrY$w zNrEyeA;CAb TVDf9aOqot z`Ct332Xz!`T1OAgv+otv{pPl?Eis6}V)WPuh;+J}W~B~W`fkMOF>Lv7oxXfE5pA=z zmohJ|Z5QgpTy@)6g%u@_w4T~!0s-_w@9%|5G+vHoeF?zmT3PCA*_=8f8lP$<8g~kb zmkDY=2UtPmv+ZU|?6Yxjl7+d_dfy){XAYRt($J{M4j_L+R|oXTc#N>fZ4eOKSzn;@ zcA99ebMkxL`+j&UX%i6^_JJwIWqXSbh)lCd7%K0?5F3*>=uJ~KsAAfnUAegITL~k% zWvMFuvDRv71k&I}1xJRzm8OpbR1Z&flnd{V2nix7p*g~ ?{Iw zMj!_-c(|y{5+LYC35tEH%1~KRp)W*9s8HDrc3y&fOy_F^8(zE)?FbahFUZ}mgU*06 z(Bme<9%tY+sH;C6IYCc)Hw6#|?ol!>B_?RN%hHnG01sMI{0_kBF_|Gm?yemrJ#oD| zE1D63S9yPM-@=5w;>=lYqaT1V;Gm*bVHZ%KRyJ+4z6Kk&uX)UgsDa5kb$oSB@*W12 z5ma^0S)6GSFwr}ZqA$mP_emz< 3u3}!BXUkrjdt4?eI8 u|YuA0paw$E4>ON3e5Wq=9OL;?eO25r`ZU@hjDaW=uwWTdY zhmEM?nwYe>5Xv!s8Gg6%aC?FNLGvu}a;NcL$8xTQ%}Q`#RI36EUOte>$fgQy_eUKZ z+??N!VdEv~wX8GJ(n@BHeAUiS{$=CHJ@#73+5OF%&*Bm%oS{ZFcw!_mK)F*jk{_p_ z@CG5yADIzkNDDNQo8$P4+^G&-H%@k@@#Ix~gB3>Dmbp#*I`ZdPi2x%tU|`paRC33r z;ex+*k1^=misM>r5>t7TXX8Y8G~){@DaABqk7~P$)gVRIe|%IW`DzULaK=xLHXc30 zpIFhwh$e`*WcXFzUtkQ~bHJx?Fv%RsE-sB*W;n!WJbmYgszmnt(%t?20O`T?ciyWC zx4h95=JTo<{0Eg1vi`<5C6_nt0$2^RE@6~1_sPp-^g8eFLQkzMu;8b0d`5|s9!fxh z(bo1#Wo!oXX&5J{d>h`?LCEEFfRq~_IBjeH_i3byj6q+mtZ!&&IKL1qEZ}Y-ZITq` zqeo2kAruwH*Vesn1Bx3KD6V`SNQya^_lSLSplcfAEsvCwkvZc>tw#`}x0)@nkMp=a zqI-XLje`76lp<3;0T7hgieO^J?xv=0qk_A7M|OxvYg#jrQF%d3o#DYx=S{D8l(X&` zs_raHD%XsvQ;#zqvSIv*X~NB5Xy)iQ?2a7L0|R~pMIi^XoI@x#sBZy|3DiujSG>DZ z=XdvNMuSn)j;-9{K!P7z(s)aMX%*Y)$*v4K@8sFYl?dSCeRa;H(?hCsT;P+}Yjfi# za93Wq>GesD*?&2AV6SWZGDA0mgCpraDN!gfO_yz?fq$M#=N1*NC7)lqBJwA(17LOi z^@Gd`0T7Yk7t8*2K2UvmLMOvXF+B4Pnxw8!8&sxqcRT^Met`J4%W&M40MJdlEr;~S ze*W@fr=-~fE{3D|rdA8}^m2Y5R7VO`FLqg7{tH}44mpP)U)6FB3ndLXEP0XXHF?*h z=e&?+xK;P@gBsTedbOJrkv}N7+{lB$EUlJAv^njj8Rd}-cJ|AYcGS7#m;3Jid^kSM zG~^1si^pSAzt3C1wh(~cNAkH}v#Vl$Gb;M`$nSGN$XdMQ;F#J-wXVE_L#@&1y*$bV zo1IAl27LD7`N#Db;)~jpnugzf5T*=??ax9&)lRM;F(&{am7N3Qi-+5AK{F4x)1Vjp zfPhy4z0ar>i(UmFhE1TP6p-dl>4`}PTv1tJleM7(Q<`Fnknh+WU@$gAngmFkT)DEr z|FDnz?BL)g4|4L(*qbL>agQNqpJ5^I=&F^@Yz=q)x@=NOIk~dxllAHK{>Z6xQ6!$m zbCYVkA4 <=|pJ&wracY@5RWIE^hNTK(1Qe-A?72LX4XI+@VacNG;C zDoRQQz{jWtj{MVcaq%hz`dVn(K?Tmk@_~>fz&7LqfvKyW{>8pORMua%4O`Stjot{~ zl*W2qB41&X8$aYbY`!dJd03sXEZc9wn7^X)_$)rbSsk=tZz~Ln^L|XL&wS6!Y}b+L z@5i?=FAofaZRP9eDh24jQ7?VDd>(_3G)>Jm>c#nCe2}+9O_(GkdohIAbvb{}^uK@4 zl0Y1|Wi0eJyq9qdC+j=M(NUNm2rcdkmaw*V$x9^{RiIZIp40jsSvgnabv|T)M{SH z@5+&oE9h)gYF@~T;D3wOG`E8b>*rm`$~BFH-91uJSh1!ulTL7g8g7Dgl?1g;`uzEb zC6{mRABLp>bO)@@M=2T=fB@(&yvq5ULx1=n`0OZqlRhF^)G;E`9>qAmIp*!OGQ; zRwyv%n!Mqusi~1Sok ^I {PQRes2@>pN+IICG-d#7V?Ww5ie*Vwd) zg2 R6jsuH)8JvsX_VUYch;dwkIU`SYYy5*}c-`|o>ALs(zW zJS{B?8slN(Rq~n0)08B|5!z@{<|!sQm8ELR{X roMGC6ZR8=o9A`SRsUO00>hKL=F30?B`D z?| zTcD??VkU;n$G_>^e)B&y3>^5k2&!7lK=Tz_|f`L`<8G2 zt7zm`uZNjJVh3v0s|QZtm|L3G%b;U2F%qcA&%uD^=7n8WejsRSP*Rw@mX@|rka8#w z#0)&E9clm9=KRl}x?xyDCS&+sPaJOk+dw}#@7$og{QQDbyIf|CMOREBEQ2|vO9wCh zOSY}Mu%&duZPnQlm}frm0a8}k_EN}gj6l=_mjuUShWFGH#^e8nkN&(r6i_+e+eC2g z9H{Gk=!vR$uF7ipfAW2Q4KThPr1Xq^$z}Ryt!MTW5}Fp8c!FILyU$$tV mP~dnY^n1hq*>leDFJHb?H8jj* zV`Ep- EtT$=J8$E9;@}kvbS;lF0$dr4BvM>p5fL%xMs8D0Ok!hw z?j2H3)c=HCeyyt}c}#qq7F^WtZva8H0HpT!fP%bMt%_B6czEomPw%Ftlo-8KQu_On zLp0Ye7BH*R(uPq1>K`~XlG09gUc}*k#Sb4o5cM3$Z~P{R`?+-R^`Ixw-lcwqAdJR{ zMlbgl0bzqLk!I)#ZS|z$Q6#H2VaQOgwOA|Ut=mPJNMu2p#=Ha~ACr=HnH%2zcH1B@ zHu-%7UJ{odU3+~y|8wx*=~$lng9^Gt@7LlwEq2D`v=*N`ZYvY<^N~QtJ?C~i|DOEH zzC+u2$t981;MyaS6j%`c@igs#59RSh9?EMeGI9L3srdJyrfY!?sJ~St%@XJP6=#wR z&@ovFdPNU_cIj%quCaH M q@0cDlol*g+`GC{=fB uQPWIsT+w9UnYkq*q@N#n?S{ IXhFI_W`NZ zRWPz3pC*`R?h~($SjObJfZ2!3G`CR3+&k6?*dxMPILSJ{=kxwEA0iGbS6$GIFu~TA zm|#!tXto7^8`Hw=-a<=~@HTJ7uyX_Aw=4@wQ?@K;;;>SW8(H(_tB*^_lQG4axw*pw zxHwb8R62wcI$n3?xHvd#aeN-fwILa^( z!h3GcsffGgnz47hrU-yhd`pIVAh@3<84vVToSq)dOYquXhkcIKE;0GWk*>Pda-~lc zIfz+2KQ G;w+VR(*)iq{@V4o-Y*j}Qb6|`P@ ze8ADEd)IjVgXn#F@sLV^rmY;rcZ(a|`%5Eh9U59%RK(0@e8w11c=0I#&n<1{fkF(s zjT XF0@W*;Rj^fn z0njYjV#eKqZLkWb?&~9z05-TKmKa{c(24B4yq<{VYXEc-;-Nnr9CjMa8>-2v{7SDy z1YU1orOZT54?Bj$K-9{sYT>CZBk21T*IS2qfJVf`ejS%3g1PDI&)wm7Tbtl%nmqGs z%N*d !%AZqEPywiT>7k~L!O-%cL20~r z{+!qnh&TWl>1n_hw5O01Gve|!-B1-0s>_yIu7eSMn(Eci51eMkE-o+T6tZqET0ADf zvo&W*efjS+ w*&n_>Uh4kK@y5ng8#tf-`6@WRfR zJm_6H3BQ8L%>`LGkfBQ-<|Ns$KI~Wq!V&6LRuTR2tgTva=%1!3ArqA#;SM0Jjkd+> zSZaX?t=s3T`otn6YZ}MK#|4LZ=RT5$rllu#mMHY%!7u{q5vPHxrE9(JsmmYQACnO% zOGY<6&zNs`KQ%{Zey{6$UiQ3RaB6JqouP^5{P(J@v-P`T2+3$E>F>K={fq^qey_g2 z_jvqnXw5z$ agO58^|oXr${!WXvTXVbCwrUtDZ0)Cd-BiH*MX&b9ir z5kk=lOvD0MiK?o&^t;jB6C@r6n5P!Kdy^%t0SqN2wl*P=t(+ddpDE_vVT{}-ae9tG znN%+@a5l$%(kvAxo7;pazgcXW4}9f&Wxr8FzSiX92UO4425TV~dPc{?aaucA>r@zh zu5Ek4`F>+yj+DIDd`K;Y2?Q{V`Q6;2SSKEFhAQC8_r6!ZXrZMEV0reo(4X8mF`37u z2bVE^!H|Qrw`smCJ|noZp+7!bw~5Km2_W9yUCmWG-^xy%l7S`}-CFDUoc|ueo)Wu+ z@0Mnmeg7Z77K8Qj_0(HD_<3c0u$xc4?BoKz4e13#rRHzuAr2p$Vd&UFhRRf$qW# zhqA#60`;4$R_Hxp=}AA@&Ml4>*}y@RjCT!|T%?CrrH4){_P3(9wLOYO`0)a6O*TUi z2M^C&DQbX@f&xM)8rwQbAxwzIjw)90OE9)5bKT*05D?|fqAEbwGN6@9SjFvEmQ}(Q z?u<3jjHHa)4?w9gH;GsL+HxwmGK6m^Z0l~8kS)b!zs@Ma63%Ye^A4}!Q=FE#a7i 92l@KTKD|*kFsuZc2hPL6 zF+262x!uQRDDLKEj}WEEO>7Tvty(`k*y;yj5xKK2zZLy`3X{Hr#I{c2bsL|5SQNfF z%!r&L0Yu+BahWt1Ez`ulT`(|ITg0$%93BP+S C{t=+=F;mw9R26LsK(!{VZl z+5O=RNa p zb-?K5?u5RPZ{xAjOvmZ_V)+a`jN6tH(w{<;fv4NGQh0Mj-_h}mDMhW!6$dhOW736l z6gw?NDce~1W!Y@NE1p1Ekb~D!{SN~xL%zu<4Psw=e#l;;D&~RFe{Ub1xTuFfm{1V; z`9R)Mm7;>0?M%I5j-r;9WdVAVv{(WKq6#g=ojisj?(pjXl-!dIW>wjJhnLqvLeV?& z>}3?!OX3>C m8UaZUOQ}^%vVtkg}{ifgAeR#6 rO z@Nl9<6vX3}T@{dyTSxy+FLZwO+dC(uHIF|#!%xP0<;-#%Qc&DMy1YN(Gn( ITjWN*2L!6n@oOi6g5oOA)lG#|B-I8BHN1CtQ7s!C{fSJT zX+zXm?16-s`GtA5!^nQ`x9%H^_RKVD974#XC{Ql?y`LfanRhPT4x^LWGf|rh8O5Ch zHHHX99s0k 1FMIXe{&Iyy1lstAV2rPABw{s}9m6F VO5Mo1qGNOlXAJY6+i+!d3A!lZrRSXq~ZOu1g|^`56w-qey{DH9^)#;;=3nG z-K7g}->4aa=Dsht-XtvTZ2F_l_1m0Ne|KnbEQ=j7{?2?;kTe#ZLxUWv^2-e(RfR-A z2(cmjVm`=o@(GD$Q+=Xdezj#$8CPxwo(?xuW|@_)x#gUA!9KzlqG%3j19h4lJvRXV z+wHYuqb&A18xVsJeKPYBEh5vNwEdZ&o-X6Y3rg t;V;s}x$&DHC%$us=>=vyQrgQ9uAuT?71$1M%#Du+zc6N%y9EWz}1gb2i zbSjFOj|Dcf8^j2e!#IuKZxi6KPU3+ox+~(r0#`WW3B}*tu^-VCj0Y}meqn3{F{}P` zZau<<#8^7js-*C|;G8%nvx~JG7IXAU9v+K`NRL2`pkW~CGjUX}fZvB#3_#UYT29Im zN@e22v)SkX4AXLycZEF`@EX2ixJ23t7?t8#G_5Fs3?Y-M+@81o&%STLwu+fM=}A$x z(Oc|he*5NJ*q4+ OKu6J?3 zOb1Q)Xw&i>@5;2s@8|z}IQNkt&OsifP+RXzhpni_eCkJ=VXzpIzUhfr0THPSgIBB> z$|4tQN5lUFzkyE$Mn4fH!af_ZEUE;AzR6kA4h;dQ1k-vId|V8GO;3GGU+q3cG7b18 zo-?NLS;6)=fF4L0po~-Fok@(kk8&2i?_dYyRi%REiuE~bXX|W7Hv~3!WsT#nkk$z{ z2=OIm;ExajULemKYLszMJfBHVGH||JLOIXZxu4E6H=9e2#NiGq7s5lAsB`Y7{H8MP zT^&d1b}@Isy(3ME5l^ pT-SV#J?=dM&KmhNR()g`GY$vd?n-W@LWf?sYE5^W1yG70ct**J2!>K7Ep> zCXOWF=j*3!jyNFq2T8>-fyW{S=~>bo=Yd+1N819uT=NXp7)0o(U;;g_GU>acLZ8wt zAy u=ZCT zA4Owjwgw`YAopH!)bT{w4C&XOIGKj2BK^pt7V-Z;R_HQf1Ph>BTsjD%u7g4caHryQ zJhv=)VOK`9Qchrz@R*U!O#|rr1%{q&Z~>Ck`}R<#Hi7(Z=Sg0dn_1!eO#H^OKB)(H z7yPF$CEP9!F4(8aO_eBILn^l z3K~+cmu<3SG%pzg%tY^FZgTn2srh1;|N0|Qu_r%b(clP>9mc)-Y$IpLm3g$aqQ{;3 zRrkZqQRZgCFXLQT(tG6)@JyJ9xAuf`;p5kML>DJp?l?J`+2 `ui(_ z#*6%RZeKdtr|HJ~lqz%5=`rc`#`Xgob4 26@)_d$IV5(_(vU6L@)|0;Y;H>S46!u1q` z6JEtYTR%zE0M&2c=|oSDC7J(=I6%*waJvK`7c;lC3{aBtue`zMA;zwmDwe?~BHFN2 z88;+em*6DB48faIX9vIt(=3&?mqU7Zl5&10_r1)GoA#htoj+_)SRwNC+!BNpl|3uA zKA&go<(Fo@pEZ?~GM<^0L~;i*YL?rOPY{+HsOgLk6UjhXpqHd|Jl7oWX+E2bTKSq8 z3Li!T>Ar7j_%Ga`LBNw6ZwKUpAT6Go 2Mc32IOv;yK&toowh`(<4x z0 HH_Mf*S+ zPL~mL@}!+Kb!dIz87#aVCO0m_+fB(m200c}QXGP{l?36l3o}MLuc-Z3Cf4$cJ4Nrm zy|OTM#DJSyjBm*TlGK74eu8PE6yErI0edvyqD%Xhmb2+;^_z=_d#_T*o$)CE^t&Y# zwaE9Xu{kwuex0T(V&h#;MvA0P=Y@l`+>A3y?ELodD65AhQp1h6sLsuf{VxxvMD**b zV#w#upIyBC1a*^F-k}qTQ?=_Uzw|G&ab3BLi4=51jtWQYjNR9vA#%6CcG<|i339sP z!{@B)ZQXad(0yXVvh6wedC2G2%=~rHD&+0aw7Y9j>w1<47iRM{6^q0&esyUCDfXT$ zcF9B3b9UH?>|@RImiUM?#=63XP8#Oz-l6xh&YD0_W^-OqUjE73kuYsKwcB@(P=TLz zY6rfLjUN1r8=y5?eBkvEq@ty@B75WzfWYh#!Z#U+ypGuti8Ox0#Wz`0WawOf0}wl= zUc9-uPZ7WQomUm$^ikM(z~!67^AvWf qNYCkBtZwV4_XcM~@nTp^5uQry3+6>`Lqu>Qs;KA16G?2sr!a}6HJYhdZ zGk-lfka@=dM0H?u-RKFgGWhR>6M5ZKvSWI4YB1iY{BEEax{t!v T