diff --git a/src/_data/catalog/destination_categories.yml b/src/_data/catalog/destination_categories.yml index b4025887c0..512cc1368f 100644 --- a/src/_data/catalog/destination_categories.yml +++ b/src/_data/catalog/destination_categories.yml @@ -1,5 +1,5 @@ # AUTOGENERATED FROM PUBLIC API. DO NOT EDIT -# destination categories last updated 2025-06-26 +# destination categories last updated 2025-07-03 items: - display_name: A/B Testing slug: a-b-testing diff --git a/src/_data/catalog/destinations.yml b/src/_data/catalog/destinations.yml index d38567971d..df0ac9c3af 100644 --- a/src/_data/catalog/destinations.yml +++ b/src/_data/catalog/destinations.yml @@ -1,5 +1,5 @@ # AUTOGENERATED FROM PUBLIC API. DO NOT EDIT -# destination data last updated 2025-06-26 +# destination data last updated 2025-07-03 items: - id: 637e8d185e2dec264895ea89 display_name: 1Flow diff --git a/src/_data/catalog/destinations_private.yml b/src/_data/catalog/destinations_private.yml index a13018ddb2..89b24aa164 100644 --- a/src/_data/catalog/destinations_private.yml +++ b/src/_data/catalog/destinations_private.yml @@ -1,5 +1,5 @@ # AUTOGENERATED FROM PUBLIC API. DO NOT EDIT -# destination data last updated 2025-06-26 +# destination data last updated 2025-07-03 items: - id: 54521fd925e721e32a72eee1 display_name: Pardot diff --git a/src/_data/catalog/source_categories.yml b/src/_data/catalog/source_categories.yml index eedd4f30ed..1aa783ddfa 100644 --- a/src/_data/catalog/source_categories.yml +++ b/src/_data/catalog/source_categories.yml @@ -1,5 +1,5 @@ # AUTOGENERATED FROM PUBLIC API. DO NOT EDIT -# source categories last updated 2025-06-26 +# source categories last updated 2025-07-03 items: - display_name: A/B testing slug: a-b-testing diff --git a/src/_data/catalog/sources.yml b/src/_data/catalog/sources.yml index 5805cf96c0..6ee745cfed 100644 --- a/src/_data/catalog/sources.yml +++ b/src/_data/catalog/sources.yml @@ -1,5 +1,5 @@ # AUTOGENERATED FROM PUBLIC API. DO NOT EDIT -# sources last updated 2025-06-26 +# sources last updated 2025-07-03 items: - id: 8HWbgPTt3k display_name: .NET diff --git a/src/_includes/content/functions/settings.md b/src/_includes/content/functions/settings.md index 775499bd48..2b11c86279 100644 --- a/src/_includes/content/functions/settings.md +++ b/src/_includes/content/functions/settings.md @@ -17,7 +17,7 @@ You can configure the details about this setting, which change how it's displaye - **Type** - Type of the setting's value. - **Description** - Optional description, which appears below the setting name. - **Required** - Enable this to ensure that the setting cannot be saved without a value. -- **Encrypted** - Enable to encrypt the value of this setting. Use this setting for sensitive data, like API keys. +- **Secret** - Enable this to ensure that sensitive data, like API key values or passwords, are not displayed in the Segment UI. As you change the values, a preview to the right updates to show how your setting will look and work. diff --git a/src/_includes/content/functions/source-settings.md b/src/_includes/content/functions/source-settings.md new file mode 100644 index 0000000000..bd6a04fd85 --- /dev/null +++ b/src/_includes/content/functions/source-settings.md @@ -0,0 +1,28 @@ + + +Settings allow you to pass configurable variables to your function, which is the best way to pass sensitive information such as security tokens. For example, you might use `settings` as placeholders to use information such as an API endpoint and API key. This way, you can use the same code with different settings for different purposes. When you deploy a function in your workspace, you are prompted to fill out these settings to configure the function. + +First, add a setting in **Settings** tab in the code editor: + +![A screenshot of the functions settings tab](/docs/connections/functions/images/settings-tab-empty.png){:width="500"} + +Click **Add Setting** to add your new setting. + +![A screenshot of the "Add Setting" section of the functions settings tab, with apiKey settings included](/docs/connections/functions/images/add-source-setting-dialog.png) + +You can configure the details about this setting, which change how it's displayed to anyone using your function: + +- **Label** - Name of the setting, which users see when configuring the function. +- **Name** - Auto-generated name of the setting to use in function's source code. +- **Type** - Type of the setting's value. +- **Description** - Optional description, which appears below the setting name. +- **Required** - Enable this to ensure that the setting cannot be saved without a value. +- **Encrypted** - Enable to encrypt the value of this setting. Use this setting for sensitive data, like API keys. + +As you change the values, a preview to the right updates to show how your setting will look and work. + +Click **Add Setting** to save the new setting. + +Once you save a setting, it appears in the **Settings** tab for the function. You can edit or delete settings from this tab. + +![A screenshot of the functions settings tab, showing the apiKey setting](/docs/connections/functions/images/settings-tab-non-empty.png){:width="500"} diff --git a/src/_sass/components/_accordion.scss b/src/_sass/components/_accordion.scss index 67dc317578..bba537b688 100644 --- a/src/_sass/components/_accordion.scss +++ b/src/_sass/components/_accordion.scss @@ -13,7 +13,7 @@ &__heading { padding-right: 20px; font-size: 16px; - font-weight: 600; + font-weight: 500; color: color(gray-800); line-height: 1.71; position: relative; @@ -38,7 +38,7 @@ display: inline-block; margin-top: 7px; font-size: 14px; - font-weight: 600; + font-weight: 500; text-decoration: underline; } diff --git a/src/_sass/components/_button.scss b/src/_sass/components/_button.scss index f3a0532daa..2303116ed6 100644 --- a/src/_sass/components/_button.scss +++ b/src/_sass/components/_button.scss @@ -1,6 +1,6 @@ .button { font-size: 12px; - font-weight: 600; + font-weight: 500; line-height: 1.5; text-align: center; padding: 8px 12px; diff --git a/src/_sass/components/_code-example.scss b/src/_sass/components/_code-example.scss index 3d1a1344eb..dba324aaf7 100644 --- a/src/_sass/components/_code-example.scss +++ b/src/_sass/components/_code-example.scss @@ -26,7 +26,7 @@ color: color(gray-700); font-size: 12px; line-height: 16px; - font-weight: 600; + font-weight: 500; &:hover { color: color(primary); diff --git a/src/_sass/components/_destination-menu.scss b/src/_sass/components/_destination-menu.scss index 8e48146169..f5544f8186 100644 --- a/src/_sass/components/_destination-menu.scss +++ b/src/_sass/components/_destination-menu.scss @@ -1,6 +1,6 @@ .destination-menu { &__title { - font-weight: 600; + font-weight: 500; padding-bottom: 10px; font-size: 14px; } diff --git a/src/_sass/components/_list-steps.scss b/src/_sass/components/_list-steps.scss index f7f0ce69f5..71bf71d497 100644 --- a/src/_sass/components/_list-steps.scss +++ b/src/_sass/components/_list-steps.scss @@ -9,7 +9,7 @@ height: 40px; border-radius: 50%; background-color: color(primary-lighter); - font-weight: 600; + font-weight: 500; color: color(primary); } diff --git a/src/_sass/components/_markdown.scss b/src/_sass/components/_markdown.scss index 6a3e144465..8dd7e9e16c 100644 --- a/src/_sass/components/_markdown.scss +++ b/src/_sass/components/_markdown.scss @@ -183,7 +183,7 @@ &::before { content: counter(list-items) ". "; color: color(primary); - font-weight: 600; + font-weight: 500; transform: translate(-23px, 0); } } @@ -227,7 +227,7 @@ th { color: color(gray-700); - font-weight: 600; + font-weight: 500; padding: 12px; @include breakpoint(medium up) { @@ -240,7 +240,7 @@ } th > code { color: #696f8c; - font-weight: 600; + font-weight: 500; font-size: 10px; background-color: inherit; } @@ -392,7 +392,7 @@ tr.show { padding: 0px 6px; border-radius: 4px; height: 16px; - font-weight: 600; + font-weight: 500; text-transform: uppercase; color: rgb(71, 77, 102); opacity: 0.65; diff --git a/src/_sass/components/_mobile-menu-side.scss b/src/_sass/components/_mobile-menu-side.scss index 7c02248795..4e80a8d787 100644 --- a/src/_sass/components/_mobile-menu-side.scss +++ b/src/_sass/components/_mobile-menu-side.scss @@ -14,7 +14,7 @@ } &__title { - font-weight: 600; + font-weight: 500; } &__list { diff --git a/src/_sass/components/_quickinfo.scss b/src/_sass/components/_quickinfo.scss index 3fe4e5a579..bc3db22f35 100644 --- a/src/_sass/components/_quickinfo.scss +++ b/src/_sass/components/_quickinfo.scss @@ -14,7 +14,7 @@ background-color:#E7E4F9; color: #6E62B6; text-transform: uppercase; - font-weight: 600; + font-weight: 500; padding: 0px 6px; border-radius: 4px @@ -35,7 +35,7 @@ margin-top: 12px; th { font-size: 14px; - font-weight: 600; + font-weight: 500; padding: 5px 13px; background-color: #F4F6FA; text-transform: none; diff --git a/src/_sass/components/_thumbnail-integration.scss b/src/_sass/components/_thumbnail-integration.scss index ee08180946..c2e1c05639 100644 --- a/src/_sass/components/_thumbnail-integration.scss +++ b/src/_sass/components/_thumbnail-integration.scss @@ -56,7 +56,7 @@ border-radius: 4px; font-size: 11px; line-height: 16px; - font-weight: 600; + font-weight: 500; text-transform: uppercase; letter-spacing: 0.2px; color: #6E62B6; diff --git a/src/_sass/components/_widget.scss b/src/_sass/components/_widget.scss index 88733076cf..f91417834c 100644 --- a/src/_sass/components/_widget.scss +++ b/src/_sass/components/_widget.scss @@ -12,7 +12,7 @@ a { text-decoration: underline; - font-weight: 600; + font-weight: 500; } } diff --git a/src/_sass/generics/_typography.scss b/src/_sass/generics/_typography.scss index d881e09ddb..f81c3fe816 100644 --- a/src/_sass/generics/_typography.scss +++ b/src/_sass/generics/_typography.scss @@ -19,5 +19,5 @@ samp { } strong { - font-weight: 600; + font-weight: 500; } diff --git a/src/_sass/vendors/_premonition.scss b/src/_sass/vendors/_premonition.scss index 7a99092854..da9fdb883c 100644 --- a/src/_sass/vendors/_premonition.scss +++ b/src/_sass/vendors/_premonition.scss @@ -94,7 +94,7 @@ .header { font-size: 14px; - font-weight: 600; + font-weight: 500; line-height: 24px; } diff --git a/src/connections/destinations/actions.md b/src/connections/destinations/actions.md index 66062e79d4..68dd8bef64 100644 --- a/src/connections/destinations/actions.md +++ b/src/connections/destinations/actions.md @@ -183,7 +183,7 @@ If necessary, click **New Mapping** to create a new, blank action. This step looks for events that match the criteria in the [debugger queue](/docs/connections/sources/debugger/), so you might need to Trigger some events with the expected criteria to test your conditions. You can skip the test step if needed, and re-try it at any time. 3. Select data models to [enrich your events](/docs/unify/linked-profiles/linked-events/) with. 4. Set up the data mapping from the Segment format to the destination tool format. -- You can click the Source field, then select the **Enrichments** tab to view and select Enrichments to use. +- You can click the Source field, then select previously configured Enrichments from the Event Properties tab. 5. Test the mapping with data from a sample event. The edit panel shows you the mapping output in the format for the destination tool. The **Select Object** option sends the entire object from the event, while the **Edit Object** option lets you map each individual property. You can change your mapping as needed and re-test. 6. When you're satisfied with the mapping, click **Save**. Segment returns you to the Mappings table. @@ -200,29 +200,45 @@ If necessary, click **New Mapping** to create a new, blank action. Segment offers suggested mappings that automatically propose relevant destination fields for both model columns and payload elements. For example, if your model includes a column or payload field named `transaction_amount`, the feature might suggest mapping it to a destination field like `Amount` or `TransactionValue`. This automation, powered by intelligent autocompletion, matches and identifies near-matching field names to streamline the setup. For more information, see [Segment's suggested mappings blogpost](https://segment.com/blog/ai-assisted-magical-mappings/){:target="_blank”} and the [Suggested Mappings Nutrition Label](/docs/connections/reverse-etl/suggested-mappings-nutrition-facts). > warning "" -> Review the suggested mappings for accuracy before finalizing them as the suggestions aren't guaranteed to be 100% accurate. +> Review the suggested mappings for accuracy before finalizing them as the suggestions aren't guaranteed to be 100% accurate. + +## Static values +Segment supports 4 static value types in Destination Actions mappings: string, boolean, number, and null. +* To create a string static value, type the string directly into the input field. +* To create boolean, number, and null values, use the **Static values** tab to create the appropriate static value based on its type. + +## Functions +In Destination Actions mappings, functions transform event data before it sends to the destination. This enables custom data handling, such as selecting non-null values or formatting fields. ### Coalesce function The coalesce function takes a primary value and uses it if it is available. If the value isn't available, the function uses the fallback value instead. +### Case function + +The case function allows you to change the casing of a given string value. + +### JSON function + +The JSON function allows you to convert an object or array to a JSON encoded string, or to convert from JSON to objects. + +### Flatten function + +The flatten function allows you to flatten a nested object to an object with a depth of 1. Keys are delimited by the configured separator. For example, an object like {a: { b: { c: 1 }, d: 2 } } will be converted to { 'a.b.c': 1, 'a.d': 2 }. + ### Replace function The replace function allows you to replace a string, integer, or boolean with a new value. You have the option to replace up to two values within a single field. ### Concatenate function -To combine two values in the event variable field, you can concatenate them using plain text and variables together. For example, to prepend the country code to a phone number, enter `+1{{Phone Number}}`. +To combine 2 values in the event variable field, you can concatenate them using plain text and variables together. For example, to prepend the country code to a phone number, enter `+1{{Phone Number}}`. Segment evaluates this field as a string, so placing text next to a variable automatically concatenates them. -Segment evaluates this field as a string, so placing text next to a variable automatically concatenates them. +You can't concatenate event variables and plain text with static values and functions. Adding a static value or function into an input field replaces any previously added event variables and plain text. ![Mapping UI showing two concatenated fields: "+1 phone" and "context.page.url context.page.path"](images/mapping-concatenation.png) -### Flatten function - -The flatten function allows you to flatten a nested object to an object with a depth of 1. Keys are delimited by the configured separator. For example, an object like {a: { b: { c: 1 }, d: 2 } } will be converted to { 'a.b.c': 1, 'a.d': 2 }. - -### Conditions +## Conditions > info "" > Self-service users can add a maximum of two conditions per Trigger. diff --git a/src/connections/destinations/catalog/actions-linkedin-conversions/index.md b/src/connections/destinations/catalog/actions-linkedin-conversions/index.md index 699679051e..f794bfbf00 100644 --- a/src/connections/destinations/catalog/actions-linkedin-conversions/index.md +++ b/src/connections/destinations/catalog/actions-linkedin-conversions/index.md @@ -43,6 +43,10 @@ Your inputs must meet the following criteria: - `LINKEDIN_FIRST_PARTY_ADS_TRACKING_UUID` - `ACXIOM_ID` - `ORACLE_MOAT_ID` -- `conversionHappenedAt` must be a valid timestamp (milliseconds since epoch) and must have happened in the past 90 days +- `conversionHappenedAt` must be a valid epoch timestamp (milliseconds since epoch) and must have happened in the past 90 days. Segment additionally accepts [ISO-8601](https://en.wikipedia.org/wiki/ISO_8601){:target="_blank"} formatted timestamps, and converts it to a valid epoch timestamp. Any deviations from this specification might lead to failed inputs. + +### Why does LinkedIn show "no integration data" after I successfully sent the data? + +One possible reason is that your events are missing the **currency** and **amount** fields. LinkedIn’s API won't reject events due to the lack of currency and amount data, but their platform will silently drop these events later during processing. Please ensure your payload includes those fields with valid values. diff --git a/src/connections/destinations/catalog/actions-ortto/index.md b/src/connections/destinations/catalog/actions-ortto/index.md index 9ededd79b2..421c5dd5e1 100644 --- a/src/connections/destinations/catalog/actions-ortto/index.md +++ b/src/connections/destinations/catalog/actions-ortto/index.md @@ -46,6 +46,8 @@ This destination is maintained by Ortto. For support or questions, [contact the **Ortto (Actions)** allows you to sync your Segment users with an Ortto Audience, enabling precise activation of rich, behavior-based segments—perfect for lifecycle marketing, retargeting, and large-scale personalization. You can manually create new audiences or use existing ones in Ortto, and dynamically add or remove contacts through profile upserts or activity tracking. This gives you real-time control over audience membership. +To define which audience the contact should be linked to, enter the **Audience Name** in the "**Associate Audience**" section. + Ortto blocks rapid audience re-entry to avoid undesirable side-effects from asynchronous updates. If a contact exits an audience and then re-enters the audience within 1 minute, Ortto blocks the update that causes them to rejoin the audience. Ortto uses a daily synchronization to make sure the result of any rapid updates is correctly applied. Ortto updates the Segment member audience field as normal, and any audience re-entries throughout the day that are longer than 1 minute after the last exit are processed in real time. diff --git a/src/connections/destinations/catalog/actions-reddit-audiences/index.md b/src/connections/destinations/catalog/actions-reddit-audiences/index.md index a12eac4470..5ab3d680ad 100644 --- a/src/connections/destinations/catalog/actions-reddit-audiences/index.md +++ b/src/connections/destinations/catalog/actions-reddit-audiences/index.md @@ -11,7 +11,7 @@ The Reddit Audiences destination allows advertisers to send Engage audiences fro This destination is maintained by Reddit. For any issues with the destination, [contact their Support team](mailto:adsapi-partner-support@reddit.com). ### Reddit Requirements -* Create a Reddit Ads account. * Find your ad account ID in [Accounts](https://ads.reddit.com/accounts). +- **Create a Reddit Ads account.** Find your ad account ID in [Accounts](https://ads.reddit.com/accounts){:target="_blank"}. ### Connect Reddit Ads to your workspace diff --git a/src/connections/destinations/catalog/actions-the-trade-desk-crm/index.md b/src/connections/destinations/catalog/actions-the-trade-desk-crm/index.md index e31ea194e0..a8ea1fe31f 100644 --- a/src/connections/destinations/catalog/actions-the-trade-desk-crm/index.md +++ b/src/connections/destinations/catalog/actions-the-trade-desk-crm/index.md @@ -53,6 +53,7 @@ To sync additional Audiences from your Engage space, create a separate instance ## Limitations +* Audiences up to 100 million profiles in size will be synced. * An audience must have at least 1500 unique members; otherwise, the destination fails, and the data won't sync. * Audience attempts to sync once per day. * Audience sync is a full sync. diff --git a/src/connections/destinations/catalog/actions-webhook-extensible/microsoft-integration-recipe.md b/src/connections/destinations/catalog/actions-webhook-extensible/microsoft-integration-recipe.md index 6b4faceebb..1b017824b6 100644 --- a/src/connections/destinations/catalog/actions-webhook-extensible/microsoft-integration-recipe.md +++ b/src/connections/destinations/catalog/actions-webhook-extensible/microsoft-integration-recipe.md @@ -89,10 +89,10 @@ To create or update the Account entity only, you can skip this step and directly #### Data mapping -1. Create a new Mapping in the Mappings tab and select the **Send** HTTP action. +1. Create a new mapping in the Mappings tab and select the **Send** HTTP action. 2. Choose which events you want to send to Google Search Ads 360 API using the Event filters. 3. Fill out mapping fields: - - Specify the URL: `[Organization URI]/api/data/v9.2/accounts` (this is for creating new accounts) + - Specify the URL: `[Organization URI]/api/data/v9.2/accounts` (this is for creating new accounts) 4. Use the mapping interface and search for the “body” parameter that was created in the insert function to select the transformed object that can be sent as the event body. 5. Turn off batching for this operation. diff --git a/src/connections/functions/destination-functions.md b/src/connections/functions/destination-functions.md index f109a68a4a..3b276a62df 100644 --- a/src/connections/functions/destination-functions.md +++ b/src/connections/functions/destination-functions.md @@ -23,12 +23,12 @@ All functions are scoped to your workspace, so members of other workspaces can't 1. From your workspace, go to **Connections > Catalog** and click the [Functions tab](https://app.segment.com/goto-my-workspace/functions/catalog){:target="_blank"}. 2. Click **New Function**. -3. Select **Destination** as the function type and click **Build**. +3. Select **Destination** as the function type and click **Next: Build Function**. -After you click **Build**, a code editor appears. Use the editor to write the code for your function, configure settings, and test the function's behavior. +After you click **Next: Build Function**, a code editor appears. Use the editor to write the code for your function, configure settings, and test the function's behavior. > success "" -> **Tip:** Want to see some example functions? Check out the templates available in the Functions UI, or in the open-source [Segment Functions Library](https://github.com/segmentio/functions-library){:target="_blank"}. (Contributions welcome!) +> **Tip:** Want to see some example functions? Check out the templates available in the Functions UI, or in the open-source [Segment Functions Library](https://github.com/segmentio/functions-library){:target="_blank"}. ## Code the destination function diff --git a/src/connections/functions/images/add-setting-dialog.png b/src/connections/functions/images/add-setting-dialog.png index dd0ca6b7e5..4ed1b17455 100644 Binary files a/src/connections/functions/images/add-setting-dialog.png and b/src/connections/functions/images/add-setting-dialog.png differ diff --git a/src/connections/functions/images/add-source-setting-dialog.png b/src/connections/functions/images/add-source-setting-dialog.png new file mode 100644 index 0000000000..dd0ca6b7e5 Binary files /dev/null and b/src/connections/functions/images/add-source-setting-dialog.png differ diff --git a/src/connections/functions/source-functions.md b/src/connections/functions/source-functions.md index 86bc3ccf36..1dd110219d 100644 --- a/src/connections/functions/source-functions.md +++ b/src/connections/functions/source-functions.md @@ -276,7 +276,7 @@ The handler for Source functions is `onRequest()`. ## Create settings and secrets -{% include content/functions/settings.md %} +{% include content/functions/source-settings.md %} Next, fill out this setting's value in **Test** tab, so that you can run the function and check the setting values being passed. diff --git a/src/connections/sources/catalog/libraries/mobile/react-native/destination-plugins/firebase-react-native.md b/src/connections/sources/catalog/libraries/mobile/react-native/destination-plugins/firebase-react-native.md index bc065aca90..bfa0b8968b 100644 --- a/src/connections/sources/catalog/libraries/mobile/react-native/destination-plugins/firebase-react-native.md +++ b/src/connections/sources/catalog/libraries/mobile/react-native/destination-plugins/firebase-react-native.md @@ -24,8 +24,8 @@ Run `pod install` after the installation to autolink the Firebase SDK. See [React Native Firebase](https://rnfirebase.io) and [React Native Firebase Analytics](https://rnfirebase.io/analytics/usage) for more details of Firebase packages. -> info "rnfirebase dependency" -> You will need to follow the [install guide](/docs/connections/sources/catalog/libraries/mobile/react-native/classic) for the rnfirebase dependency too. This may include adding the `GoogleService-Info.plist` and the `google-services.json` file. +> info "Installation" +> You will need to follow the install guide for [Android](https://rnfirebase.io/analytics/usage/installation/android){:target="_blank”} and/or [iOS](https://rnfirebase.io/analytics/usage/installation/ios){:target="_blank”}. This includes adding the `GoogleService-Info.plist` and the `google-services.json` file. ## Using the Plugin in your App diff --git a/src/connections/sources/catalog/libraries/website/javascript/troubleshooting.md b/src/connections/sources/catalog/libraries/website/javascript/troubleshooting.md index 7cdf4f4312..660a3b627f 100644 --- a/src/connections/sources/catalog/libraries/website/javascript/troubleshooting.md +++ b/src/connections/sources/catalog/libraries/website/javascript/troubleshooting.md @@ -22,9 +22,14 @@ Segment also provides a Chrome web extension, [Segment Inspector](/docs/connecti To learn more, follow the [Analytics.js Quickstart Guide](/docs/connections/sources/catalog/libraries/website/javascript/quickstart/). -## Are you loading two instances of Analytics.js? +## Loading multiple instances of Analytics.js -Note that you *cannot* load Analytics.js twice on the same page, even if you're using different write keys. If you do, you might encounter `Uncaught RangeError: Maximum call stack size exceeded`. Instead, you can conditionally set the write key based on an environment variable. + +### Analytics.js snippet loaded more than once + +You cannot load the Analytics.js snippet twice on the same page, even if different write keys are used. Doing so might result in errors like `Uncaught RangeError: Maximum call stack size exceeded`. + +However, you can conditionally set the write key based on an environment variable: Example: ```js @@ -32,6 +37,15 @@ var writeKey; ENV === 'production' ? writeKey = 'A' : writeKey = 'B'; ``` +### Multiple Versions of Analytics.js + +You can load multiple versions of Analytics.js in the same environment. For example, you could have both a snippet version and an npm version on one page, each with different write keys. This allows the npm library and the browser snippet to coexist without conflicting. + +Keep the following limitations in mind: + +- **Device-Mode Destination Conflicts**: If you are using the same device-mode destination in both instances (for example, across different write keys), conflicts may occur. This is due to third-party scripts that don't support global instances. To avoid issues, ensure you are not using the same device-mode destination with different write keys. +- **CDN URL Customization:** Segment does not support overriding the CDNURL when using multiple instances of Analytics.js. + ## How do I resolve the 'Failed to Load Analytics.js ChunkLoadError'? The error can occur for different reasons: @@ -44,6 +58,7 @@ The error can occur for different reasons: - Cloudflare caching: If you use Cloudflare to proxy Segment, disable caching for the Segment JS file. + ## Do you see events appear in your debugger? When you reload the page, does your debugger show a new [Page call](/docs/connections/spec/page)? You can also check the JavaScript console in the browser and manually fire an event, like an Identify call, which would show up in the debugger. diff --git a/src/engage/audiences/index.md b/src/engage/audiences/index.md index 86259525b9..14dbf5300b 100644 --- a/src/engage/audiences/index.md +++ b/src/engage/audiences/index.md @@ -68,18 +68,32 @@ When you build an audience based on audience membership, you use existing audien To see which audiences reference a particular audience in their definitions, select the **Consumers** tab when viewing a classic or linked audience. This tab lists all dependent audiences, to help you understand and manage relationships between your audience segments. -### Time comparison - -You can use the following time comparison operators in your audience definition: -- `before date` -- `after date` -- `within last` -- `within next` -- `before last` -- `after next` - -Only ISO timestamps can be used with these operators. Additionally, these time comparison operators exclusively apply to custom traits. -If the timestamp is not a valid ISO timestamp (for example, a trailing `Z` is missing), Segment won't process the audience in real-time. Learn more about [real-time compute compared to batch](/docs/engage/audiences/#real-time-compute-compared-to-batch). +### Trait operators + +| Operator | Description | +|--------------------------- |---------------------------------------| +| equals | Matches exact value. | +| not equals | Does not match exact value. | +| less than | Value is less than specified. | +| greater than | Value is greater than specified. | +| less than or equal to | Value is less than or equal to specified. | +| greater than or equal to | Value is greater than or equal to specified. | +| equals any of | Matches any of specified values. | +| contains any of | Includes any of specified values. | +| contains | Includes specified substring or value. | +| does not contain | Excludes specified substring or value. | +| starts with | Begins with specified substring. | +| ends with | Ends with specified substring. | +| exists | Value is present (not null). | +| not exists | Value is absent (null). | +| before date | Dates before specified date. | +| after date | Dates after specified date. | +| within last | Dates between X days ago and today. | +| within next | Dates between today and X days from now. | +| before last | All dates older than X days from today. | +| after next | All dates beyond X days from today. | + +Only ISO timestamps can be used with time comparison operators. If the timestamp is not a valid ISO timestamp (for example, a trailing `Z` is missing), Segment won't process the audience in real-time. Learn more about [real-time compute compared to batch](/docs/engage/audiences/#real-time-compute-compared-to-batch). **Note**: Timezones seen in the UI are based on your local timezone, but are converted to UTC on the backend. @@ -409,4 +423,4 @@ This error occurs when creating audiences that reference each other, meaning aud No. Traits located in the `context.traits` object of a Track event aren’t available in the Event Properties section of the Audience Builder. You can only use top-level event properties to define event-based audience conditions. ### How does the historical data flag work? -The **Include Historical Event Data** option lets you take past event data into account and control how much of it is considered when creating real-time audiences. You can set a lookback window (for example, the “last 90 days”) to limit the processed event data, or disable it entirely to use only data arriving after creation. For batch audiences, Segment includes historical data by default. \ No newline at end of file +The **Include Historical Event Data** option lets you take past event data into account and control how much of it is considered when creating real-time audiences. You can set a lookback window (for example, the “last 90 days”) to limit the processed event data, or disable it entirely to use only data arriving after creation. For batch audiences, Segment includes historical data by default. diff --git a/src/engage/using-engage-data.md b/src/engage/using-engage-data.md index be0e261c00..4fcca8d740 100644 --- a/src/engage/using-engage-data.md +++ b/src/engage/using-engage-data.md @@ -297,3 +297,4 @@ Connect any Cloud-mode destination that supports Identify or Track calls to Enga - [Marketo Static Lists (Actions)](/docs/connections/destinations/catalog/actions-marketo-static-lists/) - [Responsys](/docs/connections/destinations/catalog/responsys/) - [TikTok Audiences](/docs/connections/destinations/catalog/actions-tiktok-audiences/) +- [Klaviyo (Actions)](/docs/connections/destinations/catalog/actions-klaviyo/) diff --git a/src/privacy/consent-management/consent-faq.md b/src/privacy/consent-management/consent-faq.md index cfd3e55f69..00f55710e0 100644 --- a/src/privacy/consent-management/consent-faq.md +++ b/src/privacy/consent-management/consent-faq.md @@ -17,7 +17,15 @@ All event streams destinations, with the exception of AWS S3 and Engage destinat You can use the [Destination Actions framework](/docs/connections/destinations/actions/) to share the current status of your end-users' consent with your Actions destinations. -For more information, see the [Sharing consent with Actions destinations](/docs/privacy/consent-management/consent-in-unify/#sharing-consent-with-actions-destinations) documentation. +For more information, see the [Sharing consent with Actions destinations](/docs/privacy/consent-management/consent-in-unify/#sharing-consent-with-actions-destinations) documentation. + +## Why shouldn't I use Consent Management for managing communication preferences? + +Segment designed Consent Management for cookie and data collection consent use cases, not communication preferences. Segment doesn't recommend using Consent Management for managing communication preferences, as multiple data use categories attached to one destination can block legitimate communication to your users and might limit your ability to handle user communication preferences at a more granular level. + +For example, if you create 3 separate consent categories for "Product Newsletter," "News Updates," and "Promotional Emails" and all of these are sent through the same destination (like SendGrid,) then Consent Management only forwards data to SendGrid if the user has **opted-in to all 3 categories**. This behavior can block legitimate communication the user might have opted into, making it less flexible for nuanced email preference enforcement. + +For managing communication preferences, Segment recommends using [custom traits](/docs/unify/Traits/custom-traits/) and then acting on these traits in [Twilio Engage](/docs/engage/) or a third-party tool. ## Why is my event failing ingestion with the error "context.consent.categoryPreferences object is required"? diff --git a/src/privacy/consent-management/consent-in-retl.md b/src/privacy/consent-management/consent-in-retl.md index 2a9240ea1b..6212dc02b7 100644 --- a/src/privacy/consent-management/consent-in-retl.md +++ b/src/privacy/consent-management/consent-in-retl.md @@ -146,4 +146,4 @@ Open the [Profile Explorer](/docs/unify/#profile-explorer) and verify that your ### Reverse ETL Actions destinations Segment automatically filters out data from users who have not consented to the category mapped to your destination. -To verify that this behavior is working as intended, open [Delivery Overview](/docs/connections/delivery-overview) for a Reverse ETL-supported Actions destination and view the events that were successfully delivered to the destination. The events in your destination should only come from users that consented to send data to the category that your supported Actions destination belongs to. \ No newline at end of file +To verify that this behavior is working as intended, open [Delivery Overview](/docs/connections/delivery-overview) for a Reverse ETL-supported Actions destination and view the events that were successfully delivered to the destination. The events in your destination should only come from users that consented to send data to the category that your supported Actions destination belongs to. diff --git a/src/privacy/consent-management/consent-in-unify.md b/src/privacy/consent-management/consent-in-unify.md index bcae9b9169..5ed25b9b31 100644 --- a/src/privacy/consent-management/consent-in-unify.md +++ b/src/privacy/consent-management/consent-in-unify.md @@ -83,12 +83,14 @@ In addition to enforcing consent in Connections, you may want these preferences If you use Destination Actions to send consent information to your destinations, the Segment Consent Preference Updated event should **only** include information about a user's consent preferences because this event is sent regardless of an end-user's consent preferences. -> info "Sharing consent with Classic Destinations is not available" +> info "Sharing consent with Classic Destinations isn't available" > Segment only supports sharing consent with Actions Destinations. ## Storing consent preferences on the Profile Segment stamps consent preference on every Segment event from streaming and Reverse ETL sources to store them on the Profile. +If you're using Consent Management and Profiles, you shouldn't give your customers a Custom Trait value that matches one of the consent categories that you set up in the Segment app, as this can lead to unexpected Audience behavior. For example, if your end user consented to the "Marketing" destination category, you shouldn't give them a custom trait of `segment_consent_preference.categories.marketing.`, as this can lead your user to unexpectedly enter or leave an Audience. + > warning "Storing consent on the Profile is in private beta" > Reach out to your sales contact or [request a demo](https://segment.com/contact/demo){:target="_blank"} to participate in the private beta. diff --git a/src/privacy/consent-management/index.md b/src/privacy/consent-management/index.md index 7f8c3698e2..197744eb8d 100644 --- a/src/privacy/consent-management/index.md +++ b/src/privacy/consent-management/index.md @@ -1,9 +1,15 @@ --- title: Consent Management Overview plan: consent-management +hide-toc: true --- -When an end user visits your web or mobile app, they set **consent preferences**, or make decisions about the types of data they want you to collect, use, and share. These consent preferences are typically presented as a set list of categories that describe how your company intends to use that data. Some common categories include personalization, advertising, and site performance. +When an end user visits your web or mobile app, they set **consent preferences**, or make decisions about the types of data they want you to collect, use, and share. These consent preferences are typically presented as a set list of categories that describe how your company intends to use that data. Some common categories include personalization, advertising, and site performance. + +> info "Segment recommends using Consent Management to enforce end-user preferences related to cookies and data collection consent" +> Segment doesn't recommend using Consent Management for managing communication opt-ins and opt-outs, as using it for this purpose might limit your ability to handle user preferences at a more granular level. For more information, see [Why shouldn’t I use Consent Management for managing communication preferences?](/docs/privacy/consent-management/consent-faq/#why-shouldnt-i-use-consent-management-for-managing-communication-preferences). +> +> To manage your end users' communication preferences, Segment recommends using [custom traits](/docs/unify/Traits/custom-traits/) and then acting on these traits in [Twilio Engage](/docs/engage/) or a third-party tool. Segment integrates with your commercial third-party or bespoke consent management platform (CMP) that captures an end user's consent preferences and enforces those preferences by only routing events to the categories consented to by an end user. @@ -18,4 +24,4 @@ The events, stamped with the consent object, are then sent downstream to any des For more information about consent in Segment Connections, see the [Consent in Segment Connections](/docs/privacy/consent-management/consent-in-segment-connections) documentation. -If you are a Unify user, you can also see the [Consent in Unify](/docs/privacy/consent-management/consent-in-unify) for more information about the Segment Consent Preference Updated event, which Segment uses to add consent preference to the Profile. +If you are a Unify user, you can also see the [Consent in Unify](/docs/privacy/consent-management/consent-in-unify) for more information about the Segment Consent Preference Updated event, which Segment uses to add consent preference to the Profile. \ No newline at end of file diff --git a/src/unify/Traits/computed-traits.md b/src/unify/Traits/computed-traits.md index c8d9865429..b5bde17b2e 100644 --- a/src/unify/Traits/computed-traits.md +++ b/src/unify/Traits/computed-traits.md @@ -172,6 +172,10 @@ Learn more about [Computed trait generated events here](/docs/engage/using-engag For account-level computed traits, you have the option to send either a [Group](/docs/connections/spec/group/) call and/or [Identify](/docs/connections/spec/identify/) call. Group calls will send one event per account, whereas Identify calls will send an Identify call for each user in the account. This means that even if a user hasn't performed an event, Segment will still set the account-level computed trait on that user. Because most marketing tools are still based at the user level, it is often important to map this account-level trait onto each user within an account. See [Account-level Audiences](/docs/engage/audiences/account-audiences) for more information. +> warning "Computed Traits can only be sent to Event destinations" +> When Engage sends a computed trait to an [Event destinations](/docs/engage/using-engage-data/#event-destinations), it uses an Identify call to send user traits and a Group call to send account-level computed traits. + + ## View compute status After you create a computed trait, use the Overview page to view a compute progress bar, current [status](/docs/engage/audiences#compute-statuses), number of users with the trait, connected destinations, and more. For real-time traits, click **Refresh Trait** to update the current number of users with the trait.