From 592b729785056f129f257b1d7240ceb392e01a5d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Aug 2023 20:25:44 +0000 Subject: [PATCH 01/47] Bump commonmarker from 0.23.9 to 0.23.10 Bumps [commonmarker](https://github.com/gjtorikian/commonmarker) from 0.23.9 to 0.23.10. - [Release notes](https://github.com/gjtorikian/commonmarker/releases) - [Changelog](https://github.com/gjtorikian/commonmarker/blob/v0.23.10/CHANGELOG.md) - [Commits](https://github.com/gjtorikian/commonmarker/compare/v0.23.9...v0.23.10) --- updated-dependencies: - dependency-name: commonmarker dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) mode change 100755 => 100644 Gemfile.lock diff --git a/Gemfile.lock b/Gemfile.lock old mode 100755 new mode 100644 index 8f5e6c086c..76da881a37 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,7 +31,7 @@ GEM httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) colorator (1.1.0) - commonmarker (0.23.9) + commonmarker (0.23.10) concurrent-ruby (1.2.2) dotenv (2.8.1) em-websocket (0.5.3) @@ -46,6 +46,7 @@ GEM filesize (0.2.0) forwardable-extended (2.6.0) google-protobuf (3.23.2-x86_64-darwin) + google-protobuf (3.23.2-x86_64-linux) http_parser.rb (0.8.0) httpclient (2.8.3) i18n (1.13.0) @@ -89,6 +90,8 @@ GEM mercenary (0.4.0) nokogiri (1.15.2-x86_64-darwin) racc (~> 1.4) + nokogiri (1.15.2-x86_64-linux) + racc (~> 1.4) pathutil (0.16.2) forwardable-extended (~> 2.6) posix-spawn (0.3.15) @@ -106,6 +109,8 @@ GEM safe_yaml (1.0.5) sass-embedded (1.62.1-x86_64-darwin) google-protobuf (~> 3.21) + sass-embedded (1.62.1-x86_64-linux-gnu) + google-protobuf (~> 3.21) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) thread_safe (0.3.6) @@ -119,9 +124,9 @@ GEM webrick (1.8.1) PLATFORMS - ruby x86_64-darwin-19 x86_64-darwin-20 + x86_64-linux DEPENDENCIES dotenv From b08d3231399bf8e538a5f4aa44664207797adcfb Mon Sep 17 00:00:00 2001 From: Courtney Garcia <97773072+courtneyga@users.noreply.github.com> Date: Thu, 22 Feb 2024 16:16:14 -0600 Subject: [PATCH 02/47] Update faq-best-practices.md --- src/engage/journeys/faq-best-practices.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/engage/journeys/faq-best-practices.md b/src/engage/journeys/faq-best-practices.md index 4192cfa4db..ec6f1b9a6a 100644 --- a/src/engage/journeys/faq-best-practices.md +++ b/src/engage/journeys/faq-best-practices.md @@ -77,7 +77,7 @@ Yes. Users must first exit a Journey, however, before entering it again. To lear #### What destinations does Journeys support? -Journeys supports all Engage destinations, including Destination Functions. Read more in Send data to destinations. +Journeys supports all Engage destinations, including Destination Functions. Read more in [Send data to destinations](/docs/engage/journeys/send-data/) . #### What are the reporting capabilities of Journeys? @@ -98,4 +98,4 @@ Journeys triggers audience or trait-related events for each email `external_id` #### How quickly do user profiles move through Journeys? -It may take up to five minutes for a user profile to enter each step of a Journey, including the entry condition. For Journey steps that reference a batch audience or SQL trait, Journeys processes user profiles at the same rate as the audience or trait computation. Visit the Engage docs to [learn more about compute times](/docs/engage/audiences/#understanding-compute-times). \ No newline at end of file +It may take up to five minutes for a user profile to enter each step of a Journey, including the entry condition. For Journey steps that reference a batch audience or SQL trait, Journeys processes user profiles at the same rate as the audience or trait computation. Visit the Engage docs to [learn more about compute times](/docs/engage/audiences/#understanding-compute-times). From 94fe20d912601dd31a5099619cd26c0ac766c0fd Mon Sep 17 00:00:00 2001 From: Courtney Garcia <97773072+courtneyga@users.noreply.github.com> Date: Wed, 28 Feb 2024 20:27:09 -0600 Subject: [PATCH 03/47] Update index.md --- src/connections/index.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/connections/index.md b/src/connections/index.md index cbd7f8ed3c..e8124dc6ce 100644 --- a/src/connections/index.md +++ b/src/connections/index.md @@ -55,3 +55,6 @@ You can then sort or filter each column to just the values you care about, by cl Sources without any enabled destinations are auto-disabled after 14 days. However, the workspace owner is notified by email before Segment disables the source. Data that flows into Segment but does not flow to any downstream tools is not valuable to you and unnecessarily takes up space. Segment understands there may be cases to keep a source active. If you'd like to add your sources to an exception list, you can do so by filling out this [Airtable form](https://airtable.com/shr7V9LFDZh31cYWW){:target="_blank"}. + +### Can I request Segment add an integration tool? +Yes, you are able to submit an integration request here https://segment.com/requests/integrations/. From 384daf7be95a76eeb11438556f05be5b303706f7 Mon Sep 17 00:00:00 2001 From: Liz Kane <68755692+lizkane222@users.noreply.github.com> Date: Thu, 29 Feb 2024 15:44:58 -0800 Subject: [PATCH 04/47] Update source-functions.md --- src/connections/functions/source-functions.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/connections/functions/source-functions.md b/src/connections/functions/source-functions.md index e6f1134394..12dfdbd7ef 100644 --- a/src/connections/functions/source-functions.md +++ b/src/connections/functions/source-functions.md @@ -299,17 +299,26 @@ The advantage of testing your source function with webhooks is that all incoming Note that Segment has updated the webhook URL to `api.segmentapis.com/functions`. To use webhooks with your function: - You must [generate a public API token](https://docs.segmentapis.com/tag/Getting-Started/#section/Get-an-API-token){:target="_blank"}. -- For POST calls, you'll need to use this API token in the header. + - Navigate here to [create a Public API Token]([url](https://app.segment.com/goto-my-workspace/settings/access-management/tokens)), or follow these steps : In your Segment Workspace, navigate to Settings → Workspace settings → Access Management tab → Token tab. On the right, click the `+ Create Token` button. Create a description for the token and assign access. Click `Create` and make sure to save the access token before clicking `Done`. +- For POST calls, you'll need to use this Public API token in the Authorization Header, as `Bearer Token : public_api_token` ### Testing source functions with a webhook -You can use webhooks to test the source function either by sending requests manually (using any HTTP client such as cURL or Insomnia) or by pasting the webhook into an external server that supports webhooks (such as Slack). +You can use webhooks to test the source function either by sending requests manually (using any HTTP client such as cURL, Postman, or Insomnia) or by pasting the webhook into an external server that supports webhooks (such as Slack). +_A common Segment use case is to connect a Segment [Webhooks destination](https://segment.com/docs/connections/destinations/catalog/webhooks/) or [Webhook Actions destination](https://segment.com/docs/connections/destinations/catalog/actions-webhook/) to a test source, where the Webhook URL/endpoint that is used corresponds to the provided source function's endpoint, then you can trigger test events to send directly to that source which would be routed through your Webhook destination and continue on to the source function : Source → Webhook destination → Source Function._ -From the source function editor, copy the webhook URL from the "Auto-fill via Webhook" dialog. To trigger the source function, send the request using the `POST` method, with the `Content-Type` header set to `application/json` or `application/x-www-form-urlencoded`. +From the source function editor, copy the provided webhook URL (endpoint) from the "Auto-fill via Webhook" dialog. +_**Note** : When a new source is created that utilizes a source function, the new source's endpoint (webhook URL) will differ from the URL that is provided in the source function's test environment._ + +In order to test the source function, you must (1) send a `POST` request to the source function's provided endpoint (webhook URL), (2) include an event `body`, and (3) the request must include these Headers : +- `Content-Type : application/json` or `Content-Type : application/x-www-form-urlencoded` +- `Authorization : Bearer _your_public_api_token_` ### Testing source functions manually You can also manually construct the headers and body of an HTTPS request right inside the editor and test with this data without using webhooks. +The `Content-Type` Header is required when testing the function : +- `Content-Type : application/json` or `Content-Type : application/x-www-form-urlencoded` ![Test HTTPS Request](images/test-manual.png){:width="500"} From 549cb91306a448730dd518f0464a408b347f3fea Mon Sep 17 00:00:00 2001 From: Courtney Garcia <97773072+courtneyga@users.noreply.github.com> Date: Mon, 4 Mar 2024 20:47:08 -0600 Subject: [PATCH 05/47] Update event-delivery.md --- src/connections/event-delivery.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/connections/event-delivery.md b/src/connections/event-delivery.md index da45ced531..70130947eb 100644 --- a/src/connections/event-delivery.md +++ b/src/connections/event-delivery.md @@ -111,3 +111,9 @@ When debugging, it's helpful to see when issues start, stop, and trend over time #### Latency How P95 latency has trended over the time period you selected. + +#### Email Alerts + +You can opt in to receive email alerts regarding failed events/syncs by going to your workspaace Settings > User Preferences > Activity Notifications > Destiantions. Then you can select the option to be alerted by Email and/or In-app. + + From d0be3db4e812e0bf8ad53e24dacc553d8154c252 Mon Sep 17 00:00:00 2001 From: Courtney Garcia <97773072+courtneyga@users.noreply.github.com> Date: Mon, 4 Mar 2024 20:53:04 -0600 Subject: [PATCH 06/47] Update event-delivery.md --- src/connections/event-delivery.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/connections/event-delivery.md b/src/connections/event-delivery.md index 70130947eb..bc61eae3ed 100644 --- a/src/connections/event-delivery.md +++ b/src/connections/event-delivery.md @@ -92,7 +92,11 @@ To help you debug, Segment provides sample payloads from every step of the data' - **Request to Destination** - the request Segment made to the Partner API. This payload will likely be different from what you sent it because Segment is mapping your event to the partner's spec to ensure the message is successfully delivered.  -- **Response from Destination** - the response Segment received from the Partner API. This will have the raw partner error. If you need to troubleshoot an issue with a Partner's Success team, this is usually something they'll want to see.  +- **Response from Destination** - the response Segment received from the Partner API. This will have the raw partner error. If you need to troubleshoot an issue with a Partner's Success team, this is usually something they'll want to see. + +#### Email Alerts + +You can opt in to receive email alerts regarding failed events/syncs by going to your workspaace Settings > User Preferences > Activity Notifications > Destiantions. Then you can select the option to be alerted by Email and/or In-app. ## 4. Trends @@ -112,8 +116,5 @@ When debugging, it's helpful to see when issues start, stop, and trend over time How P95 latency has trended over the time period you selected. -#### Email Alerts - -You can opt in to receive email alerts regarding failed events/syncs by going to your workspaace Settings > User Preferences > Activity Notifications > Destiantions. Then you can select the option to be alerted by Email and/or In-app. From 209f2a739afb862f8e91676646aceaa4ce8c3759 Mon Sep 17 00:00:00 2001 From: Courtney Garcia <97773072+courtneyga@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:01:16 -0500 Subject: [PATCH 07/47] Update actions.md --- src/connections/destinations/actions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connections/destinations/actions.md b/src/connections/destinations/actions.md index 0082483855..710d9fa129 100644 --- a/src/connections/destinations/actions.md +++ b/src/connections/destinations/actions.md @@ -181,7 +181,7 @@ If necessary, click **New Mapping** to create a new, blank action. 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. 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. You can change your mapping as needed and re-test. + The edit panel shows you the mapping output in the format for the destination tool. The “Select Object” option will send the entire object from the event; whereas, the “Edit Object” option allows you to 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. 7. In the Mappings table **Status** column, verify that the **Enabled** toggle is on for the mapping you just customized. From 2a6094b1d9a261c3dd63fb21b41ae73b9a402c14 Mon Sep 17 00:00:00 2001 From: Spencer Attick <23665784+spencerattick@users.noreply.github.com> Date: Thu, 21 Mar 2024 12:11:37 -0400 Subject: [PATCH 08/47] Add debugging information for the `The required field was not present., at conversions[0].gclid` error --- .../catalog/actions-google-enhanced-conversions/index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/connections/destinations/catalog/actions-google-enhanced-conversions/index.md b/src/connections/destinations/catalog/actions-google-enhanced-conversions/index.md index 5d97b46d84..04048ae09d 100644 --- a/src/connections/destinations/catalog/actions-google-enhanced-conversions/index.md +++ b/src/connections/destinations/catalog/actions-google-enhanced-conversions/index.md @@ -121,3 +121,7 @@ When you use OAuth to authenticate into the Google Ads Conversions destination, Because of the duplicate API requests, you may see a warning in Google for unprocessed conversions due to incorrect or missing OAuth credentials. This warning is expected and does not indicate data loss. Google has confirmed that conversions are being processed, and OAuth retry behavior will not cause any issues for your web conversions. Whenever possible, Segment caches access tokens to reduce the total number of requests made to Google Ads Conversions. +### `The required field was not present., at conversions[0].gclid` Error + +Events going to Google for this integration require a `GCLID` field, an `email`, or a `phone_number`. If one of those identifiers isn't being sent properly, then you may see the `The required field was not present., at conversions[0].gclid` error. To fix this, please double check that at least one of those fields is being passed to Google on each payload. + From 1a59417e84cae557dc98fba9fb62376c917d6fa5 Mon Sep 17 00:00:00 2001 From: joeynmq <37472597+joeynmq@users.noreply.github.com> Date: Mon, 29 Apr 2024 08:46:17 +0800 Subject: [PATCH 09/47] Update index.md --- src/connections/destinations/catalog/klaviyo/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/connections/destinations/catalog/klaviyo/index.md b/src/connections/destinations/catalog/klaviyo/index.md index db8b94b072..9e1f06d5c8 100644 --- a/src/connections/destinations/catalog/klaviyo/index.md +++ b/src/connections/destinations/catalog/klaviyo/index.md @@ -85,6 +85,8 @@ If your `userId` is an email, or you provide an email in `traits.email`, Segment #### Enforce email as primary identifier This option is enabled by default to ensure duplicate profiles are not being created inside of Klaviyo. When enabled, Segment will never set the $id field to your `userId` when you call `.identify()` or `.track()`. Instead, Segment will only set $email as the primary identifier with your `traits.email` or `properties.email`. Please note that if you have this setting toggled on, you must send `email` in on your payloads or your events will not go through to Klaviyo. +> info "" +> For the Web Device-mode connection, this option applies **only** to the `.identify()` call. #### Fallback on Anonymous ID From 62d1a1f45d8034f93fe302762144482542c24c8d Mon Sep 17 00:00:00 2001 From: Liz Kane <68755692+lizkane222@users.noreply.github.com> Date: Mon, 29 Apr 2024 14:45:50 -0700 Subject: [PATCH 10/47] Update profile-api.md Escape Characters --- src/unify/profile-api.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/unify/profile-api.md b/src/unify/profile-api.md index 2e5cf07cf1..189a3b35b2 100644 --- a/src/unify/profile-api.md +++ b/src/unify/profile-api.md @@ -58,6 +58,8 @@ Your access token enables you to call the Profile API and access customer data. > warning "" > To query phone numbers that contain a plus sign (`+`), insert the escape characters `%2B` in place of the plus sign. > For example, if a `phone_number` identifier has the value `+5555550123`, enter `phone_number:%2B5555550123` in your query. +> +> If the field being used within the Profile API endpoint contains a value with a non-alphanumeric character, then the Profile API may respond with 500 error. In this case, please reference [this W3 doc](https://www.w3schools.com/tags/ref_urlencode.ASP#:~:text=ASCII%20Encoding%20Reference,%25C3%25BF), which lists the escape characters to replace the non-alphanumeric character in the Profile API endpoint with, so that the Profile API will respond with a 200 Success. ### Query the user's event traits From b226073446a0f610fff835f40c0100de66044f91 Mon Sep 17 00:00:00 2001 From: prigiattiperrut <47340158+prigiattiperrut@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:56:18 +0100 Subject: [PATCH 11/47] Update destination-filters.md --- src/connections/destinations/destination-filters.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/connections/destinations/destination-filters.md b/src/connections/destinations/destination-filters.md index bbe91950f5..9c84f8a124 100644 --- a/src/connections/destinations/destination-filters.md +++ b/src/connections/destinations/destination-filters.md @@ -257,5 +257,5 @@ Destination filters only filter events sent after filter setup. If you just adde When Segment sends an event to a destination but encounters a timeout error, it attempts to send the event again. As a result, if you add a destination filter while Segment is trying to send a failed event, these retries could filter through, since they reflect events that occurred before filter setup. #### How do destination filters handle Protocols Transformations? - -When you enable a destination-specific Transformation, Segment processes your events with a destination filter. Segment processes source-level Transformations before the events reach the destination filter. + - **Source-Scoped Transformations**: If destination filters are enabled, keep in mind that Segment processes [Source scoped transformations](https://segment.com/docs/protocols/transform/#step-2-set-up-the-transformation) before the events reach destination filters. + - **Destination-Scoped Transformations**: while [destination-specific transformations](https://segment.com/docs/protocols/transform/#step-2-set-up-the-transformation) are processed after the events have passed through the destination filters. From ab838acf02b70acc6270b785609916ad0e3afd03 Mon Sep 17 00:00:00 2001 From: Casie Oxford Date: Tue, 30 Apr 2024 11:54:41 -0500 Subject: [PATCH 12/47] grammar --- src/connections/destinations/destination-filters.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/connections/destinations/destination-filters.md b/src/connections/destinations/destination-filters.md index 9c84f8a124..19abb6c2fb 100644 --- a/src/connections/destinations/destination-filters.md +++ b/src/connections/destinations/destination-filters.md @@ -257,5 +257,5 @@ Destination filters only filter events sent after filter setup. If you just adde When Segment sends an event to a destination but encounters a timeout error, it attempts to send the event again. As a result, if you add a destination filter while Segment is trying to send a failed event, these retries could filter through, since they reflect events that occurred before filter setup. #### How do destination filters handle Protocols Transformations? - - **Source-Scoped Transformations**: If destination filters are enabled, keep in mind that Segment processes [Source scoped transformations](https://segment.com/docs/protocols/transform/#step-2-set-up-the-transformation) before the events reach destination filters. - - **Destination-Scoped Transformations**: while [destination-specific transformations](https://segment.com/docs/protocols/transform/#step-2-set-up-the-transformation) are processed after the events have passed through the destination filters. + - **Source-Scoped Transformations**: If destination filters are enabled, Segment processes [source scoped transformations](https://segment.com/docs/protocols/transform/#step-2-set-up-the-transformation) before the events reach destination filters. + - **Destination-Scoped Transformations**: Segment processes [destination-specific transformations](https://segment.com/docs/protocols/transform/#step-2-set-up-the-transformation) after the events have passed through the destination filters. From 17aabefa1837db77455fdd57172a690a6b57e7cc Mon Sep 17 00:00:00 2001 From: Casie Oxford Date: Tue, 30 Apr 2024 12:05:04 -0500 Subject: [PATCH 13/47] grammar --- src/connections/functions/source-functions.md | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/connections/functions/source-functions.md b/src/connections/functions/source-functions.md index 12dfdbd7ef..c241865910 100644 --- a/src/connections/functions/source-functions.md +++ b/src/connections/functions/source-functions.md @@ -297,36 +297,39 @@ You can test your code directly from the editor in two ways: either by receiving The advantage of testing your source function with webhooks is that all incoming data is real, so you can test behavior while closely mimicking the production conditions. -Note that Segment has updated the webhook URL to `api.segmentapis.com/functions`. To use webhooks with your function: -- You must [generate a public API token](https://docs.segmentapis.com/tag/Getting-Started/#section/Get-an-API-token){:target="_blank"}. - - Navigate here to [create a Public API Token]([url](https://app.segment.com/goto-my-workspace/settings/access-management/tokens)), or follow these steps : In your Segment Workspace, navigate to Settings → Workspace settings → Access Management tab → Token tab. On the right, click the `+ Create Token` button. Create a description for the token and assign access. Click `Create` and make sure to save the access token before clicking `Done`. -- For POST calls, you'll need to use this Public API token in the Authorization Header, as `Bearer Token : public_api_token` +Note: Segment has updated the webhook URL to `api.segmentapis.com/functions`. To use webhooks with your function, you must: +- [Generate a public API token](https://docs.segmentapis.com/tag/Getting-Started/#section/Get-an-API-token){:target="_blank"}. +- [Create a Public API Token]([url](https://app.segment.com/goto-my-workspace/settings/access-management/tokens)), or follow these steps: +In your Segment Workspace, navigate to Settings → Workspace settings → Access Management → Token. Click `+ Create Token`. Create a description for the token and assign access. Click `Create` and save the access token before clicking `Done`. +- For POST calls, use this Public API token in the Authorization Header, as `Bearer Token : public_api_token` ### Testing source functions with a webhook -You can use webhooks to test the source function either by sending requests manually (using any HTTP client such as cURL, Postman, or Insomnia) or by pasting the webhook into an external server that supports webhooks (such as Slack). -_A common Segment use case is to connect a Segment [Webhooks destination](https://segment.com/docs/connections/destinations/catalog/webhooks/) or [Webhook Actions destination](https://segment.com/docs/connections/destinations/catalog/actions-webhook/) to a test source, where the Webhook URL/endpoint that is used corresponds to the provided source function's endpoint, then you can trigger test events to send directly to that source which would be routed through your Webhook destination and continue on to the source function : Source → Webhook destination → Source Function._ +You can use webhooks to test the source function either by sending requests manually (using any HTTP client such as cURL, Postman, or Insomnia), or by pasting the webhook into an external server that supports webhooks (such as Slack). +_A common Segment use case is to connect a Segment [webhooks destination](https://segment.com/docs/connections/destinations/catalog/webhooks/) or [webhook actions destination](https://segment.com/docs/connections/destinations/catalog/actions-webhook/) to a test source, where the Webhook URL/endpoint that is used corresponds to the provided source function's endpoint, then you can trigger test events to send directly to that source, which are routed through your Webhook destination and continue on to the source function: Source → Webhook destination → Source Function._ From the source function editor, copy the provided webhook URL (endpoint) from the "Auto-fill via Webhook" dialog. _**Note** : When a new source is created that utilizes a source function, the new source's endpoint (webhook URL) will differ from the URL that is provided in the source function's test environment._ -In order to test the source function, you must (1) send a `POST` request to the source function's provided endpoint (webhook URL), (2) include an event `body`, and (3) the request must include these Headers : +To test the source function: +1. Send a `POST` request to the source function's provided endpoint (webhook URL) +2. Include an event `body` +3. The request must include these Headers: - `Content-Type : application/json` or `Content-Type : application/x-www-form-urlencoded` - `Authorization : Bearer _your_public_api_token_` ### Testing source functions manually -You can also manually construct the headers and body of an HTTPS request right inside the editor and test with this data without using webhooks. -The `Content-Type` Header is required when testing the function : +You can also manually construct the headers and body of an HTTPS request inside the editor and test with this data without using webhooks. +The `Content-Type` Header is required when testing the function: - `Content-Type : application/json` or `Content-Type : application/x-www-form-urlencoded` ![Test HTTPS Request](images/test-manual.png){:width="500"} ## Save and deploy the function -Once you finish building your source function, click **Configure** to name it, then click **Create Function** to save it. - -Once you do that, the source function appears on the **Functions** page in your workspace's catalog. +After you finish building your source function, click **Configure** to name it, then click **Create Function** to save it. +The source function appears on the **Functions** page in your workspace's catalog. If you're editing an existing function, you can **Save** changes without updating instances of the function that are already deployed and running. @@ -334,7 +337,7 @@ You can also choose to **Save & Deploy** to save the changes, and then choose wh ## Source functions logs and errors -Your function might encounter errors that you missed during testing, or you might intentionally throw errors in your code (for example, if the incoming request is missing required fields). +Your function may encounter errors that you missed during testing, or you might intentionally throw errors in your code (for example, if the incoming request is missing required fields). If your function throws an error, execution halts immediately. Segment captures the incoming request, any console logs the function printed, and the error, and displays this information in the function's **Errors** tab. You can use this tab to find and fix unexpected errors. @@ -392,7 +395,7 @@ If you are a **Workspace Owner** or **Functions Admin**, you can manage your sou From the [Functions tab](https://app.segment.com/goto-my-workspace/functions/catalog){:target="_blank"}, click **Connect Source** and follow the prompts to set it up in your workspace. -Once configured, find the webhook URL - either on the **Overview** or **Settings → Endpoint** page. +After configuring, find the webhook URL - either on the **Overview** or **Settings → Endpoint** page. Copy and paste this URL into the upstream tool or service to send data to this source. @@ -431,5 +434,4 @@ Segment alphabetizes payload fields that come in to **deployed** source function #### Can I use a Source Function in place of adding a Tracking Pixel to my code? -No. Tracking Pixels operate client-side only and need to be loaded onto your website directly. Source Functions operate server-side only, and aren't able to capture or implement client-side tracking code. If the tool you're hoping to integrate is server-side, then you can use a Source Function to connect it to Segment. - +No. Tracking Pixels operate client-side only and need to be loaded onto your website directly. Source Functions operate server-side only, and aren't able to capture or implement client-side tracking code. If the tool you're hoping to integrate is server-side, then you can use a Source Function to connect it to Segment. From b3024a65fdc9a2c6fb52567b1726968639de6fa2 Mon Sep 17 00:00:00 2001 From: forstisabella <92472883+forstisabella@users.noreply.github.com> Date: Wed, 1 May 2024 13:19:22 -0400 Subject: [PATCH 14/47] Apply suggestions from code review --- src/connections/destinations/destination-filters.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/connections/destinations/destination-filters.md b/src/connections/destinations/destination-filters.md index 19abb6c2fb..7132f4674c 100644 --- a/src/connections/destinations/destination-filters.md +++ b/src/connections/destinations/destination-filters.md @@ -257,5 +257,5 @@ Destination filters only filter events sent after filter setup. If you just adde When Segment sends an event to a destination but encounters a timeout error, it attempts to send the event again. As a result, if you add a destination filter while Segment is trying to send a failed event, these retries could filter through, since they reflect events that occurred before filter setup. #### How do destination filters handle Protocols Transformations? - - **Source-Scoped Transformations**: If destination filters are enabled, Segment processes [source scoped transformations](https://segment.com/docs/protocols/transform/#step-2-set-up-the-transformation) before the events reach destination filters. - - **Destination-Scoped Transformations**: Segment processes [destination-specific transformations](https://segment.com/docs/protocols/transform/#step-2-set-up-the-transformation) after the events have passed through the destination filters. + - **Source-Scoped Transformations**: If destination filters are enabled, Segment processes [source scoped transformations](docs/protocols/transform/#step-2-set-up-the-transformation) before the events reach destination filters. + - **Destination-Scoped Transformations**: Segment processes [destination-specific transformations](/docs/protocols/transform/#step-2-set-up-the-transformation) after the events have passed through the destination filters. From ee078fe870631ade9457cdd41fa53981c1b0f16a Mon Sep 17 00:00:00 2001 From: forstisabella <92472883+forstisabella@users.noreply.github.com> Date: Wed, 1 May 2024 13:19:41 -0400 Subject: [PATCH 15/47] Update src/connections/destinations/destination-filters.md --- src/connections/destinations/destination-filters.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connections/destinations/destination-filters.md b/src/connections/destinations/destination-filters.md index 7132f4674c..024f23818a 100644 --- a/src/connections/destinations/destination-filters.md +++ b/src/connections/destinations/destination-filters.md @@ -257,5 +257,5 @@ Destination filters only filter events sent after filter setup. If you just adde When Segment sends an event to a destination but encounters a timeout error, it attempts to send the event again. As a result, if you add a destination filter while Segment is trying to send a failed event, these retries could filter through, since they reflect events that occurred before filter setup. #### How do destination filters handle Protocols Transformations? - - **Source-Scoped Transformations**: If destination filters are enabled, Segment processes [source scoped transformations](docs/protocols/transform/#step-2-set-up-the-transformation) before the events reach destination filters. + - **Source-Scoped Transformations**: If destination filters are enabled, Segment processes [source scoped transformations](/docs/protocols/transform/#step-2-set-up-the-transformation) before the events reach destination filters. - **Destination-Scoped Transformations**: Segment processes [destination-specific transformations](/docs/protocols/transform/#step-2-set-up-the-transformation) after the events have passed through the destination filters. From 9a85dfc867a59a439b2884a483acc69749b055bc Mon Sep 17 00:00:00 2001 From: Megan Cooper Date: Wed, 1 May 2024 20:01:30 -0700 Subject: [PATCH 16/47] feat: add events.win destination docs --- .../destinations/catalog/events.win/index.md | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/connections/destinations/catalog/events.win/index.md diff --git a/src/connections/destinations/catalog/events.win/index.md b/src/connections/destinations/catalog/events.win/index.md new file mode 100644 index 0000000000..baa86e340f --- /dev/null +++ b/src/connections/destinations/catalog/events.win/index.md @@ -0,0 +1,42 @@ +--- +title: events.win Destination +rewrite: true +strat: facebook +id: 5661eb58e954a874ca44cc07 +--- + +[events.win](https://events.win/?utm_source=segmentio&utm_medium=docs&utm_campaign=partners){:target="\_blank”} provides a single platform to create your tracking plan, sync event definitions to your code, and see detailed metrics on how correct your data is. With events.win, you can ensure that your tracking is accurate and up-to-date. + +This destination is maintained by events.win. For any issues with the destination, [contact the events.win support team](mailto:hi@events.win). + +## Getting started + +1. From your workspace's [Destination catalog page](https://app.segment.com/goto-my-workspace/destinations/catalog){:target="\_blank”} search for "events.win" +2. Select events.win and click **Add Destination** +3. Select an existing Source to connect to events.win (Actions). +4. Go to the [events.win dashboard](https://app.events.win/developers){:target="\_blank"}, find and copy the **Developer key**. +5. Enter the **Developer Key** in the events.win destination settings in Segment. +6. That's it! events.win will start to receive data from Segment, there may be a delay before data is visible in the events.win dashboard. + +## Supported methods + +events.win supports the following methods, as specified in the [Segment Spec](/docs/connections/spec). + +### Track + +[Track](/docs/connections/spec/track) calls are consumed and validated against the tracking plan you've defined in events.win. We don't store the data, but we do provide a detailed report on how correct your data is. + +You can use the [@events.win/cli](https://www.npmjs.com/package/@events.win/cli) to generate type-safe tracking code for your events. + +```js +/** + * Example: + * events.win will look at your spec for the event `login-button-clicked` and validate the properties `handle` and `id` are present and have the correct data type. + */ +analytics.track("login-button-clicked", { + user: { + handle: "frodo.baggins", + id: "123456789", + }, +}); +``` From 8c2bae817fbd13799cfe00b90e87f0ed5d6e55dc Mon Sep 17 00:00:00 2001 From: Megan Cooper Date: Wed, 1 May 2024 20:03:41 -0700 Subject: [PATCH 17/47] fix: add beta, remove unneeded properties --- src/connections/destinations/catalog/events.win/index.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/connections/destinations/catalog/events.win/index.md b/src/connections/destinations/catalog/events.win/index.md index baa86e340f..ac7b74fe24 100644 --- a/src/connections/destinations/catalog/events.win/index.md +++ b/src/connections/destinations/catalog/events.win/index.md @@ -1,8 +1,6 @@ --- title: events.win Destination -rewrite: true -strat: facebook -id: 5661eb58e954a874ca44cc07 +beta: true --- [events.win](https://events.win/?utm_source=segmentio&utm_medium=docs&utm_campaign=partners){:target="\_blank”} provides a single platform to create your tracking plan, sync event definitions to your code, and see detailed metrics on how correct your data is. With events.win, you can ensure that your tracking is accurate and up-to-date. From f8a3065a4d97649400cab2e75a78f996666e7d6b Mon Sep 17 00:00:00 2001 From: joeynmq <37472597+joeynmq@users.noreply.github.com> Date: Thu, 2 May 2024 16:34:20 +0800 Subject: [PATCH 18/47] Update index.md --- .../catalog/actions-tiktok-pixel/index.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/connections/destinations/catalog/actions-tiktok-pixel/index.md b/src/connections/destinations/catalog/actions-tiktok-pixel/index.md index a8f3b44d8b..5cb68cb960 100644 --- a/src/connections/destinations/catalog/actions-tiktok-pixel/index.md +++ b/src/connections/destinations/catalog/actions-tiktok-pixel/index.md @@ -24,21 +24,9 @@ This destination is maintained by TikTok. For any issues with the destination, [ 4. Select an existing JavaScript Source to connect to TikTok Pixel. 5. Give the Destination a name. 6. On the Settings screen, provide the Pixel Code. This can be found in the TikTok Events Manager (TTEM). - - Ensure that the "Use Existing Pixel" setting is **off** if you want Segment to load the TikTok Pixel JavaScript code onto your website. This is the default and recommended behavior. - - Ensure that the "Use Existing Pixel" setting is **on** if you want Segment to detect a pre-existing TikTok Pixel that's already loaded to your website independently of Segment. If you enable this option and don't have TikTok Pixel loaded to your website, your data collection to Segment may be disrupted. See [the "Use Existing Pixel" setting](#use-existing-pixel-setting) for more information on how to use this setting safely. 7. Toggle on the Destination using the **Enable Destination** toggle. 8. Click **Save Change**. - -## The Use Existing Pixel setting - -> warning "" -> Use caution when you toggle on the **Use Existing Pixel** setting; it could result in disruption to data collection if Segment doesn't detect TikTok Pixel on the website. - -The TikTok Pixel destination's default behavior is to load a TikTok Pixel JavaScript library onto your website when the page loads. However, if you already have TikTok Pixel on your website before enabling this Destination, you may want Segment to detect and use your pre-existing TikTok Pixel JavaScript library instead of loading a new TikTok Pixel library. - -Toggling the **Use Existing Pixel** setting on will prevent Segment from loading a TikTok Pixel library onto the web page. Instead, Segment will attempt to detect your pre-loaded TikTok Pixel library and will use it when forwarding events to TikTok. - ### Mappings enabled by default After setting up the Destination, Segment enables seven mappings by default. You can click on the mappings tab to view and edit these mappings. From 293b00fc27f2b55f2aa2cb95360abe03eeb5ca35 Mon Sep 17 00:00:00 2001 From: forstisabella <92472883+forstisabella@users.noreply.github.com> Date: Thu, 2 May 2024 14:01:38 -0400 Subject: [PATCH 19/47] Move misc items to new branch --- src/_data/sidenav/main.yml | 2 ++ .../configure-consent-management.md | 2 +- src/privacy/consent-management/consent-faq.md | 28 +++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/privacy/consent-management/consent-faq.md diff --git a/src/_data/sidenav/main.yml b/src/_data/sidenav/main.yml index 54be912f7b..b3248c9e3b 100644 --- a/src/_data/sidenav/main.yml +++ b/src/_data/sidenav/main.yml @@ -515,6 +515,8 @@ sections: title: Configure Consent Management - path: /privacy/consent-management/consent-in-unify/ title: Consent in Unify + - path: /privacy/consent-management/consent-faq/ + title: Consent FAQs - path: /privacy/account-deletion title: Account & Data Deletion - path: /privacy/hipaa-eligible-segment diff --git a/src/privacy/consent-management/configure-consent-management.md b/src/privacy/consent-management/configure-consent-management.md index 6772b76261..bd6fa62cdc 100644 --- a/src/privacy/consent-management/configure-consent-management.md +++ b/src/privacy/consent-management/configure-consent-management.md @@ -53,7 +53,7 @@ Segment provides a OneTrust wrapper for the following sources: - **Swift**: Please follow the instructions from the README in the [@segment-integrations/analytics-swift-consent](https://github.com/segment-integrations/analytics-swift-consent#segment-consent-management){:target="_blank"} repository. -If you'd like to integrate with any other CMP, Segment requires you to build your own wrapper or use any mechanism provided it meets the above requirements of data and event generation. +If you'd like to integrate with any other CMP, Segment requires you to build your own wrapper or use any mechanism provided it meets the above requirements of data and event generation. To get started building your own wrapper, follow the instructions in the [@segment/analytics-consent-tools](https://github.com/segmentio/analytics-next/tree/master/packages/consent/consent-tools){:target="_blank"} repository. > warning "Consent Management is not backwards compatible with Segment's legacy iOS and Android libraries" > If you are using one of Segment's legacy mobile libraries (iOS or Android,) you will need to upgrade to [Swift](/docs/connections/sources/catalog/libraries/mobile/apple/migration/) or [Kotlin](/docs/connections/sources/catalog/libraries/mobile/kotlin-android/migration/) before using Consent Management. diff --git a/src/privacy/consent-management/consent-faq.md b/src/privacy/consent-management/consent-faq.md new file mode 100644 index 0000000000..ce2adec27a --- /dev/null +++ b/src/privacy/consent-management/consent-faq.md @@ -0,0 +1,28 @@ +--- +title: Frequently Asked Questions +plan: consent-management +--- + +## Is Segment's Consent Manager part of Consent Management? + +No. Segment's deprecated [open-source Consent Manager](https://github.com/segmentio/consent-manager){:target="_blank”}, which captures end user consent, is not part of Segment's Consent Management product, which focuses only on enforcing end user consent. + +Segment recommends moving from the deprecated consent-manager to a commercial alternative, like [OneTrust](https://www.onetrust.com/){:target="_blank”}. + +## What destinations support consent enforcement? + +All event streams destinations, with the exception of AWS S3 and Engage destinations, support consent enforcement. + +## Can I share current end user consent preferences with my destinations? + +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. + +## Can I use a Consent Management Platform (CMP) other than OneTrust to collect consent from my end users? + +Yes, you can use any commercially available CMP or custom solution to collect consent from your end users. If you use a CMP other than OneTrust, you must generate your own wrapper or other mechanism to add the following objects to the events collected from your sources: +- Includes the [consent object](/docs/privacy/consent-management/consent-in-segment-connections/#consent-object) on every event +- Generates the [Segment Consent Preference Updated](/docs/privacy/consent-management/consent-in-unify/#segment-consent-preference-updated-event) event every time a user provides or updates their consent preferences. This event must contain their anonymousId or userId. + +Segment provides guidance about creating your own wrapper in the [@segment/analytics-consent-tools](https://github.com/segmentio/analytics-next/tree/master/packages/consent/consent-tools){:target="_blank"} GitHub repository. \ No newline at end of file From a0188a3da453f58a379a2e5f87d2c5a4919e2823 Mon Sep 17 00:00:00 2001 From: forstisabella <92472883+forstisabella@users.noreply.github.com> Date: Thu, 2 May 2024 14:31:09 -0400 Subject: [PATCH 20/47] [netlify-build] --- .../consent-management/consent-in-segment-connections.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/privacy/consent-management/consent-in-segment-connections.md b/src/privacy/consent-management/consent-in-segment-connections.md index 80919720f8..2e4059c575 100644 --- a/src/privacy/consent-management/consent-in-segment-connections.md +++ b/src/privacy/consent-management/consent-in-segment-connections.md @@ -81,4 +81,4 @@ If there is a category configured in Segment (`functional`) that is not mapped i ## Content observability -Events discarded due to consent preferences appear in [Delivery Overview](/docs/connections/delivery-overview/) at the "Filtered at destination" step with the discard reason *Filtered by end user consent*. +Events discarded due to consent preferences appear in [Delivery Overview](/docs/connections/delivery-overview/) at the "Filtered at destination" step with the discard reason *Filtered by end user consent*. \ No newline at end of file From 764602f92ab665da84ef65e9a29ae4bec2522d10 Mon Sep 17 00:00:00 2001 From: forstisabella <92472883+forstisabella@users.noreply.github.com> Date: Thu, 2 May 2024 14:52:30 -0400 Subject: [PATCH 21/47] [netlify-build] --- src/_data/sidenav/main.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/_data/sidenav/main.yml b/src/_data/sidenav/main.yml index b3248c9e3b..5a79484060 100644 --- a/src/_data/sidenav/main.yml +++ b/src/_data/sidenav/main.yml @@ -517,6 +517,8 @@ sections: title: Consent in Unify - path: /privacy/consent-management/consent-faq/ title: Consent FAQs + - path: /privacy/consent-management/onetrust-wrapper/ + title: Analytics.js OneTrust Wrapper - path: /privacy/account-deletion title: Account & Data Deletion - path: /privacy/hipaa-eligible-segment From edf247038987866a17d990ea250fa51e4146909d Mon Sep 17 00:00:00 2001 From: Thomas Gilbert Date: Thu, 2 May 2024 16:24:40 -0400 Subject: [PATCH 22/47] update klaviyo actions docs --- .../catalog/actions-klaviyo/index.md | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/connections/destinations/catalog/actions-klaviyo/index.md b/src/connections/destinations/catalog/actions-klaviyo/index.md index faef19f975..58519cd42f 100644 --- a/src/connections/destinations/catalog/actions-klaviyo/index.md +++ b/src/connections/destinations/catalog/actions-klaviyo/index.md @@ -4,7 +4,6 @@ id: 650bdf1a62fb34ef0a8058e1 beta: true --- - {% include content/plan-grid.md name="actions" %} [Klaviyo](https://www.klaviyo.com){:target="_blank"} is a powerful email platform focused on ecommerce that helps companies make more money. It supports segmentation based on category and event triggers like product bought, page viewed, email engagement, or amount spent. @@ -21,33 +20,32 @@ Klaviyo (Actions) provides the following benefits: - **More control** - Actions-based destinations enable you to define the mapping between the data Segment receives from your sources, and the data Segment sends to Klaviyo. - **Default property mappings** - Default mappings from the Segment like event, timestamp, and more, allow data to be mapped correctly without any setup required. - ## Getting started 1. From the Segment web app, click **Catalog**. -2. Search for *Klaviyo (Actions)* in the Catalog, select it, and choose which of your sources to connect the destination to. +2. Search for **Klaviyo (Actions)** in the Catalog, select it, and choose which of your sources to connect the destination to. 3. Navigate to [Account > Settings > API Keys](https://www.klaviyo.com/account#api-keys-tab){:target="_blank"} in Klaviyo's UI and copy your API Key into the Segment Settings UI. > info "" -> Klaviyo requires the Private API Key to use the List API. You can find this by going to Klaviyo's UI and clicking [Account > Settings > API Keys > Create API Key](https://www.klaviyo.com/account#api-keys-tab){:target="_blank"} to generate a Private API Key and copy it into the Segment Settings UI. - +> Klaviyo requires the Private API Key to use the List API. You can find this by going to Klaviyo's UI and clicking [Account > Settings > API Keys > Create API Key](https://www.klaviyo.com/account#api-keys-tab){:target="_blank"} to generate a Private API Key and copy it into the Segment Settings UI. {% include components/actions-fields.html %} -## Using Klaviyo with RETL +## Using Klaviyo with RETL -Klaviyo (Actions) Destination can accept [RETL](/docs/connections/reverse-etl/) data. You can send the models you created in your data warehouse source. Follow [the steps](/docs/connections/reverse-etl/#step-1-add-a-source) to create your data warehouse source and set up models. +Klaviyo (Actions) Destination can accept [RETL](/docs/connections/reverse-etl/) data. You can send the models you created in your data warehouse source. Follow [the steps](/docs/connections/reverse-etl/#step-1-add-a-source) to create your data warehouse source and set up models. - -| Action | Added | Updated | Deleted | -| -------------- | --------------- | -------------- | --------------- | -| Order Completed | | | | -| Track Event | | | | -| Upsert Profile | | | | +| Action | Added | Updated | Deleted | +| ------------------- | ------------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | +| Order Completed | | | | +| Track Event | | | | +| Upsert Profile | | | | +| Subscribe Profile | | | | +| Unsubscribe Profile | | | | In order to add users to a list, use the **Upsert Profile** Action and fill out the **List** field with the Klaviyo list to add the profile to. -Follow these steps to create a list in Klaviyo: +Follow these steps to create a list in Klaviyo: 1. Navigate to **Audience > Lists & Segments**. 2. Click **Create List/Segment**. @@ -55,27 +53,27 @@ Follow these steps to create a list in Klaviyo: 4. Give your list a name and add any applicable tags. 5. Click **Create List**. - ## Using Klaviyo with Engage -Klaviyo (Actions) Destination can accept your [Engage](/docs/engage/) data. You **don't** need to create a list in Klaviyo. During the first sync, Segment creates a list with the same name as your audience. +Klaviyo (Actions) Destination can accept your [Engage](/docs/engage/) data. If you wish to add a profile to a list associated with the Engage audienceId, you **don't** need to create a list in Klaviyo. During the first sync with the **Add Profile To List (Engage)** Mapping, Segment creates a list with the same ID as your audience. + +To add and remove profiles in Klaviyo with Engage Audience data: -To use Klaviyo with Engage: 1. Create and configure your Engage Audience. 2. Navigate to **Engage > Engage Settings > Destinations** and click **Add Destination**. 3. Select **Klaviyo (Actions) Audiences**. 4. Select your Audience Space as the source, and name your destination. -5. On the **Mappings** tab, click **Add Mapping** and select **Add Profile To List**. -6. Click **Save** and make sure to enable the mapping. -7. On the **Mappings** tab, click **Add Mapping** and select **Remove Profile from list**. -8. Click **Save** and make sure you enable the mapping. -9. Enable the destination. +5. On the **Mappings** tab, click **Add Mapping** and select **Add Profile To List (Engage)**. +6. Click **Save** and make sure to enable the mapping. +7. On the **Mappings** tab, click **Add Mapping** and select **Remove Profile from List (Engage)**. +8. Click **Save** and make sure you enable the mapping. +9. Enable the destination. 10. On the **Engage > Audiences > (your audience)** page, click **Add Destination** and select the destination created. 11. In the settings that appear in the side panel, toggle the **Send Track** option on, and don't change the **Audience Entered/Audience Exited** event names. 12. Click **Save Settings**. -## FAQ +## FAQ -### Dealing with 429 Responses from Klaviyo's API +### Dealing with 429 Responses from Klaviyo's API If you're encountering rate limiting issues, consider enabling batching for the Action receiving these errors. Ensure that within the mapping configuration, "Batch data to Klaviyo" is set to "Yes". This adjustment can help alleviate the rate limiting problem. From 9db747ec68ff07913d917eebed23555fd397d932 Mon Sep 17 00:00:00 2001 From: forstisabella <92472883+forstisabella@users.noreply.github.com> Date: Thu, 2 May 2024 16:46:59 -0400 Subject: [PATCH 23/47] take sidenav link out [netlify-build] --- src/_data/sidenav/main.yml | 2 -- src/privacy/consent-management/configure-consent-management.md | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/_data/sidenav/main.yml b/src/_data/sidenav/main.yml index 5a79484060..b3248c9e3b 100644 --- a/src/_data/sidenav/main.yml +++ b/src/_data/sidenav/main.yml @@ -517,8 +517,6 @@ sections: title: Consent in Unify - path: /privacy/consent-management/consent-faq/ title: Consent FAQs - - path: /privacy/consent-management/onetrust-wrapper/ - title: Analytics.js OneTrust Wrapper - path: /privacy/account-deletion title: Account & Data Deletion - path: /privacy/hipaa-eligible-segment diff --git a/src/privacy/consent-management/configure-consent-management.md b/src/privacy/consent-management/configure-consent-management.md index bd6fa62cdc..300d62994b 100644 --- a/src/privacy/consent-management/configure-consent-management.md +++ b/src/privacy/consent-management/configure-consent-management.md @@ -48,7 +48,7 @@ Once you've created consent categories in the Segment app, you need to integrate - If using Unify and Engage, generates the [Segment Consent Preference Updated](/docs/privacy/consent-management/consent-in-unify/#segment-consent-preference-updated-event) event every time a user provides or updates their consent preferences with their anonymousId and userId Segment provides a OneTrust wrapper for the following sources: -- **Analytics.js**: Please follow the instructions from the README in the [@segment/analytics-consent-wrapper-onetrust](https://github.com/segmentio/analytics-next/tree/master/packages/consent/consent-wrapper-onetrust){:target="_blank"} repository. +- **Analytics.js**: Please follow the instructions from the README in the [@segment/analytics-consent-wrapper-onetrust](https://github.com/segmentio/analytics-next/tree/master/packages/consent/consent-wrapper-onetrust){:target="_blank"} repository. For more information about Segment's Analytics.js OneTrust wrapper, see the [Analytics.js OneTrust Wrapper](/docs/privacy/consent-management/onetrust-wrapper) documentation. - **Kotlin**: Please follow the instructions from the README in the [@segment-integrations/analytics-kotlin-consent](https://github.com/segment-integrations/analytics-kotlin-consent/blob/main/README.md#getting-started){:target="_blank"} repository. - **Swift**: Please follow the instructions from the README in the [@segment-integrations/analytics-swift-consent](https://github.com/segment-integrations/analytics-swift-consent#segment-consent-management){:target="_blank"} repository. From 4c80e5d96d17720c23475251c09501b7c95b3345 Mon Sep 17 00:00:00 2001 From: Casie Oxford Date: Thu, 2 May 2024 16:02:15 -0500 Subject: [PATCH 24/47] Revert "Bump commonmarker from 0.23.9 to 0.23.10" --- Gemfile.lock | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) mode change 100644 => 100755 Gemfile.lock diff --git a/Gemfile.lock b/Gemfile.lock old mode 100644 new mode 100755 index 76da881a37..8f5e6c086c --- a/Gemfile.lock +++ b/Gemfile.lock @@ -31,7 +31,7 @@ GEM httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) colorator (1.1.0) - commonmarker (0.23.10) + commonmarker (0.23.9) concurrent-ruby (1.2.2) dotenv (2.8.1) em-websocket (0.5.3) @@ -46,7 +46,6 @@ GEM filesize (0.2.0) forwardable-extended (2.6.0) google-protobuf (3.23.2-x86_64-darwin) - google-protobuf (3.23.2-x86_64-linux) http_parser.rb (0.8.0) httpclient (2.8.3) i18n (1.13.0) @@ -90,8 +89,6 @@ GEM mercenary (0.4.0) nokogiri (1.15.2-x86_64-darwin) racc (~> 1.4) - nokogiri (1.15.2-x86_64-linux) - racc (~> 1.4) pathutil (0.16.2) forwardable-extended (~> 2.6) posix-spawn (0.3.15) @@ -109,8 +106,6 @@ GEM safe_yaml (1.0.5) sass-embedded (1.62.1-x86_64-darwin) google-protobuf (~> 3.21) - sass-embedded (1.62.1-x86_64-linux-gnu) - google-protobuf (~> 3.21) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) thread_safe (0.3.6) @@ -124,9 +119,9 @@ GEM webrick (1.8.1) PLATFORMS + ruby x86_64-darwin-19 x86_64-darwin-20 - x86_64-linux DEPENDENCIES dotenv From 59cf507679946d7a304f0af6ee337a5ad5614508 Mon Sep 17 00:00:00 2001 From: forstisabella <92472883+forstisabella@users.noreply.github.com> Date: Thu, 2 May 2024 17:49:31 -0400 Subject: [PATCH 25/47] [netlify-build] final comments --- src/privacy/consent-management/consent-faq.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/privacy/consent-management/consent-faq.md b/src/privacy/consent-management/consent-faq.md index ce2adec27a..5650b15c08 100644 --- a/src/privacy/consent-management/consent-faq.md +++ b/src/privacy/consent-management/consent-faq.md @@ -5,9 +5,9 @@ plan: consent-management ## Is Segment's Consent Manager part of Consent Management? -No. Segment's deprecated [open-source Consent Manager](https://github.com/segmentio/consent-manager){:target="_blank”}, which captures end user consent, is not part of Segment's Consent Management product, which focuses only on enforcing end user consent. +No. Segment's deprecated [open-source Consent Manager](https://github.com/segmentio/consent-manager){:target="_blank”}, which captures end user cookie consent, is not part of Segment's Consent Management product, which focuses only on enforcing end user consent, or sharing end user data with only the destinations they consented to share data with and blocking the flow of data to all other destinations. -Segment recommends moving from the deprecated consent-manager to a commercial alternative, like [OneTrust](https://www.onetrust.com/){:target="_blank”}. +Segment recommends moving from the deprecated, open-source Consent Manager to one that meets your legal compliance requirements. ## What destinations support consent enforcement? From 8217c2d8f26de822a586cc410fb8efca0d97518c Mon Sep 17 00:00:00 2001 From: forstisabella <92472883+forstisabella@users.noreply.github.com> Date: Thu, 2 May 2024 18:24:31 -0400 Subject: [PATCH 26/47] readability [netlify-build] --- src/privacy/consent-management/consent-faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/privacy/consent-management/consent-faq.md b/src/privacy/consent-management/consent-faq.md index 5650b15c08..a49938b61b 100644 --- a/src/privacy/consent-management/consent-faq.md +++ b/src/privacy/consent-management/consent-faq.md @@ -5,7 +5,7 @@ plan: consent-management ## Is Segment's Consent Manager part of Consent Management? -No. Segment's deprecated [open-source Consent Manager](https://github.com/segmentio/consent-manager){:target="_blank”}, which captures end user cookie consent, is not part of Segment's Consent Management product, which focuses only on enforcing end user consent, or sharing end user data with only the destinations they consented to share data with and blocking the flow of data to all other destinations. +No. Segment's deprecated [open-source Consent Manager](https://github.com/segmentio/consent-manager){:target="_blank”}, which captures end user cookie consent, is not part of Segment's Consent Management product, which focuses only on **enforcing** end user consent. Enforcing end user consent means sharing your end users' data with only the destinations they consented to share data with and blocking the flow of their data to all other destinations. Segment recommends moving from the deprecated, open-source Consent Manager to one that meets your legal compliance requirements. From 4b0434380175c1198d0582c73cd75de518e98685 Mon Sep 17 00:00:00 2001 From: forstisabella <92472883+forstisabella@users.noreply.github.com> Date: Thu, 2 May 2024 18:34:30 -0400 Subject: [PATCH 27/47] bolding captures for parity --- src/privacy/consent-management/consent-faq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/privacy/consent-management/consent-faq.md b/src/privacy/consent-management/consent-faq.md index a49938b61b..1383349ccd 100644 --- a/src/privacy/consent-management/consent-faq.md +++ b/src/privacy/consent-management/consent-faq.md @@ -5,7 +5,7 @@ plan: consent-management ## Is Segment's Consent Manager part of Consent Management? -No. Segment's deprecated [open-source Consent Manager](https://github.com/segmentio/consent-manager){:target="_blank”}, which captures end user cookie consent, is not part of Segment's Consent Management product, which focuses only on **enforcing** end user consent. Enforcing end user consent means sharing your end users' data with only the destinations they consented to share data with and blocking the flow of their data to all other destinations. +No. Segment's deprecated [open-source Consent Manager](https://github.com/segmentio/consent-manager){:target="_blank”}, which **captures** end user cookie consent, is not part of Segment's Consent Management product, which focuses only on **enforcing** end user consent. Enforcing end user consent means sharing your end users' data with only the destinations they consented to share data with and blocking the flow of their data to all other destinations. Segment recommends moving from the deprecated, open-source Consent Manager to one that meets your legal compliance requirements. From f82403f83257b38fd4d862e5efaa87c23f174cd2 Mon Sep 17 00:00:00 2001 From: Thomas Gilbert Date: Fri, 3 May 2024 11:09:44 -0400 Subject: [PATCH 28/47] correct addition of Gemfile --- .../catalog/actions-klaviyo/index.md | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/connections/destinations/catalog/actions-klaviyo/index.md b/src/connections/destinations/catalog/actions-klaviyo/index.md index 58519cd42f..4f8e78349d 100644 --- a/src/connections/destinations/catalog/actions-klaviyo/index.md +++ b/src/connections/destinations/catalog/actions-klaviyo/index.md @@ -35,13 +35,19 @@ Klaviyo (Actions) provides the following benefits: Klaviyo (Actions) Destination can accept [RETL](/docs/connections/reverse-etl/) data. You can send the models you created in your data warehouse source. Follow [the steps](/docs/connections/reverse-etl/#step-1-add-a-source) to create your data warehouse source and set up models. -| Action | Added | Updated | Deleted | -| ------------------- | ------------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | -| Order Completed | | | | -| Track Event | | | | -| Upsert Profile | | | | -| Subscribe Profile | | | | -| Unsubscribe Profile | | | | +| Action | Added | Updated | Deleted | +| ------------------- | ------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------------------------------- | +| Order Completed | | | | +| Track Event | | | | +| Upsert Profile | | | | +| Remove Profile | | | | +| Subscribe Profile | | | **\*** | +| Unsubscribe Profile | | | | + +> info "" +> **\*** Though technically possible, it may not be the most intuitive approach to using RETL. +> +> **e.g.,** Triggering a **Subscribe Profile** action when a user is **deleted** from a Model that queries unsubscribed users. In order to add users to a list, use the **Upsert Profile** Action and fill out the **List** field with the Klaviyo list to add the profile to. From f9f346d43dd7582e720db267306a00f9b2fb9c2e Mon Sep 17 00:00:00 2001 From: Megan <8683055+megancooper@users.noreply.github.com> Date: Fri, 3 May 2024 16:48:20 -0700 Subject: [PATCH 29/47] Update src/connections/destinations/catalog/events.win/index.md Co-authored-by: Thomas Gilbert <64277654+tcgilbert@users.noreply.github.com> --- src/connections/destinations/catalog/events.win/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/connections/destinations/catalog/events.win/index.md b/src/connections/destinations/catalog/events.win/index.md index ac7b74fe24..2ae07f6168 100644 --- a/src/connections/destinations/catalog/events.win/index.md +++ b/src/connections/destinations/catalog/events.win/index.md @@ -1,6 +1,7 @@ --- title: events.win Destination beta: true +id: 662d3328d029f89724a0c294 --- [events.win](https://events.win/?utm_source=segmentio&utm_medium=docs&utm_campaign=partners){:target="\_blank”} provides a single platform to create your tracking plan, sync event definitions to your code, and see detailed metrics on how correct your data is. With events.win, you can ensure that your tracking is accurate and up-to-date. From 7c8e609f15e3dfb419295208219c6e775662168d Mon Sep 17 00:00:00 2001 From: Megan Cooper Date: Fri, 3 May 2024 16:49:22 -0700 Subject: [PATCH 30/47] refactor: rename folder to events-win --- .../destinations/catalog/{events.win => events-win}/index.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/connections/destinations/catalog/{events.win => events-win}/index.md (100%) diff --git a/src/connections/destinations/catalog/events.win/index.md b/src/connections/destinations/catalog/events-win/index.md similarity index 100% rename from src/connections/destinations/catalog/events.win/index.md rename to src/connections/destinations/catalog/events-win/index.md From 8417550a167a4148178b5f1c01dcfe6271f4cd5a Mon Sep 17 00:00:00 2001 From: Alice Mackel Date: Sat, 4 May 2024 02:40:45 -0400 Subject: [PATCH 31/47] Add documentation sections explaining how to track conversions with backend SDKs and reverse ETL --- .../images/snowflake-mappings.png | Bin 0 -> 53872 bytes .../catalog/actions-stackadapt/index.md | 25 ++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/connections/destinations/catalog/actions-stackadapt/images/snowflake-mappings.png diff --git a/src/connections/destinations/catalog/actions-stackadapt/images/snowflake-mappings.png b/src/connections/destinations/catalog/actions-stackadapt/images/snowflake-mappings.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab6cc4a6d4faea6d9d87d03f538b3e2a8d6c29e GIT binary patch literal 53872 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 PP>R=YUCY0E=h6QH>rv-0 literal 0 HcmV?d00001 diff --git a/src/connections/destinations/catalog/actions-stackadapt/index.md b/src/connections/destinations/catalog/actions-stackadapt/index.md index 9968ef79df..86b3eabdf7 100644 --- a/src/connections/destinations/catalog/actions-stackadapt/index.md +++ b/src/connections/destinations/catalog/actions-stackadapt/index.md @@ -139,6 +139,31 @@ analytics.track('Order Completed', { If you are using URL rules, these will be matched whenever Segment sends an event to StackAdapt with a `url` matching the URL rule. This should be accomplished by the page event Segment automatically fires when a page is viewed, so setup of URL rules should be identical to setting up URL rules with the StackAdapt pixel. +### Conversion Tracking with Backend Events + +When you send events to Segment from your backend which are forwarded to StackAdapt using Segment's backend SDKs, the user agent and IP address of the user who originated the event must be included in the event context in order for conversions to be tracked. This is because StackAdapt uses the user agent and IP address to attribute the conversion to the correct event to a user who has interacted with your ads. Examples of how to do this can be found the documentation for Segment's SDKs. For example, for the [Python SDK](/docs/connections/sources/catalog/libraries/server/python/#override-context-value) this can be done as follows: + +```python +analytics.track('user_id', 'Order Completed', context={ + 'ip': '203.0.113.1', + 'userAgent': 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Build/KLP) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30' +}) +``` + +This is necessary when using backend SDKs but not for events sent from the frontend with `analytics.js`, because `analytics.js` automatically includes the user-agent and IP address in the event context. + +### Conversion Tracking with Reverse ETL + +When sending past events to StackAdapt using a Reverse ETL tool, the user agent, IP address, event type, and either the page URL (for conversion trackers with URL rules), or the field(s) the event rules match on, must be included in your mappings. For example, the below mapping for a Snowflake source can be used to match a conversion tracker with an event rule that matches an `action` of `User Registered`: + +![Image showing Snowflake mapping to forward User Registered events](images/snowflake-mappings.png) + +Rows forwarded to StackAdapt with this mapping will be matched by the `User Registered` event rule shown below: + +![Image showing event rule in StackAdapt the matches a User Registered event](images/user-registered-event-rule.png) + +When forwarding past events using Reverse ETL, keep in mind that only users who have interacted with an ad from an associated campaign within the conversion tracker's configured view-through expiry window (for impressions) or click-through expiry window (for clicks) will count as conversions. These windows can be set to up to 180 days in the conversion tracker configuration. + {% include components/actions-fields.html %} ## Data and privacy From 108a3c4191c87ff65af6a485f22b4f69668e919f Mon Sep 17 00:00:00 2001 From: Thomas Gilbert Date: Mon, 6 May 2024 10:19:47 -0400 Subject: [PATCH 32/47] remove callout for old destination --- .../destinations/catalog/actions-kameleoon/index.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/connections/destinations/catalog/actions-kameleoon/index.md b/src/connections/destinations/catalog/actions-kameleoon/index.md index 983f14d058..3b07f639d2 100644 --- a/src/connections/destinations/catalog/actions-kameleoon/index.md +++ b/src/connections/destinations/catalog/actions-kameleoon/index.md @@ -10,10 +10,6 @@ id: 652ea51a327a62b351aa12c0 This destination is maintained by Kameleoon. For any issues with the destination, [contact the Kameleoon Support team](mailto:support@kameleoon.com). -> success "" -> This page is about the [Actions-framework](/docs/connections/destinations/actions/) Kameleoon Segment destination. There's also a page about the [non-Actions Kameleoon destination](/docs/connections/destinations/catalog/kameleoon/). Both of these destinations receive data from Segment. - - ## Benefits of Kameleoon (Actions) vs Kameleoon Classic Kameleoon (Actions) provides the following benefits over the classic Kameleoon destination: From 67fa3c63d76d19bed2a3519187868662216ae731 Mon Sep 17 00:00:00 2001 From: Alice Mackel Date: Mon, 6 May 2024 11:57:59 -0400 Subject: [PATCH 33/47] Typo fix --- .../destinations/catalog/actions-stackadapt/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/connections/destinations/catalog/actions-stackadapt/index.md b/src/connections/destinations/catalog/actions-stackadapt/index.md index 86b3eabdf7..d4aaeed9f4 100644 --- a/src/connections/destinations/catalog/actions-stackadapt/index.md +++ b/src/connections/destinations/catalog/actions-stackadapt/index.md @@ -141,7 +141,7 @@ If you are using URL rules, these will be matched whenever Segment sends an even ### Conversion Tracking with Backend Events -When you send events to Segment from your backend which are forwarded to StackAdapt using Segment's backend SDKs, the user agent and IP address of the user who originated the event must be included in the event context in order for conversions to be tracked. This is because StackAdapt uses the user agent and IP address to attribute the conversion to the correct event to a user who has interacted with your ads. Examples of how to do this can be found the documentation for Segment's SDKs. For example, for the [Python SDK](/docs/connections/sources/catalog/libraries/server/python/#override-context-value) this can be done as follows: +When you send events to Segment from your backend which are forwarded to StackAdapt using Segment's backend SDKs, the user agent and IP address of the user who originated the event must be included in the event context in order for conversions to be tracked. This is because StackAdapt uses the user agent and IP address to attribute the conversion to the correct event to a user who has interacted with your ads. Examples of how to do this can be found in the documentation for Segment's SDKs. For example, for the [Python SDK](/docs/connections/sources/catalog/libraries/server/python/#override-context-value) this can be done as follows: ```python analytics.track('user_id', 'Order Completed', context={ @@ -156,7 +156,7 @@ This is necessary when using backend SDKs but not for events sent from the front When sending past events to StackAdapt using a Reverse ETL tool, the user agent, IP address, event type, and either the page URL (for conversion trackers with URL rules), or the field(s) the event rules match on, must be included in your mappings. For example, the below mapping for a Snowflake source can be used to match a conversion tracker with an event rule that matches an `action` of `User Registered`: -![Image showing Snowflake mapping to forward User Registered events](images/snowflake-mappings.png) +![Image showing Snowflake mapping to forward User Registered events](images/snowflake-mapping.png) Rows forwarded to StackAdapt with this mapping will be matched by the `User Registered` event rule shown below: From 0b4f25b0e8a7c31c5bbac525fc0c084081e24e7c Mon Sep 17 00:00:00 2001 From: Thomas Gilbert Date: Mon, 6 May 2024 12:39:37 -0400 Subject: [PATCH 34/47] remove beta callout --- src/connections/destinations/catalog/actions-listrak/index.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/connections/destinations/catalog/actions-listrak/index.md b/src/connections/destinations/catalog/actions-listrak/index.md index f917fdbc60..e6545850ba 100644 --- a/src/connections/destinations/catalog/actions-listrak/index.md +++ b/src/connections/destinations/catalog/actions-listrak/index.md @@ -5,9 +5,6 @@ id: 64b6a221baf168a989be641a {% include content/plan-grid.md name="actions" %} -> info "" -> The Listrak Destination is in beta, and Listrak is still developing the destination. To join Listrak's beta program or to give any feedback to help improve the Listrak Destination and its documentation, [let Listrak know](mailto:support@listrak.com). - [Listrak](https://www.listrak.com/?utm_source=segmentio&utm_medium=docs&utm_campaign=partners){:target="_blank”} is the retail industry’s leading customer engagement platform. Listrak delivers results for more than 1,000 retailers by providing best-in-class email, text message marketing, identity resolution marketing and push notifications through seamless cross-channel orchestration. Listrak’s data-first approach delivers 1:1 personalization at scale so you can send messages at precisely the right time across the right combination of channels and devices to maximize customer engagement, revenue, and lifetime value. Listrak maintains this destination. For any issues with the destination, [contact the Listrak Support team](mailto:support@listrak.com). From 1db95ffb320afb06ea7fc3647e2e6ffe460198b2 Mon Sep 17 00:00:00 2001 From: Alice Mackel Date: Mon, 6 May 2024 15:29:37 -0400 Subject: [PATCH 35/47] Update src/connections/destinations/catalog/actions-stackadapt/index.md Co-authored-by: Casie Oxford --- .../destinations/catalog/actions-stackadapt/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connections/destinations/catalog/actions-stackadapt/index.md b/src/connections/destinations/catalog/actions-stackadapt/index.md index d4aaeed9f4..beddbcde55 100644 --- a/src/connections/destinations/catalog/actions-stackadapt/index.md +++ b/src/connections/destinations/catalog/actions-stackadapt/index.md @@ -154,7 +154,7 @@ This is necessary when using backend SDKs but not for events sent from the front ### Conversion Tracking with Reverse ETL -When sending past events to StackAdapt using a Reverse ETL tool, the user agent, IP address, event type, and either the page URL (for conversion trackers with URL rules), or the field(s) the event rules match on, must be included in your mappings. For example, the below mapping for a Snowflake source can be used to match a conversion tracker with an event rule that matches an `action` of `User Registered`: +When sending past events to StackAdapt using a Reverse ETL tool, the user agent, IP address, event type, and either the page URL (for conversion trackers with URL rules), or the fields the event rules match on, must be included in your mappings. For example, the below mapping for a Snowflake source can be used to match a conversion tracker with an event rule that matches an `action` of `User Registered`: ![Image showing Snowflake mapping to forward User Registered events](images/snowflake-mapping.png) From e2536a8add99a4b881dcb9b455a99ee662be0a89 Mon Sep 17 00:00:00 2001 From: Alice Mackel Date: Mon, 6 May 2024 15:29:44 -0400 Subject: [PATCH 36/47] Update src/connections/destinations/catalog/actions-stackadapt/index.md Co-authored-by: Casie Oxford --- .../destinations/catalog/actions-stackadapt/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connections/destinations/catalog/actions-stackadapt/index.md b/src/connections/destinations/catalog/actions-stackadapt/index.md index beddbcde55..f126e7143d 100644 --- a/src/connections/destinations/catalog/actions-stackadapt/index.md +++ b/src/connections/destinations/catalog/actions-stackadapt/index.md @@ -162,7 +162,7 @@ Rows forwarded to StackAdapt with this mapping will be matched by the `User Regi ![Image showing event rule in StackAdapt the matches a User Registered event](images/user-registered-event-rule.png) -When forwarding past events using Reverse ETL, keep in mind that only users who have interacted with an ad from an associated campaign within the conversion tracker's configured view-through expiry window (for impressions) or click-through expiry window (for clicks) will count as conversions. These windows can be set to up to 180 days in the conversion tracker configuration. +When forwarding past events using Reverse ETL, only users who have interacted with an ad from an associated campaign within the conversion tracker's configured view-through expiry window (for impressions) or click-through expiry window (for clicks) will count as conversions. These windows can be set to up to 180 days in the conversion tracker configuration. {% include components/actions-fields.html %} From a5eeb5f890c62e400e1c389e2f5f1ed69943769f Mon Sep 17 00:00:00 2001 From: Alice Mackel Date: Mon, 6 May 2024 15:31:03 -0400 Subject: [PATCH 37/47] Apply suggestions --- .../destinations/catalog/actions-stackadapt/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connections/destinations/catalog/actions-stackadapt/index.md b/src/connections/destinations/catalog/actions-stackadapt/index.md index f126e7143d..eb48762d0a 100644 --- a/src/connections/destinations/catalog/actions-stackadapt/index.md +++ b/src/connections/destinations/catalog/actions-stackadapt/index.md @@ -141,7 +141,7 @@ If you are using URL rules, these will be matched whenever Segment sends an even ### Conversion Tracking with Backend Events -When you send events to Segment from your backend which are forwarded to StackAdapt using Segment's backend SDKs, the user agent and IP address of the user who originated the event must be included in the event context in order for conversions to be tracked. This is because StackAdapt uses the user agent and IP address to attribute the conversion to the correct event to a user who has interacted with your ads. Examples of how to do this can be found in the documentation for Segment's SDKs. For example, for the [Python SDK](/docs/connections/sources/catalog/libraries/server/python/#override-context-value) this can be done as follows: +When you send events to Segment from your backend, which are forwarded to StackAdapt using Segment's backend SDKs, the user agent and IP address of the user who originated the event must be included in the event context for conversions to be tracked. StackAdapt uses the user agent and IP address to attribute the conversion to the correct event to a user who has interacted with your ads. Examples of how to do this can be found in the documentation for Segment's SDKs. For example, for the [Python SDK](/docs/connections/sources/catalog/libraries/server/python/#override-context-value) this can be done as follows: ```python analytics.track('user_id', 'Order Completed', context={ From 5f6370e0b97f3f0fba0cb959e47de7e6d80f68b0 Mon Sep 17 00:00:00 2001 From: Megan <8683055+megancooper@users.noreply.github.com> Date: Mon, 6 May 2024 20:39:13 -0700 Subject: [PATCH 38/47] Update src/connections/destinations/catalog/events-win/index.md Co-authored-by: forstisabella <92472883+forstisabella@users.noreply.github.com> --- .../destinations/catalog/events-win/index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/connections/destinations/catalog/events-win/index.md b/src/connections/destinations/catalog/events-win/index.md index 2ae07f6168..561524174b 100644 --- a/src/connections/destinations/catalog/events-win/index.md +++ b/src/connections/destinations/catalog/events-win/index.md @@ -10,12 +10,12 @@ This destination is maintained by events.win. For any issues with the destinatio ## Getting started -1. From your workspace's [Destination catalog page](https://app.segment.com/goto-my-workspace/destinations/catalog){:target="\_blank”} search for "events.win" -2. Select events.win and click **Add Destination** -3. Select an existing Source to connect to events.win (Actions). +1. From your workspace's [Destination catalog page](https://app.segment.com/goto-my-workspace/destinations/catalog){:target="\_blank”} search for "events.win". +2. Select events.win and click **Add Destination**. +3. Select an existing Source to connect to events.win. 4. Go to the [events.win dashboard](https://app.events.win/developers){:target="\_blank"}, find and copy the **Developer key**. -5. Enter the **Developer Key** in the events.win destination settings in Segment. -6. That's it! events.win will start to receive data from Segment, there may be a delay before data is visible in the events.win dashboard. +5. Return to Segment and enter the **Developer Key** in the events.win destination settings. +6. events.win starts to receive data from Segment. There may be a delay before data is visible in the events.win dashboard. ## Supported methods From 6ecf033d2ee6ebfc200b197f81045605cf3c27fd Mon Sep 17 00:00:00 2001 From: Megan <8683055+megancooper@users.noreply.github.com> Date: Mon, 6 May 2024 20:39:53 -0700 Subject: [PATCH 39/47] Update src/connections/destinations/catalog/events-win/index.md Co-authored-by: forstisabella <92472883+forstisabella@users.noreply.github.com> --- src/connections/destinations/catalog/events-win/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connections/destinations/catalog/events-win/index.md b/src/connections/destinations/catalog/events-win/index.md index 561524174b..b44d279ccb 100644 --- a/src/connections/destinations/catalog/events-win/index.md +++ b/src/connections/destinations/catalog/events-win/index.md @@ -23,7 +23,7 @@ events.win supports the following methods, as specified in the [Segment Spec](/d ### Track -[Track](/docs/connections/spec/track) calls are consumed and validated against the tracking plan you've defined in events.win. We don't store the data, but we do provide a detailed report on how correct your data is. +events.win consumes and validates [Track](/docs/connections/spec/track) calls against the tracking plan you've previously defined in events.win. events.win doesn't store the data, but instead provides a detailed report on how correct your data is. You can use the [@events.win/cli](https://www.npmjs.com/package/@events.win/cli) to generate type-safe tracking code for your events. From 0c9846d16caaf4feb81f57c2dff5205a7f0c0f27 Mon Sep 17 00:00:00 2001 From: Megan <8683055+megancooper@users.noreply.github.com> Date: Mon, 6 May 2024 20:40:02 -0700 Subject: [PATCH 40/47] Update src/connections/destinations/catalog/events-win/index.md Co-authored-by: forstisabella <92472883+forstisabella@users.noreply.github.com> --- src/connections/destinations/catalog/events-win/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connections/destinations/catalog/events-win/index.md b/src/connections/destinations/catalog/events-win/index.md index b44d279ccb..6c9574a661 100644 --- a/src/connections/destinations/catalog/events-win/index.md +++ b/src/connections/destinations/catalog/events-win/index.md @@ -25,7 +25,7 @@ events.win supports the following methods, as specified in the [Segment Spec](/d events.win consumes and validates [Track](/docs/connections/spec/track) calls against the tracking plan you've previously defined in events.win. events.win doesn't store the data, but instead provides a detailed report on how correct your data is. -You can use the [@events.win/cli](https://www.npmjs.com/package/@events.win/cli) to generate type-safe tracking code for your events. +You can use the [@events.win/cli](https://www.npmjs.com/package/@events.win/cli){:target="\_blank”} to generate type-safe tracking code for your events. ```js /** From 3fa957f67937c39939a2a68d4c59e235c64852b7 Mon Sep 17 00:00:00 2001 From: Megan <8683055+megancooper@users.noreply.github.com> Date: Mon, 6 May 2024 20:40:09 -0700 Subject: [PATCH 41/47] Update src/connections/destinations/catalog/events-win/index.md Co-authored-by: forstisabella <92472883+forstisabella@users.noreply.github.com> --- src/connections/destinations/catalog/events-win/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connections/destinations/catalog/events-win/index.md b/src/connections/destinations/catalog/events-win/index.md index 6c9574a661..f62b1a5aa3 100644 --- a/src/connections/destinations/catalog/events-win/index.md +++ b/src/connections/destinations/catalog/events-win/index.md @@ -19,7 +19,7 @@ This destination is maintained by events.win. For any issues with the destinatio ## Supported methods -events.win supports the following methods, as specified in the [Segment Spec](/docs/connections/spec). +events.win supports Segment's [Track](/docs/connections/spec/track) method, as specified in the [Segment Spec](/docs/connections/spec). ### Track From 6963ea5e2df970eb74992fe0178ff9d1046aa436 Mon Sep 17 00:00:00 2001 From: Charity Holt <38872070+charholt@users.noreply.github.com> Date: Tue, 7 May 2024 10:41:36 -0400 Subject: [PATCH 42/47] Update index.md --- src/connections/reverse-etl/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/src/connections/reverse-etl/index.md b/src/connections/reverse-etl/index.md index e21d4921b3..1afbb5fa81 100644 --- a/src/connections/reverse-etl/index.md +++ b/src/connections/reverse-etl/index.md @@ -64,6 +64,7 @@ To add your first model: 4. Choose a column to use as the unique identifier for each record in the **Unique Identifier column** field. * The Unique Identifier should be a column with unique values per record to ensure checkpointing works as expected. It can potentially be a primary key. This column is used to detect new, updated, and deleted records. 5. Click **Preview** to see a preview of the results of your SQL query. The data from the preview is extracted from the first 10 records of your warehouse. + * In the UI, preview queries and result sets are cached. The preview cache is stored at the source level. This means that if two queries are made for the same source, the preview results will be identical. However, during the next synchronization, the latest data will be sent to the connected destinations. 6. Click **Next**. 7. Enter your **Model Name**. 8. Click **Create Model**. From 2b605842790a88cc2e7dbe81c5ddcdbaa431af96 Mon Sep 17 00:00:00 2001 From: Thomas Gilbert Date: Tue, 7 May 2024 11:56:02 -0400 Subject: [PATCH 43/47] add chart mogul docs --- .../catalog/actions-chartmogul/index.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/connections/destinations/catalog/actions-chartmogul/index.md diff --git a/src/connections/destinations/catalog/actions-chartmogul/index.md b/src/connections/destinations/catalog/actions-chartmogul/index.md new file mode 100644 index 0000000000..431c561c87 --- /dev/null +++ b/src/connections/destinations/catalog/actions-chartmogul/index.md @@ -0,0 +1,38 @@ +--- +title: ChartMogul (Actions) Destination +id: 65f9888628c310646331738a +beta: true +hidden: true +private: true +--- + + +{% include content/plan-grid.md name="actions" %} + +[ChartMogul](https://chartmogul.com/?utm_source=segmentio&utm_medium=docs&utm_campaign=partners){:target="_blank"} is a subscription analytics platform and CRM used by thousands of businesses to measure, understand, and grow their recurring revenue businesses. + +This destination is maintained by ChartMogul. For any issues with the destination, [contact their Support team](https://help.chartmogul.com/hc/en-us/requests/new){:target="_blank"}. + +## Getting started + +1. From your workspace's [Destination catalog page](https://app.segment.com/goto-my-workspace/destinations/catalog){:target="_blank"} search for "ChartMogul". +2. Select ChartMogul and click **Add Destination**. +3. Select an existing Source to connect to ChartMogul (Actions). +4. [Create a source](https://app.chartmogul.com/#/data-platform/sources/add-source){:target="_blank"} in ChartMogul. +5. Make sure the **Account / Contact / Enrichment data** tab is selected and click **Twilio Segment**. +6. Enter the **Name** for your source. +7. Under **Create a company in ChartMogul when** select: + - **the email or UserID is created** — if you recognize any individual who interacts with your organization as a lead and want to create a [customer record](https://help.chartmogul.com/hc/en-us/articles/214085765){:target="_blank"} for them + - **user is added to a company** — if you recognize an individual who interacts with your organization as a lead only if they're part of an organization +8. Copy the **Webhook URL**. +9. Click **SAVE AND CONTINUE CONFIGURATION IN SEGMENT**. +10. Paste the **Webhook URL** in the ChartMogul destination settings in Segment. + +{% include components/actions-fields.html %} + +## Supported event calls +ChartMogul (Actions) accepts two types of event calls: +- [Track](https://segment.com/docs/connections/spec/track/){:target="_blank"} — used for contact details and custom attributes +- [Group](https://segment.com/docs/connections/spec/group/){:target="_blank"} — used for customer details and custom attributes + +ChartMogul uses attributes from these calls to create new or update existing [custom attributes](https://help.chartmogul.com/hc/en-us/articles/206120219){:target="_blank"} for contacts or customers, or to update customers' select [standard attributes](https://help.chartmogul.com/hc/en-us/articles/5321255006364#standard-attributes){:target="_blank"}. \ No newline at end of file From d605a10ee1148099145c267b15465b3aa9703b0e Mon Sep 17 00:00:00 2001 From: forstisabella <92472883+forstisabella@users.noreply.github.com> Date: Tue, 7 May 2024 12:35:05 -0400 Subject: [PATCH 44/47] Update src/connections/reverse-etl/index.md --- src/connections/reverse-etl/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connections/reverse-etl/index.md b/src/connections/reverse-etl/index.md index 1afbb5fa81..0ba7ee8cbf 100644 --- a/src/connections/reverse-etl/index.md +++ b/src/connections/reverse-etl/index.md @@ -64,7 +64,7 @@ To add your first model: 4. Choose a column to use as the unique identifier for each record in the **Unique Identifier column** field. * The Unique Identifier should be a column with unique values per record to ensure checkpointing works as expected. It can potentially be a primary key. This column is used to detect new, updated, and deleted records. 5. Click **Preview** to see a preview of the results of your SQL query. The data from the preview is extracted from the first 10 records of your warehouse. - * In the UI, preview queries and result sets are cached. The preview cache is stored at the source level. This means that if two queries are made for the same source, the preview results will be identical. However, during the next synchronization, the latest data will be sent to the connected destinations. + * Segment caches preview queries and result sets in the UI, and stores the preview cache at the source level. If you make two queries for the same source, Segment returns identical preview results. However, during the next synchronization, the latest data will be sent to the connected destinations. 6. Click **Next**. 7. Enter your **Model Name**. 8. Click **Create Model**. From 5dc505d6a413594acc9d6fa6840693fa6d3eb4ad Mon Sep 17 00:00:00 2001 From: pwseg <86626706+pwseg@users.noreply.github.com> Date: Tue, 7 May 2024 12:47:20 -0500 Subject: [PATCH 45/47] External links and cleanup --- src/unify/profile-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unify/profile-api.md b/src/unify/profile-api.md index 189a3b35b2..76a89ac362 100644 --- a/src/unify/profile-api.md +++ b/src/unify/profile-api.md @@ -59,7 +59,7 @@ Your access token enables you to call the Profile API and access customer data. > To query phone numbers that contain a plus sign (`+`), insert the escape characters `%2B` in place of the plus sign. > For example, if a `phone_number` identifier has the value `+5555550123`, enter `phone_number:%2B5555550123` in your query. > -> If the field being used within the Profile API endpoint contains a value with a non-alphanumeric character, then the Profile API may respond with 500 error. In this case, please reference [this W3 doc](https://www.w3schools.com/tags/ref_urlencode.ASP#:~:text=ASCII%20Encoding%20Reference,%25C3%25BF), which lists the escape characters to replace the non-alphanumeric character in the Profile API endpoint with, so that the Profile API will respond with a 200 Success. +> If the field you're using within the Profile API endpoint contains a value with a non-alphanumeric character, then the Profile API may respond with `500` error. In this case, see [W3's ASCII Encoding Refernece](https://www.w3schools.com/tags/ref_urlencode.ASP#:~:text=ASCII%20Encoding%20Reference,%25C3%25BF){:target="_blank"}, which lists the escape characters you can use to replace the non-alphanumeric character in the Profile API endpoint so that the Profile API will respond with a `200 Success`. ### Query the user's event traits From 69e9f7834474e1c8c8cc672eec4aeb86e2a0351b Mon Sep 17 00:00:00 2001 From: pwseg <86626706+pwseg@users.noreply.github.com> Date: Tue, 7 May 2024 12:54:23 -0500 Subject: [PATCH 46/47] cleanup --- src/connections/destinations/actions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/connections/destinations/actions.md b/src/connections/destinations/actions.md index 710d9fa129..c69e28256c 100644 --- a/src/connections/destinations/actions.md +++ b/src/connections/destinations/actions.md @@ -181,7 +181,7 @@ If necessary, click **New Mapping** to create a new, blank action. 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. 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 will send the entire object from the event; whereas, the “Edit Object” option allows you to map each individual property. You can change your mapping as needed and re-test. + 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. 7. In the Mappings table **Status** column, verify that the **Enabled** toggle is on for the mapping you just customized. From de492a3fbaca8871b54f57f8ddb42a5ba7164438 Mon Sep 17 00:00:00 2001 From: forstisabella <92472883+forstisabella@users.noreply.github.com> Date: Tue, 7 May 2024 13:59:48 -0400 Subject: [PATCH 47/47] catalog --- src/_data/catalog/destination_categories.yml | 2 +- src/_data/catalog/destinations.yml | 76 ++++++++++++++++++-- src/_data/catalog/destinations_private.yml | 2 +- src/_data/catalog/source_categories.yml | 2 +- src/_data/catalog/sources.yml | 16 +++-- 5 files changed, 84 insertions(+), 14 deletions(-) diff --git a/src/_data/catalog/destination_categories.yml b/src/_data/catalog/destination_categories.yml index deb35ba36d..c0ad2112f7 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 2024-05-02 +# destination categories last updated 2024-05-07 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 8948068409..b58521c446 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 2024-05-02 +# destination data last updated 2024-05-07 items: - id: 637e8d185e2dec264895ea89 display_name: 1Flow @@ -3280,6 +3280,18 @@ items: This is currently in Beta Testing and not generally available. required: false label: 'Merchandising Events ' + - name: oAuthClientId + type: string + defaultValue: '' + description: Client ID for your OAuth Server-to-Server Credential + required: false + label: OAuth Client ID + - name: oAuthClientSecret + type: password + defaultValue: '' + description: Client Secret for your OAuth Server-to-Server Credential + required: false + label: OAuth Client Secret - name: pageNameFallbackToScreen type: boolean defaultValue: false @@ -27371,6 +27383,64 @@ items: actions: [] presets: [] partnerOwned: false +- id: 662d3328d029f89724a0c294 + display_name: events.win + name: events.win + slug: events-win + hidden: false + endpoints: + - US + regions: + - us-west-2 + - eu-west-1 + url: connections/destinations/catalog/events-win + previous_names: + - events.win + website: http://www.events.win + status: PUBLIC_BETA + categories: + - Analytics + - Customer Success + logo: + url: https://cdn-devcenter.segment.com/79396f25-00b5-4364-8f84-3461e63880ca.svg + mark: + url: https://cdn-devcenter.segment.com/c2a3d938-1db7-4b72-a9d0-8af638830182.svg + methods: + track: false + identify: false + group: false + alias: false + screen: false + page: false + platforms: + browser: true + mobile: true + server: true + warehouse: false + cloudAppObject: false + components: [] + browserUnbundlingSupported: false + browserUnbundlingPublic: false + replay: false + connection_modes: + device: + web: false + mobile: false + server: false + cloud: + web: true + mobile: true + server: true + settings: + - name: apiKey + type: string + defaultValue: '' + description: Your events.win developer key + required: true + label: Developer Key + actions: [] + presets: [] + partnerOwned: true - id: 5fdce712dc1fbc625ebd13b8 display_name: Everflow name: Everflow @@ -62021,7 +62091,7 @@ items: previous_names: - Listrak (Actions) website: https://www.listrak.com/ - status: PUBLIC_BETA + status: PUBLIC categories: - Marketing Automation - Email Marketing @@ -81825,8 +81895,6 @@ items: categories: - CRM - Analytics - - Marketing Automation - - Personalization logo: url: https://cdn.filepicker.io/api/file/Gs7h3XjXTAW94s1zQbNJ mark: diff --git a/src/_data/catalog/destinations_private.yml b/src/_data/catalog/destinations_private.yml index 017bc54731..0787c2ecd6 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 2024-05-02 +# destination data last updated 2024-05-07 items: - id: 54521fd925e721e32a72eee1 display_name: Pardot diff --git a/src/_data/catalog/source_categories.yml b/src/_data/catalog/source_categories.yml index cb9ab1215c..08ff330884 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 2024-05-02 +# source categories last updated 2024-05-07 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 7b3694628c..9236de8c0c 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 2024-05-02 +# sources last updated 2024-05-07 items: - id: 8HWbgPTt3k display_name: .NET @@ -1776,14 +1776,16 @@ items: description: >- When you enter your Salesforce credentials and hit save, we will sync Salesforce standard objects (and their corresponding properties) to any - databases you have turned on. + databases you have turned on. Salesforce data will reflect the state of + the object at the time of the sync. We will run an update every ~3 hours. + | Sync Salesforce standard objects and their corresponding properties to + any of your databases every ~ 3 hours. + Salesforce data reflects the state of the obiect at the time of the svnc. - Salesforce data will reflect the state of the object at the time of the - sync. - - - We will run an update every ~3 hours. + To create and update Profiles with Salesforce data, use the Segment + Profiles destination. This destination lets you send your Salesforce data + to Segment as Identify calls. logo: url: https://d3hotuclm6if1r.cloudfront.net/logos/salesforce-default.svg categories: