diff --git a/Makefile b/Makefile index 6730f4a185..9adb72e5d0 100755 --- a/Makefile +++ b/Makefile @@ -62,12 +62,12 @@ catalog: catalog-papi # uses the old configapi .PHONY: capi capi: vendor/bundle - @node scripts/catalog-capi.js + @node scripts/catalog_capi.js # shorter alias .PHONY: catalog-capi catalog-capi: vendor/bundle - @node scripts/catalog-capi.js + @node scripts/catalog_capi.js # uses the new public api .PHONY: catalog-papi diff --git a/scripts/catalog_capi.js b/scripts/catalog_capi.js index 0ccc435762..409af863e3 100644 --- a/scripts/catalog_capi.js +++ b/scripts/catalog_capi.js @@ -303,14 +303,14 @@ const updateSources = async () => { var todayDate = new Date().toISOString().slice(0,10); output = "# AUTOGENERATED FROM PLATFORM API. DO NOT EDIT\n" output += "# sources last updated " + todayDate + " \n"; - output += yaml.safeDump({ items: sourcesUpdated }, options); + output += yaml.dump({ items: sourcesUpdated }, options); fs.writeFileSync(path.resolve(__dirname, `../src/_data/catalog/sources_capi.yml`), output); // Create source-category mapping yaml file var todayDate = new Date().toISOString().slice(0,10); output = "# AUTOGENERATED FROM PLATFORM API. DO NOT EDIT\n" output += "# source cateogries last updated " + todayDate + " \n"; - output += yaml.safeDump({ items: sourceCategories }, options); + output += yaml.dump({ items: sourceCategories }, options); fs.writeFileSync(path.resolve(__dirname, `../src/_data/catalog/source_categories_capi.yml`), output); } @@ -413,14 +413,14 @@ const updateDestinations = async () => { output = "# AUTOGENERATED FROM PLATFORM API. DO NOT EDIT\n" var todayDate = new Date().toISOString().slice(0,10); output += "# destination data last updated " + todayDate + " \n"; - output += yaml.safeDump({ items: destinationsUpdated }, options); + output += yaml.dump({ items: destinationsUpdated }, options); fs.writeFileSync(path.resolve(__dirname, `../src/_data/catalog/destinations_capi.yml`), output); // Create destination-category mapping yaml file output = "# AUTOGENERATED FROM PLATFORM API. DO NOT EDIT\n" var todayDate = new Date().toISOString().slice(0,10); output += "# destination categories last updated " + todayDate + " \n"; - output += yaml.safeDump({ items: destinationCategories }, options); + output += yaml.dump({ items: destinationCategories }, options); fs.writeFileSync(path.resolve(__dirname, `../src/_data/catalog/destination_categories_capi.yml`), output); } diff --git a/src/_data/catalog/destination_categories.yml b/src/_data/catalog/destination_categories.yml index b46a63b9d2..8c44ee5a7a 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 2022-05-05 +# destination categories last updated 2022-05-10 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 e14f7e50ea..709d4c1066 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 2022-05-05 +# destination data last updated 2022-05-10 items: - id: 60b5d0a01f3726b85dc05aab display_name: 2mee @@ -8959,7 +8959,7 @@ items: display_name: Close name: Close slug: close - hidden: false + hidden: true endpoints: - us regions: @@ -36298,6 +36298,344 @@ items: label: Custom Attributes actions: [] presets: [] +- id: 6234b137d3b6404a64f2a0f0 + display_name: Talon.One (Actions) + name: Talon.One (Actions) + slug: talon-one-actions + hidden: false + endpoints: + - us + regions: + - us + url: connections/destinations/catalog/talon-one-actions + previous_names: + - Talon.One (Actions) + website: https://www.talon.one + status: PUBLIC + categories: + - Referrals + - Marketing Automation + logo: + url: https://cdn.filepicker.io/api/file/OMYZDmwFSKuZXHlk7a23 + mark: + url: https://cdn.filepicker.io/api/file/Zn3B3ulpQA6cPUcJIPFz + methods: + track: true + identify: true + group: true + alias: true + page: true + platforms: + browser: true + mobile: false + server: true + components: [] + browserUnbundlingSupported: false + browserUnbundlingPublic: false + replay: false + connection_modes: + device: + web: false + mobile: false + server: false + cloud: + web: false + mobile: false + server: false + settings: + - name: apiKey + type: string + defaultValue: '' + description: Created under Developer Settings in the Talon.One Campaign Manager. + required: true + label: API Key + - name: deployment + type: string + defaultValue: '' + description: The base URL of your Talon.One deployment. + required: true + label: Deployment + actions: + - id: 9f9ULnyoFhzXZAo2FNYNpG + name: Create Audience + slug: createAudience + description: This creates a new audience entity in Talon.One. + platform: CLOUD + hidden: false + defaultTrigger: null + fields: + - id: 8Lxfo7v7j5Jt6wyNQfceFz + sortOrder: 0 + fieldKey: audienceId + label: Segment Audience ID + type: STRING + description: You should get this audience ID from Segment. + placeholder: '' + required: true + multiple: false + choices: null + dynamic: false + allowNull: false + - id: svBCPU73bV9TXxW3uEBNTc + sortOrder: 1 + fieldKey: audienceName + label: Audience Name + type: STRING + description: You should get this audience name from Segment. + placeholder: '' + required: true + multiple: false + choices: null + dynamic: false + allowNull: false + - id: aBasBxDewdhgRjDGvNbEwL + name: Track Event + slug: trackEvent + description: This records a custom event in Talon.One. + platform: CLOUD + hidden: false + defaultTrigger: null + fields: + - id: dwdjxXNWuCMHMU8B4HkgHE + sortOrder: 0 + fieldKey: customerProfileId + label: Customer Profile ID + type: STRING + description: >- + The customer profile integration ID to use in Talon.One. It is the + identifier of the customer profile associated to the event. + placeholder: '' + required: true + multiple: false + choices: null + dynamic: false + allowNull: false + - id: 52joeMeY5NjSU2eeFS2kMM + sortOrder: 1 + fieldKey: eventType + label: Event Type + type: STRING + description: The name of the event sent to Talon.One. + placeholder: '' + required: true + multiple: false + choices: null + dynamic: false + allowNull: false + - id: 543rz6PSfGojSdJ8cKuE2q + sortOrder: 2 + fieldKey: type + label: Type + type: STRING + description: >- + Type of event. Can be only `string`, `time`, `number`, `boolean`, + `location` + placeholder: '' + required: true + multiple: false + choices: null + dynamic: false + allowNull: false + - id: 6xFC517LLAP8cv4WaC8WsC + sortOrder: 3 + fieldKey: attributes + label: Attribute-Value pairs + type: OBJECT + description: >- + Extra attributes associated with the event. [See more + info](https://docs.talon.one/docs/product/account/dev-tools/managing-attributes). + placeholder: '' + required: false + multiple: false + choices: null + dynamic: false + allowNull: false + - id: dFGebKtTfihwGAT1kAoayw + name: Update Customer Profile + slug: updateCustomerProfile + description: This updates attributes and audiences for a single customer profile. + platform: CLOUD + hidden: false + defaultTrigger: null + fields: + - id: kxshLAjCK49f8tNvE8uMEW + sortOrder: 0 + fieldKey: attributes + label: Attribute-Value pairs + type: OBJECT + description: >- + Extra attributes associated with the customer profile. [See more + info](https://docs.talon.one/docs/product/account/dev-tools/managing-attributes). + placeholder: '' + required: false + multiple: false + choices: null + dynamic: false + allowNull: false + - id: 4gppCr4SL47jjrNrZvtfut + sortOrder: 1 + fieldKey: customerProfileId + label: Customer Profile ID + type: STRING + description: The customer profile integration identifier to use in Talon.One. + placeholder: '' + required: true + multiple: false + choices: null + dynamic: false + allowNull: false + - id: s1SmRis6iM9rbMym5z8rQE + sortOrder: 2 + fieldKey: deleteAudienceIds + label: List of audience ID to dissociate with the customer profile. + type: INTEGER + description: You should get this audience ID from Talon.One. + placeholder: '' + required: false + multiple: true + choices: null + dynamic: false + allowNull: false + - id: rsW1ZyxG8iMLjVLHWsie95 + sortOrder: 3 + fieldKey: addAudienceIds + label: List of audience ID to associate with the customer profile. + type: INTEGER + description: You should get this audience ID from Talon.One. + placeholder: '' + required: false + multiple: true + choices: null + dynamic: false + allowNull: false + - id: 5KcdNUoUmwru1i2nNCvRNF + sortOrder: 4 + fieldKey: runRuleEngine + label: Run rule engine + type: BOOLEAN + description: >- + This runs rule engine in Talon.One upon updating customer profile. Set + to true to trigger rules. + placeholder: '' + defaultValue: false + required: false + multiple: false + choices: null + dynamic: false + allowNull: false + - id: hjRssUycBvLhi7QPFAvXPS + name: Delete Audience + slug: deleteAudience + description: This deletes the audience entity in Talon.One. + platform: CLOUD + hidden: false + defaultTrigger: null + fields: + - id: 6CCgZAQxFAt4EsQreGEGR3 + sortOrder: 0 + fieldKey: audienceId + label: Segment Audience ID + type: STRING + description: You should get this audience ID from Segment. + placeholder: '' + required: true + multiple: false + choices: null + dynamic: false + allowNull: false + - id: mPHq5mH39pF1c31EXDXPbQ + name: Update Multiple Customer Profiles’ Attributes + slug: updateCustomerProfilesAttributes + description: This updates attributes for multiple customer profiles. + platform: CLOUD + hidden: false + defaultTrigger: null + fields: + - id: aW3WteXm5Gm9qUQU9zWsaB + sortOrder: 0 + fieldKey: data + label: Data item to change customer profile attributes + type: OBJECT + description: >- + An array of JSON objects that contains customer profile identifier and + list of attributes and their values. Customer profile ID is required. + placeholder: '' + required: true + multiple: true + choices: null + dynamic: false + allowNull: false + - id: bLv1mPckb1Kv7ZxBcrgc3j + sortOrder: 1 + fieldKey: mutualAttributes + label: Mutual Attribute-Value pairs + type: OBJECT + description: >- + This may contain mutual list of attributes and their values for every + customer profile in the "data" array. + placeholder: '' + required: false + multiple: false + choices: null + dynamic: false + allowNull: false + - id: uZ8mzsLo5KFgwoSQsDXnKK + name: Update Audience Name + slug: updateAudience + description: This updates the audience name if there is an existing audience entity. + platform: CLOUD + hidden: false + defaultTrigger: null + fields: + - id: pfd6DgoLp651CGHmmejYgt + sortOrder: 0 + fieldKey: audienceId + label: Segment Audience ID + type: STRING + description: You should get this audience ID from Segment. + placeholder: '' + required: true + multiple: false + choices: null + dynamic: false + allowNull: false + - id: uuKebzpCX7fa8kFgBi5Hrs + sortOrder: 1 + fieldKey: audienceName + label: Audience Name + type: STRING + description: You should get this audience name from Segment. + placeholder: '' + required: true + multiple: false + choices: null + dynamic: false + allowNull: false + - id: x1VDfGjR5NPmPkhCF5a8WN + name: Update Multiple Customer Profiles’ Audiences + slug: updateCustomerProfilesAudiences + description: This updates audiences for multiple customer profiles. + platform: CLOUD + hidden: false + defaultTrigger: null + fields: + - id: oy5RJd9pkfAbhrB1y7ZiwF + sortOrder: 0 + fieldKey: data + label: Data item to change customer profile audiences + type: OBJECT + description: >- + An array of JSON objects that contains customer profile identifier and + list of audiences to associate and dissociate with the indicated + customer profile. Customer profile ID and at least one audience ID are + required. + placeholder: '' + required: true + multiple: true + choices: null + dynamic: false + allowNull: false + presets: [] - id: 5c8ad1622b2a130001a7664a display_name: Tamber name: Tamber @@ -36586,7 +36924,7 @@ items: previous_names: - Tiktok Conversions - TikTok Conversions - website: https://ads.tiktok.com/help/article?aid=10003669 + website: https://ads.tiktok.com/marketing_api/docs?id=1701890979375106 status: PUBLIC categories: - Advertising diff --git a/src/_data/catalog/regional-supported.yml b/src/_data/catalog/regional-supported.yml index 64d66aae3d..d0e61d5312 100644 --- a/src/_data/catalog/regional-supported.yml +++ b/src/_data/catalog/regional-supported.yml @@ -1,5 +1,5 @@ # AUTOGENERATED LIST OF CONNECTIONS THAT SUPPORT REGIONAL -# Last updated 2022-05-05 +# Last updated 2022-05-10 warehouses: - id: WcjBCzUGff display_name: Azure SQL Data Warehouse @@ -3441,6 +3441,14 @@ destinations: - us endpoints: - us + - id: 6234b137d3b6404a64f2a0f0 + display_name: Talon.One (Actions) + slug: talon-one-actions + url: connections/destinations/catalog/talon-one-actions + regions: + - us + endpoints: + - us - id: 5c8ad1622b2a130001a7664a display_name: Tamber slug: tamber diff --git a/src/_data/catalog/source_categories.yml b/src/_data/catalog/source_categories.yml index dd1489ee6c..4714a626ad 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 cateogries last updated 2022-05-05 +# source cateogries last updated 2022-05-10 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 1c50a64d90..d7578bdc7b 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 2022-05-05 +# sources last updated 2022-05-10 items: - id: 8HWbgPTt3k display_name: .NET diff --git a/src/_data/sidenav/main.yml b/src/_data/sidenav/main.yml index 45fb79e3fe..2384dcb427 100644 --- a/src/_data/sidenav/main.yml +++ b/src/_data/sidenav/main.yml @@ -175,6 +175,8 @@ sections: title: Functions Environment - path: /connections/functions/usage title: Functions Usage Limits + - path: /connections/functions/aws-apis + title: Functions for AWS APIs - section_title: Storage Destinations slug: connections/storage section: @@ -327,7 +329,7 @@ sections: - path: /privacy/user-deletion-and-suppression title: User Deletion and Suppression - path: /privacy/account-deletion - title: Account & Data Deletion + title: Account & Data Deletion - path: /privacy/faq title: Privacy FAQs - section_title: Protocols diff --git a/src/_includes/content/functions/runtime.md b/src/_includes/content/functions/runtime.md index 517477c02b..b69325fe01 100644 --- a/src/_includes/content/functions/runtime.md +++ b/src/_includes/content/functions/runtime.md @@ -31,7 +31,9 @@ The following dependencies are installed in the function environment by default. Only the [`crypto` Node.js module](https://nodejs.org/dist/latest-v10.x/docs/api/crypto.html ) is included (exposed as `crypto`). [Other built-in Node.js modules](https://nodejs.org/api/modules.html) are not available. -##### Caching +For more information on using the `aws-sdk` module, see how to [set up functions for calling AWS APIs](/docs/connections/functions/aws-apis/). + +### Caching Basic cache storage is available through the `cache` object, which has the following methods defined: diff --git a/src/config-api/fql.md b/src/config-api/fql.md index 96394be59c..b99e555fc7 100644 --- a/src/config-api/fql.md +++ b/src/config-api/fql.md @@ -19,8 +19,11 @@ Given the following JSON object: "context": { "library": { "name": "analytics.js", - "version": "1.0", + "version": "1.0" } + }, + "properties": { + "features": ["discounts", "dark-mode"] } } ``` @@ -38,6 +41,8 @@ The following FQL statements will evaluate as follows: | `match( context.library.version, '2.*' )` | `false` | | `type = 'track' and ( event = 'Click' or match( event, 'Button *' ) )` | `true` | | `!contains( context.library.name, 'js' )` | `false` | +| `'dark-mode' in properties.features` | `true` | +| `'blink' in properties.features` | `false` | ## Field Paths @@ -100,6 +105,7 @@ If your field name has a character not in the set of `{a-z A-Z 0-9 _ -}`, you mu | `>=` | `number` | `number` | `true` if the left side is greater than or equal to the right side. | | `<` | `number` | `number` | `true` if the left side is less than the right side. | | `<=` | `number` | `number` | `true` if the left side is less than or equal to the right side. | +| `in` | `string`, `number`, `bool`, or `null` | `list` | `true` if the left side is contained in the list of values. | ## Subexpressions @@ -109,6 +115,7 @@ You can use parentheses to group subexpressions for more complex "and / or" logi | -------------------------------------------------------------------------------------------------------------- | | `type = 'track' and ( event = 'Click' or match( 'Button *', event ) )` | | `( type = 'track' or type = 'identify' ) and ( properties.enabled or match( traits.email, '*@company.com' ) )` | +| `!( type in ['track', 'identify'] )` | ## Functions @@ -134,7 +141,7 @@ For example, you can write `length( userId ) > 0` instead of `typeof( userId ) = ### `match( string, pattern )` -The `match( string, pattern )` function uses "glob" matching to return `true` if the given string fully matches a given pattern. Glob patterns are case sensitive. If you only need to determine if a string contains a given substring, you should use `contains()`. +The `match( string, pattern )` function uses "glob" matching to return `true` if the given string fully matches a given pattern. Glob patterns are case sensitive. If you only need to determine if a string contains another string, you should use `contains()`. | Pattern | Summary | | ------- | ---------------------------------------------------------------------------------------------------------------------- | diff --git a/src/connections/destinations/catalog/actions-close/index.md b/src/connections/destinations/catalog/actions-close/index.md index b657ecc285..c1533ae22e 100644 --- a/src/connections/destinations/catalog/actions-close/index.md +++ b/src/connections/destinations/catalog/actions-close/index.md @@ -1,40 +1,8 @@ --- # The end name should be similar to `Slack Destination` title: Close (Actions) Destination -hide-boilerplate: true -hide-dossier: true -hidden: true +id: 61f8296b7d15c30a3bbe2b76 +published: false --- - - -{% include content/plan-grid.md name="actions" %} - - -[Close](https://close.com/){:target="_blank"} is the inside sales CRM of choice for startups and small and midsize businesses (SMBs.) - - - - -{% include content/ajs-upgrade.md %} - - - -## Getting started - -1. Go to your Close app and select the Organization you want to use. -2. Click **Settings** in the bottom left, then click **API Keys** in the left menu. Create a new API Key. -3. From the Segment web app, click **Catalog**, then click **Destinations**. -4. Find the Destinations Actions item in the left navigation, and click it. -5. Click the “Close” item to select it and click Configure. -6. Choose which of your sources to connect the destination to. (You can connect more sources to the destination later.) - - - -{% include components/actions-fields.html %} - - +Content moved to `/close`. \ No newline at end of file diff --git a/src/connections/destinations/catalog/actions-facebook-conversions-api/index.md b/src/connections/destinations/catalog/actions-facebook-conversions-api/index.md index 6dc367857d..f1edb3a48d 100644 --- a/src/connections/destinations/catalog/actions-facebook-conversions-api/index.md +++ b/src/connections/destinations/catalog/actions-facebook-conversions-api/index.md @@ -65,6 +65,21 @@ Set up your Pixel to work with the Facebook Conversions API (Actions) destinatio The Facebook Conversions API (Actions) destination gives you several ways to implement your conversion tracking. You can use it with [Facebook Pixel](/docs/connections/destinations/catalog/facebook-pixel/), or as a stand-alone alternative. You can read more about implementation options below and in [Facebook documentation](https://developers.facebook.com/docs/marketing-api/conversions-api/guides/end-to-end-implementation#pick-your-integration-type){:target="_blank"}. +### Action Source + +`action_source` is set to "website" as a default value. + +You can set `action_source` manually by passing it as a property of a Track event. You can use either snake case or camel case to include `action_source` as a property in Track events. + +| Action Source Values | Description | +| -------------------- | --------------------------------------------------------------------------------------------------------- | +| `chat` | Conversion was made through a messaging app, SMS, or online messaging feature. | +| `email` | Conversion happened over email. | +| `other` | Conversion happened in a way that is not listed. | +| `phone_call` | Conversion was made over the phone. | +| `physical_store` | Conversion was made in person at your physical store. | +| `system_generated` | Conversion happened automatically, for example, a subscription renewal that's set on auto-pay each month. | +| `website` | Conversion was made on your website. | ### Send events from both the browser and the server diff --git a/src/connections/destinations/catalog/actions-google-analytics-4/Untitled-2.js b/src/connections/destinations/catalog/actions-google-analytics-4/Untitled-2.js deleted file mode 100644 index d5243317be..0000000000 --- a/src/connections/destinations/catalog/actions-google-analytics-4/Untitled-2.js +++ /dev/null @@ -1,12 +0,0 @@ -{ - "query": "mutation createAnnouncement ($projectId: ID!,$headline: String!,$contentJira: String!,$categoryID: ID!,$categoryAudienceID: ID!){createAnnouncement(input: {announcement: {projectId: $projectId,headline: $headline,contentJira: $contentJira,categories: [{ id: $categoryID }, { id: $categoryAudienceID}]}}) {announcement {id}}}", - "variables": { - "projectId": "pro_OSHnu79tnkPWr", - "headline": "{{issue.summary}}", - "contentJira": "{{issue.description.jsonEncode}}", - "categoryID": "{{ProductAreaCat}}" - } -} - - -"cat_NCJmvmvx0yA4s","cat_idXHpe4Fn4rcr","cat_jjCSCPpDetHyf" \ No newline at end of file diff --git a/src/connections/destinations/catalog/actions-google-analytics-4/index.md b/src/connections/destinations/catalog/actions-google-analytics-4/index.md index 03b0c21648..0883d223ca 100644 --- a/src/connections/destinations/catalog/actions-google-analytics-4/index.md +++ b/src/connections/destinations/catalog/actions-google-analytics-4/index.md @@ -65,12 +65,12 @@ Segment’s spec doesn't have an equivalent event for every Google Analytics 4 r In addition to recommended events, you can also send custom events using the [Custom Event action](/docs/connections/destinations/catalog/actions-google-analytics-4/#custom-event). Custom events are events that you name. Custom events don't appear in most standard reports; you need to set up custom reports for meaningful analysis. To create custom events in the Google Analytics 4 web interface, see Google’s [Modify and create events through the user interface](https://support.google.com/analytics/answer/10085872){:target='_blank'}. > warning "" -> Don’t create custom events that already correspond to the pre-built mappings that Segment has. Use the standard events defined in [GA4’s doc](https://developers.google.com/analytics/devguides/collection/ga4/reference/events){:target="_blank"} with their corresponding actions. +> Don’t create custom events that already correspond to the pre-built mappings that Segment has. Use the standard events defined in [GA4’s doc](https://developers.google.com/analytics/devguides/collection/ga4/reference/events){:target="_blank"} with their corresponding actions. -> info "Event naming limitations" -> Google Analytics 4 requires that all event names contain only alpha-numeric characters and underscores, and must start with an alphabetic character. Segment replaces spaces in Event Names with an underscore, so that these events are accepted by GA4. For example, Segment renames an event named `Home Profile` to `Home_Profile`. In some cases, GA4 may reject an event outright, due to unsupported characters. For example, an event named `Home | Profile` will be silently rejected due to the pipe character. -> -> In all cases, event names in GA4 are case sensitive. The Custom Event action includes a **Lowercase Event Name** option, to ensure consistency of all events sent to Google. For more information, see Google's articles [Google Analytics 4 event name rules](https://support.google.com/analytics/answer/10085872?hl=en&ref_topic=9756175#event-name-rules){:target='_blank'} and [Event name limitations](https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events?client_type=firebase){:target="_blank"}. +info "Event naming limitations" +Google Analytics 4 requires that all event names contain only alpha-numeric characters and underscores, and must start with an alphabetic character. Segment replaces spaces in Event Names with an underscore, so that these events are accepted by GA4. For example, Segment renames an event named `Home Profile` to `Home_Profile`. In some cases, GA4 may reject an event outright, due to unsupported characters. For example, an event named `Home | Profile` will be silently rejected due to the pipe character. + +In all cases, event names in GA4 are case sensitive. The Custom Event action includes a **Lowercase Event Name** option, to ensure consistency of all events sent to Google. For more information, see Google's articles [Google Analytics 4 event name rules](https://support.google.com/analytics/answer/10085872?hl=en&ref_topic=9756175#event-name-rules){:target='_blank'} and [Event name limitations](https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events?client_type=firebase){:target="_blank"}. #### Custom Dimensions and Metrics With Google Analytics 4, you must create custom dimensions and metrics within the Google Analytics 4 interface and link parameters to the corresponding dimension or metric. When you create the dimension or metric, you can either select a parameter from the list of already collected fields or enter the name of the parameter you plan to collect in the future. Custom dimensions can be either event-scoped or user-scoped, and custom metrics must be event-scoped. @@ -98,6 +98,7 @@ There are certain scenarios where sending a User-ID can be helpful. For example, - **Use the Gtag-generated Client ID.** Gtag will set a Client ID automatically. The Client ID is stored in a cookie and can be fetched on the web client. To tie data between client-side and server-side, pass the Gtag-generated Client ID to Segment as a property and use that value as the Client ID in the Google Analytics 4 destination mappings. - **Use the Segment `userId` for User-ID.** The Segment `userId` should be your company’s canonical user identifier. By setting Google's User-ID to the same value as `userId` on client-side and server-side, you can benefit from cross-platform analytics. In addition, if you use [Firebase to send mobile data to Google Analytics 4](/docs/connections/destinations/catalog/actions-google-analytics-4/#mobile-data), using the same User-ID across web and mobile will ensure users are stitched together across devices. + #### Validating and Comparing Data Google recommends a period of dual-collection with both Universal Analytics and Google Analytics 4. This dual-collection approach lets you build a historical record in Google Analytics 4 while continuing to depend on Universal Analytics until you're ready to fully switch over. diff --git a/src/connections/destinations/catalog/actions-launchdarkly/index.md b/src/connections/destinations/catalog/actions-launchdarkly/index.md new file mode 100644 index 0000000000..2b38c43c45 --- /dev/null +++ b/src/connections/destinations/catalog/actions-launchdarkly/index.md @@ -0,0 +1,53 @@ +--- +title: LaunchDarkly (Actions) Destination +hide-boilerplate: true +hide-dossier: true +--- + +{% include content/plan-grid.md name="actions" %} + +[LaunchDarkly](https://launchdarkly.com) is a feature management platform that empowers development teams to safely deliver, control, and measure their software through feature flags. + +With LaunchDarkly, you can run experiments on any feature flag. This destination allows you to connect existing Segment events to LaunchDarkly custom metrics for use in LaunchDarkly experiments. + +> success "" +> **Good to know**: This page is about the [Actions-framework](/docs/connections/destinations/actions/) LaunchDarkly Segment destination. There's also a page about the [non-Actions LaunchDarkly destination](/docs/connections/destinations/catalog/launchdarkly-events/). Both of these destinations receives data from Segment. + + + +{% include content/ajs-upgrade.md %} + + + +## Benefits of LaunchDarkly (Actions) vs LaunchDarkly Classic + +LaunchDarkly (Actions) provides the following benefits over the classic LaunchDarkly destination: + +- **Improved customization**. You determine the mapping between the data Segment receives from your source and the data Segment sends to LaunchDarkly. For example, you can map an arbitrary event property to the LaunchDarkly metric key. +- **Increased transparency**. You can see the data that is sent to LaunchDarkly and when Segment sends it. Additionally, you can subscribe to alerts when the delivery rate to LaunchDarkly dips below a configurable threshold. + + + +## Getting started + +To get started with LaunchDarkly (Actions): +1. In LaunchDarkly, navigate to [Account settings](https://app.launchdarkly.com/settings/projects) and copy the client-side ID for the project and environment that you would like to connect to Segment. +2. From the Segment web app, click **Catalog**, then click **Destinations**. +3. Search for **LaunchDarkly (Actions)** and select it. +4. Click **Configure LaunchDarkly**. +5. Select the Source you want to connect to LaunchDarkly (Actions). +6. Paste the LaunchDarkly client-side ID you copied in step 1 into the **LaunchDarkly client-side ID** field on the destination settings page. + + + +{% include components/actions-fields.html %} + +## Creating LaunchDarkly metrics + +In order to take full-advantage of the LaunchDarkly (Actions) Destination, you need to create metrics in LaunchDarkly that correspond to Segment track events. Read [Creating metrics](https://docs.launchdarkly.com/home/experimentation/metrics/index){:target="_blank"} to learn how to create metrics in LaunchDarkly. + + + +## Migration from the classic LaunchDarkly destination + +Be sure to disconnect the classic LaunchDarkly destination before enabling the LaunchDarkly (Actions) destination to avoid duplicate experimentation events in LaunchDarkly. diff --git a/src/connections/destinations/catalog/actions-talon-one/index.md b/src/connections/destinations/catalog/actions-talon-one/index.md index 257f67f8a5..99dc5e243e 100644 --- a/src/connections/destinations/catalog/actions-talon-one/index.md +++ b/src/connections/destinations/catalog/actions-talon-one/index.md @@ -2,103 +2,7 @@ title: Talon.One (Action) Destination hide-boilerplate: true hide-dossier: false +published: false +id: --- - - - -{% include content/plan-grid.md name="actions" %} - -Create flexible and targeted promotional and loyalty campaigns with [Talon.One](https://www.talon.one/){:target="_blank"}. -Campaigns can be created and managed by non-technical users like marketers. There is no need to -get your development team involved. Features include coupons, discounts, loyalty -programs, referral tracking, geofencing, and bundling. - -This destination is maintained by Talon.One. For any issues with the destination, [contact the Talon.One Support team](mailto:support@talon.one) or refer to [Talon.One's documentation](https://docs.talon.one/docs/dev/technology-partners/segment){:target="_blank"}. - - -> success "" -> **Good to know**: This page is about the [Actions-framework](/docs/connections/destinations/actions/) Talon.One Segment destination. There's also a page about the [non-Actions Talon.One destination](/docs/connections/destinations/catalog/talonone/). Both of these destinations receive data from Segment. - -## Benefits of Talon.One (Actions) vs Talon.One Classic - -Talon.One (Actions) allows you to share more data than the classic destination. -The classic version only shares customer profile data. The Action version supports sharing the following data: - -- Customer profile data -- Audience data -- Tracking events - - - -## Getting started - -### Creating an API key in Talon.One - -Segment needs a Talon.One-generated API key to be able to send data to your Talon.One Application. To generate an API key specific to Segment: - -1. Open your Talon.One Application in the Campaign Manager and click **Settings > Developer settings**. -1. Click **Create API Key**. -1. For **Do you want to use this API Key with a 3rd party service**, select **Yes**. -1. Select **Segment** from the dropdown. -1. Select an expiry date and click **Create API Key**. -1. Copy it for later use. - -### Adding a Talon.One destination - -To start sending data to Talon.One from Segment, create a Talon.One -[destination](/docs/connections/destinations/) in Segment. - -1. In Segment, click **Destinations** > **Add Destination**. The **Destination catalog** opens. -1. Search for **Talon.one** and configure the destination. -1. Enter the details: - - In **Name**, type a name, for example `Talon.One destination`. - - In **API key**, paste the API key generated in the previous section. - - In **Deployment**, type the URI of your Talon.One deployment, for example - `https://mycompany.europe-west1.talon.one/`. -1. (Optional) Set up your filters. -1. Configure the mapping: - 1. Click **New Mapping** and select the type of action to perform in Talon.One. - For example _When a new audience is created in Segment, also create it in Talon.One._ - 1. Configure the trigger and action fields. -1. Click **Event Tester** and test if you received the data in Talon.One. - -Once you receive data, you can start creating rules that rely on that data. - -> warning "" -> **Important**: You might need to create custom attributes in Talon.One to be able to map the data from Segment in Talon.One. See the [Talon.One docs](https://docs.talon.one/docs/product/account/dev-tools/managing-attributes#creating-custom-attributes){:target="_blank"}. - -### Testing the integration - -You can use the following payloads to test and fine-tune your requests. - -```json -{ - "messageId": "segment-test-message-t1kx8e", - "timestamp": "2022-03-22T12:41:20.918Z", - "type": "track", // or any other type in Segment - "userId": "test-user-z65zqk", - "event": "track-event", // or any other event in Segment - "email": "test@example.org", - "projectId": "qR6APLKpCBB3ue8pHkBLpo", - "properties": { - "eventType": "mySegmentEvent", - "type": "boolean", - "customerProfileId": "a_customer_id", - "attributes": { - "language": "English" // depends your custom attributes in Talon.One - } - } -} -``` - -### Next steps - -Once you receive data from Segment inside Talon.One, start creating your rules in the Campaign Manager. See the [Talon.One documentation](https://docs.talon.one/docs/product/rules/overview){:target="_blank"}. - - -{% include components/actions-fields.html %} - - -## Migration from the classic Talon.One destination - -To prevent duplicate events being created in Talon.One, ensure that for each Segment source, this destination and the classic Talon.One destination are not both enabled at the same time. +content moved to `/talon-one-actions` \ No newline at end of file diff --git a/src/connections/destinations/catalog/close/index.md b/src/connections/destinations/catalog/close/index.md index 35fce0c3bc..b2b9e116cc 100644 --- a/src/connections/destinations/catalog/close/index.md +++ b/src/connections/destinations/catalog/close/index.md @@ -1,7 +1,42 @@ --- title: 'Close Destination' -hidden: true id: 61f8296b7d15c30a3bbe2b76 -published: false beta: true +hide-boilerplate: true +hide-dossier: true +redirect_from: + - '/connections/destinations/catalog/actions-close' --- + + + +{% include content/plan-grid.md name="actions" %} + + +[Close](https://close.com/){:target="_blank"} is the inside sales CRM of choice for startups and small and midsize businesses (SMBs.) + + + + +{% include content/ajs-upgrade.md %} + + + +## Getting started + +1. Go to your Close app and select the Organization you want to use. +2. Click **Settings** in the bottom left, then click **API Keys** in the left menu. Create a new API Key. +3. From the Segment web app, click **Catalog**, then click **Destinations**. +4. Find the Destinations Actions item in the left navigation, and click it. +5. Click the “Close” item to select it and click Configure. +6. Choose which of your sources to connect the destination to. (You can connect more sources to the destination later.) + + + +{% include components/actions-fields.html %} + + diff --git a/src/connections/destinations/catalog/flagshipio/index.md b/src/connections/destinations/catalog/flagshipio/index.md new file mode 100644 index 0000000000..6342f7a1cb --- /dev/null +++ b/src/connections/destinations/catalog/flagshipio/index.md @@ -0,0 +1,60 @@ +--- +title: Flagship.io Destination +rewrite: true +id: 626153e34fb8f47a32f8deab +--- + +[Flagship.io](https://www.Flagship.io/?utm_source=segmentio&utm_medium=docs&utm_campaign=partners){:target="_blank"} lets engineering teams deploy continuously and monitor the impact of features on technical infrastructure. It also enables product teams to control how features are released and how they impact user experience and business KPIs. + +Flagship.io maintains this destination. For any issues with the destination, [contact the Flagship Support team](mailto:support@flagship.io). + +## Getting Started + +{% include content/connection-modes.md %} + +1. From the Destinations catalog page in the Segment App, click **Add Destination**. +2. Search for **Flagship.io** in the Destinations Catalog, and select the **Flagship.io** destination. +3. Choose which Source should send data to the Flagship.io destination. +4. Go to the [Flagship.io settings interface](https://app.flagship.io/env/c92t23fode700aontbvg/settings/integrations){:target="_blank"} under **Settings > Integrations** and choose **Segment** in the dropdown. Click **Add Tool** and copy the API key displayed. +5. Enter the **API Key** in the Flagship.io destination settings in Segment. + +## Supported methods + +Flagship.io supports the following methods as specified in the [Segment Spec](/docs/connections/spec). + +### Identify + +Send [Identify](/docs/connections/spec/identify) calls to the Flagship.io webhook. For example: + +```js +analytics.identify('userId123', { + email: 'john.doe@example.com', + trait1: 1, + trait2: "test", + trait3: true + }, +}); +``` + +Segment sends Identify calls to Flagship.io as an `identify` event. The Flagship.io data engine then ingests the different traits associated to the identified user. + +The received traits are available in the [Flagship use case builder](https://docs.developers.flagship.io/docs/getting-started-with-flagship#4-create-your-first-campaign-on-the-platform){:target="_blank"}. + + +### Group + +Send [Group](/docs/connections/spec/group) calls to Flagship.io webhook. The Flagship.io data engine then ingests the different traits associated to the identified group. For example: + +```js +analytics.group("0e8c78ea9d97a7b8185e8632", { + name: "Initech", + industry: "Technology", + employees: 329, + plan: "enterprise", + "total billed": 830 +}); +``` + +Segment sends Track calls to Flagship.io as a `group` event. The Flagship.io data engine then ingests the different traits associated to the identified user. + +The received traits are available in the [Flagship use case builder](https://docs.developers.flagship.io/docs/getting-started-with-flagship#4-create-your-first-campaign-on-the-platform){:target="_blank"}. diff --git a/src/connections/destinations/catalog/talon-one-actions/index.md b/src/connections/destinations/catalog/talon-one-actions/index.md new file mode 100644 index 0000000000..ad0260b632 --- /dev/null +++ b/src/connections/destinations/catalog/talon-one-actions/index.md @@ -0,0 +1,109 @@ +--- +title: 'Talon.One (Actions) Destination' +hide-boilerplate: true +hide-dossier: false +id: 6234b137d3b6404a64f2a0f0 +redirect_from: + - '/connections/destinations/catalog/actions-talon-one' +--- + + + +{% include content/plan-grid.md name="actions" %} + +Create flexible and targeted promotional and loyalty campaigns with [Talon.One](https://www.talon.one/){:target="_blank"}. +Campaigns can be created and managed by non-technical users like marketers. There is no need to +get your development team involved. Features include coupons, discounts, loyalty +programs, referral tracking, geofencing, and bundling. + +This destination is maintained by Talon.One. For any issues with the destination, [contact the Talon.One Support team](mailto:support@talon.one) or refer to [Talon.One's documentation](https://docs.talon.one/docs/dev/technology-partners/segment){:target="_blank"}. + + +> success "" +> **Good to know**: This page is about the [Actions-framework](/docs/connections/destinations/actions/) Talon.One Segment destination. There's also a page about the [non-Actions Talon.One destination](/docs/connections/destinations/catalog/talonone/). Both of these destinations receive data from Segment. + +## Benefits of Talon.One (Actions) vs Talon.One Classic + +Talon.One (Actions) allows you to share more data than the classic destination. +The classic version only shares customer profile data. The Action version supports sharing the following data: + +- Customer profile data +- Audience data +- Tracking events + + + +## Getting started + +### Creating an API key in Talon.One + +Segment needs a Talon.One-generated API key to be able to send data to your Talon.One Application. To generate an API key specific to Segment: + +1. Open your Talon.One Application in the Campaign Manager and click **Settings > Developer settings**. +1. Click **Create API Key**. +1. For **Do you want to use this API Key with a 3rd party service**, select **Yes**. +1. Select **Segment** from the dropdown. +1. Select an expiry date and click **Create API Key**. +1. Copy it for later use. + +### Adding a Talon.One destination + +To start sending data to Talon.One from Segment, create a Talon.One +[destination](/docs/connections/destinations/) in Segment. + +1. In Segment, click **Destinations** > **Add Destination**. The **Destination catalog** opens. +1. Search for **Talon.one** and configure the destination. +1. Enter the details: + - In **Name**, type a name, for example `Talon.One destination`. + - In **API key**, paste the API key generated in the previous section. + - In **Deployment**, type the URI of your Talon.One deployment, for example + `https://mycompany.europe-west1.talon.one/`. +1. (Optional) Set up your filters. +1. Configure the mapping: + 1. Click **New Mapping** and select the type of action to perform in Talon.One. + For example _When a new audience is created in Segment, also create it in Talon.One._ + 1. Configure the trigger and action fields. +1. Click **Event Tester** and test if you received the data in Talon.One. + +Once you receive data, you can start creating rules that rely on that data. + +> warning "" +> **Important**: You might need to create custom attributes in Talon.One to be able to map the data from Segment in Talon.One. See the [Talon.One docs](https://docs.talon.one/docs/product/account/dev-tools/managing-attributes#creating-custom-attributes){:target="_blank"}. + +### Testing the integration + +You can use the following payloads to test and fine-tune your requests. + +```json +{ + "messageId": "segment-test-message-t1kx8e", + "timestamp": "2022-03-22T12:41:20.918Z", + "type": "track", // or any other type in Segment + "userId": "test-user-z65zqk", + "event": "track-event", // or any other event in Segment + "email": "test@example.org", + "projectId": "qR6APLKpCBB3ue8pHkBLpo", + "properties": { + "eventType": "mySegmentEvent", + "type": "boolean", + "customerProfileId": "a_customer_id", + "attributes": { + "language": "English" // depends your custom attributes in Talon.One + } + } +} +``` + +### Next steps + +Once you receive data from Segment inside Talon.One, start creating your rules in the Campaign Manager. See the [Talon.One documentation](https://docs.talon.one/docs/product/rules/overview){:target="_blank"}. + + +{% include components/actions-fields.html %} + + +## Migration from the classic Talon.One destination + +To prevent duplicate events being created in Talon.One, ensure that for each Segment source, this destination and the classic Talon.One destination are not both enabled at the same time. + + diff --git a/src/connections/functions/aws-apis.md b/src/connections/functions/aws-apis.md new file mode 100644 index 0000000000..67a2e74ce4 --- /dev/null +++ b/src/connections/functions/aws-apis.md @@ -0,0 +1,89 @@ +--- +title: 'Set up functions for calling AWS APIs' +integration_type: feature +--- + +The [`aws-sdk`](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/welcome.html){:target="_blank"} module is built-in, which allows you to make calls to AWS services in your own AWS accounts. The AWS SDK requires additional setup to ensure access to your AWS resources is secure. This page describes the process for allowing your functions to securely call AWS APIs in your AWS account. + +To set up your functions to call AWS APIs: +1. Create an IAM role in your AWS account that your function will assume before making AWS API calls. + 1. Make sure you have these two values: + * **Principal account ID**: This is the ID number for the AWS account that your function runs in. For destination functions, this is `458175278816` and for source functions this is `300240842537`. + * **External ID**: This is the value your IAM role uses to ensure that only your functions have the ability to assume the role. Segment recommends you to choose a long string of at least 32 random characters and treat it as if it were an API key or a password. + 2. Create an IAM role in your AWS account with the [minimum set of necessary permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege){:target="_blank"}. + 3. Add a trust relationship to your role with the following policy, filling in the principal account ID and external ID from step 1.1: + ```json + { + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "AWS": "" + }, + "Action": "sts:AssumeRole", + "Condition": { + "StringEquals": { + "sts:ExternalId": "" + } + } + } + ] + } + ``` + +2. Create your function. +
Now that you have an IAM role in your AWS account, you can create your source or destination function. Segment recommends you to use function settings to make the IAM role configurable. This allows you to use different roles for different instances of your function and to securely store your external ID value by making it a "sensitive" setting. Here are the required settings: + * **IAM Role ARN**: A string setting that is the ARN for the IAM role above. For example, `arn:aws:iam::1234567890:role/my-secure-role`. + * **IAM Role External ID**: A sensitive string setting that is the external ID for your IAM role. + + Below is an example destination function that uploads each event received to an S3 bucket (configured using an additional "S3 Bucket" setting). It uses the built-in local cache to retain S3 clients between requests to minimize processing time and to allow different instances of the function to use different IAM roles. + + ```javascript + async function getS3(settings) { + const ttl = 30 * 60 * 1000; // 30 minutes + const key = settings.iamRoleArn + settings.iamRoleExternalId; + + return cache.load(key, ttl, async () => { + const sts = new AWS.STS(); + + const creds = await sts + .assumeRole({ + RoleArn: settings.iamRoleArn, + ExternalId: settings.iamRoleExternalId, + RoleSessionName: 'segment-function' + }) + .promise() + .then(data => { + return { + accessKeyId: data.Credentials.AccessKeyId, + secretAccessKey: data.Credentials.SecretAccessKey, + sessionToken: data.Credentials.SessionToken + }; + }) + .catch(err => { + throw err; + }); + + return new AWS.S3(creds); + }); + } + + async function onTrack(event, settings) { + const s3 = await getS3(settings); + + return s3 + .putObject({ + Bucket: settings.s3Bucket, + Key: `${event.type}/${Date.now()}.json`, + Body: JSON.stringify(event) + }) + .promise() + .then(data => { + console.log(data); + }) + .catch(err => { + throw err; + }); + } + ``` diff --git a/src/engage/campaigns/email-campaigns.md b/src/engage/campaigns/email-campaigns.md index ec00c023aa..63abdab681 100644 --- a/src/engage/campaigns/email-campaigns.md +++ b/src/engage/campaigns/email-campaigns.md @@ -22,7 +22,7 @@ You’ll build and then send your campaign in three stages: Because Engage campaigns exist within Journeys, begin by creating a Journey: -1. Within your Personas space, select **Campaigns**, then click **New Journey**. +1. Within your Personas space, select **Journeys**, then click **New Journey**. 2. Name your Journey and select its entry settings. 3. Click **Build Journey** to create the Journey. diff --git a/src/engage/campaigns/sms-campaigns.md b/src/engage/campaigns/sms-campaigns.md index aed727be92..96d5806e2b 100644 --- a/src/engage/campaigns/sms-campaigns.md +++ b/src/engage/campaigns/sms-campaigns.md @@ -22,7 +22,7 @@ You’ll build and then send your campaign in three stages: Because Engage campaigns exist within Journeys, begin by creating a Journey: -1. Within your Personas space, select **Campaigns**, then click **New Journey**. +1. Within your Personas space, select **Journeys**, then click **New Journey**. 2. Name your Journey and select its entry settings. 3. Click **Build Journey** to create the Journey. diff --git a/src/engage/overview/onboarding.md b/src/engage/overview/onboarding.md index 7145c2ad04..e6029ec9f3 100644 --- a/src/engage/overview/onboarding.md +++ b/src/engage/overview/onboarding.md @@ -77,8 +77,8 @@ Next, you’ll create a SendGrid subuser and ensure that a dedicated IP has been ### Authenticate your domain -> info "Log in as the subuser" -> All further SendGrid onboarding steps require you to be signed in as the new subuser you just created. If you're not logged in as the new subuser, log out of SendGrid, then log back in using the subuser credentials you created above. +> info "SendGrid parent and subuser accounts" +> In this section, you'll authenticate your domain using your new SendGrid subuser account and then set up reverse DNS with your SendGrid parent account. Have both login credentials on hand before proceeding. Now, you’ll authenticate your domain with SendGrid and your DNS provider and [enable link branding](https://docs.sendgrid.com/ui/account-and-settings/how-to-set-up-link-branding){:target="_blank"}. Domain authentication protects your sending reputation by showing email providers that you’ve given SendGrid permission to send email campaigns for you. @@ -86,14 +86,14 @@ To authenticate your domain, you’ll copy CNAME records given to you by SendGri You’ll authenticate your domain using the SendGrid platform and your DNS provider: -1. Follow [SendGrid’s domain authentication guide](https://docs.sendgrid.com/ui/account-and-settings/how-to-set-up-domain-authentication){:target="_blank"}. +1. **From your new SendGrid subuser account**, follow [SendGrid’s domain authentication guide](https://docs.sendgrid.com/ui/account-and-settings/how-to-set-up-domain-authentication){:target="_blank"}. 2. During the authentication process, SendGrid asks if you would like to brand links for your domain. Select **Yes**. 3. SendGrid provides you with five CNAME records. Add them to your DNS host. 4. Return to SendGrid and [verify your DNS](https://docs.sendgrid.com/ui/account-and-settings/how-to-set-up-domain-authentication#verifying-your-dns){:target="_blank"}. Complete authentication by setting up reverse DNS: -1. Follow [SendGrid’s reverse DNS (rDNS) documentation](https://docs.sendgrid.com/ui/account-and-settings/how-to-set-up-reverse-dns){:target="_blank"}. +1. **From your SendGrid parent account**, follow [SendGrid’s reverse DNS (rDNS) documentation](https://docs.sendgrid.com/ui/account-and-settings/how-to-set-up-reverse-dns){:target="_blank"}. 2. SendGrid provides you with one A record. Add it to your DNS host, along with the five CNAME records from the previous steps. 3. Return to SendGrid and [verify your DNS](https://docs.sendgrid.com/ui/account-and-settings/how-to-set-up-reverse-dns#verifying){:target="_blank"}. @@ -124,8 +124,8 @@ You’ll now need to enable event webhooks, which trigger webhook notifications ### Generate an API key -> info "Copying SendGrid Credentials" -> This step creates an API key that you’ll later add to Segment. Make sure you’re ready to copy and save the key before proceeding. You must follow these steps from within the SendGrid subuser account [you created for use with Twilio Engage](/docs/engage/overview/onboarding/#create-a-subuser-and-check-the-dedicated-ip-address). +> warning "Copying SendGrid Credentials" +> This step creates an API key that you’ll later add to Segment. Make sure you’re ready to copy and save the key before proceeding; SendGrid only displays the API key once. You must follow these steps from within the SendGrid subuser account [you created for use with Twilio Engage](/docs/engage/overview/onboarding/#create-a-subuser-and-check-the-dedicated-ip-address). Next, generate an API key within SendGrid. Have your Segment workspace open in another tab, as you’ll copy the API key and paste it into your Engage settings. diff --git a/src/engage/profiles/csv-upload.md b/src/engage/profiles/csv-upload.md index ed4b0095b9..3cddf8ce0e 100644 --- a/src/engage/profiles/csv-upload.md +++ b/src/engage/profiles/csv-upload.md @@ -67,12 +67,12 @@ For each CSV file, Engage adds: - An `email_subscription_status` column next to **Email** columns. - An `sms_subscription_status` column next to **SMS** columns. -In the `email_subscription_status` and `sms_subscription_status` columns, set subscription states for email addresses and phone numbers: +In the `email_subscription_status` and `sms_subscription_status` columns, set subscription states for email and phone numbers with the following values: -- **Subscribed**: The user has actively subscribed. -- **Unsubscribed**: The user has actively unsubscribed. -- **Did Not Subscribe**: The user has provided their contact information but didn't actively subscribe or unsubscribe. -- **No Subscription Status (or blank)**: The user's profile exists in Segment, but they haven't explicitly provided their contact information, and no subscription information is available. +- `Subscribed`: The user has actively subscribed. +- `Unsubscribed`: The user has actively unsubscribed. +- `Did Not Subscribe`: The user has provided their contact information but didn't actively subscribe or unsubscribe. +- **No Subscription Status (blank value)**: The user's profile exists in Segment, but they haven't explicitly provided their contact information, and no subscription information is available. > success "" > Only contact users that subscribe to your communications. View [User Subscription States](/docs/engage/profiles/user-subscriptions/subscription-states/) to learn more. diff --git a/src/getting-started/02-simple-install.md b/src/getting-started/02-simple-install.md index 7abbaf9fc0..839eff8a42 100644 --- a/src/getting-started/02-simple-install.md +++ b/src/getting-started/02-simple-install.md @@ -19,9 +19,11 @@ Before you start your Segment implementation, you need: > success "" > **Tip**! If you don't have any of those things, consider creating a simple [GitHub Pages website](https://pages.github.com/). +### Create separate dev and prod sources + When you develop and test sources, Segment recommends you to create and use separate sources for each of your environments (production, development, staging) to prevent testing and development activities from filling production systems with invalid data. -You can give each source an `environment` label when you create it, and Segment strongly suggests that you use these labels to sort your sources. When you create a source during the steps below, make sure you enter an environment label. +You can give each source an environment label when you create it, and Segment strongly suggests that you use these labels to sort your sources. When you create a source during the steps below, make sure you enter an environment label. > warning "" > Double-check when you enter write keys for dev and production environments to make sure that you send the right data to the right place. diff --git a/src/guides/filtering-data.md b/src/guides/filtering-data.md index 20d97bff2b..820b4680d4 100644 --- a/src/guides/filtering-data.md +++ b/src/guides/filtering-data.md @@ -25,7 +25,7 @@ You can use the `integrations` JSON object as part of your Segment payloads to c "page": { "title": "Analytics Academy", "url": "https://segment.com/academy/" - }, + } }, "integrations": { "All": true, diff --git a/src/personas/audiences/index.md b/src/personas/audiences/index.md index 597b36fc81..bd38a37f45 100644 --- a/src/personas/audiences/index.md +++ b/src/personas/audiences/index.md @@ -53,6 +53,9 @@ See [Account-level Audiences](/docs/personas/audiences/account-audiences) for mo ## Connecting your Audience to a Destination +> warning "Audience Keys" +> Avoid using the same Audience key twice, even if you've deleted the original Audience. + Once you have previewed your audience, you can choose to connect a destination, or simply keep the audience in Segment and download a csv. If you already have destinations set up in Segment, you can import the configuration from one of your existing sources to Personas. Note that you can only connect one destination configuration per destination type. ![](/docs/personas/images/audience_select_destination_card.png) diff --git a/src/personas/faqs.md b/src/personas/faqs.md index 5a1f9e2330..66f6895109 100644 --- a/src/personas/faqs.md +++ b/src/personas/faqs.md @@ -5,16 +5,16 @@ title: Personas Frequently Asked Questions ## Can I use the Profile API on the client-side? -For security reasons, we require the Profile API only be used server-side. The Profile API allows you to look up data about any user given an identifier (e.g. email, `anonymousId`, or `userId`) and an authorized access secret. While this enables powerful personalization workflows, it could also let your customers' data fall into the wrong hands if the access secret were exposed on the client. +For security reasons, Segment requires that the Profile API only be used server-side. The Profile API allows you to look up data about any user given an identifier (for example, email, `anonymousId`, or `userId`) and an authorized access secret. While this enables powerful personalization workflows, it could also let your customers' data fall into the wrong hands if the access secret were exposed on the client. Instead, by creating an authenticated personalization endpoint server-side backed by the Personas Profile API, you can serve up personalized data to your users without the risk of their information falling into the wrong hands. ## Do you have an Audiences API? -Currently you can add, remove, and modify audiences only by using the Personas in-app audience builder. +You can add, remove, and modify audiences only by using the Personas in-app audience builder. -However, you can programmatically query the Profile API in order to determine if a particular user is a member of a particular audience because Personas creates a trait with the same name as your audience. For example, to determine if the user with an email address of `bob@example.com` is a member of your `high_value_users` audience, you could query the following profile API URL: +However, you can programmatically query the Profile API to determine if a user belongs to a particular audience because Personas creates a trait with the same name as your audience. For example, to determine if the user with an email address of `bob@example.com` is a member of your `high_value_users` audience, you could query the following profile API URL: `https://profiles.segment.com/v1/namespaces//collections/users/profiles/email:bob@segment.com/traits?include=high_value_users` @@ -31,8 +31,11 @@ The following response indicates that Bob is indeed a high-value user: } ``` -To learn more about our profile API, you can head [here](https://segment.com/docs/personas/profile-api). +For more information on profile queries, visit the [Profile API documentation](/docs/personas/profile-api). +## Can I reuse audience keys? + +Avoid using the same audience key twice, even if you've deleted the key's original audience. Downstream tools and Destinations might have trouble distinguishing between different audiences that at any point shared the same key. ## Does your identity model support multiple external ID types? @@ -68,23 +71,23 @@ The trait and audience will automatically update going forward as historical eve ## How does Personas handle identity merging? Each incoming event is analyzed and external IDs are extracted (`user_id`, `anonymous_id`, `email`). The simplified algorithm works as follows: -- We first search the Identity Graph for incoming external IDs. -- If we find no users, we'll create one. +- Segment first searches the Identity Graph for incoming external IDs. +- If Segment find no users, it creates one. - If one user is returned, then that user is chosen. -- If multiple users are returned, our merge protection kicks in and checks the validity of all of the provided external IDs. - - If the merge protection checks pass, we'll create a new merge connection between those two users. The first user profile ever created becomes the parent profile, and all merged users become child profiles. - - If the merge protection checks fail, we'll discard the lowest precedence external ID and re-run the algorithm. +- If multiple users are returned, merge protection kicks in and checks the validity of all of the provided external IDs. + - If the merge protection checks pass, Segment creates a new merge connection between those two users. The first user profile ever created becomes the parent profile, and all merged users become child profiles. + - If the merge protection checks fail, Segment discards the lowest precedence external ID and re-run the algorithm. -![](images/merging_1.png) +![Identity graph merging](images/merging_1.png "Flowchart of Segment receiving an incoming event") -![](images/merging_2.png) +![Identity graph merging](images/merging_2.png "Flowchart of Segment searching for profiles by external ID") -![](images/merging_3.png) +![Identity graph merging](images/merging_3.png "Flowchart of Segment merging profiles") ## Is all matching deterministic, or is there any support for probabilistic matching? All Profile matching is deterministic and based on first-party data that you've collected. -We do not support probabilistic matching. We've found that most marketing automation use cases require 100% confidence that a user is who you think they are (sending an email, delivering a recommendation, etc). We've found the best way to support this is through a deterministic identity algorithm. +Segment doesn't support probabilistic matching. Most marketing automation use cases require 100% confidence that a user is who you think they are (sending an email, delivering a recommendation, and so on). The best way to support this is through a deterministic identity algorithm. ## Should I use Personas if I already have a marketing automation tool? Personas pairs well with marketing automation tools on the Segment platform. @@ -95,7 +98,7 @@ From there, your marketing, product, sales, and success teams have channels on w They can contact you using livechat, email, push notification, or text. Success can better prioritize their support ticket in Zendesk, or hone in on the customer's problem faster. On the sales side, they can focus on the products a prospect is most engaged with, or focus on getting the customer on the right plan. Your product team can serve specific recommendations, based on that user's specific needs next time they visit your site. -Today, most businesses are forced to think about each channel as individual siloes. With Personas, all channels — including your marketing automation tool — can be powered by the same, singular understanding of your users. +Today, most businesses are forced to think about each channel as individual silos. With Personas, all channels — including your marketing automation tool — can be powered by the same, singular understanding of your users. ## What are Funnel Audiences? Funnel Audiences allow you to use **strict, relative ordering** for your audience conditions. Common use cases for these audiences are Cart Abandonment (users that triggered the Product Added event but did not trigger the Order Completed event after the Product Added event occurred) and onboarding steps (users that Added Credit Card but did not Subscribe afterward). @@ -108,32 +111,33 @@ The funnel condition will now be relative to the parent condition. The audience in the image below includes all users that have Product Added in the last week, but not Order Completed within a day of doing so. -![](images/funnel_audience.png) +![Funnel condition](images/funnel_audience.png "A screenshot of using funnel conditions in the Personas Audience builder") **Important:** Funnel Audiences compute based on all instances of the parent event within the lookback period. This means that if you have a user that Product Added ⟶ Order Completed ⟶ Product Added, this user would be entered into the Abandoned Cart state despite having previously completed an order. ## What happens to conflicting and non-conflicting profile attributes? -If two merged user profiles contain conflicting profile attributes, we'll select the newest, or last updated, attributes when querying the profile. In the future, we'll let the conflict resolution policies be configurable. +If two merged user profiles contain conflicting profile attributes, Segment selects the newest, or last updated, attributes when querying the profile. ## What is Personas Merge Protection? Personas merge protection algorithm protects your identity graph from unnecessary merges by finding and removing untrusted external IDs. Here's an example: -![](images/merge_protection.png) +![Merge protection](images/merge_protection.png "An image representing the merge protection flow") -In this example, `anonymous_id: a1` is not reset during a `User Logout`. Without merge protection, we'd merge `user_id u1` and `user_id u2`. Instead, our Merge Protection algorithm detects that such a merge would break user_id uniqueness and prevents the merge. +In this example, `anonymous_id: a1` is not reset during a `User Logout`. Without merge protection, Segment would merge `user_id u1` and `user_id u2`. Instead, the Merge Protection algorithm detects that such a merge would break user_id uniqueness and prevents the merge. This is especially helpful for preventing "blob users" that are merged together by non-unique anonymous IDs or by common group emails like `team@company.com`. ## Which destinations support syncing the identity graph? Most destinations on the Segment Platform are built up around a user model. They assume that a user will have a single userId. Further, most Destinations are not built to handle anonymous traffic. -By default, we do not sync the output of the Identity Graph to Destinations. However, Segment computed traits and audiences are based on the entire user profile, including anonymous and merged data. We sync the value of these computations (e.g. `blog_posts_ready_30_days: 10`) using all `userIds` on the profile. +By default, Segment doesn't sync the output of the Identity Graph to Destinations. However, Segment computed traits and audiences are based on the entire user profile, including anonymous and merged data. We sync the value of these computations (e.g. `blog_posts_ready_30_days: 10`) using all `userIds` on the profile. -For Destinations that support an `alias` call (for example, Mixpanel), we have the option to emit an alias call on merge. +For Destinations that support an `alias` call (for example, Mixpanel), you can emit an `alias` call on merge. ## What Sources can I sync to Personas? -You can sync data from your… +The following list shows just some data sources you can sync to Personas: + - Website ([analytics.js](/docs/connections/sources/catalog/libraries/website/javascript/)) - Mobile SDKs ([ios](/docs/connections/sources/catalog/libraries/mobile/ios), [android](/docs/connections/sources/catalog/libraries/mobile/android), [amp](/docs/connections/sources/catalog/libraries/mobile/amp)) - Serverside libraries ([go](/docs/connections/sources/catalog/libraries/server/go), [node](/docs/connections/sources/catalog/libraries/server/node/), [java](/docs/connections/sources/catalog/libraries/server/java), [PHP](/docs/connections/sources/catalog/libraries/server/php/), [python](/docs/connections/sources/catalog/libraries/server/python), [ruby](/docs/connections/sources/catalog/libraries/server/ruby), [.NET](/docs/connections/sources/catalog/libraries/server/net)) @@ -157,11 +161,11 @@ You can sync data from your… ## Can I send audiences to multiple destination accounts? -Yes, Personas now supports the ability to send an audience or computed trait to two or more accounts of the same partner. The most common use case is multiple Facebook, or Adwords ad accounts. +Yes, Personas supports the ability to send an audience or computed trait to two or more accounts of the same partner. The most common use case is multiple Facebook, or Adwords ad accounts. -![](images/multi-facebook.png) +![Multiple Destination sends](images/multi-facebook.png "Sending Personas audience traits to two Facebook accounts") ### What identifiers can the merged profile be queried/updated with? -Any of the external IDs can be used to query a profile. When a profile is requested, we will traverse the merge graph and resolve all merged profiles. The result is a single profile, with the latest state of all traits, events, and identifiers. +Any of the external IDs can be used to query a profile. When a profile is requested, Segment traverses the merge graph and resolves all merged profiles. The result is a single profile, with the latest state of all traits, events, and identifiers. diff --git a/src/segment-app/iam/mfa.md b/src/segment-app/iam/mfa.md index b5a41b2925..d461be8df9 100644 --- a/src/segment-app/iam/mfa.md +++ b/src/segment-app/iam/mfa.md @@ -25,4 +25,8 @@ Once MFA is enabled, Segment prompts you for one of these methods every time you ## Recovering MFA Your recovery code can be used bypass in the event you do not have your MFA device. If you no longer have access to your recovery code, you can choose to send a recovery code to your email to re-access your Account. -If you've lost your recovery code, you can send it to your email by continuing through the recovery code flow and clicking _Send recovery code to my email_. +1. Enter your username and password on the login screen. +2. Click the _authenticating a different way_ link. +3. Click _Recovery Code_. +4. Click _Send recovery code to my email_. +