diff --git a/src/_data/catalog/destination_categories.yml b/src/_data/catalog/destination_categories.yml index ca461149bd..65fa36b340 100644 --- a/src/_data/catalog/destination_categories.yml +++ b/src/_data/catalog/destination_categories.yml @@ -1,5 +1,5 @@ # AUTOGENERATED FROM PUBLIC API. DO NOT EDIT -# destination categories last updated 2025-04-10 +# destination categories last updated 2025-05-08 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 59414630d4..55657d2fb1 100644 --- a/src/_data/catalog/destinations.yml +++ b/src/_data/catalog/destinations.yml @@ -1,5 +1,5 @@ # AUTOGENERATED FROM PUBLIC API. DO NOT EDIT -# destination data last updated 2025-04-10 +# destination data last updated 2025-05-08 items: - id: 637e8d185e2dec264895ea89 display_name: 1Flow @@ -19596,6 +19596,41 @@ items: mobile: false server: false settings: + - name: adStorage + type: select + defaultValue: '' + description: >- + The default value for ad storage consent state. This is only used if + **Enable Consent Mode** is on. + required: false + label: Ad Storage Consent Default + - name: adStorageConsentCategory + type: string + defaultValue: '' + description: >- + [For Segment [Consent + Management](https://segment.com/docs/privacy/consent-management/) users] + The consent category to look up for Ad Storage consent value. This is only + used if **Enable Consent Mode** is on. + required: false + label: Ad Storage Consent Category + - name: adStoragePropertyMapping + type: string + defaultValue: '' + description: >- + The property to lookup Ad Storage consent state from track or page events. + Accepted values are **granted** or **denied**. This is only used if + **Enable Consent Mode** is on. + required: false + label: Ad Storage Property Mapping + - name: enableConsent + type: boolean + defaultValue: false + description: >- + Set to true to enable Bing Ad's [consent + mode](https://help.ads.microsoft.com/#apex/ads/en/60119/1-500). + required: false + label: Enable Consent Mode - name: tagId type: string defaultValue: '' @@ -33306,8 +33341,6 @@ items: categories: - Analytics - Attribution - - Marketing Automation - - Enrichment logo: url: https://cdn.filepicker.io/api/file/Z2uDA7FHQ5CwYnWt19q6 mark: @@ -33513,7 +33546,7 @@ items: hidden: false defaultTrigger: type = "track" fields: - - id: jKELzfnwbo8yQpm2B7NuQc + - id: 27xeTbG8fme8euDUUdDY4V sortOrder: 0 fieldKey: action label: Action @@ -33527,7 +33560,7 @@ items: choices: null dynamic: false allowNull: false - - id: nhQJBPWX8QThSnse2RL2tM + - id: vxMm8vUmpJisCkm6RbA3XZ sortOrder: 1 fieldKey: email label: Email Address @@ -33547,7 +33580,7 @@ items: choices: null dynamic: false allowNull: false - - id: 6DeJN5SBD8y25YHS3HqMVX + - id: 2EhURtqVsnTHq9iZ4jtdZ5 sortOrder: 2 fieldKey: properties label: Properties @@ -33569,7 +33602,7 @@ items: hidden: false defaultTrigger: type = "identify" fields: - - id: in1TVXvKS3eDaWgrUVaqMx + - id: xvFMHemGWedTpXSNmZFGob sortOrder: 0 fieldKey: custom_fields label: Custom fields @@ -33585,7 +33618,7 @@ items: choices: null dynamic: false allowNull: false - - id: 55ssNjDfHie3KNwrhKd76e + - id: vD3PhGhkxqddSJXLb8KkBt sortOrder: 1 fieldKey: email label: Email Address @@ -33599,7 +33632,7 @@ items: choices: null dynamic: false allowNull: false - - id: 8kJXFwbwfsZ6wDDBLPUeoS + - id: b2URVZk5z6wiZbaKFKKVVm sortOrder: 2 fieldKey: ip label: IP Address @@ -33613,7 +33646,7 @@ items: choices: null dynamic: false allowNull: false - - id: 5yCTjN9yuiaUDXx3au8rfy + - id: h2Dt3w2B5YxzsCvZsQRv4E sortOrder: 3 fieldKey: phone label: SMS Number @@ -33627,27 +33660,41 @@ items: choices: null dynamic: false allowNull: false - - id: ciPuPvfdriSkGcXR33VfQd + - id: rJijDWLPkc3eX8YnRSsJdq sortOrder: 4 - fieldKey: status - label: Status + fieldKey: initial_status + label: Initial Status type: STRING - description: The person's subscription status. + description: The person's subscription status if newly identified. placeholder: '' defaultValue: '@if': exists: - '@path': $.traits.status + '@path': $.traits.initial_status then: - '@path': $.traits.status + '@path': $.traits.initial_status else: unsubscribed required: false multiple: false choices: null dynamic: false allowNull: false - - id: 8cJ6W9XeEAK7nEyqSE7b8r + - id: aMt1SrZ8VBzF7qgu5y1A7e sortOrder: 5 + fieldKey: status + label: Status + type: STRING + description: The person's subscription status. Overrides initial_status. + placeholder: '' + defaultValue: + '@path': $.traits.status + required: false + multiple: false + choices: null + dynamic: false + allowNull: false + - id: pdpbCWQxk5LJMUW1NXWZr6 + sortOrder: 6 fieldKey: status_updated_at label: Status Updated At type: DATETIME @@ -33660,8 +33707,8 @@ items: choices: null dynamic: false allowNull: false - - id: 7keyZLwhDeAqVi7gG9FXDf - sortOrder: 6 + - id: 4uBC7uPGdcPz8f9jpWpFwg + sortOrder: 7 fieldKey: tags label: Tags type: STRING @@ -33676,8 +33723,8 @@ items: choices: null dynamic: false allowNull: false - - id: j6osLQGcYvfynratjbCNBc - sortOrder: 7 + - id: 33GRsPKbfgFgkw4bF4FSzF + sortOrder: 8 fieldKey: timezone label: Timezone type: STRING @@ -33690,8 +33737,8 @@ items: choices: null dynamic: false allowNull: false - - id: 9oaYsrheckLvBsBtt5P2s1 - sortOrder: 8 + - id: 8U9bip46MJRd6jfGQF5NA4 + sortOrder: 9 fieldKey: enable_batching label: Enable Batching? type: BOOLEAN @@ -33703,22 +33750,6 @@ items: dynamic: false allowNull: false presets: - - actionId: pw7SY1gPNo8zVZHQDHC8nB - name: Track event - fields: - action: - '@path': $.event - email: - '@if': - exists: - '@path': $.properties.email - then: - '@path': $.properties.email - else: - '@path': $.context.traits.email - properties: - '@path': $.properties - trigger: type = "track" - actionId: sLfpFVRwsHj4GTBP3LEqBy name: Identify fields: @@ -33730,13 +33761,15 @@ items: '@path': $.context.ip phone: '@path': $.traits.phone - status: + initial_status: '@if': exists: - '@path': $.traits.status + '@path': $.traits.initial_status then: - '@path': $.traits.status + '@path': $.traits.initial_status else: unsubscribed + status: + '@path': $.traits.status status_updated_at: '@path': $.traits.status_updated_at tags: @@ -33744,6 +33777,22 @@ items: timezone: '@path': $.context.timezone trigger: type = "identify" + - actionId: pw7SY1gPNo8zVZHQDHC8nB + name: Track event + fields: + action: + '@path': $.event + email: + '@if': + exists: + '@path': $.properties.email + then: + '@path': $.properties.email + else: + '@path': $.context.traits.email + properties: + '@path': $.properties + trigger: type = "track" partnerOwned: true - id: 64ede9fe67158afa8de61480 display_name: Dynamic Yield by Mastercard Audiences @@ -42463,115 +42512,6 @@ items: hidden: false presets: [] partnerOwned: false -- id: 58ae54dc70a3e552b95415f6 - display_name: Facebook Offline Conversions - name: Facebook Offline Conversions - slug: facebook-offline-conversions - hidden: false - endpoints: - - US - regions: - - us-west-2 - - eu-west-1 - url: connections/destinations/catalog/facebook-offline-conversions - previous_names: - - Facebook Offline Conversions - website: https://www.facebook.com/business/help/1782327938668950 - status: PUBLIC - categories: - - Advertising - logo: - url: https://cdn.filepicker.io/api/file/MjCkA4RSTm7BQMFAcy8N - mark: - url: https://cdn.filepicker.io/api/file/TP1ONlaTGaF8fjL5XWhI - methods: - track: true - identify: false - group: false - alias: false - screen: false - page: false - platforms: - browser: false - mobile: false - server: true - warehouse: false - cloudAppObject: false - linkedAudiences: false - components: - - code: >- - https://github.com/segmentio/integrations/tree/master/integrations/facebook-offline-conversions - type: SERVER - browserUnbundlingSupported: false - browserUnbundlingPublic: true - replay: false - connection_modes: - device: - web: false - mobile: false - server: false - cloud: - web: false - mobile: true - server: true - settings: - - name: completeRegistrations - type: text-map - defaultValue: {} - description: >- - Enter your Segment `.track()` event names on the left that you want to - send as `CompleteRegistration` conversions. On the right hand side, put - the ID of the Facebook Offline Event Set where you want to send these - conversions. - required: false - label: Map Track Events as CompleteRegistration Conversions to Event Set IDs - - name: events - type: text-map - defaultValue: {} - description: >- - Enter your Segment `.track()` event names on the left that you want to - send as conversions. On the right hand side, put the ID of the Facebook - Offline Event Set where you want to send these conversions. - required: false - label: Map Track Events to Event Set IDs - - name: leads - type: text-map - defaultValue: {} - description: >- - Enter your Segment `.track()` event names on the left that you want to - send as `Lead` conversions. On the right hand side, put the ID of the - Facebook Offline Event Set where you want to send these conversions. - required: false - label: Map Track Events as Lead Conversions to Event Set IDs - - name: limitedDataUse - type: boolean - defaultValue: false - description: >- - The Limited Data Use (LDU) setting controls whether or not Data Processing - Options are sent to Facebook. When enabling LDU, you **must** set the user - geography values in the `Facebook Offline Conversions` integration options - under the `dataProcessingOptions` key. If you do not pass specific - geography values, Segment will default to empty Data Processing Options. - required: false - label: Limited Data Use - - name: oauth - type: oauth - defaultValue: {} - description: 'Authorize Segment to oauth `` ' - required: false - label: oauth - - name: valueIdentifier - type: select - defaultValue: value - description: >- - For pre-purchase events such as `Product Viewed`, `Product Added`, and - `Product List Viewed`, choose which Segment property you would like to map - to Facebook's `value` property. - required: false - label: Value Field Identifier - actions: [] - presets: [] - partnerOwned: false - id: 5661eb58e954a874ca44cc07 display_name: Facebook Pixel name: Facebook Pixel @@ -62115,7 +62055,7 @@ items: hidden: false defaultTrigger: type = "track" fields: - - id: rnuUQAxpWobUocYoov9Q3s + - id: 2DK3cxzfVVXoUfUMnCZBz8 sortOrder: 0 fieldKey: eventName label: Event Name @@ -62133,7 +62073,7 @@ items: choices: null dynamic: true allowNull: false - - id: gvxdvNVnTBYbqytz5NdWXw + - id: tnM7UP4S9SKR3vMk9A234N sortOrder: 1 fieldKey: occurredAt label: Event Timestamp @@ -62149,7 +62089,7 @@ items: choices: null dynamic: false allowNull: false - - id: 5j58hEA34tvQbepza6SUkj + - id: kHFJW5DuJ8wPe79vqppMaf sortOrder: 2 fieldKey: email label: Email Address @@ -62171,7 +62111,7 @@ items: choices: null dynamic: false allowNull: false - - id: cpqmG1F5LnaxB61wYjeRpK + - id: k5AFngJYZBoUMDz4gmGhnY sortOrder: 3 fieldKey: utk label: User Token @@ -62185,7 +62125,7 @@ items: choices: null dynamic: false allowNull: false - - id: e9yg7ujnHLT9jpFk6XPwUW + - id: 2QhfBAuxN3av5tXGJScwfv sortOrder: 4 fieldKey: objectId label: Object ID @@ -62200,7 +62140,7 @@ items: choices: null dynamic: false allowNull: false - - id: mnGdZdUhDz251x6Nc8xVD9 + - id: x1xeTjjcU34AH62Hm7jqSD sortOrder: 5 fieldKey: properties label: Event Properties @@ -62225,7 +62165,7 @@ items: hidden: false defaultTrigger: null fields: - - id: kjmoivD5g6mhLqvnzEPjj2 + - id: oSV1Gh1mRXUVR8vnvPzKCj sortOrder: 0 fieldKey: createNewCustomRecord label: Create Custom Object Record if Not Found @@ -62242,7 +62182,7 @@ items: choices: null dynamic: false allowNull: false - - id: bacfKcYZ7xQH3EkP3vwAep + - id: gYL4VVzGSTsEnBEskYyoBD sortOrder: 1 fieldKey: customObjectSearchFields label: Custom Object Search Fields @@ -62257,7 +62197,7 @@ items: choices: null dynamic: false allowNull: false - - id: 3KDKw9V7gMUjxR3qkChR5B + - id: kVoAYtHQWjCxvFRmxQ5FeP sortOrder: 2 fieldKey: objectType label: Object Type @@ -62275,7 +62215,7 @@ items: choices: null dynamic: true allowNull: false - - id: n92VUCRAbRMT49uzLskTdo + - id: v1a7MfwfJXu65QR6xjChrR sortOrder: 3 fieldKey: properties label: Properties @@ -62293,7 +62233,7 @@ items: choices: null dynamic: false allowNull: false - - id: umCoTvDdjdNC3Z8uwHgd3L + - id: aC3d3njdQuFu2PTQygXG28 sortOrder: 4 fieldKey: searchFieldsToAssociateCustomObjects label: Search Fields to Associate custom Object @@ -62309,7 +62249,7 @@ items: choices: null dynamic: false allowNull: false - - id: axm4sMpA7B9Jbo6JMoCLEV + - id: dot3B8iESooQ5db5WcLfnh sortOrder: 5 fieldKey: toObjectType label: ObjectType to associate @@ -62327,7 +62267,7 @@ items: choices: null dynamic: true allowNull: false - - id: snJ1FGV7ULGUuEsv1XcvkL + - id: wR6QAHzuRRVpCumtSrgSsa sortOrder: 6 fieldKey: associationLabel label: Association Label @@ -62347,7 +62287,7 @@ items: hidden: false defaultTrigger: type = "identify" fields: - - id: cdsB5rr2hLGXLgDDoJQ9XX + - id: 3dxcZbCvuFLxPDAFGZ3Hja sortOrder: 0 fieldKey: email label: Email @@ -62365,7 +62305,7 @@ items: choices: null dynamic: false allowNull: false - - id: fBcf79y8CH2uWhZFKV1Nfd + - id: t24YuT1HoWD7tdb7QYoZXQ sortOrder: 1 fieldKey: company label: Company Name @@ -62379,7 +62319,7 @@ items: choices: null dynamic: false allowNull: false - - id: 8yogxd4Z3cc4TzfYrctPWt + - id: tCRKbEA1WoN22hsxvJudr4 sortOrder: 2 fieldKey: firstname label: First Name @@ -62399,7 +62339,7 @@ items: choices: null dynamic: false allowNull: false - - id: 4k6JwCdd5QaziEnaSXKuHf + - id: qcGmJjDqyEbaikHxe2zkwg sortOrder: 3 fieldKey: lastname label: Last Name @@ -62419,7 +62359,7 @@ items: choices: null dynamic: false allowNull: false - - id: mz5HESZ17B1gTKZsJycDbH + - id: hDSuR6PmMxa5prBxTXxUvm sortOrder: 4 fieldKey: phone label: Phone @@ -62433,7 +62373,7 @@ items: choices: null dynamic: false allowNull: false - - id: 381N2wgFTk5pMQSXQTZH43 + - id: kkQTnzJZziPybzuL9iZMvN sortOrder: 5 fieldKey: address label: Street Address @@ -62447,7 +62387,7 @@ items: choices: null dynamic: false allowNull: false - - id: 4ydUXVik3bv7C6X5aaRYXp + - id: praDwxC46R3UShxWV7Wa8y sortOrder: 6 fieldKey: city label: City @@ -62461,7 +62401,7 @@ items: choices: null dynamic: false allowNull: false - - id: spkp8CjRBJDEmUwqoMNcRq + - id: qCpRD1pNCHBrL9jfh11Ukc sortOrder: 7 fieldKey: state label: State @@ -62475,7 +62415,7 @@ items: choices: null dynamic: false allowNull: false - - id: dLBadxVvGzWqwPp1Wm1fW2 + - id: 8eo86YeBoYTVAdQAsEtPHq sortOrder: 8 fieldKey: country label: Country @@ -62489,7 +62429,7 @@ items: choices: null dynamic: false allowNull: false - - id: sxwT2NtMAmZEwXdro8auth + - id: 4TqFafUWz18kQcaX4hQWkm sortOrder: 9 fieldKey: zip label: Postal Code @@ -62509,7 +62449,7 @@ items: choices: null dynamic: false allowNull: false - - id: ss2u7Dd27uKniJcPGBmvMU + - id: 4uWyyPuaF9U73j8uxpQKh1 sortOrder: 10 fieldKey: website label: Website @@ -62523,7 +62463,7 @@ items: choices: null dynamic: false allowNull: false - - id: 8qe9Bxe4nFcjN6Rb4Fac2a + - id: wEjutQUx7SDJbKt57DJM2Z sortOrder: 11 fieldKey: lifecyclestage label: Lifecycle Stage @@ -62539,7 +62479,7 @@ items: choices: null dynamic: false allowNull: false - - id: xryKefrs6Dq6mJqgN4VQ3F + - id: kg7QXDvCEkSZ8VYZsVwWK7 sortOrder: 12 fieldKey: properties label: Other properties @@ -62557,7 +62497,7 @@ items: choices: null dynamic: false allowNull: false - - id: mj1uh2gajoQWhBKGChGez + - id: 2n2bQPYCGj8D1PwMtfBwGs sortOrder: 13 fieldKey: enable_batching label: Send Batch Data to HubSpot @@ -62582,7 +62522,7 @@ items: hidden: false defaultTrigger: type = "group" fields: - - id: nRZRNvpAXhwGjdLMdyGH8h + - id: rrApjdJDLKdLw9t46kxmr5 sortOrder: 0 fieldKey: groupid label: Unique Company Identifier @@ -62606,7 +62546,7 @@ items: choices: null dynamic: false allowNull: false - - id: 8Hno2mcRtitQkBmx9Sk1fh + - id: aKZGXAjq5vk2Z2emp2avtM sortOrder: 1 fieldKey: createNewCompany label: Create Company if Not Found @@ -62623,7 +62563,7 @@ items: choices: null dynamic: false allowNull: false - - id: 6i778RsTDFPGziNePk5AJ4 + - id: wrRPgUTU7zV7G9na8DKUSV sortOrder: 2 fieldKey: associateContact label: Associate Contact with Company @@ -62642,7 +62582,7 @@ items: choices: null dynamic: false allowNull: false - - id: 68VNBLHiy7A49ndak4gSH3 + - id: 6ZbDPDyhbT9ED7K1AcMV9x sortOrder: 3 fieldKey: companysearchfields label: Company Search Fields @@ -62659,7 +62599,7 @@ items: choices: null dynamic: false allowNull: false - - id: viUWHEJYxRD3VBY65SCdk + - id: 3BMsmMSRy8TjvecF2bNqNX sortOrder: 4 fieldKey: name label: Company Name @@ -62673,7 +62613,7 @@ items: choices: null dynamic: false allowNull: false - - id: 4C2D4nz8FiY9v2MwLFAsEh + - id: wWnGiFwcGbs8GfTxCGfZ6o sortOrder: 5 fieldKey: description label: Company Description @@ -62687,7 +62627,7 @@ items: choices: null dynamic: false allowNull: false - - id: qab37BAg9j1pzZcx5S54j9 + - id: b6fh8muFW95QJShTaTTDjx sortOrder: 6 fieldKey: address label: Street Address @@ -62701,7 +62641,7 @@ items: choices: null dynamic: false allowNull: false - - id: uVMLsrK71kASexcaiVe5Z8 + - id: 61hE1RBvR1KW9CL3QCwQHZ sortOrder: 7 fieldKey: city label: City @@ -62715,7 +62655,7 @@ items: choices: null dynamic: false allowNull: false - - id: gGRsfYg7GSCAJ3s3ztdzdt + - id: 7YbU3hGsy5pbpDT67PmWk6 sortOrder: 8 fieldKey: state label: State @@ -62729,7 +62669,7 @@ items: choices: null dynamic: false allowNull: false - - id: 5R2HfMUC6txJC9bVF7ja9b + - id: jQwgvdvMrnoj6C6KBxj3PG sortOrder: 9 fieldKey: zip label: Postal Code @@ -62749,7 +62689,7 @@ items: choices: null dynamic: false allowNull: false - - id: kEdokL5PrDvoYXpeCGdUTj + - id: g8b9eh3ftRFFFxNDWT2Wtc sortOrder: 10 fieldKey: domain label: Domain @@ -62763,7 +62703,7 @@ items: choices: null dynamic: false allowNull: false - - id: 6W5XETikyLRax6eHQvBU8Y + - id: gC1zTXod4fDd9cvdUqLycS sortOrder: 11 fieldKey: phone label: Phone @@ -62777,7 +62717,7 @@ items: choices: null dynamic: false allowNull: false - - id: pzjqj3BKP7H9aoMqzcqJDa + - id: 9pagwUPECaRLMqJ8SbK5yj sortOrder: 12 fieldKey: numberofemployees label: Number of Employees @@ -62791,7 +62731,7 @@ items: choices: null dynamic: false allowNull: false - - id: 9rSLRqK59Dji6zSANhgava + - id: mi6XfbaKpAEcaHFEMJqWK1 sortOrder: 13 fieldKey: industry label: Industry @@ -62805,7 +62745,7 @@ items: choices: null dynamic: false allowNull: false - - id: tXC4MshvXvfSNG7cgPWMZv + - id: cWKDBKPhTVJzyJTvhcjvbz sortOrder: 14 fieldKey: lifecyclestage label: Lifecycle Stage @@ -62821,7 +62761,7 @@ items: choices: null dynamic: false allowNull: false - - id: wNHgQFvCwEgujveWfwzWZG + - id: kPhagpW9YhqYHFyAC61Z1k sortOrder: 15 fieldKey: properties label: Other Properties @@ -62851,7 +62791,7 @@ items: hidden: false defaultTrigger: null fields: - - id: aQQRfpfb8pzEZmvScoGS4G + - id: kxSPqnXFDQXMTkcrE38Vcy sortOrder: 0 fieldKey: object_details label: Object Details @@ -62863,7 +62803,7 @@ items: choices: null dynamic: false allowNull: false - - id: xz6LDZHCmxYbaKNgKge413 + - id: iQmEqNLT2Mhtjc6jzQXmGe sortOrder: 1 fieldKey: properties label: Properties @@ -62875,7 +62815,7 @@ items: choices: null dynamic: true allowNull: false - - id: wXQn4bhhtLNLU61yxtPFTi + - id: ipq9jZegNCGyBsuoQyAbns sortOrder: 2 fieldKey: sensitive_properties label: Sensitive Properties @@ -62887,7 +62827,7 @@ items: choices: null dynamic: true allowNull: false - - id: pp8757hq6jPqQEDVPhY4F1 + - id: 8pcBfffJxYqCTMd8gvhTvz sortOrder: 3 fieldKey: association_sync_mode label: Associated Record Sync Mode @@ -62907,7 +62847,7 @@ items: value: read dynamic: false allowNull: false - - id: 9oKBmYTBK7zBYjPcSnkD9d + - id: iFYPqCCfEX3xCnqUD9ex54 sortOrder: 4 fieldKey: associations label: Associations @@ -62927,7 +62867,7 @@ items: hidden: false defaultTrigger: null fields: - - id: yuGonhqqeWPopJDdc3FyJ + - id: h7d99ZCwfEyFev1UVPcx93 sortOrder: 0 fieldKey: event_name label: Event Name @@ -62939,7 +62879,7 @@ items: choices: null dynamic: true allowNull: false - - id: 8DgdKPN2gvvJzGhefMpb4V + - id: nhdhQtU3Whix5BNauHBP5z sortOrder: 1 fieldKey: record_details label: Associated Record Details @@ -62951,7 +62891,7 @@ items: choices: null dynamic: false allowNull: false - - id: opsdKmRBYB4dftajPNTiHr + - id: 9MAhmE2ox45VxrSE8X1V6V sortOrder: 2 fieldKey: properties label: Properties @@ -62963,7 +62903,7 @@ items: choices: null dynamic: true allowNull: false - - id: wg8nJQCyFw3d185WTiMZhg + - id: w4Fz3hcKhx1iULDmweuJN sortOrder: 3 fieldKey: occurred_at label: Event Timestamp @@ -90228,7 +90168,7 @@ items: hidden: false defaultTrigger: type = "identify" fields: - - id: gaoUZPQZpURjeHcjj7mALm + - id: sWtUU45JDUQZ5FCL92HJ8C sortOrder: 0 fieldKey: user_identifiers label: User identifiers @@ -90256,12 +90196,16 @@ items: '@path': $.properties.optimizely_vuid else: '@path': $.traits.optimizely_vuid + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId required: true multiple: false choices: null dynamic: false allowNull: false - - id: xw1ikonZfaWKAjdatV2xv + - id: kgdLx9q7Jq1t8VM4LPDiWJ sortOrder: 1 fieldKey: company label: Company Name @@ -90275,7 +90219,7 @@ items: choices: null dynamic: false allowNull: false - - id: fMjdXqJDHsT4rfrRt8tESH + - id: 4bYsSx3pXPHvsMxRPv51f1 sortOrder: 2 fieldKey: title label: Title @@ -90289,7 +90233,7 @@ items: choices: null dynamic: false allowNull: false - - id: iybbwS7cUeZfWeBWf285xV + - id: eqjC7oBPuB6xaXCUfRGju1 sortOrder: 3 fieldKey: name label: Name @@ -90303,7 +90247,7 @@ items: choices: null dynamic: false allowNull: false - - id: jQQuEDs5didv1HvgJ4uLU6 + - id: 9wBFCgQFsSJUZzHSxc2qF9 sortOrder: 4 fieldKey: firstname label: First Name @@ -90317,7 +90261,7 @@ items: choices: null dynamic: false allowNull: false - - id: 212jp4XFL3FnzzTZoufV7E + - id: x6k4L2itAPMrFsbUfxgHuB sortOrder: 5 fieldKey: lastname label: Last Name @@ -90331,7 +90275,7 @@ items: choices: null dynamic: false allowNull: false - - id: aJG9xokgqjjg1EeC9nwocS + - id: e3uzYhjnjfpqprzUpQyc1a sortOrder: 6 fieldKey: gender label: Gender @@ -90345,7 +90289,7 @@ items: choices: null dynamic: false allowNull: false - - id: piPkDaZDvsNvxmXNn2ebcc + - id: 23w7GDVXndkJ2Qi5ovCF2s sortOrder: 7 fieldKey: DOB label: Birthday @@ -90359,7 +90303,7 @@ items: choices: null dynamic: false allowNull: false - - id: sqYqZHz4KbKwfqDRyjZALQ + - id: tjju6UnfFpRaEsW5LduNE2 sortOrder: 8 fieldKey: phone label: Phone @@ -90373,7 +90317,7 @@ items: choices: null dynamic: false allowNull: false - - id: msHxKMpN3tcXpwduiBDnPp + - id: rXpqNfQt3UucQnc57HA7jP sortOrder: 9 fieldKey: age label: Age @@ -90387,7 +90331,7 @@ items: choices: null dynamic: false allowNull: false - - id: 5qM5kK9b9d8ZnUV26RPXZC + - id: 9pGCjbJ2CjzBdkzWaihLiv sortOrder: 10 fieldKey: address label: Address @@ -90410,7 +90354,7 @@ items: choices: null dynamic: false allowNull: false - - id: jhJfvsfEGTGZzEC6dpdRZK + - id: 5tDd9irhQKJGCWVb1WZF1z sortOrder: 11 fieldKey: avatar label: avatar @@ -90424,7 +90368,7 @@ items: choices: null dynamic: false allowNull: false - - id: uc5tzWoN6FeAq2hgAovLFo + - id: 5vfbfoGi34VxHjy9WVEK7L sortOrder: 12 fieldKey: additional_traits label: Addition User Traits @@ -90444,7 +90388,7 @@ items: hidden: false defaultTrigger: null fields: - - id: iff8iAHVoS5CExhSuge4ZQ + - id: ty3D3VLGGD3X5UYLTZ764e sortOrder: 0 fieldKey: user_identifiers label: User identifiers @@ -90472,12 +90416,16 @@ items: '@path': $.properties.optimizely_vuid else: '@path': $.context.traits.optimizely_vuid + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId required: true multiple: false choices: null dynamic: false allowNull: false - - id: 8f4YNXHK5CtFnCUnvGV6Q9 + - id: tHij7D1fg8H3KUuC6hqFf sortOrder: 1 fieldKey: event_action label: Optimizely Event Action @@ -90489,7 +90437,7 @@ items: choices: null dynamic: false allowNull: false - - id: xg2H1RYJ2FiHTfPYkzStjL + - id: aWDvskPwGeqZPdD7HCkNDg sortOrder: 2 fieldKey: campaign label: Campaign Name @@ -90503,7 +90451,7 @@ items: choices: null dynamic: false allowNull: false - - id: sJaWbY1CPvCm3eYW86zSQL + - id: rFyE5wvxoYHdxSYoCde5bp sortOrder: 3 fieldKey: campaign_id label: Campaign ID @@ -90517,7 +90465,7 @@ items: choices: null dynamic: false allowNull: false - - id: if66b7vsHktLPQSYbhR5ca + - id: qJb5GuwUGmc7RYQErzSBjy sortOrder: 4 fieldKey: link_url label: Link URL @@ -90531,7 +90479,7 @@ items: choices: null dynamic: false allowNull: false - - id: 4tBBsWt6KutdAoKM4rr2jk + - id: 8SsyoKcvYqJBH1AuGps1AP sortOrder: 5 fieldKey: timestamp label: Timestamp @@ -90553,7 +90501,7 @@ items: hidden: false defaultTrigger: null fields: - - id: 7oERk4PHbNESX5V4irBxUW + - id: 5ByVEAaN4d1UdTGSyBN81f sortOrder: 0 fieldKey: user_identifiers label: User identifiers @@ -90581,12 +90529,16 @@ items: '@path': $.properties.optimizely_vuid else: '@path': $.traits.optimizely_vuid + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId required: true multiple: false choices: null dynamic: false allowNull: false - - id: bEjPGknXCxxyQbcYQFYA93 + - id: ADTWeEnk85sTSCZuZXwD4 sortOrder: 1 fieldKey: event_type label: Optimizely Event Type @@ -90600,7 +90552,7 @@ items: choices: null dynamic: false allowNull: false - - id: u3z41Dt5qHkuJEoA9mS4r8 + - id: qbTEuuwM5CBve8L5gvi2Fq sortOrder: 2 fieldKey: event_action label: Optimizely Event Action @@ -90612,7 +90564,7 @@ items: choices: null dynamic: false allowNull: false - - id: bb6d3kFwvzX225Sqhjwkjy + - id: seCKLjbxhZqiqPkQxrVKNy sortOrder: 3 fieldKey: products label: Product details @@ -90633,7 +90585,7 @@ items: choices: null dynamic: false allowNull: false - - id: wpTXtX1NZbkZTtDpd4CdNm + - id: e1iyvMzZCRFy5ohAAWuct5 sortOrder: 4 fieldKey: order_id label: Order ID @@ -90647,7 +90599,7 @@ items: choices: null dynamic: false allowNull: false - - id: deZWVgeJdUbxALrawUmG5j + - id: mgYJ1HGrftbYTHbFrZmt3R sortOrder: 5 fieldKey: total label: Order Total @@ -90661,7 +90613,7 @@ items: choices: null dynamic: false allowNull: false - - id: 5kxuyG37oHoBxFCpvgDVpG + - id: rFy9rXhHvhMYWs31Hy2mYa sortOrder: 6 fieldKey: timestamp label: Timestamp @@ -90683,7 +90635,7 @@ items: hidden: false defaultTrigger: null fields: - - id: 9SvrqpiESGuWqLFVfNzHob + - id: heW1fP9ZggtrUhZeNEuYmk sortOrder: 0 fieldKey: user_identifiers label: User identifiers @@ -90711,12 +90663,16 @@ items: '@path': $.properties.optimizely_vuid else: '@path': $.traits.optimizely_vuid + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId required: true multiple: false choices: null dynamic: false allowNull: false - - id: wmufL5LBhvXk8pZoEeQP7z + - id: jeRXqeaks1TxHfM57n1jPg sortOrder: 1 fieldKey: event_type label: Optimizely Event Type @@ -90730,7 +90686,7 @@ items: choices: null dynamic: false allowNull: false - - id: 44BrCsz1Jiq6Tp8GF74euQ + - id: izuwbaiu8g9Vfu39ka9xU6 sortOrder: 2 fieldKey: event_action label: Optimizely Event Action @@ -90742,7 +90698,7 @@ items: choices: null dynamic: false allowNull: false - - id: 9egos4J7DtbQTaLTwdgPoU + - id: k2QWpArvTsnuDwkJGrkod4 sortOrder: 3 fieldKey: data label: Event Properties @@ -90756,7 +90712,7 @@ items: choices: null dynamic: false allowNull: false - - id: obpagJcURrkD7AdJgNhboT + - id: 9Z927KoQweF4eR81mURyPG sortOrder: 4 fieldKey: timestamp label: Timestamp @@ -90772,7 +90728,7 @@ items: allowNull: false presets: - actionId: hcqEnue2U8oG3e3iVHW5KV - name: Unsubscribed + name: Email Link Clicked fields: user_identifiers: anonymousId: @@ -90795,6 +90751,10 @@ items: '@path': $.properties.optimizely_vuid else: '@path': $.context.traits.optimizely_vuid + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId campaign: '@path': $.properties.campaign_name campaign_id: @@ -90805,52 +90765,10 @@ items: '@path': $.timestamp enable_batching: true batch_size: 100 - event_action: unsubscribe - trigger: type = "track" and event = "Unsubscribed" - - actionId: meD4xgcJ8b3f29gWudiuFQ - name: Order Completed - fields: - user_identifiers: - anonymousId: - '@path': $.anonymousId - userId: - '@path': $.userId - email: - '@if': - exists: - '@path': $.properties.email - then: - '@path': $.properties.email - else: - '@path': $.traits.email - optimizely_vuid: - '@if': - exists: - '@path': $.properties.optimizely_vuid - then: - '@path': $.properties.optimizely_vuid - else: - '@path': $.traits.optimizely_vuid - event_type: order - products: - '@arrayPath': - - $.properties.products - - product_id: - '@path': $.product_id - qty: - '@path': $.quantity - order_id: - '@path': $.properties.order_id - total: - '@path': $.properties.total - timestamp: - '@path': $.timestamp - enable_batching: true - batch_size: 100 - event_action: purchase - trigger: type = "track" and event = "Order Completed" + event_action: click + trigger: type = "track" and event = "Email Link Clicked" - actionId: hcqEnue2U8oG3e3iVHW5KV - name: Email Sent + name: Email Opened fields: user_identifiers: anonymousId: @@ -90873,6 +90791,10 @@ items: '@path': $.properties.optimizely_vuid else: '@path': $.context.traits.optimizely_vuid + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId campaign: '@path': $.properties.campaign_name campaign_id: @@ -90883,8 +90805,8 @@ items: '@path': $.timestamp enable_batching: true batch_size: 100 - event_action: sent - trigger: type = "track" and event = "Email Sent" + event_action: open + trigger: type = "track" and event = "Email Opened" - actionId: meD4xgcJ8b3f29gWudiuFQ name: Product Added fields: @@ -90909,6 +90831,10 @@ items: '@path': $.properties.optimizely_vuid else: '@path': $.traits.optimizely_vuid + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId event_type: product products: '@arrayPath': @@ -90928,7 +90854,7 @@ items: event_action: add_to_cart trigger: type = "track" and event = "Product Added" - actionId: meD4xgcJ8b3f29gWudiuFQ - name: Product Viewed + name: Order Completed fields: user_identifiers: anonymousId: @@ -90951,10 +90877,14 @@ items: '@path': $.properties.optimizely_vuid else: '@path': $.traits.optimizely_vuid - event_type: product + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId + event_type: order products: '@arrayPath': - - $.properties + - $.properties.products - product_id: '@path': $.product_id qty: @@ -90967,10 +90897,10 @@ items: '@path': $.timestamp enable_batching: true batch_size: 100 - event_action: detail - trigger: type = "track" and event = "Product Viewed" + event_action: purchase + trigger: type = "track" and event = "Order Completed" - actionId: hcqEnue2U8oG3e3iVHW5KV - name: Email Marked as Spam + name: Email Sent fields: user_identifiers: anonymousId: @@ -90993,6 +90923,10 @@ items: '@path': $.properties.optimizely_vuid else: '@path': $.context.traits.optimizely_vuid + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId campaign: '@path': $.properties.campaign_name campaign_id: @@ -91003,8 +90937,8 @@ items: '@path': $.timestamp enable_batching: true batch_size: 100 - event_action: spam_report - trigger: type = "track" and event = "Email Marked as Spam" + event_action: sent + trigger: type = "track" and event = "Email Sent" - actionId: meD4xgcJ8b3f29gWudiuFQ name: Product Removed fields: @@ -91029,6 +90963,10 @@ items: '@path': $.properties.optimizely_vuid else: '@path': $.traits.optimizely_vuid + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId event_type: product products: '@arrayPath': @@ -91048,7 +90986,7 @@ items: event_action: remove_from_cart trigger: type = "track" and event = "Product Removed" - actionId: hcqEnue2U8oG3e3iVHW5KV - name: Email Link Clicked + name: Email Marked as Spam fields: user_identifiers: anonymousId: @@ -91071,6 +91009,10 @@ items: '@path': $.properties.optimizely_vuid else: '@path': $.context.traits.optimizely_vuid + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId campaign: '@path': $.properties.campaign_name campaign_id: @@ -91081,10 +91023,56 @@ items: '@path': $.timestamp enable_batching: true batch_size: 100 - event_action: click - trigger: type = "track" and event = "Email Link Clicked" + event_action: spam_report + trigger: type = "track" and event = "Email Marked as Spam" + - actionId: meD4xgcJ8b3f29gWudiuFQ + name: Product Viewed + fields: + user_identifiers: + anonymousId: + '@path': $.anonymousId + userId: + '@path': $.userId + email: + '@if': + exists: + '@path': $.properties.email + then: + '@path': $.properties.email + else: + '@path': $.traits.email + optimizely_vuid: + '@if': + exists: + '@path': $.properties.optimizely_vuid + then: + '@path': $.properties.optimizely_vuid + else: + '@path': $.traits.optimizely_vuid + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId + event_type: product + products: + '@arrayPath': + - $.properties + - product_id: + '@path': $.product_id + qty: + '@path': $.quantity + order_id: + '@path': $.properties.order_id + total: + '@path': $.properties.total + timestamp: + '@path': $.timestamp + enable_batching: true + batch_size: 100 + event_action: detail + trigger: type = "track" and event = "Product Viewed" - actionId: hcqEnue2U8oG3e3iVHW5KV - name: Email Opened + name: Unsubscribed fields: user_identifiers: anonymousId: @@ -91107,6 +91095,10 @@ items: '@path': $.properties.optimizely_vuid else: '@path': $.context.traits.optimizely_vuid + fs_user_id: + '@path': $.userId + web_user_id: + '@path': $.userId campaign: '@path': $.properties.campaign_name campaign_id: @@ -91117,8 +91109,8 @@ items: '@path': $.timestamp enable_batching: true batch_size: 100 - event_action: open - trigger: type = "track" and event = "Email Opened" + event_action: unsubscribe + trigger: type = "track" and event = "Unsubscribed" partnerOwned: true - id: 641d5acea88fa531b9068608 display_name: Optimizely Feature Experimentation (Actions) @@ -94582,6 +94574,12 @@ items: description: Podscribe advertiser lookup key required: true label: Advertiser + - name: userId + type: string + defaultValue: '' + description: Podscribe user ID + required: false + label: User ID actions: - id: otTeGZNHmduwXWxaTMe4ux name: Page @@ -94591,7 +94589,7 @@ items: hidden: false defaultTrigger: type = "page" fields: - - id: cYZYdxvQzBev6fZR5xdzwf + - id: 5uHaFgAuEX7NBT9LhZPdHB sortOrder: 0 fieldKey: anonymousId label: Anonymous ID @@ -94606,7 +94604,7 @@ items: dynamic: false allowNull: true hidden: false - - id: hsGJRRqsjoFqZKZ82zpxZB + - id: fEfhwnZP67QtjrKMevQGQX sortOrder: 1 fieldKey: timestamp label: Timestamp @@ -94621,7 +94619,7 @@ items: dynamic: false allowNull: false hidden: false - - id: v1VGGytx1NYqUgYHDSn5MT + - id: iiXRhnbzJzxJy9cM6Pf1Mt sortOrder: 2 fieldKey: referrer label: Page Referrer @@ -94642,7 +94640,7 @@ items: dynamic: false allowNull: true hidden: false - - id: dnSccvhcXFtXq7FYb6ap9v + - id: diiPjvHqaf6tGEmjphHNPG sortOrder: 3 fieldKey: url label: Page URL @@ -94663,7 +94661,7 @@ items: dynamic: false allowNull: true hidden: false - - id: 6oR6Ba2jbPHFvpK3QRXbrG + - id: apHTUdviHqCYGMnipvLqoa sortOrder: 4 fieldKey: ip label: User IP address @@ -94678,7 +94676,7 @@ items: dynamic: false allowNull: false hidden: false - - id: sN55PJZPUndAZcHmGz7nMr + - id: ek6YjM1tbkqzqpeM48Je9E sortOrder: 5 fieldKey: library label: Segment Library @@ -94693,7 +94691,7 @@ items: dynamic: false allowNull: false hidden: false - - id: iMhGsP389b4qc7JsMJ8Zt1 + - id: 5KLt95PKDgZHnLv55wEdSe sortOrder: 6 fieldKey: userAgent label: User Agent @@ -94716,7 +94714,7 @@ items: hidden: false defaultTrigger: type = "track" fields: - - id: c5Cyryb66879sYfKuvi379 + - id: mqrEKxee9sT6bNCTo75smv sortOrder: 0 fieldKey: anonymousId label: Anonymous ID @@ -94731,7 +94729,7 @@ items: dynamic: false allowNull: true hidden: false - - id: f9Bz4NCkmubwGLLcP1yWYs + - id: 2rGX2NhqhWpbwwhthRnATn sortOrder: 1 fieldKey: timestamp label: Timestamp @@ -94746,7 +94744,7 @@ items: dynamic: false allowNull: false hidden: false - - id: 92McJykQw7qH8Xi5gjTGuA + - id: rdH29EvEg6ApWbmfokGrhs sortOrder: 2 fieldKey: referrer label: Page Referrer @@ -94767,7 +94765,7 @@ items: dynamic: false allowNull: true hidden: false - - id: 31apiakvDM1jTp7dKFVBzs + - id: tGhm8a2RJjRwtvfcsXgrCR sortOrder: 3 fieldKey: url label: Page URL @@ -94788,7 +94786,7 @@ items: dynamic: false allowNull: true hidden: false - - id: 7ExWVm19PLZVYzfbXMFaUC + - id: rWv1kvRDeEifBKd1KG66LG sortOrder: 4 fieldKey: ip label: User IP address @@ -94803,7 +94801,7 @@ items: dynamic: false allowNull: false hidden: false - - id: npX2zKEB16yMmz7VYeaGhn + - id: nNUtsrNYXZaVZqsSJaY3FV sortOrder: 5 fieldKey: library label: Segment Library @@ -94818,7 +94816,7 @@ items: dynamic: false allowNull: false hidden: false - - id: iGvB5w2qXuASKesXnRrQTy + - id: 5dKUFVHMEurLRkURw5VSsQ sortOrder: 6 fieldKey: userAgent label: User Agent @@ -94833,7 +94831,7 @@ items: dynamic: false allowNull: false hidden: false - - id: bQSecVUCXwSGEszBLvYeXX + - id: 7AoFf1AcKS9pQeENf3z3sX sortOrder: 7 fieldKey: email label: Email address @@ -94854,7 +94852,7 @@ items: dynamic: false allowNull: true hidden: false - - id: 56kZ2bxgbeXT5JRHTefFfD + - id: dswRFtZ8kswSsP44B6c4Yz sortOrder: 8 fieldKey: properties label: Event properties @@ -94882,7 +94880,7 @@ items: dynamic: false allowNull: false hidden: false - - id: tSQ1Q4pFQpoKoWy8YGbe2u + - id: azmHnoj58EZPwtJ2e8eXn sortOrder: 9 fieldKey: podscribeEvent label: Podscribe event type @@ -94952,8 +94950,8 @@ items: '@path': $.properties.is_subscription podscribeEvent: purchase trigger: type = "track" and event = "Order Completed" - - actionId: wXFTRjNRXRVqqSPeFL66YJ - name: Signed Up Calls + - actionId: otTeGZNHmduwXWxaTMe4ux + name: Page Calls fields: anonymousId: '@path': $.anonymousId @@ -94981,33 +94979,9 @@ items: '@path': $.context.library userAgent: '@path': $.context.userAgent - email: - '@if': - exists: - '@path': $.context.traits.email - then: - '@path': $.context.traits.email - else: - '@path': $.properties.email - properties: - total: - '@path': $.properties.total - order_id: - '@path': $.properties.order_id - currency: - '@path': $.properties.currency - coupon: - '@path': $.properties.coupon - num_items_purchased: - '@path': $.properties.num_items_purchased - is_new_customer: - '@path': $.properties.is_new_customer - is_subscription: - '@path': $.properties.is_subscription - podscribeEvent: signup - trigger: type = "track" and event = "Signed Up" - - actionId: otTeGZNHmduwXWxaTMe4ux - name: Page Calls + trigger: type = "page" + - actionId: wXFTRjNRXRVqqSPeFL66YJ + name: Signed Up Calls fields: anonymousId: '@path': $.anonymousId @@ -95035,7 +95009,31 @@ items: '@path': $.context.library userAgent: '@path': $.context.userAgent - trigger: type = "page" + email: + '@if': + exists: + '@path': $.context.traits.email + then: + '@path': $.context.traits.email + else: + '@path': $.properties.email + properties: + total: + '@path': $.properties.total + order_id: + '@path': $.properties.order_id + currency: + '@path': $.properties.currency + coupon: + '@path': $.properties.coupon + num_items_purchased: + '@path': $.properties.num_items_purchased + is_new_customer: + '@path': $.properties.is_new_customer + is_subscription: + '@path': $.properties.is_subscription + podscribeEvent: signup + trigger: type = "track" and event = "Signed Up" partnerOwned: true - id: 5d25eddde3ff660001b3adda display_name: Podsights @@ -97154,7 +97152,7 @@ items: previous_names: - Recombee website: https://www.recombee.com - status: PUBLIC_BETA + status: PUBLIC categories: - Personalization - Marketing Automation @@ -102499,7 +102497,7 @@ items: hidden: false defaultTrigger: type = "track" or type = "identify" fields: - - id: aCdquof3Bd6c3wug29BeEY + - id: m2kriU4SGQa1xwXZLAcnJ1 sortOrder: 0 fieldKey: custom_audience_name label: Custom Audience Name @@ -102514,7 +102512,7 @@ items: dynamic: false allowNull: false hidden: false - - id: 4qkzJunzrb3ZTtn5VEXgHo + - id: 8foubWaS3F8SEM6BvrV81W sortOrder: 1 fieldKey: segment_computation_action label: Segment Computation Action @@ -102531,12 +102529,14 @@ items: dynamic: false allowNull: false hidden: false - - id: fq5EwYtoVfnBh5wRJ6YMhH + - id: poTpnUr2v1okG6zFKWdaPD sortOrder: 2 fieldKey: email label: Email type: STRING - description: User's email address for including/excluding from custom audience + description: >- + User's email address to be included/excluded from the custom audience. + One of either email_sha256 or email must be specified. placeholder: '' defaultValue: '@if': @@ -102546,14 +102546,36 @@ items: '@path': $.context.traits.email else: '@path': $.traits.email - required: true + required: false multiple: false choices: null dynamic: false allowNull: false hidden: false - - id: ae6rFSFRB9dSGZNVAxPxjb + - id: bRRuzs6Qx2oujG33Sydv1i sortOrder: 3 + fieldKey: email_sha256 + label: Email SHA256 + type: STRING + description: >- + User's SHA256-hashed email address to be included/excluded from the + custom audience. One of either email_sha256 or email must be specified. + placeholder: '' + defaultValue: + '@if': + exists: + '@path': $.context.traits.email_sha256 + then: + '@path': $.context.traits.email_sha256 + else: + '@path': $.traits.email_sha256 + required: false + multiple: false + choices: null + dynamic: false + allowNull: false + - id: a6YHzmbqbXRnMaTboRcr9F + sortOrder: 4 fieldKey: traits_or_props label: traits or properties object type: OBJECT @@ -102573,8 +102595,8 @@ items: dynamic: false allowNull: false hidden: false - - id: btfk8jdv6uDRh7KT6dmcwC - sortOrder: 4 + - id: b4mjo4w2Cd9hfVF68E1on2 + sortOrder: 5 fieldKey: enable_batching label: enable batching to rokt api type: BOOLEAN @@ -102605,6 +102627,14 @@ items: '@path': $.context.traits.email else: '@path': $.traits.email + email_sha256: + '@if': + exists: + '@path': $.context.traits.email_sha256 + then: + '@path': $.context.traits.email_sha256 + else: + '@path': $.traits.email_sha256 traits_or_props: '@if': exists: @@ -132757,7 +132787,7 @@ items: previous_names: - Userpilot Cloud (Actions) website: https://userpilot.com/ - status: PUBLIC_BETA + status: PUBLIC categories: - Personalization - Analytics @@ -132982,7 +133012,7 @@ items: previous_names: - Userpilot Web (Actions) website: https://userpilot.com/ - status: PUBLIC_BETA + status: PUBLIC categories: - Personalization - Analytics diff --git a/src/_data/catalog/destinations_private.yml b/src/_data/catalog/destinations_private.yml index 61d530d36b..a930152ec4 100644 --- a/src/_data/catalog/destinations_private.yml +++ b/src/_data/catalog/destinations_private.yml @@ -1,5 +1,5 @@ # AUTOGENERATED FROM PUBLIC API. DO NOT EDIT -# destination data last updated 2025-04-10 +# destination data last updated 2025-05-08 items: - id: 54521fd925e721e32a72eee1 display_name: Pardot diff --git a/src/_data/catalog/source_categories.yml b/src/_data/catalog/source_categories.yml index af303e8e13..4f4fee434d 100644 --- a/src/_data/catalog/source_categories.yml +++ b/src/_data/catalog/source_categories.yml @@ -1,5 +1,5 @@ # AUTOGENERATED FROM PUBLIC API. DO NOT EDIT -# source categories last updated 2025-04-10 +# source categories last updated 2025-05-08 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 b05ab5cfeb..19ac91cd50 100644 --- a/src/_data/catalog/sources.yml +++ b/src/_data/catalog/sources.yml @@ -1,5 +1,5 @@ # AUTOGENERATED FROM PUBLIC API. DO NOT EDIT -# sources last updated 2025-04-10 +# sources last updated 2025-05-08 items: - id: 8HWbgPTt3k display_name: .NET diff --git a/src/_data/sidenav/main.yml b/src/_data/sidenav/main.yml index 0e442607d6..2c75846dec 100644 --- a/src/_data/sidenav/main.yml +++ b/src/_data/sidenav/main.yml @@ -448,6 +448,10 @@ sections: title: Linked Audiences Overview - path: '/engage/audiences/linked-audiences-limits' title: Linked Audiences Limits + - path: '/engage/audiences/linked-audiences-braze' + title: Linked Audiences with Braze + - path : '/engage/audiences/linked-audiences-iterable' + title: Linked Audiences with Iterable - path: '/engage/audiences/account-audiences' title: Account-level Audiences - path: '/engage/audiences/generative-audiences' diff --git a/src/connections/alerting.md b/src/connections/alerting.md index 690fe781ec..09f74d8a70 100644 --- a/src/connections/alerting.md +++ b/src/connections/alerting.md @@ -24,7 +24,7 @@ To create a source volume alert: 3. On the Create alert sidesheet, enter a percentage of source volume change that you'd like to be notified for. 4. Select one or more of the following alert channels: - **Email**: Select this to receive notifications at the provided email address. - - **Slack**: Select this to send alerts to one or more channels in your workspace. + - **Slack**: Select this to send alerts to one or more channels in your workspace. You can post messages to your channel with either a [webhook](https://api.slack.com/messaging/webhooks){:target="_blank”} or a [workflow](https://slack.com/help/articles/360041352714-Build-a-workflow--Create-a-workflow-that-starts-outside-of-Slack){:target="_blank”}. - **In-app**: Select this to receive notifications in the Segment app. To view your notifications, select the bell next to your user icon in the Segment app. 5. Click **Save**. @@ -46,7 +46,7 @@ To create a successful delivery rate alert: 3. On the Create alert sidesheet, enter a percentage. You will receive events if your successful delivery rate falls below this percentage. 4. Select one of the following alert channels: - **Email**: Select this to receive notifications at either the email address associated with your account or another email address that you enter into this field. - - **Slack**: Select this and enter a Slack webhook URL and channel name to send alerts to a channel in your Slack workspace. + - **Slack**: Select this to send alerts to one or more channels in your workspace. You can post messages to your channel with either a [webhook](https://api.slack.com/messaging/webhooks){:target="_blank”} or a [workflow](https://slack.com/help/articles/360041352714-Build-a-workflow--Create-a-workflow-that-starts-outside-of-Slack){:target="_blank”}. - **In-app**: Select this to receive notifications in the Segment app. To view your notifications, select the bell next to your user icon in the Segment app. 5. Click **Save**. diff --git a/src/connections/auto-instrumentation/configuration.md b/src/connections/auto-instrumentation/configuration.md index cb1e143e5c..1f5af89c19 100644 --- a/src/connections/auto-instrumentation/configuration.md +++ b/src/connections/auto-instrumentation/configuration.md @@ -10,8 +10,8 @@ This guide details how to use signals, and their associated data, generated in o This guide assumes that you've already added the Signals SDK to your application. If you haven't yet, see the [Auto-Instrumentation Setup](/docs/connections/auto-instrumentation/) guide for initial setup. -> info "Auto-Instrumentation Pilot" -> Auto-Instrumentation is currently in pilot and is governed by Segment's [First Access and Beta Preview Terms](https://www.twilio.com/en-us/legal/tos){:target="_blank"}. Segment is actively iterating on and improving the Auto-Instrumentation user experience. +> info "Auto-Instrumentation Private Beta" +> Auto-Instrumentation is currently in Private Beta and is governed by Segment's [First Access and Beta Preview Terms](https://www.twilio.com/en-us/legal/tos){:target="_blank"}. Segment is actively iterating on and improving the Auto-Instrumentation user experience. > success "Enable Auto-Instrumentation" > To enable Auto-Instrumentation in your Segment workspace, reach out to your dedicated account manager. @@ -26,6 +26,9 @@ After you set up the Signals SDK to capture the signals you want to target, you 1. In your Segment workspace, go to to **Connections > Auto-Instrumentation** and click on a source. 2. Click **Create Rules**. +> info "Where's the Event Builder tab?" +> The Event Builder tab only appears after you've installed the Auto-Instrumentation snippet in your site or app. If you don’t see the tab, double check your implementation or reach out to your Segment CSM. + ### Using the Rules Editor The Rules Editor is where you define rules that transform raw signal data into analytics events. In the editor, you write functions that convert signals into events and then call them in the `processSignal()` function. diff --git a/src/connections/auto-instrumentation/event-builder.md b/src/connections/auto-instrumentation/event-builder.md new file mode 100644 index 0000000000..c52f14a8de --- /dev/null +++ b/src/connections/auto-instrumentation/event-builder.md @@ -0,0 +1,89 @@ +--- +title: Auto-Instrumentation Event Builder +hidden: true +--- + +The Event Builder provides a no-code way to define analytics events based on signals collected by Auto-Instrumentation. + +You can use it to create Track, Identify, Page, and other event types directly from your Segment workspace. + +> info "Auto-Instrumentation Private Beta" +> Auto-Instrumentation is currently in Private Beta and is governed by Segment's [First Access and Beta Preview Terms](https://www.twilio.com/en-us/legal/tos){:target="_blank"}. Segment is actively iterating on and improving the Auto-Instrumentation user experience. + +## Access the Event Builder + +The Event Builder appears as a tab within each source, next to the Debugger. If you don't see the Event Builder tab, first confirm that you've installed the required Auto-Instrumentation SDK. + +If you've installed the SDK but still don't see the Event Builder tab, reach out to your Segment account manager to verify your workspace is included in the Auto-Instrumentation Private Beta. + +![The Event Builder tab shown in the navigation bar between Debugger and Schema in a Segment source](images/event_builder_tab.png) + +> info "Event Builder during Private Beta" +> During Private Beta, both the Event Builder and the legacy Auto-Instrumentation tab appear in the navigation. Segment will remove the legacy tab once all customers have migrated to the Event Builder experience. + +## Generate activity + +To populate the Event Builder with signals, you first need to open your website or app with a special query parameter that enables signal detection. + +1. Visit your site or app in a browser, and add `?segment_signals_debug=true` to the end of the URL. + For example: `https://www.your-website.com?segment_signals_debug=true`. +2. Interact with your app as a user would: click buttons, navigate between pages or screens, submit forms, and so on. +3. Return to the Event Builder tab in Segment to view the signals being collected in real time. + + +![Prompt in the Event Builder showing how to start detecting activity by visiting the website with a debug query parameter and interacting with the app](images/detecting_activity.png) + +> info "Enable signal detection" +> Segment only detects signals when you access your site using the `?segment_signals_debug=true` query parameter. If you visit your site without it, signals won't show up in the Event Builder. + +Segment collects and displays activity as signals. These signals are grouped into types, like: + +- Interaction: clicks, taps, and UI interactions. +- Navigation: screen changes and page transitions +- Network: requests and responses +- `LocalData`, Instrumentation, and `UserDefined`: additional signal types from the SDK. + +### How signals relate to events + +Segment separates signal collection from event creation. Signals represent raw user interactions, like a button click or screen view. Events, on the other hand, are analytics calls you define based on those signals. This two-step process lets you observe user behavior first, and then decide how and when to turn that behavior into structured analytics events, without needing to modify your code. + +Signal detection is active for 24 hours after you generate activity. Detected signals are available in the Event Builder for 72 hours. + +## Create an event + +You can create events by selecting individual signals or combining multiple signals in sequence. + +Follow these steps to create an event: + +1. Find the signal you want to use and click **Configure event**. +2. Add one or more conditions. The order matters; Segment evaluates them in the order you add them. + - For example, to track a successful login, first select a **button click** signal, then the **network response** signal. +3. Select properties from the signal(s) to include in your event. +4. Map those properties to your targeted Segment event fields. +5. Name your event. This name will appear in the Debugger and downstream tools. +6. Click **Publish event rules** to activate the event in your workspace. + - You must publish each rule before Segment starts collecting data for the event. + +For example, suppose a user taps an "Add to Cart" button. You can define an `Add to Cart` event by combining the button click signal with a network response signal that includes product details. You can then map properties like product name, ID, and price directly from the network response to your event. + +Once published, your event rules appear in the **Event Rules** tab of the Event Builder. From this tab, you can view all of your published rules and delete rules you no longer need. + +![The Event Rules tab shown in the Event Builder, showing six custom rules, categorized by event type](images/event_rules.png) + +## Choose an event type + +When you define an event in the Event Builder, you assign it a type that determines how Segment and your connected destinations process it. These event types (Track, Identify, Page, and Screen) follow the same structure and behavior defined in the [Segment Spec](/docs/connections/spec/). + +| Event type | Description | +| ---------- | ----------------------------------------------------------------------------------------------------------- | +| Track | Custom event tracking. Use this for user actions like `Product Viewed`, `Add to Cart`, or `Signup Started`. | +| Identify | User identification. Use this to associate traits (like `email`, `userId`, or `plan`) with a known user. | +| Page | Web page view tracking. Use this to record visits to pages on your website. | +| Screen | Mobile screen view tracking. Use this to record views of screens in your mobile app. | + +For example, to track a login flow, you might define an Identify event that maps traits like `userId` and `email` from a network response signal. To track cart activity, you could define a Track event like `Checkout Started` with properties like cart value, item count, and currency. + +Segment uses the event name and any mapped properties to format each event according to the Segment Spec. Events you create in the Event Builder behave the same way as events sent through Segment SDKs or APIs. + +> info "Event type behavior in destinations" +> While Segment handles these event types consistently, downstream tools may treat them differently. For example, Identify events often update user profiles, while Page or Screen events may be handled as pageviews instead of custom events. \ No newline at end of file diff --git a/src/connections/auto-instrumentation/images/detecting_activity.png b/src/connections/auto-instrumentation/images/detecting_activity.png new file mode 100644 index 0000000000..daa6774561 Binary files /dev/null and b/src/connections/auto-instrumentation/images/detecting_activity.png differ diff --git a/src/connections/auto-instrumentation/images/event_builder_tab.png b/src/connections/auto-instrumentation/images/event_builder_tab.png new file mode 100644 index 0000000000..8de6f6e78f Binary files /dev/null and b/src/connections/auto-instrumentation/images/event_builder_tab.png differ diff --git a/src/connections/auto-instrumentation/images/event_rules.png b/src/connections/auto-instrumentation/images/event_rules.png new file mode 100644 index 0000000000..98000b46f2 Binary files /dev/null and b/src/connections/auto-instrumentation/images/event_rules.png differ diff --git a/src/connections/auto-instrumentation/index.md b/src/connections/auto-instrumentation/index.md index 5045ffa336..28e0b014aa 100644 --- a/src/connections/auto-instrumentation/index.md +++ b/src/connections/auto-instrumentation/index.md @@ -24,35 +24,36 @@ redirect_from: - '/docs/connections/auto-instrumentation/setup/' --- -Auto-Instrumentation simplifies tracking in your websites and apps by eliminating the need for a traditional Segment instrumentation. +Auto-Instrumentation simplifies tracking in your websites and apps by removing the need for a traditional Segment instrumentation. -> info "Auto-Instrumentation Pilot" -> Auto-Instrumentation is currently in pilot and is governed by Segment's [First Access and Beta Preview Terms](https://www.twilio.com/en-us/legal/tos){:target="_blank"}. Segment is actively iterating on and improving the Auto-Instrumentation user experience. +> info "Auto-Instrumentation Private Beta" +> Auto-Instrumentation is currently in private beta and is governed by Segment's [First Access and Beta Preview Terms](https://www.twilio.com/en-us/legal/tos){:target="_blank"}. Segment is actively iterating on and improving the Auto-Instrumentation user experience. > success "Enable Auto-Instrumentation in your workspace" > To enable Auto-Instrumentation in your Segment workspace, reach out to your dedicated account manager. ## Background -Gathering actionable and timely data is crucial to the success of your business. However, collecting this data in real time has historically proven to be challenging. - -As your business needs change, keeping instrumentation up-to-date across all of your digital properties can be time-consuming, often taking weeks or months. This delay can lead to lost insights, frustration for your marketers and developers, and open-ended support of your Segment instrumentation. +Collecting high-quality analytics data is essential, but traditional tracking setups often fall behind as business needs change. Instrumentation updates can take weeks or months, and these delays reduce visibility and increase the burden on engineering teams. ## Auto-Instrumentation as a solution With just a few lines of code, Auto-Instrumentation handles device tracking for you, helping you focus on collecting the data that's essential to your business and letting your marketers and data analysts gather and update data without relying on engineering teams. -Some Auto-Instrumentation advantages include: +Key Auto-Instrumentation benefits include: + +- **No-code event creation**: Use the Event Builder tab to define events based on user activity; no JavaScript required. +- **Fast iteration**: Update your tracking configuration at any time, without deploying new app versions. +- **Fewer dependencies**: Reduce the need for engineering support while still maintaining reliable event tracking. -- **JavaScript-based instrumentation logic**: Configure and refine your instrumentation logic entirely within JavaScript, simplifying the development process and reducing dependencies on other environments. -- **Rapid iteration**: Update your instrumentation logic without the need to constantly release new versions of your mobile app, enabling faster iterations and improvements. -- **Bypass update delays**: Avoid the typical delays associated with app update cycles and app store approvals. Auto-Instrumentation lets you update your tracking setups or fix errors immediately, ensuring your data collection remains accurate and timely. +> info "Event Builder during Private Beta" +> During the Auto-Instrumentation Private Beta, both the Event Builder and the legacy Auto-Instrumentation tab appear in the Segment UI. Segment will remove the legacy tab once all customers have migrated to the Event Builder experience. ## How it works -Once you integrate the Analytics SDK and Signals SDK into your website or application, Segment begins to passively monitor user activity like button clicks, page navigation, and network data. Segment captures these events as "signals" and sends them to your Auto-Instrumentation source in real time. +After you install the required SDKs and enable Auto-Instrumentation, Segment detects activity like button clicks, navigation, and network calls. Segment captures these events as signals, which appear in the Event Builder. -In Segment, the Auto-Instrumentation source lets you view raw signals. You can then [use this data to create detailed analytics events](/docs/connections/auto-instrumentation/configuration/) based on those signals, enriching your insights into user behavior and application performance. +You can group signals into complete analytics events, assign names, and map custom properties. You can then [use this data to create detailed analytics events](/docs/connections/auto-instrumentation/configuration/) based on those signals, enriching your insights into user behavior and application performance. ## Setup Guides diff --git a/src/connections/auto-instrumentation/kotlin-setup.md b/src/connections/auto-instrumentation/kotlin-setup.md index b2c44a6f86..8b1d67494b 100644 --- a/src/connections/auto-instrumentation/kotlin-setup.md +++ b/src/connections/auto-instrumentation/kotlin-setup.md @@ -7,8 +7,8 @@ This guide outlines the steps required to set up the Signals SDK in your Android You'll learn how to add Auto-Instrumentation sources, integrate dependencies, and ensure that your setup captures and processes data as intended. -> info "Auto-Instrumentation Pilot" -> Auto-Instrumentation is currently in pilot and is governed by Segment's [First Access and Beta Preview Terms](https://www.twilio.com/en-us/legal/tos){:target="_blank"}. Segment is actively iterating on and improving the Auto-Instrumentation user experience. +> info "Auto-Instrumentation Private Beta" +> Auto-Instrumentation is currently in Private Beta and is governed by Segment's [First Access and Beta Preview Terms](https://www.twilio.com/en-us/legal/tos){:target="_blank"}. Segment is actively iterating on and improving the Auto-Instrumentation user experience. > success "Enable Auto-Instrumentation" > To enable Auto-Instrumentation in your Segment workspace, reach out to your dedicated account manager. @@ -79,18 +79,15 @@ Next, you'll need to add the Signals SDKs to your Kotlin application. ## Step 3: Verify and deploy events -Next, you'll need to verify signal emission and [create rules](/docs/connections/auto-instrumentation/configuration/#example-rule-implementations) to convert those signals into events: +After integrating the SDK and running your app, verify that Segment is collecting signals: -1. In your Segment workspace, return to **Connections > Auto-Instrumentation** and click on the new source you created. -2. Verify that signals appear as expected on the dashboard. - - ![Signals successfully appearing in the Segment UI](images/autoinstrumentation_signals.png "Signals successfully appearing in the Segment UI") - -3. Click **Create Rules**. -4. In the Rules Editor, add a rule that converts signal data into an event. -5. Click **Preview**, then click **Save & Deploy**. - -Segment displays `Rule updated successfully` to verify that it saved your rule. +1. In your Segment workspace, go to **Connections > Sources** and select the source you created for Auto-Instrumentation. +2. In the source overview, look for the **Event Builder** tab. If the tab doesn’t appear: + - Make sure you've installed the SDK correctly. + - Reach out to your Segment CSM to confirm that your workspace has the necessary feature flags enabled. +3. Launch your app [in debug mode](https://github.com/segmentio/analytics-next/tree/master/packages/signals/signals#sending-and-viewing-signals-on-segmentcom-debug-mode){:target="_blank"}, for example, by running the app from Android Studio on a simulator or test device. This enables signal collection so you can see activity in the Event Builder. +4. Use the app as a user would: navigate between screens, tap buttons, trigger network requests. Signals appear in real time as you interact with the app. +5. In the Event Builder, find a signal and click **Configure event** to define a new event. After configuring the event, click **Publish event rules**. ## Configuration Options diff --git a/src/connections/auto-instrumentation/swift-setup.md b/src/connections/auto-instrumentation/swift-setup.md index 62fc46572a..1a4d327024 100644 --- a/src/connections/auto-instrumentation/swift-setup.md +++ b/src/connections/auto-instrumentation/swift-setup.md @@ -7,8 +7,8 @@ This guide outlines the steps required to set up the Signals SDK in your Apple O You'll learn how to add Auto-Instrumentation sources, integrate dependencies, and ensure that your setup captures and processes data as intended. -> info "Auto-Instrumentation Pilot" -> Auto-Instrumentation is currently in pilot and is governed by Segment's [First Access and Beta Preview Terms](https://www.twilio.com/en-us/legal/tos){:target="_blank"}. Segment is actively iterating on and improving the Auto-Instrumentation user experience. +> info "Auto-Instrumentation Private Beta" +> Auto-Instrumentation is currently in Private Beta and is governed by Segment's [First Access and Beta Preview Terms](https://www.twilio.com/en-us/legal/tos){:target="_blank"}. Segment is actively iterating on and improving the Auto-Instrumentation user experience. > success "Enable Auto-Instrumentation" > To enable Auto-Instrumentation in your Segment workspace, reach out to your dedicated account manager. @@ -77,18 +77,15 @@ typealias SecureField = SignalSecureField ``` ## Step 3: Verify and deploy events -Next, you'll need to verify signal emission and [create rules](/docs/connections/auto-instrumentation/configuration/#example-rule-implementations) to convert those signals into events: +After integrating the SDK and running your app, verify that Segment is collecting signals: -1. In your Segment workspace, return to **Connections > Auto-Instrumentation** and click on the new source you created. -2. Verify that signals appear as expected on the dashboard. - - ![Signals successfully appearing in the Segment UI](images/autoinstrumentation_signals.png "Signals successfully appearing in the Segment UI") - -3. Click **Create Rules**. -4. In the Rules Editor, add a rule that converts signal data into an event. -5. Click **Preview**, then click **Save & Deploy**. - -Segment displays `Rule updated successfully` to verify that it saved your rule. +1. In your Segment workspace, go to **Connections > Sources** and select the source you created for Auto-Instrumentation. +2. In the source overview, look for the **Event Builder** tab. If the tab doesn’t appear: + - Make sure you've installed the SDK correctly. + - Reach out to your Segment CSM to confirm that your workspace has the necessary feature flags enabled. +3. Launch your app [in debug mode](https://github.com/segmentio/analytics-next/tree/master/packages/signals/signals#sending-and-viewing-signals-on-segmentcom-debug-mode){:target="_blank"}. This enables signal collection so you can see activity in the Event Builder. +4. Use the app as a user would: navigate between screens, tap buttons, trigger network requests. Signals appear in real time as you interact with the app. +5. In the Event Builder, find a signal and click **Configure event** to define a new event. After configuring the event, click **Publish event rules**. ## Configuration Options diff --git a/src/connections/auto-instrumentation/web-setup.md b/src/connections/auto-instrumentation/web-setup.md index acb2da05c7..9367132762 100644 --- a/src/connections/auto-instrumentation/web-setup.md +++ b/src/connections/auto-instrumentation/web-setup.md @@ -7,8 +7,8 @@ This guide outlines the steps required to set up the Signals SDK in your JavaScr You'll learn how to add Auto-Instrumentation sources, integrate dependencies, and ensure that your setup captures and processes data as intended. -> info "Auto-Instrumentation Pilot" -> Auto-Instrumentation is currently in pilot and is governed by Segment's [First Access and Beta Preview Terms](https://www.twilio.com/en-us/legal/tos){:target="_blank"}. Segment is actively iterating on and improving the Auto-Instrumentation user experience. +> info "Auto-Instrumentation Private Beta" +> Auto-Instrumentation is currently in Private Beta and is governed by Segment's [First Access and Beta Preview Terms](https://www.twilio.com/en-us/legal/tos){:target="_blank"}. Segment is actively iterating on and improving the Auto-Instrumentation user experience. > success "Enable Auto-Instrumentation" > To enable Auto-Instrumentation in your Segment workspace, reach out to your dedicated account manager. @@ -65,18 +65,18 @@ Verify that you replaced `` with the actual write key you copied in S ## Step 3: Verify and deploy events -Next, you'll need to verify signal emission and [create rules](/docs/connections/auto-instrumentation/configuration/#example-rule-implementations) to convert those signals into events: +After integrating the SDK and running your app, verify that Segment is collecting signals: -1. In your Segment workspace, return to **Connections > Auto-Instrumentation** and click on the new source you created. -2. Verify that signals appear as expected on the dashboard. +1. In your Segment workspace, return to **Connections > Sources**, then select the source you created for Auto-Instrumentation. +2. In the source overview, look for the **Event Builder** tab. If the tab doesn’t appear: + - Make sure you've installed the SDK correctly. + - Reach out to your Segment CSM to confirm that your workspace has the necessary feature flags enabled. + ![The Event Builder tab shown in the navigation bar between Debugger and Schema in a Segment Source](images/event_builder_tab.png) +3. Open the **Event Builder** and follow the on-screen instructions to start signal detection. + - To collect signals in the UI, visit your site in a browser using the query string:`?segment_signals_debug=true` +4. Interact with your app to trigger signals: click buttons, navigate pages, submit forms, and so on. Segment collects and displays these as signals in real time. +5. From the signals list, click **Configure event** to define a new event based on one or more signals. After configuring the event, click **Publish event rules**. - ![Signals successfully appearing in the Segment UI](images/autoinstrumentation_signals.png "Signals successfully appearing in the Segment UI") - -3. Click **Create Rules**. -4. In the Rules Editor, add a rule that converts signal data into an event. -5. Click **Preview**, then click **Save & Deploy**. - -Segment displays `Rule updated successfully` to verify that it saved your rule. ### Debugging #### Enable debug mode diff --git a/src/connections/destinations/catalog/actions-chartmogul/index.md b/src/connections/destinations/catalog/actions-chartmogul/index.md index 0c9c9a760f..40b12b2726 100644 --- a/src/connections/destinations/catalog/actions-chartmogul/index.md +++ b/src/connections/destinations/catalog/actions-chartmogul/index.md @@ -29,7 +29,7 @@ This destination is maintained by ChartMogul. For any issues with the destinatio ## 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 +- [Identify](https://segment.com/docs/connections/spec/identify/){:target="_blank"} — used for contact details +- [Group](https://segment.com/docs/connections/spec/group/){:target="_blank"} — used for customer details 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"}. diff --git a/src/connections/destinations/catalog/actions-hubspot-cloud/index.md b/src/connections/destinations/catalog/actions-hubspot-cloud/index.md index 4d8c70ccf8..8f1a219b6d 100644 --- a/src/connections/destinations/catalog/actions-hubspot-cloud/index.md +++ b/src/connections/destinations/catalog/actions-hubspot-cloud/index.md @@ -16,13 +16,18 @@ HubSpot is an all-in-one marketing tool that helps attract new leads and convert When you use the HubSpot Cloud Mode (Actions) destination, Segment sends your data to [HubSpot's REST API](https://developers.hubspot.com/docs/api/overview){:target="_blank"}. -> warning "" -> The **Upsert Company** action is not compatible with the Mapping Tester on the mappings page if Associate Contact is set to **Yes**. As a result, Segment recommends using the Event Tester or other tools to test and troubleshoot creating and updating companies in HubSpot. -> -> Note that for the company to contact association to work, you are required to trigger an Upsert Contact action before triggering an Upsert Company action. Contacts created with batch endpoint can not be associated to a Company from the Upsert Company Action. +Keep in mind that: +* The **Upsert Company** action is not compatible with the Mapping Tester on the mappings page if Associate Contact is set to **Yes**. As a result, Segment recommends using the Event Tester or other tools to test and troubleshoot creating and updating companies in HubSpot. For the company to contact association to work, you are required to trigger an Upsert Contact action before triggering an Upsert Company action. Contacts created with batch endpoint can not be associated to a Company from the Upsert Company Action. +* **Behavioral Events (Legacy)** are only supported with [Hubspot Classic Destination](/docs/connections/destinations/catalog/hubspot/). > warning "" -> **Behavioral Events (Legacy)** are only supported with [Hubspot Classic Destination](/docs/connections/destinations/catalog/hubspot/). +> As of April 29, 2025, HubSpot no longer supports referencing custom object types by their base names. Instead, you must reference all custom objects by using their short-hand custom object type name, `fullyQualifiedName`, or `objectTypeId`. To avoid issues, update the following fields: +> +>- **Object Type** and **ObjectType to associate** in the **Upsert Custom Object Record** action +>- **Object Type** in the **Custom Event V2** action +>- **Object Type** and **To Object Type** in the **Custom Object V2** action +> +> For further details, refer to the [HubSpot documentation](https://developers.hubspot.com/changelog/breaking-change-removed-support-for-referencing-custom-object-types-by-base-name){:target="_blank"}. ## Benefits of HubSpot Cloud Mode (Actions) vs HubSpot Classic diff --git a/src/connections/destinations/catalog/actions-klaviyo/index.md b/src/connections/destinations/catalog/actions-klaviyo/index.md index 0521bb9f3f..763ae25b4b 100644 --- a/src/connections/destinations/catalog/actions-klaviyo/index.md +++ b/src/connections/destinations/catalog/actions-klaviyo/index.md @@ -107,10 +107,6 @@ Some customers experience 403 errors when sending audience data to Klaviyo throu To reduce the number of `403` errors that you encounter, enable [IP Allowlisting](/docs/connections/destinations/#ip-allowlisting) for your workspace. For more information the range of IP addresses Klaviyo uses for integration traffic, see Klaviyo's [How to allowlist Klaviyo integration traffic IP addresses](https://help.klaviyo.com/hc/en-us/articles/19143781289115){:target="_blank”} documentation. -#### Can I send Engage Audiences to a pre-created Klaviyo List? - -No. Engage audiences are designed to initiate the creation of new lists in Klaviyo when you use the "Add Profile to List - Engage" mapping. You cannot link Engage lists to existing Klaviyo lists and cannot edit the List ID for Engage audiences. - #### How can I unsuppress a profile when adding it to a list? When adding a user to a list, our action make use of the [Bulk Profile Import](https://developers.klaviyo.com/en/reference/spawn_bulk_profile_import_job){:target="_blank”} endpoint (when batching is enabled), and the [Add Profile To List](https://developers.klaviyo.com/en/reference/create_list_relationships){:target="_blank”} endpoint for non-batched requests. Both of which will not update a users suppression status if they were previously suppressed. diff --git a/src/connections/destinations/catalog/actions-reddit-audiences/index.md b/src/connections/destinations/catalog/actions-reddit-audiences/index.md new file mode 100644 index 0000000000..ae12980367 --- /dev/null +++ b/src/connections/destinations/catalog/actions-reddit-audiences/index.md @@ -0,0 +1,30 @@ +--- +title: Reddit Audiences +id: 66f2b0f961bb2128729079bb +--- + +{% include content/plan-grid.md name="actions" %} + +The Reddit Audiences destination allows advertisers to send Engage audiences from Segment to Reddit to use as [Custom Audiences](https://business.reddithelp.com/s/article/custom-audiences?utm_source=segmentio&utm_medium=docs&utm_campaign=partners){:target="_blank"}, which can be used for Reddit Ads features like audience targeting, retargeting, creating lookalike audiences, and engagement retargeting. + +This destination is maintained by Reddit. For any issues with the destination, [contact their Support team](mailto:adsapi-partner-support@reddit.com). + +### Reddit Requirements +* Create a Reddit Ads account. * Find your ad account ID in [Accounts](https://ads.reddit.com/accounts). + +### Connect Reddit Ads to your workspace + +## Getting started + +1. In your Segment workspace, click **Engage** in the left navigation bar, then select your space. +2. Click **Engage Settings** and select the **Destinations** tab. +3. Search for `Reddit Audiences`. +4. Click **Add Destination**. +5. Confirm the source. By default, this is the source connected to the space to which you’re adding the destination. +6. In the **Settings** tab, click **Connect to Reddit Audiences** and authenticate the connection between Segment and Reddit. +7. Provide your ad account ID for **Ad Account ID**. +8. Toggle **Enable Destination** on and click **Save Changes**. +9. Navigate to the engage space that contains the audience, and select it in the **Audiences** tab. +10. Click **Add Destination**. + +{% include components/actions-fields.html %} diff --git a/src/connections/destinations/catalog/actions-reddit-conversions-api/index.md b/src/connections/destinations/catalog/actions-reddit-conversions-api/index.md index 374767b294..0d3af5d7b1 100644 --- a/src/connections/destinations/catalog/actions-reddit-conversions-api/index.md +++ b/src/connections/destinations/catalog/actions-reddit-conversions-api/index.md @@ -5,7 +5,7 @@ id: 66cc766ef4b1c152177239a0 {% include content/plan-grid.md name="actions" %} -The [Reddit Conversions API](https://business.reddithelp.com/helpcenter/s/article/Conversions-API/?utm_source=segmentio&utm_medium=docs&utm_campaign=partners){:target="_blank”} allows advertisers to send conversion events from Segment directly to Reddit, without needing website code. By building a sustainable server-side connection more resilient to signal loss, you can gain stronger campaign performance with improved measurement, targeting, and optimization. +The [Reddit Conversions API](https://ads-api.reddit.com/docs/v2/#tag/Conversions-API){:target="_blank"} allows advertisers to send conversion events from Segment directly to Reddit, without needing website code. By building a sustainable server-side connection more resilient to signal loss, you can gain stronger campaign performance with improved measurement, targeting, and optimization. ### Benefits of Reddit Conversions API diff --git a/src/connections/destinations/catalog/actions-tiktok-audiences/index.md b/src/connections/destinations/catalog/actions-tiktok-audiences/index.md index 00b9b4b75c..c8a092e50a 100644 --- a/src/connections/destinations/catalog/actions-tiktok-audiences/index.md +++ b/src/connections/destinations/catalog/actions-tiktok-audiences/index.md @@ -23,7 +23,9 @@ By using Segment's TikTok Audiences destination, you can increase traffic and dr ### Prerequisites -Before connecting to the TikTok Audiences destination, you must have a [TikTok Ads Manager](https://www.tiktok.com/business/en-US/solutions/ads-manager){:target="_blank"} account. +Before connecting to the TikTok Audiences destination, you must have a [TikTok Ads Manager](https://www.tiktok.com/business/en-US/solutions/ads-manager){:target="_blank"} account, with either Admin or Operator permissions to create and manage campaigns in TikTok. + +For more details on account and access level permissions, refer to [TikTok's documentation](https://ads.tiktok.com/help/article/how-to-assign-asset-level-permissions?lang=en){:target="_blank"}. ### TikTok Audience Segments diff --git a/src/connections/destinations/catalog/bing-ads/index.md b/src/connections/destinations/catalog/bing-ads/index.md index 96980cb2a5..539d2a7381 100644 --- a/src/connections/destinations/catalog/bing-ads/index.md +++ b/src/connections/destinations/catalog/bing-ads/index.md @@ -98,6 +98,19 @@ analytics.track('Order Completed', { | Category | `category` property | | Action | Always set to `track` | +## Consent mode + +Starting May 5, 2025, Microsoft is enforcing the use of consent mode for clients with end users in the European Economic Area (EEA), the United Kingdom, and Switzerland. To learn more about setting consent mode, refer to the [Microsoft docs](https://help.ads.microsoft.com/?FromAdsEmail=1#apex/ads/en/60341/1){:target="_blank"}. Microsoft is currently only enforcing the [`ad_storage` value](https://help.ads.microsoft.com/?FromAdsEmail=1#apex/ads/en/60341/1/#exp46){:target="_blank"}. + +To send consent signals using the Microsoft Bing Ads destination: + +1. Navigate to **Connections > Destinations** and select the Microsoft Bing Ads destination. +2. Select the **Settings** tab for the destination. +3. Turn on the **Enable Consent** setting. If it is turned off, the Microsoft Bing Ads destination won't send the consent signal. +4. Select **ALLOWED** or **DENIED** as the **Default Ads Storage Consent State**. This will be the default consent signal state when the page loads. You can toggle the consent state by passing consent signals using the Track or Page event. +5. If you're using Segment [Consent Management](/docs/privacy/consent-management/), specify the consent category to look up the `ad_storage` consent state using the **Ad Storage Consent Category** setting. +6. If you're not a Segment consent management user, specify the properties field through which you want to toggle the consent setting with the `Ad Storage Consent Property Mapping` setting. For example, if you wish to toggle `ad_storage` consent state based `properties.ad_storage`, set the value to `ad_storage` and make sure the `properties.ad_storage` in your track or page event is set to `granted` or `denied`. + ## Troubleshooting diff --git a/src/connections/destinations/catalog/facebook-offline-conversions/index.md b/src/connections/destinations/catalog/facebook-offline-conversions/index.md index 388c05465f..092d34e722 100644 --- a/src/connections/destinations/catalog/facebook-offline-conversions/index.md +++ b/src/connections/destinations/catalog/facebook-offline-conversions/index.md @@ -6,6 +6,9 @@ id: 58ae54dc70a3e552b95415f6 --- [Facebook Offline Conversions](https://www.facebook.com/business/help/1782327938668950?utm_source=segmentio&utm_medium=docs&utm_campaign=partners){:target="_blank”} enables offline event tracking, so marketers can run campaigns, upload transaction data, and compare in-store transactions. +> info "Offline Conversions API deprecation" +> Meta will [discontinue the Offline Conversions API](https://developers.facebook.com/docs/graph-api/changelog/version17.0#offline-conversions-api){:target="_blank"} in May 2025. As a result, this destination will stop accepting data at that time and will no longer be available for use. To continue sending offline conversion events to Meta, migrate to the [Facebook Conversions API (Actions)](/docs/connections/destinations/catalog/actions-facebook-conversions-api/#purchase) destination, which supports offline event tracking. + > info "Customer Information Parameters Requirements" > As of Facebook Marketing API v13.0+, Facebook began enforcing new requirements for customer information parameters (match keys). To ensure your events don't throw an error, Segment recommends that you review [Facebook’s new requirements](https://developers.facebook.com/docs/graph-api/changelog/version13.0#conversions-api){:target="_blank"}. diff --git a/src/connections/destinations/catalog/facebook-pixel/index.md b/src/connections/destinations/catalog/facebook-pixel/index.md index 5fb11ea0f1..579c00566a 100644 --- a/src/connections/destinations/catalog/facebook-pixel/index.md +++ b/src/connections/destinations/catalog/facebook-pixel/index.md @@ -110,7 +110,7 @@ In addition, Segment sends the following event types as Standard events: - `Products Searched`, which Segment sends as `Search` - `Checkout Started`, which Segment sends as `InitiateCheckout` -Facebook requires a currency for `Purchase` events. If you leave it out a currency, Segment will set a default value of `USD`. +Facebook requires a currency for `Purchase` events. If you leave out a currency, Segment will set a default value of `USD`. You can set custom properties for the events listed above. Use the setting "Standard Events custom properties" to list all the properties you want to send. @@ -193,7 +193,7 @@ If you're using real estate, travel, or automotive [Dynamic Ads](https://www.fac For most implementations, Segment recommends leaving these mappings blank. By default, Segment sets `content_type` to "product". -The same mapping can be used to change the `content_id` from the default value (product_id or the sku) to anything specific for Meta Pixel. For more information about required Meta Pixel events, see Meta's [Required Meta Pixel events and parameters for Advantage+ catalog ads](https://www.facebook.com/business/help/606577526529702?id=1205376682832142){:target="_blank”} documentation. +The same mapping can be used to change the `content_ids` from the default value (product_id or the sku) to anything specific for Meta Pixel. For more information about required Meta Pixel events, see Meta's [Required Meta Pixel events and parameters for Advantage+ catalog ads](https://www.facebook.com/business/help/606577526529702?id=1205376682832142){:target="_blank”} documentation. ## Troubleshooting diff --git a/src/connections/destinations/catalog/trubrics/index.md b/src/connections/destinations/catalog/trubrics/index.md new file mode 100644 index 0000000000..34aa98c72e --- /dev/null +++ b/src/connections/destinations/catalog/trubrics/index.md @@ -0,0 +1,26 @@ +--- +title: Trubrics (Actions) Destination +id: 664ce847b3e6f19ea96b3611 +private: true +hidden: true +--- + +{% include content/plan-grid.md name="actions" %} + +[Trubrics](https://trubrics.com/?utm_source=segmentio&utm_medium=docs&utm_campaign=partners){:target="_blank”} provides self-serve product analytics for AI product teams. On top of regular product analytics to understand user behavior, Trubrics helps you understand how your AI is performing and how to improve it. + +This destination is maintained by Trubrics. For any issues with the destination, [contact their Support team](mailto:jeff.kayne@trubrics.com). + +## Getting started + +1. From your workspace's [Destination catalog page](https://app.segment.com/goto-my-workspace/destinations/catalog){:target="_blank”}, search for "Trubrics". +2. Select Trubrics and click **Add Destination**. +3. Select an existing source to connect to Trubrics (Actions). +4. Go to the [Trubrics app](https://app.trubrics.com){:target="_blank"}, and copy the **Project API key** from the settings page. +5. Enter the **Project API Key** in the Trubrics destination settings in Segment, then enable the destination. +6. Add mappings for your AI/user properties. + - To learn more about adding mappings, see [Trubrics <> Segment Mapping Events](https://www.loom.com/share/3bc3a02cf38d47b4b865c50314dbc8fb){:target="_blank”}. + + + +{% include components/actions-fields.html %} \ No newline at end of file diff --git a/src/connections/functions/insert-functions.md b/src/connections/functions/insert-functions.md index e364ba6c94..f40678d9df 100644 --- a/src/connections/functions/insert-functions.md +++ b/src/connections/functions/insert-functions.md @@ -111,6 +111,12 @@ To ensure the Destination processes an event payload modified by the function, r > info "" > Functions' runtime includes a `fetch()` polyfill using a `node-fetch` package. Check out the [node-fetch documentation](https://www.npmjs.com/package/node-fetch){:target="_blank"} for usage examples. +### Variable scoping + +When declaring settings variables, make sure to declare them in the function handler rather than globally in your function. This prevents you leaking the settings values across other function instances. + +The handler for insert functions is event-specific, for example, `onTrack()`, `onIdentify()`, and so on. + ### Errors and error handling Segment considers a function's execution successful if it finishes without error. You can `throw` an error to create a failure on purpose. Use these errors to validate event data before processing it to ensure the function works as expected. @@ -176,8 +182,7 @@ async function onIdentify(event) { ``` If you don't supply a function for an event type, Segment throws an `EventNotSupported` error by default. - -You can read more about [error handling](#destination-insert-functions-logs-and-errors) below. +See [errors and error handling](#errors-and-error-handling) for more information on supported error types and how to troubleshoot them. ## Runtime and dependencies diff --git a/src/connections/reverse-etl/manage-retl.md b/src/connections/reverse-etl/manage-retl.md index e4dd195d2e..dbe3a0022d 100644 --- a/src/connections/reverse-etl/manage-retl.md +++ b/src/connections/reverse-etl/manage-retl.md @@ -84,7 +84,7 @@ To subscribe to alerts for a failed or partially successful sync: - **Reverse ETL sync partial success**: Receive a notification when your Reverse ETL sync is partially successful. 4. Select one or more of the following alert options: - **Enable email notifications**: Enter an email address or alias that should receive alerts. - - **Enable Slack notifications**: Enter a webhook URL and Slack channel name. + - **Enable Slack notifications**: Enter a webhook URL and Slack channel name. You can post messages to your channel with either a [webhook](https://api.slack.com/messaging/webhooks){:target="_blank”} or a [workflow](https://slack.com/help/articles/360041352714-Build-a-workflow--Create-a-workflow-that-starts-outside-of-Slack){:target="_blank”}. - **Enable in-app notifications**: Select this option to see an in-app notification. 5. Click **Create alert**. @@ -124,7 +124,7 @@ To subscribe to alerts for successful delivery fluctuations at the mapping level 3. Set an *alert threshold*, or the percentage of successfully delivered events that would prompt an alert. 4. Select one or more of the following notification channels: - **Email**: Enter an email address or alias that should receive alerts. - - **Slack notification**: Enter a Webhook URL and a Slack channel name to receive alerts in a Slack channel. + - **Slack notification**: Enter a Webhook URL and a Slack channel name to receive alerts in a Slack channel. You can post messages to your channel with either a [webhook](https://api.slack.com/messaging/webhooks){:target="_blank”} or a [workflow](https://slack.com/help/articles/360041352714-Build-a-workflow--Create-a-workflow-that-starts-outside-of-Slack){:target="_blank”}. - **In-app notifications**: Select this to receive notifications in the Segment app. To view your notifications, select the bell next to your user icon in the Segment app. 5. Toggle the **Enable alert** setting on and click **Create**. diff --git a/src/connections/reverse-etl/reverse-etl-source-setup-guides/databricks-setup.md b/src/connections/reverse-etl/reverse-etl-source-setup-guides/databricks-setup.md index c47619e20a..88ffe7ce51 100644 --- a/src/connections/reverse-etl/reverse-etl-source-setup-guides/databricks-setup.md +++ b/src/connections/reverse-etl/reverse-etl-source-setup-guides/databricks-setup.md @@ -12,24 +12,26 @@ At a high level, when you set up Databricks for Reverse ETL, the configured serv ## Required permissions * Make sure the service principal you use to connect to Segment has permissions to use that warehouse. In the Databricks console go to **SQL warehouses** and select the warehouse you're using. Navigate to **Overview > Permissions** and make sure the service principal you use to connect to Segment has *can use* permissions. +Note the Service Principal UUID from the [User Management Page](https://accounts.cloud.databricks.com/user-management/serviceprincipals/){:target="_blank”} (under Service Principals) for the following SQL operations. + * To grant access to read data from the tables used in the model query, run: ``` - GRANT USAGE ON SCHEMA TO ``; - GRANT SELECT, READ_METADATA ON SCHEMA TO ``; + GRANT USAGE ON SCHEMA TO ``; + GRANT SELECT, READ_METADATA ON SCHEMA TO ``; ``` * To grant Segment access to create a schema to keep track of the running syncs, run: ``` - GRANT CREATE on catalog TO ``; + GRANT CREATE on catalog TO ``; ``` * If you want to create the schema yourself instead and then give Segment access to it, run: ``` CREATE SCHEMA IF NOT EXISTS __segment_reverse_etl; - GRANT ALL PRIVILEGES ON SCHEMA __segment_reverse_etl TO ``; + GRANT ALL PRIVILEGES ON SCHEMA __segment_reverse_etl TO ``; ``` ## Set up guide diff --git a/src/connections/reverse-etl/reverse-etl-source-setup-guides/postgres-setup.md b/src/connections/reverse-etl/reverse-etl-source-setup-guides/postgres-setup.md index 42fe99565d..2a6689f0a8 100644 --- a/src/connections/reverse-etl/reverse-etl-source-setup-guides/postgres-setup.md +++ b/src/connections/reverse-etl/reverse-etl-source-setup-guides/postgres-setup.md @@ -31,6 +31,15 @@ To set up Postgres with Reverse ETL: -- allows the "segment" user to create new schemas on the specified database. (this is the name you chose when provisioning your cluster) GRANT CREATE ON DATABASE "" TO "segment"; + + -- create Segment schema + CREATE SCHEMA __segment_reverse_etl; + + -- Allow user to use the Segment schema + GRANT USAGE ON SCHEMA __segment_reverse_etl TO segment; + + -- Grant all privileges on all existing tables in the Segment schema + GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA __segment_reverse_etl TO segment; ``` 4. Make sure the user has correct access permissions to the database. 5. Follow the steps listed in the [Add a source](/docs/connections/reverse-etl/setup/#step-1-add-a-source) section to finish adding Postgres as a source. diff --git a/src/connections/reverse-etl/reverse-etl-source-setup-guides/redshift-setup.md b/src/connections/reverse-etl/reverse-etl-source-setup-guides/redshift-setup.md index 6ae2d4bdc0..c32f6f6aca 100644 --- a/src/connections/reverse-etl/reverse-etl-source-setup-guides/redshift-setup.md +++ b/src/connections/reverse-etl/reverse-etl-source-setup-guides/redshift-setup.md @@ -15,12 +15,21 @@ To set up Redshift with Reverse ETL: 2. Follow the [networking instructions](/docs/connections/storage/catalog/redshift/#networking) to configure the correct network and security settings. 3. Run the SQL commands below to create a user named `segment`. - ```ts + ```sql -- create a user named "segment" that Segment will use when connecting to your Redshift cluster. CREATE USER segment PASSWORD ''; -- allows the "segment" user to create new schemas on the specified database. (this is the name you chose when provisioning your cluster) GRANT CREATE ON DATABASE "" TO "segment"; + + -- create Segment schema + CREATE SCHEMA __segment_reverse_etl; + + -- Allow user to use the Segment schema + GRANT USAGE ON SCHEMA __segment_reverse_etl TO segment; + + -- Grant all privileges on all current tables in the Segment schema + GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA __segment_reverse_etl TO segment; ``` 4. Follow the steps listed in the [Add a source](/docs/connections/reverse-etl/setup/#step-1-add-a-source) section to finish adding Redshift as your source. diff --git a/src/connections/reverse-etl/reverse-etl-source-setup-guides/snowflake-setup.md b/src/connections/reverse-etl/reverse-etl-source-setup-guides/snowflake-setup.md index 697b375900..2bf44475c1 100644 --- a/src/connections/reverse-etl/reverse-etl-source-setup-guides/snowflake-setup.md +++ b/src/connections/reverse-etl/reverse-etl-source-setup-guides/snowflake-setup.md @@ -10,7 +10,7 @@ Set up Snowflake as your Reverse ETL source. At a high level, when you set up Snowflake for Reverse ETL, the configured user/role needs read permissions for any resources (databases, schemas, tables) the query needs to access. Segment keeps track of changes to your query results with a managed schema
(`__SEGMENT_REVERSE_ETL`), which requires the configured user to allow write permissions for that schema. > success "" -> Segment now supports key-pair authentication for Snowflake Reverse ETL sources. Key-pair authentication is available for Business Tier users only. +> Segment now supports key-pair authentication for Snowflake Reverse ETL sources. > info "Snowflake Reverse ETL sources support Segment's dbt extension" > If you have an existing dbt account with a Git repository, you can use [Segment's dbt extension](/docs/segment-app/extensions/dbt/) to centralize model management and versioning, reduce redundancies, and run CI checks to prevent breaking changes. @@ -55,6 +55,7 @@ Follow the instructions below to set up the Segment Snowflake connector. Segment -- database access GRANT USAGE ON DATABASE segment_reverse_etl TO ROLE segment_reverse_etl; GRANT CREATE SCHEMA ON DATABASE segment_reverse_etl TO ROLE segment_reverse_etl; + GRANT CREATE TABLE ON SCHEMA __segment_reverse_etl TO ROLE segment_reverse_etl; ``` 6. Enter and run one of the following code snippets below to create the user Segment uses to run queries. For added security, Segment recommends creating a user that authenticates using a key pair. diff --git a/src/connections/sources/catalog/cloud-apps/qualtrics/index.md b/src/connections/sources/catalog/cloud-apps/qualtrics/index.md index 69938aa5ad..1d1979b6ea 100644 --- a/src/connections/sources/catalog/cloud-apps/qualtrics/index.md +++ b/src/connections/sources/catalog/cloud-apps/qualtrics/index.md @@ -8,24 +8,24 @@ This is an [Event Cloud Source](/docs/sources/#event-cloud-sources) which can no Qualtrics maintains this source. For any issues with the source, [contact the Qualtrics Support team](mailto:support@qualtrics.com). -> info "Beta Source" -> The Qualtrics Source is in beta, which means that they are still actively developing the source. This doc was last updated on February 15, 2023. If you are interested in joining their beta program or have any feedback to help improve the Qualtrics Source and its documentation, [let the Qualtrics team know](mailto:support@qualtrics.com)!_ +> info "Beta source" +> The Qualtrics Source is in beta, which means that they are still actively developing the source. This doc was last updated on February 15, 2023. If you are interested in joining their beta program or have any feedback to help improve the Qualtrics source and its documentation, [let the Qualtrics team know](mailto:support@qualtrics.com). ## Getting started 1. From your workspace's [Sources catalog page](https://app.segment.com/goto-my-workspace/sources/catalog){:target="_blank”} click **Add Source**. 2. Search for "Qualtrics" in the Sources Catalog, select Qualtrics, and click **Add Source**. -3. On the next screen, give the Source a nickname configure any other settings. +3. On the next screen, give the source a nickname configure any other settings. - The nickname is used as a label in the Segment app, and Segment creates a related schema name in your warehouse. The nickname can be anything, but Segment recommends using something that reflects the source itself and distinguishes amongst your environments (for example, SourceName_Prod, SourceName_Staging, or SourceName_Dev). 4. Click **Add Source** to save your settings. -5. Log in to your Qualtrics Account. Navigate to workflows, select a workflow to send Segment events from, and add a new Segment task. +5. Log in to your Qualtrics Account. Navigate to Workflows, select a workflow to send Segment events from, and add a new Segment task. 6. From within the Segment task, after connecting with your Segment workspace API token, select your Qualtrics source and continue to set up the task with the event, data mapping, and more. - Your workspace token will need Source Admin permissions, at a minimum. 7. For more information on the Qualtrics Segment task, view the [Qualtrics support page](https://www.qualtrics.com/support/integrations/twilio-segment/twilio-segment-task/){:target="_blank"}. ## Stream -Qualtrics uses Segment's stream Source component to send Segment event data. It uses a server-side (select from `track` and `identify`) method(s) to send data to Segment. These events are then available in any destination that accepts server-side events and are available in a schema in your data warehouse, so you can query using SQL. +Qualtrics uses Segment's stream source component to send Segment event data. It uses a server-side (select from `track` and `identify`) method(s) to send data to Segment. These events are then available in any destination that accepts server-side events and are available in a schema in your data warehouse, so you can query using SQL. Qualtrics allows you to configure the userId from various sources from within the Qualtrics platform, for example, data from a survey response or a XM Directory contact's external data reference. The anonymous ID can also be configured from within Qualtrics task setup. @@ -33,18 +33,18 @@ Qualtrics allows you to configure the userId from various sources from within th Use the Qualtrics integration to define the event to be sent to Segment from within the task. This can be customized for a particular use case such as 'Onboarding Survey Completed' which could be the event based on a response to a particular survey. Another example may be 'Contact Updated' based on XM Directory change. These events can be tailored to align with your existing process or particular use case. -## Event Properties +## Event properties The Qualtrics integration allows you to define event properties within the following constraints: - Use `Track` events to define the `properties` object - Use `Identify` events to define the `traits` object -## Adding Destinations +## Adding destinations -Now that your Source is set up, you can connect it with Destinations. +Now that your source is set up, you can connect it with destinations. -Log into your downstream tools and verify that events and properties appear the way you expect. If events and properties don’t appear as you expect them to, check the [Event Delivery](/docs/connections/event-delivery/) tool, and refer to the Destination docs for each tool for troubleshooting. +Log into your downstream tools and verify that events and properties appear the way you expect. If events and properties don’t appear as you expect them to, check the [Event Delivery](/docs/connections/event-delivery/) tool, and refer to the destination docs for each tool for troubleshooting. If there are any issues with how the events are arriving to Segment, [contact the Qualtrics support team](mailto:support@Qualtrics.com). diff --git a/src/connections/sources/catalog/libraries/website/javascript/index.md b/src/connections/sources/catalog/libraries/website/javascript/index.md index 0c0579d06f..e3c83feb50 100644 --- a/src/connections/sources/catalog/libraries/website/javascript/index.md +++ b/src/connections/sources/catalog/libraries/website/javascript/index.md @@ -65,10 +65,13 @@ The Identify call has the following fields: | Field | | Type | Description | | ---------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `userId` | optional | String | The database ID for the user. If you don't know who the user is yet, you can omit the `userId` and just record `traits`. You can read more about identities in the [identify reference](/docs/connections/spec/identify). | +| `userId` | optional | String | The database ID for the user. If you don't know who the user is yet, you can omit the `userId` and just record `traits`. You can read more about identities in the [identify reference](/docs/connections/spec/identify). | | `traits` | optional | Object | A dictionary of traits you know about the user, like `email` or `name`. You can read more about traits in the [identify reference](/docs/connections/spec/identify/). | | `options` | optional | Object | A dictionary of options. For example, [enable or disable specific destinations](#managing-data-flow-with-the-integrations-object) for the call. _Note: If you do not pass a `traits` object, pass an empty object (as an '{}') before `options`._ | -| `callback` | optional | Function | A function executed after a timeout of 300 ms, giving the browser time to make outbound requests first. | +| `callback` | optional | Function | A function executed after a timeout of 300 ms, giving the browser time to make outbound requests first. | + + +If you want to set the `userId` without sending an Identify call, you can use `analytics.user().id('123')`. In the NPM package, use `analytics.instance.user().id(xxx)`. This method updates the stored `userId` locally without triggering a network request. This is helpful if you want to associate a user ID silently, without sending additional data to Segment or connected destinations. Be cautious when changing the `userId` mid-session to avoid double-counting users or splitting their identity history. By default, Analytics.js caches traits in the browser's `localStorage` and attaches them to each Identify call. @@ -101,6 +104,7 @@ analytics.identify('12091906-01011992', function(){ }); ``` + ### Track The Track method lets you record actions your users perform. You can [see a track example in the Quickstart guide](/docs/connections/sources/catalog/libraries/website/javascript/quickstart/#step-4-track-actions) or find details on [the track method payload](/docs/connections/spec/track/). diff --git a/src/connections/spec/best-practices-identify.md b/src/connections/spec/best-practices-identify.md index 622f714c41..85b76c7844 100644 --- a/src/connections/spec/best-practices-identify.md +++ b/src/connections/spec/best-practices-identify.md @@ -312,8 +312,10 @@ The Segment ID cookie is set with a one year expiration. However, there are some - If you invoke any call before you set an `anonymousId`, Segment automatically sets the `anonymousId` first. This means if you explicitly set an `anonymousId`, you might give the user two `anonymousId`s or overwrite an existing one. - If you fetch the `anonymousId` using `analytics.user().anonymousId()` before one is set, Segment generates and sets an `anonymousId` rather than returning `null`. - If you call `analytics.identify()` with a `userId` that is different from the currently cached `userId`, this can overwrite the existing one and cause attribution problems. +- If you call `analytics.identify(xxx)` or `analytics.instance.user().id(xxx)`(In the NPM package, use `analytics.instance.user().id(xxx)`) with a `userId` that is different from the currently cached `userId`, this can overwrite the existing one and cause attribution problems. - If you generate a new `anonymousId` on a server library, and pass it from the server to the browser, this could overwrite the user's existing `anonymousId`. + > info "" > Remember, if a user has multiple devices, they can have different `anonymousId`s on each different device. diff --git a/src/connections/storage/catalog/snowflake/index.md b/src/connections/storage/catalog/snowflake/index.md index aa76e90e8b..71b686d807 100644 --- a/src/connections/storage/catalog/snowflake/index.md +++ b/src/connections/storage/catalog/snowflake/index.md @@ -91,9 +91,6 @@ GRANT CREATE SCHEMA ON DATABASE "SEGMENT_EVENTS" TO ROLE "SEGMENT"; Create the user that Segment uses to connect to your warehouse. You can create a user that authenticates with a key pair, or you can create a user that authenticates using a password. For enhanced security, Segment recommends creating a user that authenticates with an encrypted key pair. -> info "Key-pair authentication restricted to Business Tier users only" -> Users on other plans can authenticate with Snowflake using a [username and password](#create-a-user-that-authenticates-with-a-username-and-password). - #### Create a user that authenticates with a key pair If you are creating a user that will use a key pair to authenticate, you first must create a public key and then can create a new user. @@ -264,7 +261,7 @@ At this time, the Segment Snowflake destination is not compatible with Snowflake Segment recommends that you authenticate with your Snowflake warehouse using an encrypted key pair. Key-pair authentication uses PKCS#8 private keys, which are typically exchanged in the PEM base64-encoded format. -Although you can create up to two keys in Snowflake, Segment only supports authenticating with one key at a time. To change the key that is in Segment, return to your Snowflake destination's settings and upload a new key in the **Private Key** field. +Although you can create up to two keys in Snowflake, Segment only supports authenticating with one key at a time. To change the key that's used to authenticate with Segment, return to your Snowflake destination's settings and upload a new key in the **Private Key** field. ### Auto Suspend and Auto Resume diff --git a/src/engage/audiences/index.md b/src/engage/audiences/index.md index cb92ee1830..3f104f92f6 100644 --- a/src/engage/audiences/index.md +++ b/src/engage/audiences/index.md @@ -288,7 +288,7 @@ To create an Activation event health spikes or drops alert: 4. Enter a percentage threshold to trigger activation event health notifications. 5. Select one or more of the following alert channels: - **Email**: Select this to receive notifications at the provided email address. - - **Slack**: Select this to send alerts to one or more channels in your workspace. + - **Slack**: Select this to send alerts to one or more channels in your workspace. You can post messages to your channel with either a [webhook](https://api.slack.com/messaging/webhooks){:target="_blank”} or a [workflow](https://slack.com/help/articles/360041352714-Build-a-workflow--Create-a-workflow-that-starts-outside-of-Slack){:target="_blank”}. - **In-app**: Select this to receive notifications in the Segment app. To view your notifications, select the bell next to your user icon in the Segment app. 6. Click **Save**. @@ -374,5 +374,8 @@ The audience builder accepts CSV and TSV lists. This error occurs when creating audiences that reference each other, meaning audience X refers to audience Y in its trigger condition, and later you attempt to modify audience Y's trigger condition to refer back to audience X. To avoid this error, ensure that the audiences do not reference each other in their conditions. +### Can I build an audience based on `context.traits` in a Track event? +No. Traits located in the `context.traits` object of a Track event aren’t available in the Event Properties section of the Audience Builder. You can only use top-level event properties to define event-based audience conditions. + ### How does the historical data flag work? -The **Include Historical Event Data** option lets you take past event data into account and control how much of it is considered when creating real-time audiences. You can set a lookback window (for example, the “last 90 days”) to limit the processed event data, or disable it entirely to use only data arriving after creation. For batch audiences, Segment includes historical data by default. +The **Include Historical Event Data** option lets you take past event data into account and control how much of it is considered when creating real-time audiences. You can set a lookback window (for example, the “last 90 days”) to limit the processed event data, or disable it entirely to use only data arriving after creation. For batch audiences, Segment includes historical data by default. \ No newline at end of file diff --git a/src/engage/audiences/linked-audiences-braze.md b/src/engage/audiences/linked-audiences-braze.md index a75dc0718c..ef5e5dfab9 100644 --- a/src/engage/audiences/linked-audiences-braze.md +++ b/src/engage/audiences/linked-audiences-braze.md @@ -2,17 +2,16 @@ title: Using Linked Audiences with Braze plan: engage-foundations beta: true -hidden: true +hidden: false --- Linked Audiences allows you [dynamically personalize email messages](https://www.braze.com/docs/user_guide/personalization_and_dynamic_content/liquid){:target="_blank"} in Braze using the predefined traits of any Linked Audience profile and the attributes of any entities used to match the profile into the audience. -The following topic is intended for a Technical Marketer and Data Engineer to complete together while setting up their Linked Audience. ## Supported Braze Engagement Tools -The following engagement tools are available for use with Linked Audiences in Segment: +The following engagement tool is available for use with Linked Audiences in Segment: | Type | Description | | ------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------- | diff --git a/src/engage/audiences/linked-audiences-iterable.md b/src/engage/audiences/linked-audiences-iterable.md index e6070e8faf..8869cdc7de 100644 --- a/src/engage/audiences/linked-audiences-iterable.md +++ b/src/engage/audiences/linked-audiences-iterable.md @@ -2,12 +2,11 @@ title: Using Linked Audiences with Iterable plan: engage-foundations beta: true -hidden: true +hidden: false --- Linked Audiences allows you to [dynamically personalize email messages](https://support.iterable.com/hc/en-us/articles/205480365-Personalizing-Templates-with-Handlebars){:target="_blank"} in Iterable using the predefined traits of any Linked Audience profile and the attributes of any entities used to match the profile into the audience. -The following topic is intended for a Technical Marketer and Data Engineer to complete together while setting up their Linked Audience. ## Supported Iterable Engagement Tools diff --git a/src/engage/index.md b/src/engage/index.md index b15e7f45d4..f0cdd3d93a 100644 --- a/src/engage/index.md +++ b/src/engage/index.md @@ -22,56 +22,9 @@ Add detail to user profiles with new traits and use them to power personalized m - [**Predictions**:](/docs/unify/traits/predictions/) Predict the likelihood that users will perform custom events tracked in Segment, like LTV, churn, and purchase. #### Build Audiences -Create lists of users or accounts that match specific criteria. For example, after creating an `inactive accounts` audience that lists paid accounts with no logins in 60 days, you can push the audience to your analytics tools or send an SMS, email, or WhatsApp campaign with Engage Channels. Learn more about [Engage audiences](/docs/engage/audiences/). +Create lists of users or accounts that match specific criteria. For example, after creating an `inactive accounts` audience that lists paid accounts with no logins in 60 days, you can push the audience to your analytics tools or send an SMS, email, or WhatsApp campaign with Engage Channels. Learn more about [Engage audiences](/docs/engage/audiences/). #### Sync audiences to downstream tools Once you create your Computed Traits and Audiences, Engage sends them to your Segment Destinations in just a few clicks. You can use these Traits and Audiences to personalize messages across channels, optimize ad spend, and improve targeting. You can also use the [Profile API](/docs/unify/profile-api) to build in-app and onsite personalization. Learn more about [using Engage data](/docs/engage/using-engage-data/) and the [Profile API](/docs/unify/profile-api). -{% include components/reference-button.html href="https://segment.com/customers/drift/" icon="personas.svg" title="Personalizing marketing campaigns" description="Marketing teams use Engage to run real-time multi-channel marketing campaigns based off specific user attributes they've computed in Engage. Read about how Drift used Engage to increase prospect engagement by 150% in two months." %} - -## Market to customers with Engage Premier and Channels - -To send email, SMS, and WhatsApp campaigns with Engage Channels, you'll connect a [Twilio messaging service](https://support.twilio.com/hc/en-us/articles/223181308-Getting-started-with-Messaging-Services){:target="blank"}, [SendGrid subuser account](https://docs.sendgrid.com/ui/account-and-settings/subusers#create-a-subuser){:target="blank"}, and [WhatsApp messaging service](https://www.twilio.com/docs/whatsapp/self-sign-up){:target="blank"} to your Segment Engage space. Use existing accounts, or create new ones. - -View the [onboarding steps](/docs/engage/onboarding/) for more on how to connect Twilio and SendGrid accounts. - -#### Send email, SMS, and WhatsApp messages in Journeys - -Use Engage to build email, SMS, and WhatsApp campaigns within [Journeys](/docs/engage/journeys/). Send campaigns to [subscribed users](#user-subscriptions) based on event behavior and profile traits. With [message analytics](#message-analytics), you can track the performance of your campaigns. - -- **Send Email**: [Build email campaigns](/docs/engage/campaigns/email-campaigns/) with existing templates, or create a new email template within Journeys. Before you send the email, test the template and set [conversion goals](#conversion-goals). - -- **Send SMS messages**: [Build SMS campaigns](/docs/engage/campaigns/sms-campaigns/) to message users in real-time as a step in a Journey. For example, create an abandoned cart campaign that texts users a reminder to complete their purchase, along with a promo code. Add [merge tags](#personalize-with-merge-tags) and set conversion goals. - -- **Send WhatsApp messages**: [Build WhatsApp campaigns](/docs/engage/campaigns/whatsapp-campaigns) that deliver messages to your customers on the world's most used messaging app. - -To learn more, visit the [CSV Uploader](/docs/engage/profiles/csv-upload/) documentation. - -#### Build Email, SMS, and WhatsApp message templates - -Build personalized [email](/docs/engage/content/email/template/), [SMS](/docs/engage/content/sms/template), and [WhatsApp](/docs/engage/content/whatsapp) templates in Twilio Engage for use in your campaigns. Design email templates with a WYSIWYG [Drag and Drop Editor](/docs/engage/content/email/editor/) or the [HTML Editor](/docs/engage/content/email/html-editor/). Engage saves the templates for you to preview, edit, and reuse throughout Journeys. - -#### Personalize with merge tags -Insert real-time user profile traits from merge tags to personalize each message. For example, address recipients by name or highlight new products from a user's favorite brand. - -#### CSV Uploader -Use the CSV uploader to add or update user profiles and [subscription states](/docs/engage/user-subscriptions/). To learn more, visit the [CSV Uploader](/docs/engage/profiles/csv-upload/) documentation. - -#### User subscriptions - -Set user subscription states in two ways: -- [Upload a CSV file](/docs/engage/profiles/csv-upload/) with lists of users along with their phone, email, and WhatsApp subscription states. -- Programmatically with Segment's [Public API](https://api.segmentapis.com/docs/spaces/#replace-messaging-subscriptions-in-spaces){:target="blank"} - -Use Engage to add subscription states to user email addresses and phone numbers. Subscription states help determine which users you can send campaigns to in Engage. You can set user subscription states with a [CSV file upload](/docs/engage/profiles/csv-upload/), or programmatically with Segment's [Public API](https://api.segmentapis.com/docs/spaces/#replace-messaging-subscriptions-in-spaces){:target="blank"}. - -#### Message Analytics -With analytics in Engage, you can monitor real-time conversion data. Track message performance and customer interaction beyond clicks and opens. Use campaign dashboards to view events such as `Email Delivered`, `Unsubscribed`, `Spam Reported`, and more. - -#### Conversion Goals - -For each message step in a Journey, you can set conversion conditions with events and properties in your Segment space. Then, define a duration after message delivery to track goals. - -For example, track users who perform the event **Order Completed** with a promo code that you send them. - -Visit [Message Analytics](/docs/engage/analytics/) to learn more. +{% include components/reference-button.html href="https://segment.com/customers/drift/" icon="personas.svg" title="Personalizing marketing campaigns" description="Marketing teams use Engage to run real-time multi-channel marketing campaigns based off specific user attributes they've computed in Engage. Read about how Drift used Engage to increase prospect engagement by 150% in two months." %} \ No newline at end of file diff --git a/src/engage/product-limits.md b/src/engage/product-limits.md index c7d74d06ce..059f3736c2 100644 --- a/src/engage/product-limits.md +++ b/src/engage/product-limits.md @@ -26,7 +26,7 @@ To learn more about custom limits and upgrades, contact your dedicated Customer | name | limit | Details | | --------------------------------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compute Concurrency | 5 new concurrent audiences or computed traits | Segment computes five new audiences or computed traits at a time. Once the limit is reached, Segment queues additional computations until one of the five finishes computing. | -| Edit Concurrency | 2 concurrent audiences or computed traits | You can edit two concurrent audiences or computed traits at a time. Once the limit is reached, Segment queues and locks additional computations until one of the two finishes computing. | +| Edit Concurrency | 5 concurrent audiences or computed traits | You can edit five concurrent audiences or computed traits at a time. Once the limit is reached, Segment queues and locks additional computations until one of the five finishes computing. | | Batch Compute Concurrency Limit | 10 (default) per space | The number of batch computations that can run concurrently per space. When this limit is reached, Segment delays subsequent computations until current computations finish. | | Compute Throughput | 10000 computations per second | Computations include any Track or Identify call that triggers an audience or computed trait re-computation. Once the limit is reached, Segment may slow audience processing. | | Real-time to batch destination sync frequency | 12-15 hours | The frequency with which Segment syncs real-time audiences to batch destinations. | diff --git a/src/getting-started/01-what-is-segment.md b/src/getting-started/01-what-is-segment.md index b791d80ec6..4078c74a4a 100644 --- a/src/getting-started/01-what-is-segment.md +++ b/src/getting-started/01-what-is-segment.md @@ -12,8 +12,8 @@ In a nutshell, the Segment libraries ([Sources](/docs/connections/sources/catalo [Segment Spec methods](/docs/connections/spec/) are how you collect interaction data from your interfaces, and the [Sources](/docs/connections/sources/) are what you package with your interfaces to collect and route the data. Once you've collected your interaction data, there are several different actions you can take: -- Send it to [Destinations](/docs/connections/destinations/), which receive the data from any number of sources in real time -- Send it to [Warehouses](/docs/connections/storage/) and other bulk storage tools, which hold your raw event schemas and update on regular intervals +- Send it to [Destinations](/docs/connections/destinations/), which receive the data from any number of sources in real time. +- Send it to [Warehouses](/docs/connections/storage/) and other bulk storage tools, which hold your raw event schemas and update on regular intervals. - Enrich the customer data you collect by [connecting data from your other tools](/docs/connections/sources/catalog/#cloud-apps), and then collect it in a warehouse to monitor performance, inform decision-making processes, and create uniquely customized user experiences. - Use [Engage](/docs/engage/), Twilio's marketing automation tool, to build marketing campaigns personalized to your audience. @@ -53,7 +53,7 @@ Although there are some tradeoffs between the two approaches, neither is better TODO: Image removed, didn't work with formatting. need a better version of this flowchart or else to just omit?--> -## The Segment Methods +## The Segment methods The Segment libraries generate messages about what happens on your interface, translate those messages into different formats for use by destinations, and transmit the messages to those tools. diff --git a/src/getting-started/03-planning-full-install.md b/src/getting-started/03-planning-full-install.md index 5599e9fd40..1c04a2576e 100644 --- a/src/getting-started/03-planning-full-install.md +++ b/src/getting-started/03-planning-full-install.md @@ -24,20 +24,20 @@ Now that you've seen Segment in action, step back and think through what a full Be prepared to invest time deciding with stakeholders how to track your data, and planning how you'll analyze it. The time you spend here will save you lots of time in the future, as following Segment's best practices allows you to easily change your tracking later. -## Define Business Objectives +## Define business objectives Tracking is about learning and taking action. Think about what you want to know about your product or customers. Think about what assumptions need to be tested and what theories need to be proven true or false. Think about the unknowns. Here are some helpful questions to get started: -- What kind of events or data best illustrate or explain how your customers use your product? +- What kinds of events or data best illustrate or explain how your customers use your product? - How do people discover, start using, and paying for your product? - What are the most important steps in a customer's journey? -While it may seem obvious, we highly recommend documenting your high-level business objectives. More specifically, ask yourself: what are the measurable business outcomes you want to achieve this year? Do you want to acquire new customers? Generate more new sign-ups, drive more incremental revenue among your current customer base? +While it may seem obvious, we highly recommend documenting your high-level business objectives. More specifically, ask yourself: what are the measurable business outcomes you want to achieve this year? Do you want to acquire new customers? Generate more new sign-ups? Drive more incremental revenue among your current customer base? -The best way to answer this question is to interview stakeholders in your organization who will consume the data. +The best way to answer these questions is to interview stakeholders in your organization who will consume the data. With your business goals documented, the next step is to map user actions to those business goals. For example, if one of your goals is to activate new signups, you want to think about which activities are related to a signup. Ask yourself, what actions do people take _before_ signing up? Do specific actions predict a user signing up? @@ -55,7 +55,7 @@ While this list represents a tiny fraction of the user actions you _could_ track ## Decide what to collect -With your business objectives documented and mapped to user actions, it's time to build standards that you can use when deciding what to track. With your stakeholders, make a list of the actual events (page or screen views, and user actions) that you want to track. Think about all of the ways your users can interact with your site or app +With your business objectives documented and mapped to user actions, it's time to build standards that you can use when deciding what to track. With your stakeholders, make a list of the actual events (page or screen views, and user actions) that you want to track. Think about all of the ways your users can interact with your site or app. When you're first starting out, we recommend that you limit your tracking plan to a few core events, but add lots of properties to provide context about them. We generally see more success with the “less is more” philosophy of tracking data, but you might also decide to take a more liberal “track more and analyze later” approach. Like everything, each alternative has pros and cons that are important to consider especially as it relates to your company's needs. @@ -95,7 +95,7 @@ Regardless of approach, here are some important best practices to keep in mind: - **Don't create events to track properties:** Avoid adding values to event names when they could be a property. Instead, add values as a property. For example, rather than having an event called "Read Blog Post - Best Tracking Plans Ever", create a "Blog Post Read" event and with a property like `"blog_post_title":"Best Tracking Plans Ever"`. -- **Don't create property keys dynamically:** Avoid creating property names like `"feature_1":"true"`,`"feature_2":"false"` as these are ambiguous and very difficult to analyze +- **Don't create property keys dynamically:** Avoid creating property names like `"feature_1":"true"`,`"feature_2":"false"` as these are ambiguous and very difficult to analyze. ![An image comparing good and bad naming and collection standards](/docs/protocols/images/asset_nVdJ3ZyA.png) @@ -141,11 +141,11 @@ At Segment, we started out tracking these events: - **Source Data Sent** - **Subscription Started** -Then we added some peripheral events to to better understand how we're performing, for the following reasons: +Then we added some peripheral events to better understand how we're performing, for the following reasons: - **User Invited** When users invite more people to their organization, it's a good indicator that they're engaged and serious about using the product. This helps us measure growth in organizations. - **Destination Enabled** Turning on a destination is a key value driver for our customers. -- **Debugger Call Expanded** When we see that a certain customer has used the live event stream feature a number of times, we can contact see if we can help them debug. +- **Debugger Call Expanded** When we see that a customer has used the live event stream feature multiple times, we can contact them to see if we can help them debug. For an Ecommerce company, however, the main events might be something like: diff --git a/src/getting-started/whats-next.md b/src/getting-started/whats-next.md index 1a421246fe..9dab9da2e3 100644 --- a/src/getting-started/whats-next.md +++ b/src/getting-started/whats-next.md @@ -38,7 +38,7 @@ With Engage, you can create unified customer profiles, enrich those profiles wit ##### Recipes -Need ideas or prior art? [Segment Recipes](https://segment.com/recipes/?utm=docs) are some cool things you can do by hooking your Segment workspace up to different Destination tools. Everything from sending tailored onboarding emails, to joining and cleaning your data with third party tools +Need ideas or prior art? [Segment Recipes](https://segment.com/recipes/?utm=docs) are some cool things you can do by hooking your Segment workspace up to different Destination tools. Everything from sending tailored onboarding emails, to joining and cleaning your data with third party tools. ### Other Resources diff --git a/src/guides/regional-segment.md b/src/guides/regional-segment.md index c58c76479b..00255bd0c9 100644 --- a/src/guides/regional-segment.md +++ b/src/guides/regional-segment.md @@ -127,23 +127,6 @@ Segment maintains and hosts these sources, and they don't require SDK-level conf If you're using other cloud sources not listed here, they may only be available in US-based workspaces. Reach out to Segment Support if you're unsure whether a cloud source is supported in the EU. -## Updating source settings in Segment - -After you’ve configured your SDKs or custom integrations, double-check that your source settings in Segment are using the correct regional endpoint. - -To set your data ingestion region: - -1. Go to your source's **Settings** tab. -2. Click **Regional Settings**. -3. Choose your **Data Ingestion Region**. - - If your workspace is in the *US West* data processing region, you can select from: Dublin, Singapore, Oregon, or Sydney. - - If your workspace is in the *EU West* data processing region, Segment only supports ingestion from Dublin, using the `events.eu1.segmentapis.com/` endpoint. -4. Save your changes. - -All regions are configured on a **per-source** basis. You'll need to configure the region for each source separately if you don't want to use the default region. - -Segment’s client-side SDKs automatically fetch this setting and update themselves the next time the app reloads. However, for mobile apps and critical regional routing, Segment recommends also [setting the endpoint manually in your SDK configuration](#set-up-your-sources-for-eu-or-us-workspaces. - ## Create a new workspace with a different region > info "" diff --git a/src/guides/usage-and-billing/mtus-and-throughput.md b/src/guides/usage-and-billing/mtus-and-throughput.md index de50b9504d..a9453b6f7e 100644 --- a/src/guides/usage-and-billing/mtus-and-throughput.md +++ b/src/guides/usage-and-billing/mtus-and-throughput.md @@ -182,7 +182,7 @@ Check to see if you changed how you call `analytics.reset()`. This utility metho #### Overwriting an existing identity -Segment's analytics libraries include methods that allow you to overwrite both the `userId` (using `identify(xxx)`) and `anonymousId` (using `analytics.user().anonymousId(xxx)`). Using these methods on a user whose tracking information already includes an ID can cause the user to be counted more than once. +Segment’s analytics libraries include methods that allow you to overwrite both the `userId` (using `identify(xxx)` or `analytics.instance.user().id(xxx)`) and `anonymousId` (using `analytics.user().anonymousId(xxx)`). Using these methods on a user whose tracking information already includes an ID can cause the user to be counted more than once. If you find you need to use one of these overwrite methods, you should check to make sure that the field you are changing is `null` first. If the field is _not_ null, you probably don't want to overwrite it and lose the user's original tracked identity. diff --git a/src/monitor/alerts/default-alerts.md b/src/monitor/alerts/default-alerts.md index bd20b502e8..361f329271 100644 --- a/src/monitor/alerts/default-alerts.md +++ b/src/monitor/alerts/default-alerts.md @@ -16,15 +16,16 @@ You can create alerts for the following product areas: - [Protocols](#protocols-alerts) - [Unify](#unify-alerts) - [Engage](#engage-alerts) +- [Users](#users-alerts) - [Functions](#functions-alerts) - [Reverse ETL](#reverse-etl-alerts) - [Data Graph](#data-graph-alerts) The Alerting table includes the following information about each event: - **Alert name**: The type of alert, for example, "Audience created" or "Audience deleted". -- **Last triggered**: The most recent date and time, in your local time zone, that the alert was triggered. +- **Last triggered**: The most recent date and time, in your local time zone, that the alert was triggered. Some alerts, like **Violations Detected**, trigger only once per day. - **Status**: Either **enabled**, if the alert is currently configured in your workspace, or **disabled**, if you're not configured to receive alerts for an event. -- **Notification channels**: Icons describing what notification channels you'll receive the alerts on - through a Slack webhook, email, or in-app notification. +- **Notification channels**: Icons describing what notification channels you'll receive the alerts on - through a Slack webhook, Slack workflow, email, or in-app notification. - **Actions**: By selecting the menu icon for an individual alert, you can edit or delete it from the Alerting page. ## Create a new alert @@ -110,11 +111,17 @@ your identity-resolved profiles to your data warehouse. - **Audience Deleted**: A user in your workspace deleted an Audience. - **Audience Destination Sync Failed**: Segment was unable to sync your Audience with a connected destination. - **Audience Modified**: A user in your workspace modified an Audience. +- **Audience Run Complete**: Segment computed your Audience. For more information about how long it takes Segment to compute an Audience, see the [Engage Audiences Overview](/docs/engage/audiences/#understanding-compute-times) docs. - **Audience Run Failed**: Segment was unable to compute your Audience. To resolve this error, please [contact Segment support](https://segment.com/help/contact/){:target="_blank”}. > info "Custom Engage alerts" > During the Monitor public beta, you can configure custom [Activation event health spikes or drops](/docs/engage/audiences/#activation-event-health-spikes-or-drops) alerts, but these alerts won't appear in the Monitor tab. +## Users alerts +- **Access Request Created**: A user in your workspace requested access to a resource that they don't currently have permission to view. For more information, see the [Request Access](/docs/segment-app/iam/membership/#request-access) documentation. +- **Public API Tokens Without Owners Detected**: Segment detected that the user that created one of your Public API tokens is no longer in your workspace. Workspace Owners receive the alert on the day that Segment detects the token's owner is no longer in the workspace and then again 30 days after the last alert. +- **Users Invited**: Someone [invited a new Team Member](/docs/segment-app/iam/membership/#invite-a-new-team-member) to your workspace. + ## Functions alerts - **Destination Filter Created**: A user in your workspace created a [destination filter](/docs/connections/destinations/destination-filters/). - **Destination Filter Deleted**: A user in your workspace deleted a [destination filter](/docs/connections/destinations/destination-filters/). diff --git a/src/privacy/consent-management/consent-faq.md b/src/privacy/consent-management/consent-faq.md index 1383349ccd..cfd3e55f69 100644 --- a/src/privacy/consent-management/consent-faq.md +++ b/src/privacy/consent-management/consent-faq.md @@ -19,7 +19,15 @@ You can use the [Destination Actions framework](/docs/connections/destinations/a 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? +## Why is my event failing ingestion with the error "context.consent.categoryPreferences object is required"? + +An `context.consent.categoryPreferences object is required` error occurs when you send the Segment Consent Preference Updated event without the `context.consent.categoryPreferences` object. Segment performs a validation on the Segment Consent Preference Updated event to ensure that you've correctly structured your end users' consent preferences. If the required object is missing, Segment won't ingest the event and the event won't appear in downstream tools. + +Other events, like Track, Identify, or Group, are not subject to the same consent validation and do not require the `context.consent.categoryPreferences` object. + +If you're using a Consent Management Platform (CMP) integration other than [Segment's Analytics.js OneTrust wrapper](/docs/privacy/consent-management/onetrust-wrapper/), you must ensure your Segment Consent Preference Updated events contain the `context.consent.categoryPreferences` object. + +## Can I use a 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 diff --git a/src/privacy/data-retention-policy.md b/src/privacy/data-retention-policy.md index 0a71bc5808..f4cf16e58e 100644 --- a/src/privacy/data-retention-policy.md +++ b/src/privacy/data-retention-policy.md @@ -44,9 +44,9 @@ Segment recommends keeping your data for at least 30 days to enable [replays](/d To change your data retention settings, open Segment and navigate to **Privacy > Settings > Data Retention**. -### Workspace Default Archive Retention Period +### Workspace default archive retention period -Select the default retention period for the workspace in this setting. This value applies to all sources in the workspace, unless overridden in the [Source-Level Archive Retention Periods](#source-level-archive-retention-periods) setting. +Select the default retention period for the workspace in this setting. This value applies to all sources in the workspace. - 14 days - 30 days @@ -55,40 +55,29 @@ Select the default retention period for the workspace in this setting. This valu - 365 days - 3 years (the default setting starting July 15, 2025) - Unlimited (deprecated July 15, 2025) - -### Source-Level Archive Retention Periods - -> warning "Source-Level Archive Retention Periods will be deprecated on April 15, 2025" -> After April 15, you will no longer be able to override your workspace's default retention period on a source-by-source basis. - -Override the workspace default retention period on a per-source level. - -You can select from the following Archive Retention time periods: -- Default (This is the default value you set in the [Workspace Default Archive Retention Period](#workspace-default-archive-retention-period) setting) -- 14 days -- 30 days -- 90 days -- 180 days -- 365 days ### What data is impacted? With this data retention policy, all data beyond the retention period is unrecoverably deleted from all of Segment and impacts the following: * [Data Replays](/docs/guides/what-is-replay/) will only be available for data within the retention period. Unify, Engage and Linked customers that replay data to recreate Unify Spaces or Profiles may encounter variations in the number of profiles, as well as in the identifiers, traits and properties associated with the profiles, depending on the data available. -* Backfill Data is only available for data within the retention period when sources are connected to your warehouse. +* Backfill Data is only available for data within the retention period, when sources are connected to your warehouse. * [Data residency](/docs/guides/regional-segment/) migrations across regions (US and EU) is only available for data within the retention period. * Additional impacts to Object data: - * [Object API](/docs/connections/sources/catalog/libraries/server/object-api/#set), [Bulk API](/docs/connections/sources/catalog/libraries/server/object-bulk-api/), or [SendGrid](/docs/connections/sources/catalog/cloud-apps/sendgrid/#streaming) and [Mandrill](/docs/connections/sources/catalog/cloud-apps/mandrill/#streaming) streaming sources: Any data older than 180 days is treated as a new record and may not contain any historic properties. To prevent loss of data properties, Segment recommends that you always send full objects with all properties. + * [Object API](/docs/connections/sources/catalog/libraries/server/object-api/#set) or [Bulk API](/docs/connections/sources/catalog/libraries/server/object-bulk-api/): Object data not updated within the retention period will be deleted. Any new data will treated as a new record and may not contain any historic properties. To prevent loss of data properties, Segment recommends that you always send full objects with all properties. * Users and Accounts: Segment aggregates data from Identify and Group events into [Users and Account objects and tables for warehouse destinations](/docs/connections/storage/warehouses/schema/#warehouse-tables) object store records. Any object store records not updated in the last 180 days will be deleted from Segment's object stores. Any new data after object store records are deleted for inactivity is treated as a new object store record. If the source is connected to a Warehouse destination, object store entities are synced into [`.users` and `.accounts` tables](/docs/connections/storage/warehouses/schema/#warehouse-tables), and the existing record in the warehouse will be replaced with the new object store record, resulting in possible loss of attribute data. To prevent loss of attributes, Segment advises customers to migrate to using [Profiles Sync](/docs/unify/profiles-sync/overview/), always send complete Identify and Group calls, or back up your `.users` and `.accounts` tables. * [Computed traits](/docs/unify/Traits/computed-traits/) is built using the available data within the retention period. Recreating these traits may result in different values based on the available data. -* [Profiles](/docs/unify/), [Engage](/docs/engage/) [Audiences](/docs/engage/audiences/) and [Journeys](/docs/engage/journeys/) that are built using Events will use available data within the retention period. Recreating these may result in different Profiles based on the available data. Depending on how the conditions are defined, Profiles may or may not exit Computed traits, Engage Audiences, and Journeys due to the data retention policy, and this may result in mismatches in counts when comparing against a preview. +* [Profiles](/docs/unify/), [Engage](/docs/engage/) [Audiences](/docs/engage/audiences/) and [Journeys](/docs/engage/journeys/) that are built using Events will use available data within the retention period. Recreating these may result in different Profiles based on the available data. + * [Real Time Computation](/docs/engage/audiences/#refresh-real-time-audiences-and-traits) (Audiences, Computed Traits, Journeys): When backfilling with historical data, backfill will use available data within the retention period. Once a computation is live, events that are removed due to data retention will not cause Profiles to enter/exit audiences and will not cause computed trait value changes. However, if you edit the definition or disable then re-enable them, this will cause the computation to re-backfill, which will cause Profiles to enter/exit audiences and computed trait value to change. + * [Batch Computation](/docs/engage/audiences/#real-time-compute-compared-to-batch) (Audiences, Computed Traits): Batch computation always computes based on available data, events removed due to data retention will cause Profile to enter/exit an Audience or computed trait values to change. + ### What data is not impacted? With this policy the following data is not impacted, but may be subject to other policies: -* **[Object Cloud Sources](/docs/connections/sources/#object-cloud-sources)**: This involves Segment fetching object data from third party Cloud Sources. Since Segment always fetches the full objects, the retention policy will have no impact. +* **[Object Cloud Sources](/docs/connections/sources/#object-cloud-sources)**: Segment fetches complete object data from third party Object Cloud Sources. Objects older than the retention period will be deleted. However, since Segment always fetches the complete object, Objects deleted will be fetched and made available again. + * [SendGrid](/docs/connections/sources/catalog/cloud-apps/sendgrid/) is both an Event Source and Object Source, therefore Events from SendGrid have retention period applicable to Archive and Profile stores while Objects from SendGrid have retention period applicable to the Object store retention period. * **Profiles**: Unify Profiles, Identifiers, and Traits created are not subject to this data retention policy. * **Third Party Destinations**: Data in your third party destinations shared by Segment in the course of your implementation remains unaffected. Data stored in a third party system may be subject to the data retention policy of that system. * Anything a user creates in the Segment App, like Audiences, Journeys, Data Graphs, Connections, and more, **are not subject to this data retention policy**. diff --git a/src/protocols/faq.md b/src/protocols/faq.md index b33cf789cf..e2bb133f9b 100644 --- a/src/protocols/faq.md +++ b/src/protocols/faq.md @@ -31,6 +31,17 @@ You can also use the Slack Actions destination to set event triggers for context To consolidate the views in the Schema tab, Segment automatically converts `page` and `screen` calls into `Page Viewed` and `Screen Viewed` events that appear in the Schema Events view. Segment recommends adding a `Page Viewed` or `Screen Viewed` event to your Tracking Plan with any properties you want to validate against. At this time, to validate that a specific named page/screen (`analytics.page('Homepage') | analytics.screen('Home')`) has a specific set of required properties, you will need to use the [JSON Schema](/docs/protocols/tracking-plan/create/#edit-underlying-json-schema). +### Why aren't my changes to the Tracking Plan showing up immediately? + +When you update a Tracking Plan (for example, adding or removing a new property or editing the event or data type) the changes are typically applied within a few minutes. However, there can occasionally be a short delay, especially during periods of high usage across the platform. + +If you still see events flagged or properties omitted shortly after making changes, try the following: + +- Wait a few minutes and then send the event again. +- Make sure the updates are saved and published properly. + +If the changes still aren't reflected after 10 - 15 minutes, [contact Segment Support](https://segment.com/help/contact/){:target="_blank"}. + ### How can I see who made changes to my Tracking Plan? Each Tracking Plan includes a Changelog, which shows which changes were made by which users. To view it, open a Tracking Plan, click the **...** button (also known as the dot-dot-dot, or ellipses menu) next to the Edit Tracking Plan button, and click **View Changelog**. diff --git a/src/segment-app/extensions/git.md b/src/segment-app/extensions/git.md index 97b19156e4..5dae126d31 100644 --- a/src/segment-app/extensions/git.md +++ b/src/segment-app/extensions/git.md @@ -6,7 +6,10 @@ Segment's Git extension lets you manage versioning by syncing changes you make i Git Sync supports synchronization from Segment to Git. When you sync data from Segment to Git, you capture the current state of your workspace through a full sync and includes all new records and changes for supported resources. -You can use [bidirectional sync](#bidirectional-sync) to sync data from Git to Segment. After you enable bidirectional sync, Segment automatically listens for pull requests in your repository and manages all related workspace changes. +You can use [bidirectional sync](#bidirectional-sync) to sync data from Git to Segment. After you enable bidirectional sync, Segment automatically listens for pull requests in your repository and manages all related workspace changes. + +> info "Bidirectional sync is in Private Beta" +> Bidirectional sync is in private beta, and Segment is actively working on this feature. Some functionality may change before it becomes generally available. ## Set up Git Sync @@ -88,6 +91,9 @@ For more information on using Terraform, visit [Terraform's documentation](https Bidirectional sync builds on top of the Git Sync extension and lets you manage your Segment workspace directly in GitHub. After you configure and enable bidirectional sync, Segment automatically listens for pull requests in your repository and manages all related workspace changes. Segment only applies changes when you comment `segment apply` on pull requests that can be successfully merged. +> info "Bidirectional sync is in Private Beta" +> Bidirectional sync is in private beta, and Segment is actively working on this feature. Some functionality may change before it becomes generally available. + Bidirectional sync only supports: - Explicit values ([secrets](#use-secrets-with-bidirectional-sync) require additional configuration) - [Segment resources compatible with Git sync](#working-with-git-sync) diff --git a/src/unify/data-graph/index.md b/src/unify/data-graph/index.md index 2061cb55e7..2b2b25d906 100644 --- a/src/unify/data-graph/index.md +++ b/src/unify/data-graph/index.md @@ -13,30 +13,29 @@ The Data Graph acts as a semantic layer that allows businesses to define relatio ## Prerequisites -> info "Why you need both materialized and unmaterialized tables" -> Segment recommends using materialized views for Profiles Sync to optimize performance and reduce query costs with Linked Audiences. However, due to schema inference requirements, you still need to select the matching **unmaterialized tables** as well. Segment relies on the unmaterialized tables during setup, even if they’re not used when queries run. - To use the Data Graph, you'll need the following: - A supported data warehouse with the appropriate Data Graph permissions - Workspace Owner or Unify Read-only/Admin and Entities Admin permissions -- For Linked Audiences, set up [Profiles Sync](/docs/unify/profiles-sync/) in a Unify space with ready-to-use [data models and tables](/docs/unify/profiles-sync/tables/) in your warehouse. When setting up selective sync, Segment recommends the following settings: +- For Linked Audiences, set up [Profiles Sync](/docs/unify/profiles-sync/) in a Unify space with ready-to-use [data models and tables](/docs/unify/profiles-sync/tables/) in your warehouse. When setting up selective sync, Segment recommends the following settings: - Under **Profile materialized tables**, select all the tables (`user_identifier`, `user_traits`, `profile_merges`) for faster and more cost-efficient Linked Audiences computations in your data warehouse. - **Make sure to include the unmaterialized tables as well**. Segment needs them during setup to understand your schema. - Under **Track event tables**, select **Sync all Track Call Tables** to enable filtering on event history for Linked Audiences conditions. > info "" -> To define entity relationships, you need to enable Linked Audiences. Contact your Customer Success Manager to get access to Linked Audiences. +> To define entity relationships, you need to enable Linked Audiences. Contact your Customer Success Manager to get access to Linked Audiences. ## Step 1: Set up Data Graph permissions in your data warehouse + > warning "" > Data Graph, Reverse ETL, and Profiles Sync require different warehouse permissions. -To get started with the Data Graph, set up the required permissions in your warehouse. Segment supports the following: +To get started with the Data Graph, set up the required permissions in your warehouse. Segment supports the following: + - Linked Audiences: [BigQuery](/docs/unify/data-graph/setup-guides/BigQuery-setup/), [Databricks](/docs/unify/data-graph/setup-guides/databricks-setup/), [Redshift](/docs/unify/data-graph/setup-guides/redshift-setup/), and [Snowflake](/docs/unify/data-graph/setup-guides/snowflake-setup/) -- Linked Events: [BigQuery](/docs/unify/data-graph/setup-guides/BigQuery-setup/), [Databricks](/docs/unify/data-graph/setup-guides/databricks-setup/), [Redshift](/docs/unify/data-graph/setup-guides/redshift-setup/), and [Snowflake](/docs/unify/data-graph/setup-guides/snowflake-setup/) +- Linked Events: [BigQuery](/docs/unify/data-graph/setup-guides/BigQuery-setup/), [Databricks](/docs/unify/data-graph/setup-guides/databricks-setup/), [Redshift](/docs/unify/data-graph/setup-guides/redshift-setup/), and [Snowflake](/docs/unify/data-graph/setup-guides/snowflake-setup/) -To track the data sent to Segment on previous syncs, Segment uses [Reverse ETL](/docs/connections/reverse-etl/) infrastructure to store diffs in tables within a dedicated schema called `_segment_reverse_etl` in your data warehouse. You can choose which database or project in your warehouse this data lives in. +To track the data sent to Segment on previous syncs, Segment uses [Reverse ETL](/docs/connections/reverse-etl/) infrastructure to store diffs in tables within a dedicated schema called `_segment_reverse_etl` in your data warehouse. You can choose which database or project in your warehouse this data lives in. ## Step 2: Connect your warehouse to the Data Graph @@ -45,7 +44,7 @@ To connect your warehouse to the Data Graph: 1. Navigate to **Unify > Data Graph**. This should be a Unify space with Profiles Sync already set up. 2. Click **Add warehouse**. 3. Select your warehouse type. -4. Enter your warehouse credentials. +4. Enter your warehouse credentials. 5. Test your connection, then click **Save**. ## Step 3: Build your Data Graph @@ -64,34 +63,35 @@ The Data Graph is a semantic layer that represents a subset of relevant business **Defining Relationships** -Similar to the concept of [cardinality in data modeling](https://w.wiki/Ay$u){:target="_blank"}, the Data Graph supports 3 types of relationships: +Similar to the concept of [cardinality in data modeling](https://w.wiki/Ay$u){:target="\_blank"}, the Data Graph supports 3 types of relationships: + - **Profile-to-entity relationship:** This is a relationship between your entity table and the Segment Profiles tables, and is the first level of relationship. - **1:many relationship:** For example, an `account` can have many `carts`, but each `cart` can only be associated with one `account`. - **many:many relationship:** For example, a user can have many `carts`, and each `cart` can have many `products`. However, these `products` can also belong to many `carts`. - The Data Graph currently supports 6 levels of depth (or nodes) starting from the profile. For example, relating the `profile` to the `accounts` table to the `carts` table is 3 levels of depth. There are no limits on the width of your Data Graph or the number of entities. - Relationships are nested under the profile. Refer to the example below. -**Data Graph Example** +**Data Graph Example** An example of a Data Graph ```python data_graph { version = "v1.0.0" - + # Define entities entity "account-entity" { name = "account" table_ref = "PRODUCTION.CUST.ACCOUNT" primary_key = "ID" } - + entity "product-entity" { name = "product" table_ref = "PRODUCTION.PROD.PRODUCT_SKUS" primary_key = "SKU" } - + entity "cart-entity" { name = "cart" table_ref = "PRODUCTION.CUST.CART" @@ -110,13 +110,13 @@ data_graph { table_ref = "PRODUCTION.CUST.SUBSCRIPTION" primary_key = "SUB_ID" } - + # Define the profile entity, which corresponds to Segment Profiles tables synced with Profiles Sync # Use materialized views in Profiles Sync to reduce query costs and speed things up profile { profile_folder = "PRODUCTION.SEGMENT" type = "segment:materialized" - + # First branch - relate accounts table to the profile # This is a unique type of relationship between an entity and the profile block relationship "user-accounts" { @@ -128,17 +128,17 @@ data_graph { type = "email" join_key = "EMAIL_ID" } - + # Define 1:many relationship between accounts and carts # for example, an account can be associated with many carts relationship "user-carts" { name = "Shopping Carts" related_entity = "cart-entity" join_on = "account-entity.ID = cart-entity.ACCOUNT_ID" - + # Define many:many relationship between carts and products # for example, there can be multiple carts, and each cart can be associated with multiple products - relationship "products" { + relationship "products" { name = "Purchased Products" related_entity = "product-entity" junction_table { @@ -146,7 +146,7 @@ data_graph { table_ref = "PRODUCTION.CUSTOMER.CART_PRODUCT" left_join_on = "cart-entity.ID = CART_ID" right_join_on = "PRODUCT_ID = product-entity.SKU" - } + } } } } @@ -159,7 +159,7 @@ data_graph { type = "email" join_key = "EMAIL_ID" } - + # Define 1:many relationship between households and subscriptions # for example, a household can be associated with multiple subscriptions relationship "user-subscriptions" { @@ -172,15 +172,17 @@ data_graph { ``` ### 3a: Define entities + The first step in creating a Data Graph is to define your entities. An entity corresponds to a table in the warehouse. -| Parameters | Definition | -| ----------- | --------------------------------------------------------------------- | -| `entity` | An immutable slug for the entity, and will be treated as a delete if you make changes. The slug must be in all lowercase, and supports dashes or underscores (e.g `account-entity` or `account_entity`). | -| `name` | A label displayed throughout your Segment space for Linked Events, Linked Audiences, etc. This name can be modified at any time. | -| `table_ref` | Defines the fully qualified table reference: `[database name].[schema name].[table name]`. Segment flexibly supports tables, views and materialized views. | -| `primary_key` | The unique identifier for the given table. Must be a column with unique values per row. | -| (If applicable) `enrichment_enabled = true` | Add this if you plan to reference the entity table for [Linked Events](/docs/unify/data-graph/linked-events/) use cases. | +| Parameters | Definition | +| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `entity` | An immutable slug for the entity, and will be treated as a delete if you make changes. The slug must be in all lowercase, and supports dashes or underscores (for example, `account-entity` or `account_entity`). | +| `description` (*Optional*) | An optional descriptor used to add additional context to the entity (for example, table grain, cadence at which the table/view is refreshed). | +| `name` | A label displayed throughout your Segment space for Linked Events, Linked Audiences. This name can be modified at any time. | +| `table_ref` | Defines the fully qualified table reference: `[database name].[schema name].[table name]`. Segment flexibly supports tables, views and materialized views. | +| `primary_key` | The unique identifier for the given table. Must be a column with unique values per row. | +| (If applicable) `enrichment_enabled = true` | Add this if you plan to reference the entity table for [Linked Events](/docs/unify/data-graph/linked-events/) use cases. | **Example:** @@ -188,10 +190,11 @@ The first step in creating a Data Graph is to define your entities. An entity co data_graph { entity "account-entity" { name = "account" + description = "An entity representing user accounts" table_ref = "PRODUCTION.CUST.ACCOUNT" primary_key = "ID" } - + entity "cart-entity" { name = "cart" table_ref = "PRODUCTION.CUST.CART" @@ -202,15 +205,16 @@ data_graph { ``` ### 3b: Define the profile + > info "" > Segments recommends that you select materialized views under the Profiles [Selective Sync settings](/docs/unify/profiles-sync/profiles-sync-setup/#step-3-set-up-selective-sync) to optimize warehouse compute costs. -Next, define the profile. This is a special class of entity that represents Segment Profiles, which corresponds to the Profiles Sync tables and models. For Linked Audiences, this allows marketers to filter on profile traits, event history, etc. There can only be one profile for a Data Graph. +Next, define the profile. This is a special class of entity that represents Segment Profiles, which corresponds to the Profiles Sync tables and models. For Linked Audiences, this allows marketers to filter on profile traits, event history, etc. There can only be one profile for a Data Graph. -| Parameters | Definition | -| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `profile_folder` | Define the fully qualified path of the folder or schema location for the profile tables. | -| `type` | Use `segment:materialized` to sync materialized views with Profiles Sync. Segment recommends this configuration for all Linked Audiences and Data Graph setups. If you can't sync materialized views, [reach out to Segment support](https://segment.com/help/contact/){:target="_blank"} for help. | +| Parameters | Definition | +| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `profile_folder` | Define the fully qualified path of the folder or schema location for the profile tables. | +| `type` | Use `segment:materialized` to sync materialized views with Profiles Sync. Segment recommends this configuration for all Linked Audiences and Data Graph setups. If you can't sync materialized views, [reach out to Segment support](https://segment.com/help/contact/){:target="\_blank"} for help. | **Example:** @@ -219,7 +223,7 @@ Next, define the profile. This is a special class of entity that represents Segm data_graph { # Define entities ... - + # Define the profile entity, which corresponds to Segment Profiles tables synced via Profiles Sync # Recommend setting up Profiles Sync materialized views to optimize warehouse compute costs profile { @@ -232,23 +236,27 @@ data_graph { ### 3c: Define relationships -Now define your relationships between your entities. Similar to the concept of [cardinality in data modeling](en.wikipedia.org/wiki/Cardinality_(data_modeling)), the Data Graph supports 3 types of relationships below. All relationship types require you to define the relationship slug, name, and related entity. Each type of relationship has unique join on conditions. +Now define your relationships between your entities. Similar to the concept of [cardinality in data modeling](), the Data Graph supports 3 types of relationships below. All relationship types require you to define the relationship slug, name, and related entity. Each type of relationship has unique join on conditions. + - **[Profile-to-entity relationship](#define-profile-to-entity-relationship):** This is a relationship between your entity table and the Segment Profiles tables, and is the first level of relationship. - **[1:many relationship](#define-a-1many-relationship):** For example, an `account` can have many `carts`, but each `cart` can only be associated with one `account`. - **[many:many relationship](#define-manymany-relationship):** For example, a user can have many `carts`, and each `cart` can have many `products`. However, these `products` can also belong to many `carts`. #### Define profile-to-entity relationship -This is the first level of relationships and a unique type of relationship between the Segment profile entity and a related entity. -| Parameters | Definition | -| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `relationship` | An immutable slug for the relationship, and will be treated as a delete if you make changes. The slug must be in all lowercase, and supports dashes or underscores (like `user-account` or `user_account`) | -| `name` | A label displayed throughout your Segment space for Linked Events, Linked Audiences, etc. This name can be modified at any time | -| `related_entity` | References your already defined entity | +This is the first level of relationships and a unique type of relationship between the Segment profile entity and a related entity. + +| Parameters | Definition | +| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `relationship` | An immutable slug for the relationship, and will be treated as a delete if you make changes. The slug must be in all lowercase, and supports dashes or underscores (like `user-account` or `user_account`). | +| `name` | A label displayed throughout your Segment space for Linked Events, Linked Audiences. This name can be modified at any time. | +| `description` (*Optional*) | An optional descriptor used to add additional context to the relationship. | +| `related_entity` | This references the already defined entity. | -To define a profile-to-entity relationship, reference your entity table and depending on your table columns, choose to join on one of the following: +To define a profile-to-entity relationship, reference your entity table and depending on your table columns, choose to join on one of the following: + +**Option 1 (Most common) - Join on an external ID:** Use the `external_id` block to join the profile entity with an entity table using external IDs from your [Unify ID resolution](/docs/unify/identity-resolution/externalids/) settings. Typically these identifiers are `user_id`, `email`, or `phone` depending on the structure of your entity table. -**Option 1 (Most common) - Join on an external ID:** Use the `external_id` block to join the profile entity with an entity table using external IDs from your [Unify ID resolution](/docs/unify/identity-resolution/externalids/) settings. Typically these identifiers are `user_id`, `email`, or `phone` depending on the structure of your entity table. - `type`: Represents the [external ID type](/docs/unify/identity-resolution/externalids/#default-externalids) (`email`, `phone`, `user_id`) in your ID resolution settings. - This maps to the `type` column in the `user_identifiers` table when using materialized views. - `join_key`: The column on the entity table that matches the external ID. @@ -256,38 +264,41 @@ To define a profile-to-entity relationship, reference your entity table and depe > note "" > Segment recommends using materialized views with Profiles Sync. However, Segment may still reference unmaterialized tables during setup for schema detection. -**Option 2 - Join on a profile trait:** Use the `trait` block to join the profile entity with an entity table using [Profile Traits](/docs/unify/#enrich-profiles-with-traits). -- `name`: Represents a trait name in your Unify profiles. - - This maps to the `name` column in the `user_traits` table when using materialized views. +**Option 2 - Join on a profile trait:** Use the `trait` block to join the profile entity with an entity table using [Profile Traits](/docs/unify/#enrich-profiles-with-traits). + +- `name`: Represents a trait name in your Unify profiles. + - This maps to the `name` column in the `user_traits` table when using materialized views. - `join_key`: The column on the entity table that you're matching to the trait. **Example:** + ```python -data_graph { +data_graph { entity "account-entity" { name = "account" table_ref = "PRODUCTION.CUST.ACCOUNT" primary_key = "ID" } - + # Define additional entities... # Note: Relationships are nested profile { profile_folder = "PRODUCTION.SEGMENT" type = "segment:materialized" - - # Relate accounts table to the profile + + # Relate accounts table to the profile relationship "user-accounts" { name = "Premium Accounts" + description = "A relationship linking Segment profiles to user accounts" related_entity = "account-entity" - + # Option 1: Join the profile entity with an identifier (like email) on the related entity table external_id { type = "email" join_key = "EMAIL_ID" } - + # Option 2: Join the profile entity with a profile trait on the related entity table trait { name = "cust_id" @@ -299,38 +310,41 @@ data_graph { ``` #### Define a 1:many relationship + For 1:many relationships, define the join on between the two entity tables using the spec below. -| Parameters | Definition | -| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `relationship` | An immutable slug for the relationship, and will be treated as a delete if you make changes. The slug must be in all lowercase, and supports dashes or underscores (like `user-account` or `user_account`) | -| `name` | A label displayed throughout your Segment space for Linked Events, Linked Audiences, and so on. This name can be modified at any time | -| `related_entity` | References your already defined entity | -| `join_on` | Defines relationship between the two entity tables `[lefty entity slug].[column name] = [right entity slug].[column name]`. Note that since you’re referencing the entity slug for the join on, you do not need to define the full table reference | +| Parameters | Definition | +| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `relationship` | An immutable slug for the relationship, and will be treated as a delete if you make changes. The slug must be in all lowercase, and supports dashes or underscores (like `user-account` or `user_account`). | +| `name` | A label displayed throughout your Segment space for Linked Events, Linked Audiences, and so on. This name can be modified at any time | +| `description` (*Optional*) | An optional descriptor used to add additional context to the relationship. | +| `related_entity` | References your already defined entity | +| `join_on` | Defines relationship between the two entity tables `[lefty entity slug].[column name] = [right entity slug].[column name]`. Note that since you’re referencing the entity slug for the join on, you do not need to define the full table reference. | **Example:** ```python -data_graph { +data_graph { entity "cart-entity" { name = "cart" table_ref = "PRODUCTION.CUST.CART" primary_key = "ID" } - + # Define additional entities... # Note: Relationships are nested profile { profile_folder = "PRODUCTION.SEGMENT" type = "segment:materialized" - + relationship "user-accounts" { ... - + # Define 1:many relationship between accounts and carts relationship "user-carts" { name = "Shopping Carts" + description = "A relationship linking user accounts to carts" related_entity = "carts-entity" join_on = "account-entity.ID = cart-entity.ACCOUNT_ID" } @@ -340,47 +354,59 @@ data_graph { ``` #### Define many:many relationship + For many:many relationships, define the join on between the two entity tables with the `junction_table`. > warning "" > Attributes from a junction table are not referenceable via the Linked Audience builder. If a marketer would like to filter upon a column on the junction table, you must define the junction as an entity and define a relationship. - -| Parameters | Definition | -| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `relationship` | An immutable slug for the relationship, and will be treated as a delete if you make changes. The slug must be in all lowercase, and supports dashes or underscores (like `user-account` or `user_account`) | -| `name` | A label displayed throughout your Segment space for Linked Events, Linked Audiences, and so on. This name can be modified at any time | -| `related_entity` | References your already defined entity | +| Parameters | Definition | +| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `relationship` | An immutable slug for the relationship, and will be treated as a delete if you make changes. The slug must be in all lowercase, and supports dashes or underscores (like `user-account` or `user_account`). | +| `name` | A label displayed throughout your Segment space for Linked Events, Linked Audiences, and so on. This name can be modified at any time. | +| (Optional) `description` | An optional descriptor used to add additional context to the relationship. | +| `related_entity` | This references your defined entity. | **Junction table spec** | Parameters | Definition | | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `table_ref` | Defines the fully qualified table reference to the join table: `[database name].[schema name].[table name]`. Segment flexibly supports tables, views and materialized views | -| `primary_key` | The unique identifier for the given table. Must be a column with unique values per row | -| `left_join_on` | Define the relationship between the left entity table and the junction table: `[left entity slug].[column name] = [junction table column name]`. Note that schema and table are implied within the junction table column name, so you do not need to define it again | -| `right_join_on` | Define the relationship between the junction table and the right entity table: `[junction table column name] = [right entity slug].[column name]`. Note that schema and table are implied within the junction table column name, so you do not need to define it again | +| `table_ref` | Defines the fully qualified table reference to the join table: `[database name].[schema name].[table name]`. Segment flexibly supports tables, views and materialized views. | +| `primary_key` | The unique identifier for the given table. Must be a column with unique values per row. | +| `left_join_on` | Defines the relationship between the left entity table and the junction table: `[left entity slug].[column name] = [junction table column name]`. Note that schema and table are implied within the junction table column name, so you do not need to define it again. | +| `right_join_on` | Define the relationship between the junction table and the right entity table: `[junction table column name] = [right entity slug].[column name]`. Note that schema and table are implied within the junction table column name, so you do not need to define it again. | + +When you define a many-to-many relationship using a junction table, `left_join_on` and `right_join_on` tell Data Graph how to connect each entity to the junction table: + +- Use `left_join_on` to specify which column in the junction table links to the parent (left) entity. + +- Use `right_join_on` to specify which column links to the child (right) entity. + +These fields define the join conditions, but they don’t control how the join is executed. Data Graph always performs inner joins, even if you specify a `left_join_on`. + +If you need behavior similar to a left join (like including unmatched rows), create a view in your warehouse with the logic you’re targeting and reference that view as an entity in your graph. **Example:** ```python -data_graph { +data_graph { # Define entities # Note: Relationships are nested profile { # Define profile - + relationship "user-accounts" { ... - + relationship "user-carts" { ... - + # Define many:many relationship between carts and products relationship "products" { name = "Purchased Products" + description = "A relationship linking user carts to products via the CART_PRODUCT junction table" related_entity = "product-entity" junction_table { table_ref = "PRODUCTION.CUSTOMER.CART_PRODUCT" @@ -393,9 +419,11 @@ data_graph { } } } - + ``` + ## Step 4: Validate your Data Graph + You can validate your Data Graph using the preview, then click Save. After you've set up your Data Graph, your partner teams can start leveraging these datasets with with [Linked Events](/docs/unify/data-graph/linked-events/) and [Linked Audiences](/docs/engage/audiences/linked-audiences/). ## Edit and manage your Data Graph @@ -408,28 +436,33 @@ To edit your Data Graph: ### View Data Graph data consumers A data consumer refers to a Segment feature like Linked Events and Linked Audiences that are referencing datasets, such as entities and/or relationships, from the Data Graph. You can view a list of data consumers in two places: + - Under **Unify > Data Graph**, click the **Data consumers** tab - Under **Unify > Data Graph > Overview** or the **Data Graph editor > Preview**, click into a node on the Data Graph preview and a side sheet will pop up with the list of data consumers for the respective relationship ### Understand changes that may cause breaking and potential breaking changes Upon editing and saving changes to your Data Graph, a modal will pop up to warn of breaking and/or potential breaking changes to your data consumers. You must acknowledge and click **Confirm and save** in order to proceed. + - **Definite breaking change**: Occurs when deleting an entity or relationship that is being referenced by a data consumer. Data consumers affected by breaking changes will fail on the next run. Note: The entity and relationship slug are immutable and treated as a delete if you make changes. You can modify the label. - **Potential breaking change**: Some changes such as updating the entity `table_ref` or `primary_key`, may lead to errors with data consumers. If there’s a breaking change, the data consumer will fail on the next run. Unaffected data consumers will continue to work. ### Detect warehouse breaking changes -Segment has a service that regularly scans and monitors the Data Graph for changes that occur in your warehouse that may break components of the Data Graph, like when the table being referenced by the Data Graph gets deleted from your warehouse or when the primary key column no longer exists. An alert banner will be displayed on the Data Graph landing page. The banner will be removed once the issues are resolved in your warehouse and/or the Data Graph. You will also have the option to trigger a manual sync of your warehouse schema. +Segment has a service that regularly scans and monitors the Data Graph for changes that occur in your warehouse that may break components of the Data Graph, like when the table being referenced by the Data Graph gets deleted from your warehouse or when the primary key column no longer exists. An alert banner will be displayed on the Data Graph landing page. The banner will be removed once the issues are resolved in your warehouse and/or the Data Graph. You will also have the option to trigger a manual sync of your warehouse schema. ### Receive alerts for warehouse breaking changes Configure alerts for breaking changes to receive notifications over Slack, email, or in-app notification whenever Segment detects a breaking change in your warehouse. -To configure alerts for breaking changes: -1. Open your workspace and navigate to **Settings > User Preferences > Activity Notifications**. +To configure alerts for breaking changes: + +1. Open your workspace and navigate to **Settings > User Preferences > Activity Notifications**. 2. Select **Data Graph**. -3. Select one of the following notification methods: - - **Email**: Select this to receive notifications at either the email address associated with your account or another email address that you enter into this field. - - **Slack**: Select this and enter a Slack webhook URL and channel name to send alerts to a channel in your Slack workspace. - - **In-app**: Select this to receive notifications in the Segment app. To view your notifications, select the bell next to your user icon in the Segment app. +3. Select one of the following notification methods: + +- **Email**: Select this to receive notifications at either the email address associated with your account or another email address that you enter into this field. +- **Slack**: Select this and enter a Slack webhook URL and channel name to send alerts to a channel in your Slack workspace. +- **In-app**: Select this to receive notifications in the Segment app. To view your notifications, select the bell next to your user icon in the Segment app. + 4. Click **Save**. diff --git a/src/unify/data-graph/linked-events.md b/src/unify/data-graph/linked-events.md index 407b8b303f..ea32cb189e 100644 --- a/src/unify/data-graph/linked-events.md +++ b/src/unify/data-graph/linked-events.md @@ -159,7 +159,7 @@ To configure your sync schedule: 3. Click **Edit** next to **Sync schedule**. 4. Select the **Schedule type**. You can choose from: * **Manual**: Trigger the sync manually or with Segment's API. - * **Interval**: Sync based on a by-the minute, hourly, or daily cycle. For example, once every 2 hours. + * **Interval**: Sync at predefined intervals: 15 min, 30 min, 1 hour, 2 hours, 4 hours, 6 hours, 8 hours, 12 hours, or 1 day * **Day and time**: Sync at specific times on selected days of the week. For example, Mondays at 2:00PM. ### Add entities @@ -213,7 +213,7 @@ To use Linked Events, be sure that you have proper permissions for the Data Ware #### How often do syncs occur? -Segment currently syncs once every hour. +You can configure your syncs to occur at predefined intervals: 15 min, 30 min, 1 hour, 2 hours, 4 hours, 6 hours, 8 hours, 12 hours, or 1 day. See the section on [configuring the sync schedule](#configure-the-sync-schedule) to learn more. #### Which Destinations does Linked Events support? diff --git a/src/unify/data-graph/setup-guides/snowflake-setup.md b/src/unify/data-graph/setup-guides/snowflake-setup.md index aea89baece..249530272a 100644 --- a/src/unify/data-graph/setup-guides/snowflake-setup.md +++ b/src/unify/data-graph/setup-guides/snowflake-setup.md @@ -156,7 +156,7 @@ To connect your warehouse to the Data Graph: - **Username**: The Snowflake user that Segment uses to run SQL in your warehouse. This user is referred to as `segment_connection_username` in the script below - **Authentication**: There are 2 supported authentication methods: - **Key Pair**: This is the recommended method of authentication. You would need to first create the user and assign it a key pair following the instructions in the [Snowflake docs](https://docs.snowflake.com/en/user-guide/key-pair-auth){:target="_blank"}. Then, follow the Segment docs above to set up Snowflake permissions and set the `segment_connections_username` variable in the SQL script to the user you just created - - **Password**: The password of the user above. This password is referred to as `segment_connection_password` in the script below. + - **Password**: The password of the user above. This password is referred to as `segment_connection_password` in the script below 5. Test your connection, then click Save. diff --git a/src/unify/event-filtering.md b/src/unify/event-filtering.md new file mode 100644 index 0000000000..c4e8dc3088 --- /dev/null +++ b/src/unify/event-filtering.md @@ -0,0 +1,82 @@ +--- +title: Unify Event Filtering +plan: unify +--- + +Unify Event Filtering lets you control which events reach your Unify space. + +> info "Public Beta" +> Unify Event Filtering is in public beta, and Segment is actively working on this feature. Some functionality may change before it becomes generally available. + +## Overview + +With Unify Event Filtering, you can use block events that aren’t useful for [Identity Resolution](/docs/unify/identity-resolution/) or downstream activation, which keeps your space cleaner and more efficient. + +Event Filtering is useful when you’re sending a lot of different event types into Segment but only some of them are relevant to Unify. For example, you might want to: + +- Drop telemetry or system events that don’t describe user behavior +- Filter out events from certain regions or user groups +- Keep events in Connections, but exclude them from Unify + +Unify Event Filtering works differently from [Destination Filters](/docs/connections/destinations/destination-filters/) in a few important ways: + +| | Unify Event Filtering | Destination Filters | +| ---------------- | ---------------------------------------------------------------- | --------------------------------------- | +| Where it applies | Unify space | Individual destinations | +| Filter scope | All [sources](/docs/connections/sources/) connected to the space | One source for each destination | +| Filter action | Drops entire events | Can drop or modify events and fields | +| Setup | Created through API, visible in Unify UI | Created in UI or API | +| Timing | Before Identity Resolution | Before events get sent to a destination | + +This helps simplify your setup and reduce noise in profile data without needing repeaters, webhooks, or custom logic. + +## How filtering works + +Unify Event Filtering evaluates every incoming event before it enters your Unify space. If the event matches any of your filters, it gets dropped. + +Keep the following in mind as you work with Unify Event Filtering: + +- Filters are configured at the space level. You don’t create filters per source. Instead, one set of filters applies to all sources connected to the space. +- The filtering logic is based on [Filter Query Language](/docs/api/public-api/fql/). If you’ve used Destination Filters before, it works the same way. You can write expressions to match events based on type, name, traits, properties, or values. +- Matching is inclusive: if an event matches any filter, Segment drops it. +- Filtering happens **before** Identity Resolution: dropped events never reach the profile graph and won’t affect trait updates or [computed traits](/docs/unify/traits/computed-traits/). + +As a result, Unify Event Filtering helps you keep profile data clean from the start, without having to preprocess or transform events outside of Segment. + +## Creating and managing filters + +During public beta, you'll use the [Space Filter API](https://docs.segmentapis.com/tag/Space-Filters/){:target="_blank"} to create and manage all Unify event filters. The API lets you define filters using FQL, name them, enable or disable them, and delete them. Each Unify space can have up to 10 filters. Any event that matches 1 of those filters gets dropped before it reaches Unify. + +After you create a filter through the API, it shows up in your Segment workspace in **Unify > Unify settings > Filters**. From there, you can view existing filters, turn them on or off, rename them, or delete them. However, you can’t edit the filtering logic from within your workspace. If you want to edit filtering logic, you'll need to managed it through the API. + +The following table compares what you can do with Event Filtering with the API compared your Segment workspace: + +| Action | Where it happens | +| ------------------------- | ------------------- | +| Create a filter | API only | +| Define filter logic (FQL) | API only | +| Enable or disable filters | API or workspace | +| Rename a filter | API or workspace | +| Delete a filter | API or workspace | +| View filters | API or workspace | +| Edit filter logic | Replace in API only | + +> info "Updating filter logic" +> To update a filter’s logic, you’ll need to delete the existing filter through the Space Filter API and create a new one with the updated expression. + +## Best practices + +Unify Event Filtering is most useful when you want to keep noisy, irrelevant, or duplicate data out of your Unify space. The following table lists best practices to help you get the most value out of filtering: + +| Tip | Why it matters | +| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Filter early | Prevents irrelevant events from affecting profile data or identity resolution. | +| Drop obvious noise | Start with telemetry, test data, or internal events. | +| Keep it simple | A few targeted filters are easier to manage than multiple complex filters. | +| Think at the space level | Filters apply to all sources. Write conditions accordingly. | +| Test before enabling | Use the [preview endpoint](https://docs.segmentapis.com/tag/Destination-Filters#operation/previewDestinationFilter){:target="_blank"} to check filter behavior before turning it on. | + + +Unify Event Filtering gives you an early control point for managing the quality of data entering your space. It helps reduce noise, control costs, and improve the accuracy of profile data before any Identity Resolution takes place. + +To learn more about how Unify spaces work and how Segment processes events after filtering, see the [Unify documentation](/docs/unify/). \ No newline at end of file diff --git a/src/unify/product-limits.md b/src/unify/product-limits.md index 9f7c9c1df5..44979fe2ac 100644 --- a/src/unify/product-limits.md +++ b/src/unify/product-limits.md @@ -42,7 +42,7 @@ Visit Segment's [pricing page](https://segment.com/pricing/){:target="_blank"} t | name | limit | Details | | --------------------------------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Compute Concurrency | 5 new concurrent audiences or computed traits | Segment computes five new audiences or computed traits at a time. Once the limit is reached, Segment queues additional computations until one of the five finishes computing. | -| Edit Concurrency | 2 concurrent audiences or computed traits | You can edit two concurrent audiences or computed traits at a time. Once the limit is reached, Segment queues and locks additional computations until one of the two finishes computing. | +| Edit Concurrency | 5 concurrent audiences or computed traits | You can edit five concurrent audiences or computed traits at a time. Once the limit is reached, Segment queues and locks additional computations until one of the five finishes computing. | | Batch Compute Concurrency Limit | 10 (default) per space | The number of batch computations that can run concurrently per space. When this limit is reached, Segment delays subsequent computations until current computations finish. | | Compute Throughput | 10000 computations per second | Computations include any Track or Identify call that triggers an audience or computed trait re-computation. Once the limit is reached, Segment may slow audience processing. | | Real-time to batch destination sync frequency | 2-3 hours | The frequency with which Segment syncs real-time audiences to batch destinations. |