From ba0a256ce358829464ff79d702ba274d5ce08061 Mon Sep 17 00:00:00 2001 From: Atif Javed <46914900+muhammadatifjav@users.noreply.github.com> Date: Tue, 15 Oct 2024 14:31:53 +1100 Subject: [PATCH 1/8] Add faqs about null values --- src/engage/faqs.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/engage/faqs.md b/src/engage/faqs.md index d8d2e8b842..048edace2e 100644 --- a/src/engage/faqs.md +++ b/src/engage/faqs.md @@ -84,6 +84,10 @@ In this example, `anonymous_id: a1` is not reset during a `User Logout`. Without This is especially helpful for preventing "blob users" that are merged together by non-unique anonymous IDs or by common group emails like `team@company.com`. +## Can we remove a trait from a User profile? + +To remove a trait from a user profile, you can send in a key-value pair in the properties object with null as the value for that trait from one of the connected sources. E.g. `"properties": {"trait1": null, ...}, ....` Sending in an empty string i.e. `trait2: ""` will also have the same effect. + ## Which destinations support syncing the identity graph? Most destinations on the Segment Platform are built up around a user model. They assume that a user will have a single userId. Further, most Destinations are not built to handle anonymous traffic. From aced8683e557ac6fdee1d727c2ebf12ba6d5b71f Mon Sep 17 00:00:00 2001 From: Atif Javed <46914900+muhammadatifjav@users.noreply.github.com> Date: Mon, 28 Oct 2024 18:01:41 +1100 Subject: [PATCH 2/8] Update faqs.md reverting change --- src/engage/faqs.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/engage/faqs.md b/src/engage/faqs.md index 048edace2e..d8d2e8b842 100644 --- a/src/engage/faqs.md +++ b/src/engage/faqs.md @@ -84,10 +84,6 @@ In this example, `anonymous_id: a1` is not reset during a `User Logout`. Without This is especially helpful for preventing "blob users" that are merged together by non-unique anonymous IDs or by common group emails like `team@company.com`. -## Can we remove a trait from a User profile? - -To remove a trait from a user profile, you can send in a key-value pair in the properties object with null as the value for that trait from one of the connected sources. E.g. `"properties": {"trait1": null, ...}, ....` Sending in an empty string i.e. `trait2: ""` will also have the same effect. - ## Which destinations support syncing the identity graph? Most destinations on the Segment Platform are built up around a user model. They assume that a user will have a single userId. Further, most Destinations are not built to handle anonymous traffic. From a5754919a35906fbd77af95ba532e893bec167b3 Mon Sep 17 00:00:00 2001 From: Atif Javed <46914900+muhammadatifjav@users.noreply.github.com> Date: Mon, 28 Oct 2024 18:13:46 +1100 Subject: [PATCH 3/8] Update faqs.md Added the Faq to unify section and added some clarity --- src/unify/faqs.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/unify/faqs.md b/src/unify/faqs.md index 251af20490..4a83735a22 100644 --- a/src/unify/faqs.md +++ b/src/unify/faqs.md @@ -54,6 +54,9 @@ No. As the Identity Graph uses ExternalIDs, they remain for the lifetime of the ### Can I delete specific events from a user profile in Unify? No. Alternatively, you may delete the entire user profile from Segment using a [GDPR deletion request](/docs/privacy/user-deletion-and-suppression/). +## Can I remove a trait from a User profile? +To remove a trait from a user profile, you can send in an identify event with null as the value for the trait in the traits object from one of the connected sources. E.g. `"traits": {"trait1": null, ..}, ...`. Note that sending in an empty string (i.e. `"traits": {"trait2": "", ..}, ...` will update the trait to be an 'empty' string, and will not remove the trait from the user profile. + ### How does profile creation affect MTUs, particularly where a profile isn't merged with the parent profile due to exceeding the merge limit? Segment determines the Monthly Tracked Users (MTUs) count by the number of unique user IDs and anonymous IDs processed, regardless of how you manage these profiles in Unify and Engage. This count is taken as events are sent to Segment, before they reach Unify and Engage. Therefore, the creation of new profiles or the merging of profiles in Unify doesn't affect the MTU count. The MTU count only increases when you send new unique user or anonymous IDs to Segment. From 694f57fd1662f00fe80838a2f847e0ddd7de44fb Mon Sep 17 00:00:00 2001 From: stayseesong <83784848+stayseesong@users.noreply.github.com> Date: Mon, 4 Nov 2024 13:56:46 -0800 Subject: [PATCH 4/8] Apply suggestions from code review --- src/unify/faqs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/unify/faqs.md b/src/unify/faqs.md index 4a83735a22..215c4c517d 100644 --- a/src/unify/faqs.md +++ b/src/unify/faqs.md @@ -54,8 +54,8 @@ No. As the Identity Graph uses ExternalIDs, they remain for the lifetime of the ### Can I delete specific events from a user profile in Unify? No. Alternatively, you may delete the entire user profile from Segment using a [GDPR deletion request](/docs/privacy/user-deletion-and-suppression/). -## Can I remove a trait from a User profile? -To remove a trait from a user profile, you can send in an identify event with null as the value for the trait in the traits object from one of the connected sources. E.g. `"traits": {"trait1": null, ..}, ...`. Note that sending in an empty string (i.e. `"traits": {"trait2": "", ..}, ...` will update the trait to be an 'empty' string, and will not remove the trait from the user profile. +## Can I remove a trait from a user profile? +To remove a trait from a user profile, send an identify event with null as the value for the trait in the traits object from one of the connected sources. For example, `"traits": {"trait1": null, ..}, ...`. Note that sending in an empty string such as,`"traits": {"trait2": "", ..}, ...` updates the trait to be an 'empty' string and won't remove the trait from the user profile. ### How does profile creation affect MTUs, particularly where a profile isn't merged with the parent profile due to exceeding the merge limit? Segment determines the Monthly Tracked Users (MTUs) count by the number of unique user IDs and anonymous IDs processed, regardless of how you manage these profiles in Unify and Engage. This count is taken as events are sent to Segment, before they reach Unify and Engage. Therefore, the creation of new profiles or the merging of profiles in Unify doesn't affect the MTU count. The MTU count only increases when you send new unique user or anonymous IDs to Segment. From 88b33b934804d92300ee666b433ca22275d53a6b Mon Sep 17 00:00:00 2001 From: stayseesong <83784848+stayseesong@users.noreply.github.com> Date: Mon, 4 Nov 2024 13:58:43 -0800 Subject: [PATCH 5/8] Update src/unify/faqs.md --- src/unify/faqs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unify/faqs.md b/src/unify/faqs.md index 215c4c517d..cce2cce467 100644 --- a/src/unify/faqs.md +++ b/src/unify/faqs.md @@ -54,7 +54,7 @@ No. As the Identity Graph uses ExternalIDs, they remain for the lifetime of the ### Can I delete specific events from a user profile in Unify? No. Alternatively, you may delete the entire user profile from Segment using a [GDPR deletion request](/docs/privacy/user-deletion-and-suppression/). -## Can I remove a trait from a user profile? +### Can I remove a trait from a user profile? To remove a trait from a user profile, send an identify event with null as the value for the trait in the traits object from one of the connected sources. For example, `"traits": {"trait1": null, ..}, ...`. Note that sending in an empty string such as,`"traits": {"trait2": "", ..}, ...` updates the trait to be an 'empty' string and won't remove the trait from the user profile. ### How does profile creation affect MTUs, particularly where a profile isn't merged with the parent profile due to exceeding the merge limit? From 8f3f58e6b81824059ff5a956bbb8679c2c087271 Mon Sep 17 00:00:00 2001 From: pwseg <86626706+pwseg@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:10:30 -0600 Subject: [PATCH 6/8] cleanup --- src/unify/faqs.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/unify/faqs.md b/src/unify/faqs.md index cce2cce467..46644119e5 100644 --- a/src/unify/faqs.md +++ b/src/unify/faqs.md @@ -9,13 +9,13 @@ Yes, Identity Graph supports multiple external IDs. Identity Graph automatically collects a rich set of external IDs without any additional code: -1. Device level IDs (ex: `anonymous_id`, `ios.idfa` and `android.id`) -2. Device token IDs (ex: `ios.push_token` and `android_push_token`) -3. User level IDs (ex: `user_id`) +1. Device level IDs (example: `anonymous_id`, `ios.idfa` and `android.id`) +2. Device token IDs (example: `ios.push_token` and `android_push_token`) +3. User level IDs (example: `user_id`) 4. Common external IDs (`email`) -5. Cross domain analytics IDs (`cross_domain_id`) +5. Cross-domain analytics IDs (`cross_domain_id`) -If you want Identity Graph to operate on a different custom ID, you can pass it in using `context.externalIds` on an `identify()` or `track()`. If you're interested in this feature, contact your CSM to discuss the best way to implement this feature. +If you want Identity Graph to operate on a different custom ID, you can pass it in using `context.externalIds` on an [Identify](/docs/connections/spec/identify/) or [Track call](/docs/connections/spec/identify/). If you're interested in this feature, contact your CSM to discuss the best way to implement this feature. ## How does Unify handle identity merging? Each incoming event is analyzed and external IDs are extracted (`user_id`, `anonymous_id`, `email`). The simplified algorithm works as follows: From 44fcd00b9be78d2178260969e293b0e66fde34eb Mon Sep 17 00:00:00 2001 From: pwseg <86626706+pwseg@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:17:04 -0600 Subject: [PATCH 7/8] clean up new FAQ --- src/unify/faqs.md | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/src/unify/faqs.md b/src/unify/faqs.md index 46644119e5..a42a113118 100644 --- a/src/unify/faqs.md +++ b/src/unify/faqs.md @@ -18,13 +18,13 @@ Identity Graph automatically collects a rich set of external IDs without any add If you want Identity Graph to operate on a different custom ID, you can pass it in using `context.externalIds` on an [Identify](/docs/connections/spec/identify/) or [Track call](/docs/connections/spec/identify/). If you're interested in this feature, contact your CSM to discuss the best way to implement this feature. ## How does Unify handle identity merging? -Each incoming event is analyzed and external IDs are extracted (`user_id`, `anonymous_id`, `email`). The simplified algorithm works as follows: +Segment analyzes each incoming event and extracts external IDs (like `user_id`, `anonymous_id`, `email`). The simplified algorithm works as follows: 1. Segment first searches the Identity Graph for incoming external IDs. 2. If Segment finds no matching profile(s), it creates one. -3. If Segment finds one profile, it merges the incoming event with that profile. (This means that Segment adds the external IDs on the incoming message and resolves the event to the profile.) +3. If Segment finds one profile, it merges the incoming event with that profile. This means that Segment adds the external IDs on the incoming message and resolves the event to the profile. 4. If Segment finds multiple matching profiles, Segment applies the identity resolution settings for merge protection. Specifically, Segment uses identifier limits and priorities to add the correct identifiers to the profile. -5. Segment then applies [limits](/docs/unify/profile-api-limits/) to ensure profiles remain under these limits. Segment doesn't add any further merges or mappings if the profile is at either limit, but event resolution for the profile will continue. +5. Segment then [applies limits](/docs/unify/profile-api-limits/) to ensure profiles remain under these limits. Segment doesn't add any further merges or mappings if the profile is at either limit, but event resolution for the profile will continue. {% comment %} @@ -48,17 +48,37 @@ If two merged user profiles contain conflicting profile attributes, Segment sele Any of the external IDs can be used to query a profile. When a profile is requested, Segment traverses the merge graph and resolves all merged profiles. The result is a single profile, with the latest state of all traits, events, and identifiers. -### Can ExternalID's be changed or removed from the profiles? -No. As the Identity Graph uses ExternalIDs, they remain for the lifetime of the user profile. +### Can external IDs be changed or removed from the profiles? +No. As the Identity Graph uses external IDs, they remain for the lifetime of the user profile. ### Can I delete specific events from a user profile in Unify? No. Alternatively, you may delete the entire user profile from Segment using a [GDPR deletion request](/docs/privacy/user-deletion-and-suppression/). -### Can I remove a trait from a user profile? -To remove a trait from a user profile, send an identify event with null as the value for the trait in the traits object from one of the connected sources. For example, `"traits": {"trait1": null, ..}, ...`. Note that sending in an empty string such as,`"traits": {"trait2": "", ..}, ...` updates the trait to be an 'empty' string and won't remove the trait from the user profile. - ### How does profile creation affect MTUs, particularly where a profile isn't merged with the parent profile due to exceeding the merge limit? Segment determines the Monthly Tracked Users (MTUs) count by the number of unique user IDs and anonymous IDs processed, regardless of how you manage these profiles in Unify and Engage. This count is taken as events are sent to Segment, before they reach Unify and Engage. Therefore, the creation of new profiles or the merging of profiles in Unify doesn't affect the MTU count. The MTU count only increases when you send new unique user or anonymous IDs to Segment. ### What is the event lookback period on the Profile Explorer? The [Profile Explorer](/docs/unify/#profile-explorer) retains event details for a period of up to 2 weeks. If you need event information beyond this timeframe, Segment recommends using [Profiles Sync](/docs/unify/profiles-sync/overview/) for comprehensive event analysis and retention. + +### Can I remove a trait from a user profile? + +Yes, you can remove a trait from a user profile by sending an identify event with the trait value set to `null` in the traits object from one of your connected sources. For example: + +```json +{ + "traits": { + "trait1": null + } +} +``` +Setting the trait value to an empty string won't remove the trait, like in this example: + +```json +{ + "traits": { + "trait2": "" + } +} +``` + +Instead, this updates the trait to an empty string within the user profile. From d49136cec9d765deec7ad89bd71975dae2d7b4f0 Mon Sep 17 00:00:00 2001 From: pwseg <86626706+pwseg@users.noreply.github.com> Date: Sun, 17 Nov 2024 19:17:37 -0600 Subject: [PATCH 8/8] style Identify call --- src/unify/faqs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unify/faqs.md b/src/unify/faqs.md index a42a113118..189654b8de 100644 --- a/src/unify/faqs.md +++ b/src/unify/faqs.md @@ -62,7 +62,7 @@ The [Profile Explorer](/docs/unify/#profile-explorer) retains event details for ### Can I remove a trait from a user profile? -Yes, you can remove a trait from a user profile by sending an identify event with the trait value set to `null` in the traits object from one of your connected sources. For example: +Yes, you can remove a trait from a user profile by sending an Identify event with the trait value set to `null` in the traits object from one of your connected sources. For example: ```json {