From 22455ff3380a3700b32a247272b0324e69630380 Mon Sep 17 00:00:00 2001 From: Lydia Xie Date: Tue, 6 Jan 2026 10:59:34 -0800 Subject: [PATCH 01/11] BD-5509: Update order of Currents examples --- .../customer_behavior_events.md | 422 +++++++++--------- 1 file changed, 211 insertions(+), 211 deletions(-) diff --git a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/customer_behavior_events.md b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/customer_behavior_events.md index 23c5ea181d7..4f578f90273 100644 --- a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/customer_behavior_events.md +++ b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/customer_behavior_events.md @@ -87,6 +87,31 @@ Custom Events This event occurs when a specific custom event is triggered. Use this to track when users perform custom events in your application. {% tabs %} +{% tab Cloud Storage %} +```json +// users.behaviors.CustomEvent + +{ + "ad_id" : "(optional, string) [PII] Advertising identifier", + "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", + "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_id" : "(optional, string) API ID of the app on which this event occurred", + "device_id" : "(optional, string) ID of the device on which the event occurred", + "device_model" : "(optional, string) Model of the device", + "external_user_id" : "(optional, string) [PII] External ID of the user", + "id" : "(required, string) Globally unique ID for this event", + "name" : "(required, string) Name of the custom event", + "os_version" : "(optional, string) Version of the operating system of the device", + "platform" : "(optional, string) Platform of the device", + "properties" : "(required, string) Custom properties stored as a JSON encoded string", + "time" : "(required, int) UNIX timestamp at which the event happened", + "timezone" : "(optional, string) Time zone of the user", + "user_id" : "(required, string) Braze user ID of the user who performed this event" +} +``` +{% endtab %} + {% tab Amplitude %} ```json // [Braze Custom Event] (users.behaviors.CustomEvent) @@ -170,31 +195,6 @@ This event occurs when a specific custom event is triggered. Use this to track w } ``` {% endtab %} - -{% tab Cloud Storage %} -```json -// users.behaviors.CustomEvent - -{ - "ad_id" : "(optional, string) [PII] Advertising identifier", - "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", - "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(optional, string) API ID of the app on which this event occurred", - "device_id" : "(optional, string) ID of the device on which the event occurred", - "device_model" : "(optional, string) Model of the device", - "external_user_id" : "(optional, string) [PII] External ID of the user", - "id" : "(required, string) Globally unique ID for this event", - "name" : "(required, string) Name of the custom event", - "os_version" : "(optional, string) Version of the operating system of the device", - "platform" : "(optional, string) Platform of the device", - "properties" : "(required, string) Custom properties stored as a JSON encoded string", - "time" : "(required, int) UNIX timestamp at which the event happened", - "timezone" : "(optional, string) Time zone of the user", - "user_id" : "(required, string) Braze user ID of the user who performed this event" -} -``` -{% endtab %} {% endtabs %} #### Property details @@ -214,6 +214,21 @@ Attribution This event occurs when an app installation is attributed to a source. Use this to track where your app installs are coming from. {% tabs %} +{% tab Cloud Storage %} +```json +// users.behaviors.InstallAttribution + +{ + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "external_user_id" : "(optional, string) [PII] External ID of the user", + "id" : "(required, string) Globally unique ID for this event", + "source" : "(required, string) The source of the attribution", + "time" : "(required, int) UNIX timestamp at which the event happened", + "user_id" : "(required, string) Braze user ID of the user who performed this event" +} +``` +{% endtab %} + {% tab Amplitude %} ```json // Install Attribution (users.behaviors.InstallAttribution) @@ -276,21 +291,6 @@ This event occurs when an app installation is attributed to a source. Use this t } ``` {% endtab %} - -{% tab Cloud Storage %} -```json -// users.behaviors.InstallAttribution - -{ - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "external_user_id" : "(optional, string) [PII] External ID of the user", - "id" : "(required, string) Globally unique ID for this event", - "source" : "(required, string) The source of the attribution", - "time" : "(required, int) UNIX timestamp at which the event happened", - "user_id" : "(required, string) Braze user ID of the user who performed this event" -} -``` -{% endtab %} {% endtabs %} {% endapi %} @@ -305,6 +305,33 @@ Locations This event is triggered when a user visits a specified location. Use this to track users triggering location events in your app. {% tabs %} +{% tab Cloud Storage %} +```json +// users.behaviors.Location + +{ + "ad_id" : "(optional, string) [PII] Advertising identifier", + "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", + "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", + "alt_accuracy" : "(optional, float) Altitude accuracy of recorded location", + "altitude" : "(optional, float) [PII] Altitude of recorded location", + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_id" : "(required, string) API ID of the app on which this event occurred", + "device_id" : "(optional, string) ID of the device on which the event occurred", + "device_model" : "(optional, string) Model of the device", + "external_user_id" : "(optional, string) [PII] External ID of the user", + "id" : "(required, string) Globally unique ID for this event", + "latitude" : "(required, float) [PII] Latitude of recorded location", + "ll_accuracy" : "(optional, float) Accuracy of the latitude and longitude of recorded location", + "longitude" : "(required, float) [PII] Longitude of recorded location", + "os_version" : "(optional, string) Version of the operating system of the device", + "platform" : "(optional, string) Platform of the device", + "time" : "(required, int) UNIX timestamp at which the event happened", + "user_id" : "(required, string) Braze user ID of the user who performed this event" +} +``` +{% endtab %} + {% tab Amplitude %} ```json // Location (users.behaviors.Location) @@ -402,33 +429,6 @@ This event is triggered when a user visits a specified location. Use this to tra } ``` {% endtab %} - -{% tab Cloud Storage %} -```json -// users.behaviors.Location - -{ - "ad_id" : "(optional, string) [PII] Advertising identifier", - "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", - "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", - "alt_accuracy" : "(optional, float) Altitude accuracy of recorded location", - "altitude" : "(optional, float) [PII] Altitude of recorded location", - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(required, string) API ID of the app on which this event occurred", - "device_id" : "(optional, string) ID of the device on which the event occurred", - "device_model" : "(optional, string) Model of the device", - "external_user_id" : "(optional, string) [PII] External ID of the user", - "id" : "(required, string) Globally unique ID for this event", - "latitude" : "(required, float) [PII] Latitude of recorded location", - "ll_accuracy" : "(optional, float) Accuracy of the latitude and longitude of recorded location", - "longitude" : "(required, float) [PII] Longitude of recorded location", - "os_version" : "(optional, string) Version of the operating system of the device", - "platform" : "(optional, string) Platform of the device", - "time" : "(required, int) UNIX timestamp at which the event happened", - "user_id" : "(required, string) Braze user ID of the user who performed this event" -} -``` -{% endtab %} {% endtabs %} #### Property details @@ -451,6 +451,32 @@ Purchases are special custom events and come with a JSON encoded string of custo {% endalert %} {% tabs %} +{% tab Cloud Storage %} +```json +// users.behaviors.Purchase + +{ + "ad_id" : "(optional, string) [PII] Advertising identifier", + "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", + "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_id" : "(optional, string) API ID of the app on which this event occurred", + "currency" : "(required, string) Currency of the purchase", + "device_id" : "(optional, string) ID of the device on which the event occurred", + "device_model" : "(optional, string) Model of the device", + "external_user_id" : "(optional, string) [PII] External ID of the user", + "id" : "(required, string) Globally unique ID for this event", + "os_version" : "(optional, string) Version of the operating system of the device", + "platform" : "(optional, string) Platform of the device", + "price" : "(required, float) Price of the purchase", + "product_id" : "(required, string) ID of the product purchased", + "properties" : "(required, string) Custom properties stored as a JSON encoded string", + "time" : "(required, int) UNIX timestamp at which the event happened", + "user_id" : "(required, string) Braze user ID of the user who performed this event" +} +``` +{% endtab %} + {% tab Amplitude %} ```json // Purchase (users.behaviors.Purchase) @@ -542,32 +568,6 @@ Purchases are special custom events and come with a JSON encoded string of custo } ``` {% endtab %} - -{% tab Cloud Storage %} -```json -// users.behaviors.Purchase - -{ - "ad_id" : "(optional, string) [PII] Advertising identifier", - "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", - "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(optional, string) API ID of the app on which this event occurred", - "currency" : "(required, string) Currency of the purchase", - "device_id" : "(optional, string) ID of the device on which the event occurred", - "device_model" : "(optional, string) Model of the device", - "external_user_id" : "(optional, string) [PII] External ID of the user", - "id" : "(required, string) Globally unique ID for this event", - "os_version" : "(optional, string) Version of the operating system of the device", - "platform" : "(optional, string) Platform of the device", - "price" : "(required, float) Price of the purchase", - "product_id" : "(required, string) ID of the product purchased", - "properties" : "(required, string) Custom properties stored as a JSON encoded string", - "time" : "(required, int) UNIX timestamp at which the event happened", - "user_id" : "(required, string) Braze user ID of the user who performed this event" -} -``` -{% endtab %} {% endtabs %} #### Property details @@ -591,6 +591,31 @@ When a user starts their first session, both a `FirstSession` and a `SessionStar {% endalert %} {% tabs %} +{% tab Cloud Storage %} +```json +// users.behaviors.app.FirstSession + +{ + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_id" : "(required, string) API ID of the app on which this event occurred", + "country" : "(optional, string) [DEPRECATED]", + "device_id" : "(optional, string) ID of the device on which the event occurred", + "device_model" : "(optional, string) Model of the device", + "external_user_id" : "(optional, string) [PII] External ID of the user", + "gender" : "(optional, string) [DEPRECATED]", + "id" : "(required, string) Globally unique ID for this event", + "language" : "(optional, string) [DEPRECATED]", + "os_version" : "(optional, string) Version of the operating system of the device", + "platform" : "(optional, string) Platform of the device", + "sdk_version" : "(optional, string) [DEPRECATED]", + "session_id" : "(required, string) UUID of the session", + "time" : "(required, int) UNIX timestamp at which the event happened", + "timezone" : "(optional, string) Time zone of the user", + "user_id" : "(required, string) Braze user ID of the user who performed this event" +} +``` +{% endtab %} + {% tab Amplitude %} ```json // First Session (users.behaviors.app.FirstSession) @@ -665,45 +690,41 @@ When a user starts their first session, both a `FirstSession` and a `SessionStar } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Session End events {#session-end-events} + +{% apitags %} +Sessions +{% endapitags %} +This occurs when a user exits your application, therefore ending their current session. Use this data to track when sessions end, and along with the appropriate session start event, calculate the duration of their time in a session. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.behaviors.app.FirstSession +// users.behaviors.app.SessionEnd { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "app_id" : "(required, string) API ID of the app on which this event occurred", - "country" : "(optional, string) [DEPRECATED]", "device_id" : "(optional, string) ID of the device on which the event occurred", "device_model" : "(optional, string) Model of the device", + "duration" : "(optional, float) Duration of the session in seconds", "external_user_id" : "(optional, string) [PII] External ID of the user", - "gender" : "(optional, string) [DEPRECATED]", "id" : "(required, string) Globally unique ID for this event", - "language" : "(optional, string) [DEPRECATED]", "os_version" : "(optional, string) Version of the operating system of the device", "platform" : "(optional, string) Platform of the device", - "sdk_version" : "(optional, string) [DEPRECATED]", "session_id" : "(required, string) UUID of the session", "time" : "(required, int) UNIX timestamp at which the event happened", - "timezone" : "(optional, string) Time zone of the user", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Session End events {#session-end-events} -{% apitags %} -Sessions -{% endapitags %} - -This occurs when a user exits your application, therefore ending their current session. Use this data to track when sessions end, and along with the appropriate session start event, calculate the duration of their time in a session. - -{% tabs %} {% tab Amplitude %} ```json // Session End (users.behaviors.app.SessionEnd) @@ -781,17 +802,33 @@ This occurs when a user exits your application, therefore ending their current s } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Session Start events {#session-start-events} +{% apitags %} +Sessions +{% endapitags %} + +This event occurs when a user starts a session. Use this data to track when users start sessions. + +{% alert tip %} +When a user starts their first session, both a `FirstSession` and a `SessionStart` event are fired. +{% endalert %} + +{% tabs %} {% tab Cloud Storage %} ```json -// users.behaviors.app.SessionEnd +// users.behaviors.app.SessionStart { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "app_id" : "(required, string) API ID of the app on which this event occurred", "device_id" : "(optional, string) ID of the device on which the event occurred", "device_model" : "(optional, string) Model of the device", - "duration" : "(optional, float) Duration of the session in seconds", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", "os_version" : "(optional, string) Version of the operating system of the device", @@ -802,24 +839,7 @@ This occurs when a user exits your application, therefore ending their current s } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Session Start events {#session-start-events} -{% apitags %} -Sessions -{% endapitags %} - -This event occurs when a user starts a session. Use this data to track when users start sessions. - -{% alert tip %} -When a user starts their first session, both a `FirstSession` and a `SessionStart` event are fired. -{% endalert %} - -{% tabs %} {% tab Amplitude %} ```json // Session Start (users.behaviors.app.SessionStart) @@ -894,40 +914,41 @@ When a user starts their first session, both a `FirstSession` and a `SessionStar } ``` {% endtab %} +{% endtabs %} + +{% endapi %} +{% api %} +## Live Activity Push To Start Token Change events {#live-activity-push-to-start-token-change-events} + +{% apitags %} +Live Activity, Push To Start Token +{% endapitags %} + +This event occurs when Braze syncs Live Activity push to start token with the user + +{% tabs %} {% tab Cloud Storage %} ```json -// users.behaviors.app.SessionStart +// users.behaviors.liveactivity.PushToStartTokenChange { + "activity_attributes_type" : "(optional, string) Live Activity attribute type", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(required, string) API ID of the app on which this event occurred", + "app_id" : "(optional, string) API ID of the app on which this event occurred", "device_id" : "(optional, string) ID of the device on which the event occurred", - "device_model" : "(optional, string) Model of the device", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "os_version" : "(optional, string) Version of the operating system of the device", - "platform" : "(optional, string) Platform of the device", - "session_id" : "(required, string) UUID of the session", + "ios_push_token_apns_gateway" : "(optional, int) APNS gateway of the push token, only applies to iOS push tokens, 1 for development, 2 for production", + "push_to_start_token" : "(optional, string) Live Activity push to start token", + "push_token_state_change_type" : "(optional, string) A description of the push token state change type", + "sdk_version" : "(optional, string) Version of the Braze SDK in use during the event", "time" : "(required, int) UNIX timestamp at which the event happened", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} -{% api %} -## Live Activity Push To Start Token Change events {#live-activity-push-to-start-token-change-events} - -{% apitags %} -Live Activity, Push To Start Token -{% endapitags %} - -This event occurs when Braze syncs Live Activity push to start token with the user - -{% tabs %} {% tab Amplitude %} ```json // Live Activity Push To Start Token Change (users.behaviors.liveactivity.PushToStartTokenChange) @@ -1002,41 +1023,41 @@ This event occurs when Braze syncs Live Activity push to start token with the us } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Live Activity Update Token Change events {#live-activity-update-token-change-events} + +{% apitags %} +Live Activity, Update Token +{% endapitags %} +This event occurs when Braze syncs Live Activity update token with the user + +{% tabs %} {% tab Cloud Storage %} ```json -// users.behaviors.liveactivity.PushToStartTokenChange +// users.behaviors.liveactivity.UpdateTokenChange { - "activity_attributes_type" : "(optional, string) Live Activity attribute type", + "activity_id" : "(optional, string) Live Activity identifier", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "app_id" : "(optional, string) API ID of the app on which this event occurred", "device_id" : "(optional, string) ID of the device on which the event occurred", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", "ios_push_token_apns_gateway" : "(optional, int) APNS gateway of the push token, only applies to iOS push tokens, 1 for development, 2 for production", - "push_to_start_token" : "(optional, string) Live Activity push to start token", "push_token_state_change_type" : "(optional, string) A description of the push token state change type", "sdk_version" : "(optional, string) Version of the Braze SDK in use during the event", "time" : "(required, int) UNIX timestamp at which the event happened", + "update_token" : "(optional, string) Live Activity update token", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} -{% endapi %} - -{% api %} -## Live Activity Update Token Change events {#live-activity-update-token-change-events} - -{% apitags %} -Live Activity, Update Token -{% endapitags %} - -This event occurs when Braze syncs Live Activity update token with the user - -{% tabs %} {% tab Amplitude %} ```json // Live Activity Update Token Change (users.behaviors.liveactivity.UpdateTokenChange) @@ -1111,41 +1132,47 @@ This event occurs when Braze syncs Live Activity update token with the user } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Push Notification Token State Change events {#push-notification-token-state-change-events} +{% apitags %} +Push, Token State Change +{% endapitags %} + +This event occurs when a push token is inserted, updated or removed. Use this to track the states of push tokens. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.behaviors.liveactivity.UpdateTokenChange +// users.behaviors.pushnotification.TokenStateChange { - "activity_id" : "(optional, string) Live Activity identifier", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "app_id" : "(optional, string) API ID of the app on which this event occurred", - "device_id" : "(optional, string) ID of the device on which the event occurred", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", "ios_push_token_apns_gateway" : "(optional, int) APNS gateway of the push token, only applies to iOS push tokens, 1 for development, 2 for production", + "platform" : "(optional, string) Platform of the device", + "push_token_created_at" : "(optional, int) UNIX timestamp at which the push token was created", + "push_token_device_id" : "(optional, string) Device id of the push token", + "push_token_foreground_push_disabled" : "(optional, boolean) Foreground push disabled flag of the push token", + "push_token_provisionally_opted_in" : "(optional, boolean) Provisionally opted in flag of the push token", "push_token_state_change_type" : "(optional, string) A description of the push token state change type", + "push_token_updated_at" : "(optional, int) UNIX timestamp at which the push token was last updated", "sdk_version" : "(optional, string) Version of the Braze SDK in use during the event", "time" : "(required, int) UNIX timestamp at which the event happened", - "update_token" : "(optional, string) Live Activity update token", - "user_id" : "(required, string) Braze user ID of the user who performed this event" + "user_id" : "(required, string) Braze user ID of the user who performed this event", + "web_push_token_public_key" : "(optional, string) Public key of the push token, only applies to web push tokens", + "web_push_token_user_auth" : "(optional, string) User auth of the push token, only applies to web push tokens", + "web_push_token_vapid_public_key" : "(optional, string) VAPID public key of the push token, only applies to web push tokens" } ``` {% endtab %} -{% endtabs %} -{% endapi %} - -{% api %} -## Push Notification Token State Change events {#push-notification-token-state-change-events} - -{% apitags %} -Push, Token State Change -{% endapitags %} - -This event occurs when a push token is inserted, updated or removed. Use this to track the states of push tokens. - -{% tabs %} {% tab Amplitude %} ```json // Push Notification Token State Change (users.behaviors.pushnotification.TokenStateChange) @@ -1239,33 +1266,6 @@ This event occurs when a push token is inserted, updated or removed. Use this to } ``` {% endtab %} - -{% tab Cloud Storage %} -```json -// users.behaviors.pushnotification.TokenStateChange - -{ - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(optional, string) API ID of the app on which this event occurred", - "external_user_id" : "(optional, string) [PII] External ID of the user", - "id" : "(required, string) Globally unique ID for this event", - "ios_push_token_apns_gateway" : "(optional, int) APNS gateway of the push token, only applies to iOS push tokens, 1 for development, 2 for production", - "platform" : "(optional, string) Platform of the device", - "push_token_created_at" : "(optional, int) UNIX timestamp at which the push token was created", - "push_token_device_id" : "(optional, string) Device id of the push token", - "push_token_foreground_push_disabled" : "(optional, boolean) Foreground push disabled flag of the push token", - "push_token_provisionally_opted_in" : "(optional, boolean) Provisionally opted in flag of the push token", - "push_token_state_change_type" : "(optional, string) A description of the push token state change type", - "push_token_updated_at" : "(optional, int) UNIX timestamp at which the push token was last updated", - "sdk_version" : "(optional, string) Version of the Braze SDK in use during the event", - "time" : "(required, int) UNIX timestamp at which the event happened", - "user_id" : "(required, string) Braze user ID of the user who performed this event", - "web_push_token_public_key" : "(optional, string) Public key of the push token, only applies to web push tokens", - "web_push_token_user_auth" : "(optional, string) User auth of the push token, only applies to web push tokens", - "web_push_token_vapid_public_key" : "(optional, string) VAPID public key of the push token, only applies to web push tokens" -} -``` -{% endtab %} {% endtabs %} #### Property details From f47a847edf057b6ad8a0c457aecae2e7f6a68157 Mon Sep 17 00:00:00 2001 From: Lydia Xie Date: Tue, 6 Jan 2026 11:33:16 -0800 Subject: [PATCH 02/11] update tabs to cloud storage first --- .../message_engagement_events.md | 3203 ++++++++--------- 1 file changed, 1600 insertions(+), 1603 deletions(-) diff --git a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md index 1e99f1597b8..5d82f325116 100644 --- a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md +++ b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md @@ -88,6 +88,22 @@ This event is not fired when the user actually uninstalls the app, as that's imp {% endalert %} {% tabs %} +{% tab Cloud Storage %} +```json +// users.behaviors.Uninstall + +{ + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_id" : "(required, string) API ID of the app on which this event occurred", + "device_id" : "(optional, string) ID of the device on which the event occurred", + "external_user_id" : "(optional, string) [PII] External ID of the user", + "id" : "(required, string) Globally unique ID for this event", + "time" : "(required, int) UNIX timestamp at which the event happened", + "user_id" : "(required, string) Braze user ID of the user who performed this event" +} +``` +{% endtab %} + {% tab Amplitude %} ```json // Uninstall (users.behaviors.Uninstall) @@ -183,22 +199,6 @@ This event is not fired when the user actually uninstalls the app, as that's imp } ``` {% endtab %} - -{% tab Cloud Storage %} -```json -// users.behaviors.Uninstall - -{ - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(required, string) API ID of the app on which this event occurred", - "device_id" : "(optional, string) ID of the device on which the event occurred", - "external_user_id" : "(optional, string) [PII] External ID of the user", - "id" : "(required, string) Globally unique ID for this event", - "time" : "(required, int) UNIX timestamp at which the event happened", - "user_id" : "(required, string) Braze user ID of the user who performed this event" -} -``` -{% endtab %} {% endtabs %} {% endapi %} @@ -213,6 +213,37 @@ Subscription This event occurs when Braze receives a request to update the global subscription state of the user. {% tabs %} +{% tab Cloud Storage %} +```json +// users.behaviors.subscription.GlobalStateChange + +{ + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_id" : "(optional, string) API ID of the app on which this event occurred", + "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", + "campaign_name" : "(optional, string) Name of the campaign", + "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", + "canvas_name" : "(optional, string) Name of the Canvas", + "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_name" : "(optional, string) Name of the Canvas step", + "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", + "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "channel" : "(optional, string) Channel this event belongs to", + "channel_identifier" : "(optional, string) [PII] The user's identifier on the channel the event is for.", + "email_address" : "(optional, string) [PII] Email address of the user", + "external_user_id" : "(optional, string) [PII] External ID of the user", + "id" : "(required, string) Globally unique ID for this event", + "message_variation_id" : "(optional, string) API ID of the message variation this user received", + "send_id" : "(optional, string) Message send ID this message belongs to", + "state_change_source" : "(optional, string) Source of the state change, e.g: REST API, SDK, Dashboard, etc.", + "subscription_status" : "(required, string) Subscription status: 'Subscribed', 'Unsubscribed' or 'Opted In'", + "time" : "(required, int) UNIX timestamp at which the event happened", + "timezone" : "(optional, string) Time zone of the user", + "user_id" : "(required, string) Braze user ID of the user who performed this event" +} +``` +{% endtab %} + {% tab Amplitude %} ```json // Global Subscription State Change (users.behaviors.subscription.GlobalStateChange) @@ -370,37 +401,6 @@ This event occurs when Braze receives a request to update the global subscriptio } ``` {% endtab %} - -{% tab Cloud Storage %} -```json -// users.behaviors.subscription.GlobalStateChange - -{ - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(optional, string) API ID of the app on which this event occurred", - "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", - "campaign_name" : "(optional, string) Name of the campaign", - "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", - "canvas_name" : "(optional, string) Name of the Canvas", - "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_name" : "(optional, string) Name of the Canvas step", - "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", - "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "channel" : "(optional, string) Channel this event belongs to", - "channel_identifier" : "(optional, string) [PII] The user's identifier on the channel the event is for.", - "email_address" : "(optional, string) [PII] Email address of the user", - "external_user_id" : "(optional, string) [PII] External ID of the user", - "id" : "(required, string) Globally unique ID for this event", - "message_variation_id" : "(optional, string) API ID of the message variation this user received", - "send_id" : "(optional, string) Message send ID this message belongs to", - "state_change_source" : "(optional, string) Source of the state change, e.g: REST API, SDK, Dashboard, etc.", - "subscription_status" : "(required, string) Subscription status: 'Subscribed', 'Unsubscribed' or 'Opted In'", - "time" : "(required, int) UNIX timestamp at which the event happened", - "timezone" : "(optional, string) Time zone of the user", - "user_id" : "(required, string) Braze user ID of the user who performed this event" -} -``` -{% endtab %} {% endtabs %} #### Property details @@ -440,6 +440,41 @@ Subscription groups are only available for email, SMS, RCS, and WhatsApp channel {% endalert %} {% tabs %} +{% tab Cloud Storage %} +```json +// users.behaviors.subscriptiongroup.StateChange + +{ + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_id" : "(optional, string) API ID of the app on which this event occurred", + "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", + "campaign_name" : "(optional, string) Name of the campaign", + "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", + "canvas_name" : "(optional, string) Name of the Canvas", + "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_name" : "(optional, string) Name of the Canvas step", + "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", + "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "channel" : "(optional, string) Channel this event belongs to", + "channel_identifier" : "(optional, string) [PII] The user's identifier on the channel the event is for.", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", + "email_address" : "(optional, string) [PII] Email address of the user", + "external_user_id" : "(optional, string) [PII] External ID of the user", + "id" : "(required, string) Globally unique ID for this event", + "message_variation_id" : "(optional, string) API ID of the message variation this user received", + "message_variation_name" : "(optional, string) Name of the message variation", + "phone_number" : "(optional, string) [PII] Phone number of the user in e.164 format (for example +14155552671)", + "send_id" : "(optional, string) Message send ID this message belongs to", + "state_change_source" : "(optional, string) Source of the state change, e.g: REST API, SDK, Dashboard, etc.", + "subscription_group_id" : "(required, string) Subscription group API ID", + "subscription_status" : "(required, string) Subscription status: 'Subscribed' or 'Unsubscribed'", + "time" : "(required, int) UNIX timestamp at which the event happened", + "timezone" : "(optional, string) Time zone of the user", + "user_id" : "(required, string) Braze user ID of the user who performed this event" +} +``` +{% endtab %} + {% tab Amplitude %} ```json // Subscription Group State Change (users.behaviors.subscriptiongroup.StateChange) @@ -611,41 +646,6 @@ Subscription groups are only available for email, SMS, RCS, and WhatsApp channel } ``` {% endtab %} - -{% tab Cloud Storage %} -```json -// users.behaviors.subscriptiongroup.StateChange - -{ - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(optional, string) API ID of the app on which this event occurred", - "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", - "campaign_name" : "(optional, string) Name of the campaign", - "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", - "canvas_name" : "(optional, string) Name of the Canvas", - "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_name" : "(optional, string) Name of the Canvas step", - "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", - "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "channel" : "(optional, string) Channel this event belongs to", - "channel_identifier" : "(optional, string) [PII] The user's identifier on the channel the event is for.", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", - "email_address" : "(optional, string) [PII] Email address of the user", - "external_user_id" : "(optional, string) [PII] External ID of the user", - "id" : "(required, string) Globally unique ID for this event", - "message_variation_id" : "(optional, string) API ID of the message variation this user received", - "message_variation_name" : "(optional, string) Name of the message variation", - "phone_number" : "(optional, string) [PII] Phone number of the user in e.164 format (for example +14155552671)", - "send_id" : "(optional, string) Message send ID this message belongs to", - "state_change_source" : "(optional, string) Source of the state change, e.g: REST API, SDK, Dashboard, etc.", - "subscription_group_id" : "(required, string) Subscription group API ID", - "subscription_status" : "(required, string) Subscription status: 'Subscribed' or 'Unsubscribed'", - "time" : "(required, int) UNIX timestamp at which the event happened", - "timezone" : "(optional, string) Time zone of the user", - "user_id" : "(required, string) Braze user ID of the user who performed this event" -} -``` -{% endtab %} {% endtabs %} #### Property details @@ -687,6 +687,29 @@ Note that the conversion event is encoded in the `conversion_behavior` field, wh {% endalert %} {% tabs %} +{% tab Cloud Storage %} +```json +// users.campaigns.Conversion + +{ + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_id" : "(optional, string) API ID of the app on which this event occurred", + "campaign_id" : "(required, string) API ID of the campaign this event belongs to", + "campaign_name" : "(optional, string) Name of the campaign", + "conversion_behavior" : "(optional, string) JSON-encoded string describing the conversion behavior", + "conversion_behavior_index" : "(optional, int) Index of the conversion behavior", + "external_user_id" : "(optional, string) [PII] External ID of the user", + "id" : "(required, string) Globally unique ID for this event", + "message_variation_id" : "(optional, string) API ID of the message variation this user received", + "message_variation_name" : "(optional, string) Name of the message variation", + "send_id" : "(optional, string) Message send ID this message belongs to", + "time" : "(required, int) UNIX timestamp at which the event happened", + "timezone" : "(optional, string) Time zone of the user", + "user_id" : "(required, string) Braze user ID of the user who performed this event" +} +``` +{% endtab %} + {% tab Amplitude %} ```json // Campaign Conversion (users.campaigns.Conversion) @@ -815,18 +838,33 @@ Note that the conversion event is encoded in the `conversion_behavior` field, wh } ``` {% endtab %} +{% endtabs %} +{% endapi %} + +{% api %} +## Campaign Control Group Enrollment events {#campaign-control-group-enrollment-events} + +{% apitags %} +Campaign, Entry +{% endapitags %} + +This event occurs when a user is enrolled in a control variant set on a multi-variant campaign. This event is generated as there will be no channel send event for this user. + +{% alert note %} +`dispatch_id` is deprecated and will be removed in the next Currents release. +{% endalert %} + +{% tabs %} {% tab Cloud Storage %} ```json -// users.campaigns.Conversion +// users.campaigns.EnrollInControl { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "app_id" : "(optional, string) API ID of the app on which this event occurred", "campaign_id" : "(required, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", - "conversion_behavior" : "(optional, string) JSON-encoded string describing the conversion behavior", - "conversion_behavior_index" : "(optional, int) Index of the conversion behavior", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", @@ -838,24 +876,7 @@ Note that the conversion event is encoded in the `conversion_behavior` field, wh } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Campaign Control Group Enrollment events {#campaign-control-group-enrollment-events} - -{% apitags %} -Campaign, Entry -{% endapitags %} -This event occurs when a user is enrolled in a control variant set on a multi-variant campaign. This event is generated as there will be no channel send event for this user. - -{% alert note %} -`dispatch_id` is deprecated and will be removed in the next Currents release. -{% endalert %} - -{% tabs %} {% tab Amplitude %} ```json // Campaign Control Group Enrollment (users.campaigns.EnrollInControl) @@ -976,27 +997,6 @@ This event occurs when a user is enrolled in a control variant set on a multi-va } ``` {% endtab %} - -{% tab Cloud Storage %} -```json -// users.campaigns.EnrollInControl - -{ - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(optional, string) API ID of the app on which this event occurred", - "campaign_id" : "(required, string) API ID of the campaign this event belongs to", - "campaign_name" : "(optional, string) Name of the campaign", - "external_user_id" : "(optional, string) [PII] External ID of the user", - "id" : "(required, string) Globally unique ID for this event", - "message_variation_id" : "(optional, string) API ID of the message variation this user received", - "message_variation_name" : "(optional, string) Name of the message variation", - "send_id" : "(optional, string) Message send ID this message belongs to", - "time" : "(required, int) UNIX timestamp at which the event happened", - "timezone" : "(optional, string) Time zone of the user", - "user_id" : "(required, string) Braze user ID of the user who performed this event" -} -``` -{% endtab %} {% endtabs %} {% endapi %} @@ -1015,6 +1015,30 @@ Note that the conversion event is encoded in the `conversion_behavior` field, wh {% endalert %} {% tabs %} +{% tab Cloud Storage %} +```json +// users.canvas.Conversion + +{ + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_id" : "(optional, string) API ID of the app on which this event occurred", + "canvas_id" : "(required, string) API ID of the Canvas this event belongs to", + "canvas_name" : "(optional, string) Name of the Canvas", + "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_name" : "(optional, string) Name of the Canvas step", + "canvas_variation_id" : "(required, string) API ID of the Canvas variation this event belongs to", + "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "conversion_behavior" : "(optional, string) JSON-encoded string describing the conversion behavior", + "conversion_behavior_index" : "(optional, int) Index of the conversion behavior", + "external_user_id" : "(optional, string) [PII] External ID of the user", + "id" : "(required, string) Globally unique ID for this event", + "time" : "(required, int) UNIX timestamp at which the event happened", + "timezone" : "(optional, string) Time zone of the user", + "user_id" : "(required, string) Braze user ID of the user who performed this event" +} +``` +{% endtab %} + {% tab Amplitude %} ```json // Canvas Conversion (users.canvas.Conversion) @@ -1143,44 +1167,42 @@ Note that the conversion event is encoded in the `conversion_behavior` field, wh } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Canvas Entry events {#canvas-entry-events} + +{% apitags %} +Canvas, Entry +{% endapitags %} + +This event occurs when a user enters into the Canvas. This event tells you which variant the user entered into. +{% tabs %} {% tab Cloud Storage %} ```json -// users.canvas.Conversion +// users.canvas.Entry { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(optional, string) API ID of the app on which this event occurred", "canvas_id" : "(required, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(required, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "conversion_behavior" : "(optional, string) JSON-encoded string describing the conversion behavior", - "conversion_behavior_index" : "(optional, int) Index of the conversion behavior", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", + "in_control_group" : "(required, boolean) Whether the user was enrolled in the control group", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} -{% endapi %} - -{% api %} -## Canvas Entry events {#canvas-entry-events} - -{% apitags %} -Canvas, Entry -{% endapitags %} - -This event occurs when a user enters into the Canvas. This event tells you which variant the user entered into. - -{% tabs %} {% tab Amplitude %} ```json // Canvas Entry (users.canvas.Entry) @@ -1302,42 +1324,44 @@ This event occurs when a user enters into the Canvas. This event tells you which } ``` {% endtab %} +{% endtabs %} +{% endapi %} + +{% api %} +## Exit Match Audience events {#exit-match-audience-events} + +{% apitags %} +Exit, Canvas +{% endapitags %} + +This event occurs when a user has exited a Canvas by matching an audience. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.canvas.Entry +// users.canvas.exit.MatchedAudience { - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_group_api_id" : "(optional, string) [DEPRECATED]", + "app_group_id" : "(required, string) API ID of the app group this user belongs to", + "canvas_api_id" : "(optional, string) [DEPRECATED]", "canvas_id" : "(required, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", + "canvas_step_api_id" : "(optional, string) [DEPRECATED]", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", "canvas_step_name" : "(optional, string) Name of the Canvas step", + "canvas_variation_api_id" : "(optional, string) [DEPRECATED]", "canvas_variation_id" : "(required, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "in_control_group" : "(required, boolean) Whether the user was enrolled in the control group", "time" : "(required, int) UNIX timestamp at which the event happened", - "timezone" : "(optional, string) Time zone of the user", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Exit Match Audience events {#exit-match-audience-events} - -{% apitags %} -Exit, Canvas -{% endapitags %} - -This event occurs when a user has exited a Canvas by matching an audience. -{% tabs %} {% tab Amplitude %} ```json // Exit Match Audience (users.canvas.exit.MatchedAudience) @@ -1449,10 +1473,23 @@ This event occurs when a user has exited a Canvas by matching an audience. } ``` {% endtab %} +{% endtabs %} +{% endapi %} + +{% api %} +## Exit Perform Event events {#exit-perform-event-events} + +{% apitags %} +Exit, Canvas +{% endapitags %} + +This event occurs when a user has exited a Canvas by performing an event. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.canvas.exit.MatchedAudience +// users.canvas.exit.PerformedEvent { "app_group_api_id" : "(optional, string) [DEPRECATED]", @@ -1473,20 +1510,7 @@ This event occurs when a user has exited a Canvas by matching an audience. } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Exit Perform Event events {#exit-perform-event-events} - -{% apitags %} -Exit, Canvas -{% endapitags %} -This event occurs when a user has exited a Canvas by performing an event. - -{% tabs %} {% tab Amplitude %} ```json // Exit Perform Event (users.canvas.exit.PerformedEvent) @@ -1598,23 +1622,37 @@ This event occurs when a user has exited a Canvas by performing an event. } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Experiment Step Conversion events {#experiment-step-conversion-events} + +{% apitags %} +Canvas +{% endapitags %} + +This event occurs when a user convert for a Canvas experiment step. +{% tabs %} {% tab Cloud Storage %} ```json -// users.canvas.exit.PerformedEvent +// users.canvas.experimentstep.Conversion { - "app_group_api_id" : "(optional, string) [DEPRECATED]", - "app_group_id" : "(required, string) API ID of the app group this user belongs to", - "canvas_api_id" : "(optional, string) [DEPRECATED]", - "canvas_id" : "(required, string) API ID of the Canvas this event belongs to", + "app_id" : "(optional, string) API ID of the app on which this event occurred", + "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", - "canvas_step_api_id" : "(optional, string) [DEPRECATED]", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", "canvas_step_name" : "(optional, string) Name of the Canvas step", - "canvas_variation_api_id" : "(optional, string) [DEPRECATED]", - "canvas_variation_id" : "(required, string) API ID of the Canvas variation this event belongs to", + "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "conversion_behavior" : "(optional, string) JSON-encoded string describing the conversion behavior", + "conversion_behavior_index" : "(optional, int) Index of the conversion behavior", + "experiment_split_id" : "(optional, string) API ID of the experiment split the user enrolled in", + "experiment_split_name" : "(optional, string) Name of the experiment split", + "experiment_step_id" : "(optional, string) API ID of the experiment step this event belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", "time" : "(required, int) UNIX timestamp at which the event happened", @@ -1622,20 +1660,7 @@ This event occurs when a user has exited a Canvas by performing an event. } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Experiment Step Conversion events {#experiment-step-conversion-events} - -{% apitags %} -Canvas -{% endapitags %} - -This event occurs when a user convert for a Canvas experiment step. -{% tabs %} {% tab Amplitude %} ```json // Experiment Step Conversion (users.canvas.experimentstep.Conversion) @@ -1766,45 +1791,43 @@ This event occurs when a user convert for a Canvas experiment step. } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Experiment Split Entry events {#experiment-split-entry-events} + +{% apitags %} +Canvas +{% endapitags %} +This event occurs when a user enters a Canvas experiment step path. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.canvas.experimentstep.Conversion +// users.canvas.experimentstep.SplitEntry { - "app_id" : "(optional, string) API ID of the app on which this event occurred", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "conversion_behavior" : "(optional, string) JSON-encoded string describing the conversion behavior", - "conversion_behavior_index" : "(optional, int) Index of the conversion behavior", "experiment_split_id" : "(optional, string) API ID of the experiment split the user enrolled in", "experiment_split_name" : "(optional, string) Name of the experiment split", "experiment_step_id" : "(optional, string) API ID of the experiment step this event belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", + "in_control_group" : "(required, boolean) Whether the user was enrolled in the control group", "time" : "(required, int) UNIX timestamp at which the event happened", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Experiment Split Entry events {#experiment-split-entry-events} - -{% apitags %} -Canvas -{% endapitags %} - -This event occurs when a user enters a Canvas experiment step path. -{% tabs %} {% tab Amplitude %} ```json // Experiment Split Entry (users.canvas.experimentstep.SplitEntry) @@ -1928,43 +1951,46 @@ This event occurs when a user enters a Canvas experiment step path. } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Canvas Step Progression events {#canvas-step-progression-events} + +{% apitags %} +Canvas, Progression +{% endapitags %} +This event occurs when a user progresses through a step in a Canvas with some outcome. Note that this event doesn't occur when steps are entered or exited. Currently, only split steps (Audience Paths, Decision Split, Action Paths, Experiment) and advance outcomes generate step progression events. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.canvas.experimentstep.SplitEntry +// users.canvasstep.Progression { + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "canvas_entry_id" : "(required, string) Unique identifier for this instance of a user in a canvas", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "experiment_split_id" : "(optional, string) API ID of the experiment split the user enrolled in", - "experiment_split_name" : "(optional, string) Name of the experiment split", - "experiment_step_id" : "(optional, string) API ID of the experiment step this event belongs to", + "device_id" : "(optional, string) ID of the device on which the event occurred", + "exit_reason" : "(optional, string) If this is an exit, the reason a user exited the canvas during the step", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "in_control_group" : "(required, boolean) Whether the user was enrolled in the control group", + "is_canvas_entry" : "(optional, boolean) Whether this is entry into a first step in a canvas", + "next_step_id" : "(optional, string) API ID of the next step in the canvas", + "progression_type" : "(required, string) What type of step progression event this is", "time" : "(required, int) UNIX timestamp at which the event happened", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Canvas Step Progression events {#canvas-step-progression-events} - -{% apitags %} -Canvas, Progression -{% endapitags %} - -This event occurs when a user progresses through a step in a Canvas with some outcome. Note that this event doesn't occur when steps are entered or exited. Currently, only split steps (Audience Paths, Decision Split, Action Paths, Experiment) and advance outcomes generate step progression events. -{% tabs %} {% tab Amplitude %} ```json // Canvas Step Progression (users.canvasstep.Progression) @@ -2102,46 +2128,57 @@ This event occurs when a user progresses through a step in a Canvas with some ou } ``` {% endtab %} +{% endtabs %} + +{% endapi %} +{% api %} +## Banner Abort events {#banner-abort-events} + +{% apitags %} +Banner, Abort +{% endapitags %} + +This event occurs when an originally scheduled banner message was aborted for some reason. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.canvasstep.Progression +// users.messages.banner.Abort { + "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", + "abort_type" : "(optional, string) Type of abort", + "ad_id" : "(optional, string) [PII] Advertising identifier", + "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", + "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "canvas_entry_id" : "(required, string) Unique identifier for this instance of a user in a canvas", - "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", - "canvas_name" : "(optional, string) Name of the Canvas", - "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_name" : "(optional, string) Name of the Canvas step", - "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", - "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "app_id" : "(optional, string) API ID of the app on which this event occurred", + "banner_placement_id" : "(optional, string) Customer specified banner placement ID", + "browser" : "(optional, string) Device browser - extracted from user_agent - on which the open occurred", + "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", + "campaign_name" : "(optional, string) Name of the campaign", + "carrier" : "(optional, string) Carrier of the device", + "country" : "(optional, string) [PII] Country of the user", "device_id" : "(optional, string) ID of the device on which the event occurred", - "exit_reason" : "(optional, string) If this is an exit, the reason a user exited the canvas during the step", + "device_model" : "(optional, string) Model of the device", "external_user_id" : "(optional, string) [PII] External ID of the user", + "gender" : "(optional, string) [PII] Gender of the user, one of ['M', 'F', 'O', 'N', 'P']", "id" : "(required, string) Globally unique ID for this event", - "is_canvas_entry" : "(optional, boolean) Whether this is entry into a first step in a canvas", - "next_step_id" : "(optional, string) API ID of the next step in the canvas", - "progression_type" : "(required, string) What type of step progression event this is", + "language" : "(optional, string) [PII] Language of the user", + "message_variation_id" : "(optional, string) API ID of the message variation this user received", + "message_variation_name" : "(optional, string) Name of the message variation", + "os_version" : "(optional, string) Version of the operating system of the device", + "platform" : "(optional, string) Platform of the device", + "resolution" : "(optional, string) Resolution of the device", + "sdk_version" : "(optional, string) Version of the Braze SDK in use during the event", "time" : "(required, int) UNIX timestamp at which the event happened", + "timezone" : "(optional, string) Time zone of the user", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} -{% api %} -## Banner Abort events {#banner-abort-events} - -{% apitags %} -Banner, Abort -{% endapitags %} - -This event occurs when an originally scheduled banner message was aborted for some reason. - -{% tabs %} {% tab Amplitude %} ```json // Banner Abort (users.messages.banner.Abort) @@ -2298,14 +2335,25 @@ This event occurs when an originally scheduled banner message was aborted for so } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Banner Click events {#banner-click-events} +{% apitags %} +Banner, Clicks +{% endapitags %} + +This event occurs when a user clicks a banner. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.banner.Abort +// users.messages.banner.Click { - "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", - "abort_type" : "(optional, string) Type of abort", "ad_id" : "(optional, string) [PII] Advertising identifier", "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", @@ -2313,6 +2361,7 @@ This event occurs when an originally scheduled banner message was aborted for so "app_id" : "(optional, string) API ID of the app on which this event occurred", "banner_placement_id" : "(optional, string) Customer specified banner placement ID", "browser" : "(optional, string) Device browser - extracted from user_agent - on which the open occurred", + "button_id" : "(optional, string) ID of the button clicked, if this click represents a click on a button", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "carrier" : "(optional, string) Carrier of the device", @@ -2335,20 +2384,7 @@ This event occurs when an originally scheduled banner message was aborted for so } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Banner Click events {#banner-click-events} - -{% apitags %} -Banner, Clicks -{% endapitags %} - -This event occurs when a user clicks a banner. -{% tabs %} {% tab Amplitude %} ```json // Banner Click (users.messages.banner.Click) @@ -2501,10 +2537,23 @@ This event occurs when a user clicks a banner. } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Banner Impression events {#banner-impression-events} + +{% apitags %} +Banner, Impressions +{% endapitags %} + +This event occurs when a user views a banner. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.banner.Click +// users.messages.banner.Impression { "ad_id" : "(optional, string) [PII] Advertising identifier", @@ -2514,7 +2563,6 @@ This event occurs when a user clicks a banner. "app_id" : "(optional, string) API ID of the app on which this event occurred", "banner_placement_id" : "(optional, string) Customer specified banner placement ID", "browser" : "(optional, string) Device browser - extracted from user_agent - on which the open occurred", - "button_id" : "(optional, string) ID of the button clicked, if this click represents a click on a button", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "carrier" : "(optional, string) Carrier of the device", @@ -2537,20 +2585,6 @@ This event occurs when a user clicks a banner. } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Banner Impression events {#banner-impression-events} - -{% apitags %} -Banner, Impressions -{% endapitags %} - -This event occurs when a user views a banner. - -{% tabs %} {% tab Amplitude %} ```json // Banner Impression (users.messages.banner.Impression) @@ -2699,55 +2733,51 @@ This event occurs when a user views a banner. } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Content Card Abort events {#content-card-abort-events} + +{% apitags %} +Abort, Content Cards +{% endapitags %} + +This event occurs if a Content Card message was aborted based on Liquid aborts, etc. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.banner.Impression +// users.messages.contentcard.Abort { - "ad_id" : "(optional, string) [PII] Advertising identifier", - "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", - "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", + "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", + "abort_type" : "(optional, string) Type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(optional, string) API ID of the app on which this event occurred", - "banner_placement_id" : "(optional, string) Customer specified banner placement ID", - "browser" : "(optional, string) Device browser - extracted from user_agent - on which the open occurred", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", - "carrier" : "(optional, string) Carrier of the device", - "country" : "(optional, string) [PII] Country of the user", + "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", + "canvas_name" : "(optional, string) Name of the Canvas", + "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", + "canvas_step_name" : "(optional, string) Name of the Canvas step", + "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", + "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "device_id" : "(optional, string) ID of the device on which the event occurred", - "device_model" : "(optional, string) Model of the device", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", - "gender" : "(optional, string) [PII] Gender of the user, one of ['M', 'F', 'O', 'N', 'P']", "id" : "(required, string) Globally unique ID for this event", - "language" : "(optional, string) [PII] Language of the user", "message_variation_id" : "(optional, string) API ID of the message variation this user received", - "message_variation_name" : "(optional, string) Name of the message variation", - "os_version" : "(optional, string) Version of the operating system of the device", - "platform" : "(optional, string) Platform of the device", - "resolution" : "(optional, string) Resolution of the device", - "sdk_version" : "(optional, string) Version of the Braze SDK in use during the event", + "message_variation_name" : "(optional, string) Name of the message variation", + "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Content Card Abort events {#content-card-abort-events} -{% apitags %} -Abort, Content Cards -{% endapitags %} - -This event occurs if a Content Card message was aborted based on Liquid aborts, etc. - -{% tabs %} {% tab Amplitude %} ```json // Content Card Abort (users.messages.contentcard.Abort) @@ -2897,30 +2927,55 @@ This event occurs if a Content Card message was aborted based on Liquid aborts, } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## Content Card Click events {#content-card-click-events} + +{% apitags %} +Content Cards, Clicks +{% endapitags %} + +This event occurs when a user clicks a Content Card. + +{% alert note %} +`dispatch_id` is deprecated and will be removed in the next Currents release. +{% endalert %} +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.contentcard.Abort +// users.messages.contentcard.Click { - "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", - "abort_type" : "(optional, string) Type of abort", + "ad_id" : "(optional, string) [PII] Advertising identifier", + "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", + "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_id" : "(required, string) API ID of the app on which this event occurred", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "content_card_id" : "(required, string) ID of the card that generated this event", "device_id" : "(optional, string) ID of the device on which the event occurred", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", + "device_model" : "(optional, string) Model of the device", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", + "os_version" : "(optional, string) Version of the operating system of the device", + "platform" : "(optional, string) Platform of the device", "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", @@ -2928,28 +2983,7 @@ This event occurs if a Content Card message was aborted based on Liquid aborts, } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## Content Card Click events {#content-card-click-events} - -{% apitags %} -Content Cards, Clicks -{% endapitags %} -This event occurs when a user clicks a Content Card. - -{% alert note %} -`dispatch_id` is deprecated and will be removed in the next Currents release. -{% endalert %} - -{% tabs %} {% tab Amplitude %} ```json // Content Card Click (users.messages.contentcard.Click) @@ -3126,10 +3160,31 @@ This event occurs when a user clicks a Content Card. } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). +- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. +{% endapi %} + +{% api %} +## Content Card Dismiss events {#content-card-dismiss-events} + +{% apitags %} +Content Cards, Dismissal +{% endapitags %} + +This event occurs when a user dismisses a Content Card. + +{% alert note %} +`dispatch_id` is deprecated and will be removed in the next Currents release. +{% endalert %} +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.contentcard.Click +// users.messages.contentcard.Dismiss { "ad_id" : "(optional, string) [PII] Advertising identifier", @@ -3161,28 +3216,7 @@ This event occurs when a user clicks a Content Card. } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). -- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. -{% endapi %} - -{% api %} -## Content Card Dismiss events {#content-card-dismiss-events} - -{% apitags %} -Content Cards, Dismissal -{% endapitags %} - -This event occurs when a user dismisses a Content Card. - -{% alert note %} -`dispatch_id` is deprecated and will be removed in the next Currents release. -{% endalert %} -{% tabs %} {% tab Amplitude %} ```json // Content Card Dismiss (users.messages.contentcard.Dismiss) @@ -3359,10 +3393,31 @@ This event occurs when a user dismisses a Content Card. } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). +- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. +{% endapi %} + +{% api %} +## Content Card Impression events {#content-card-impression-events} + +{% apitags %} +Content Cards, Impressions +{% endapitags %} + +This event occurs when a user views a Content Card. + +{% alert note %} +`dispatch_id` is deprecated and will be removed in the next Currents release. +{% endalert %} +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.contentcard.Dismiss +// users.messages.contentcard.Impression { "ad_id" : "(optional, string) [PII] Advertising identifier", @@ -3394,28 +3449,7 @@ This event occurs when a user dismisses a Content Card. } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). -- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. -{% endapi %} - -{% api %} -## Content Card Impression events {#content-card-impression-events} - -{% apitags %} -Content Cards, Impressions -{% endapitags %} -This event occurs when a user views a Content Card. - -{% alert note %} -`dispatch_id` is deprecated and will be removed in the next Currents release. -{% endalert %} - -{% tabs %} {% tab Amplitude %} ```json // Content Card Impression (users.messages.contentcard.Impression) @@ -3592,17 +3626,34 @@ This event occurs when a user views a Content Card. } ``` {% endtab %} +{% endtabs %} +#### Property details + +- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). +- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. +{% endapi %} + +{% api %} +## Content Card Send events {#content-card-send-events} + +{% apitags %} +Content Cards, Sends +{% endapitags %} + +This event occurs when a Content Card gets sent to a user. + +{% alert note %} +`dispatch_id` is deprecated and will be removed in the next Currents release. +{% endalert %} + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.contentcard.Impression +// users.messages.contentcard.Send { - "ad_id" : "(optional, string) [PII] Advertising identifier", - "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", - "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(required, string) API ID of the app on which this event occurred", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", @@ -3613,13 +3664,11 @@ This event occurs when a user views a Content Card. "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "content_card_id" : "(required, string) ID of the card that generated this event", "device_id" : "(optional, string) ID of the device on which the event occurred", - "device_model" : "(optional, string) Model of the device", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", + "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "os_version" : "(optional, string) Version of the operating system of the device", - "platform" : "(optional, string) Platform of the device", "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", @@ -3627,28 +3676,7 @@ This event occurs when a user views a Content Card. } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). -- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. -{% endapi %} - -{% api %} -## Content Card Send events {#content-card-send-events} - -{% apitags %} -Content Cards, Sends -{% endapitags %} - -This event occurs when a Content Card gets sent to a user. - -{% alert note %} -`dispatch_id` is deprecated and will be removed in the next Currents release. -{% endalert %} -{% tabs %} {% tab Amplitude %} ```json // Content Card Send (users.messages.contentcard.Send) @@ -3798,52 +3826,56 @@ This event occurs when a Content Card gets sent to a user. } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `message_extras` allow you to annotate your send events with dynamic data from Connected Content, custom attributes (such as language or country), and Canvas entry properties. Refer to [Message extras]({{site.baseurl}}/message_extras_tag/) to learn more. +{% endapi %} + +{% api %} +## Email Abort events {#email-abort-events} + +{% apitags %} +Abort, Email +{% endapitags %} +This event occurs if an email message was aborted based on Liquid aborts, etc. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.contentcard.Send +// users.messages.email.Abort { + "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", + "abort_type" : "(optional, string) Type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "content_card_id" : "(required, string) ID of the card that generated this event", "device_id" : "(optional, string) ID of the device on which the event occurred", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", + "email_address" : "(required, string) [PII] Email address of the user", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", + "ip_pool" : "(optional, string) IP pool from which the email send was made", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", - "user_id" : "(required, string) Braze user ID of the user who performed this event" -} -``` -{% endtab %} -{% endtabs %} - -#### Property details - -- `message_extras` allow you to annotate your send events with dynamic data from Connected Content, custom attributes (such as language or country), and Canvas entry properties. Refer to [Message extras]({{site.baseurl}}/message_extras_tag/) to learn more. -{% endapi %} - -{% api %} -## Email Abort events {#email-abort-events} - -{% apitags %} -Abort, Email -{% endapitags %} - -This event occurs if an email message was aborted based on Liquid aborts, etc. + "user_id" : "(required, string) Braze user ID of the user who performed this event" +} +``` +{% endtab %} -{% tabs %} {% tab Amplitude %} ```json // Email Abort (users.messages.email.Abort) @@ -4002,57 +4034,58 @@ This event occurs if an email message was aborted based on Liquid aborts, etc. } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## Email Bounce events {#email-bounce-events} + +{% apitags %} +Email, Bounce +{% endapitags %} + +This event occurs when an Internet Service Provider returns a hard bounce. A hard bounce signifies a permanent deliverability failure. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.email.Abort +// users.messages.email.Bounce { - "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", - "abort_type" : "(optional, string) Type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "bounce_reason" : "(optional, string) [PII] The SMTP reason code and user friendly message received for this bounce event", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "device_id" : "(optional, string) ID of the device on which the event occurred", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "email_address" : "(required, string) [PII] Email address of the user", + "esp" : "(optional, string) ESP related to the event (SparkPost, SendGrid, or Amazon SES)", "external_user_id" : "(optional, string) [PII] External ID of the user", + "from_domain" : "(optional, string) Sending domain for the email", "id" : "(required, string) Globally unique ID for this event", "ip_pool" : "(optional, string) IP pool from which the email send was made", + "is_drop" : "(optional, boolean) Indicates that this event counts as a drop event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", + "sending_ip" : "(optional, string) IP address from which the email send was made", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## Email Bounce events {#email-bounce-events} - -{% apitags %} -Email, Bounce -{% endapitags %} - -This event occurs when an Internet Service Provider returns a hard bounce. A hard bounce signifies a permanent deliverability failure. -{% tabs %} {% tab Amplitude %} ```json // Email Bounce (users.messages.email.Bounce) @@ -4219,14 +4252,31 @@ This event occurs when an Internet Service Provider returns a hard bounce. A har } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. Learn more about [dispatch ID behavior]({{site.baseurl}}/help/help_articles/data/dispatch_id/). +{% endapi %} + +{% api %} +## Email Click events {#email-click-events} + +{% apitags %} +Email, Clicks +{% endapitags %} +This event occurs when a user clicks an email. Multiple events may be generated for the same campaign if a user clicks multiple times or clicks different links within the email. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.email.Bounce +// users.messages.email.Click { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "bounce_reason" : "(optional, string) [PII] The SMTP reason code and user friendly message received for this bounce event", + "browser" : "(optional, string) Device browser - extracted from user_agent - on which the open occurred", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", @@ -4235,6 +4285,9 @@ This event occurs when an Internet Service Provider returns a hard bounce. A har "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "device_class" : "(optional, string) Device class extracted from user_agent (mobile, desktop, tablet, etc...)", + "device_model" : "(optional, string) Model of the device", + "device_os" : "(optional, string) Device operating system extracted from user_agent", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "email_address" : "(required, string) [PII] Email address of the user", "esp" : "(optional, string) ESP related to the event (SparkPost, SendGrid, or Amazon SES)", @@ -4242,35 +4295,24 @@ This event occurs when an Internet Service Provider returns a hard bounce. A har "from_domain" : "(optional, string) Sending domain for the email", "id" : "(required, string) Globally unique ID for this event", "ip_pool" : "(optional, string) IP pool from which the email send was made", - "is_drop" : "(optional, boolean) Indicates that this event counts as a drop event", + "is_amp" : "(optional, boolean) Indicates that this is an AMP event", + "is_suspected_bot_click" : "(optional, boolean) Indicates that this is a suspected bot click. Will only populate when Bot Filtering setting is enabled", + "link_alias" : "(optional, string) Alias associated with this link ID", + "link_id" : "(optional, string) Unique ID for the link which was clicked, as created by Braze", + "mailbox_provider" : "(optional, string) Mailbox provider value returned by the esp for this event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", - "sending_ip" : "(optional, string) IP address from which the email send was made", + "suspected_bot_click_reason" : "(optional, array of string) Reason(s) why this is a suspected bot click. Will always populate even if Bot Filtering setting is disabled.", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", + "url" : "(optional, string) URL that the user clicked on", + "user_agent" : "(optional, string) User agent on which the click occurred", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. Learn more about [dispatch ID behavior]({{site.baseurl}}/help/help_articles/data/dispatch_id/). -{% endapi %} - -{% api %} -## Email Click events {#email-click-events} - -{% apitags %} -Email, Clicks -{% endapitags %} - -This event occurs when a user clicks an email. Multiple events may be generated for the same campaign if a user clicks multiple times or clicks different links within the email. -{% tabs %} {% tab Amplitude %} ```json // Email Click (users.messages.email.Click) @@ -4477,25 +4519,41 @@ This event occurs when a user clicks an email. Multiple events may be generated } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. Learn more about [dispatch ID behavior]({{site.baseurl}}/help/help_articles/data/dispatch_id/). +{% endapi %} + +{% api %} +## Email Deferral events {#email-deferral-events} + +{% apitags %} +Email, Deferral +{% endapitags %} + +This event occurs when an Internet Service Provider does not immediately deliver the email to a non-hard bounced email address and Braze retries the email for up to 72 hours. Typical reasons for deferrals include reputation-based email volume rate-limiting from the inbox provider, temporary connectivity issues, recipient's mailbox is full, or DNS errors. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.email.Click +// users.messages.email.Deferral { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "browser" : "(optional, string) Device browser - extracted from user_agent - on which the open occurred", + "attempt_count" : "(optional, int) Number of attempts made to send the message", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "device_class" : "(optional, string) Device class extracted from user_agent (mobile, desktop, tablet, etc...)", - "device_model" : "(optional, string) Model of the device", - "device_os" : "(optional, string) Device operating system extracted from user_agent", + "deferral_reason" : "(optional, string) [PII] The SMTP reason code and user friendly message received for this deferral event", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "email_address" : "(required, string) [PII] Email address of the user", "esp" : "(optional, string) ESP related to the event (SparkPost, SendGrid, or Amazon SES)", @@ -4503,41 +4561,18 @@ This event occurs when a user clicks an email. Multiple events may be generated "from_domain" : "(optional, string) Sending domain for the email", "id" : "(required, string) Globally unique ID for this event", "ip_pool" : "(optional, string) IP pool from which the email send was made", - "is_amp" : "(optional, boolean) Indicates that this is an AMP event", - "is_suspected_bot_click" : "(optional, boolean) Indicates that this is a suspected bot click. Will only populate when Bot Filtering setting is enabled", - "link_alias" : "(optional, string) Alias associated with this link ID", - "link_id" : "(optional, string) Unique ID for the link which was clicked, as created by Braze", - "mailbox_provider" : "(optional, string) Mailbox provider value returned by the esp for this event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", + "recipient_domain" : "(optional, string) Recipient's email domain", "send_id" : "(optional, string) Message send ID this message belongs to", - "suspected_bot_click_reason" : "(optional, array of string) Reason(s) why this is a suspected bot click. Will always populate even if Bot Filtering setting is disabled.", + "sending_ip" : "(optional, string) IP address from which the email send was made", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", - "url" : "(optional, string) URL that the user clicked on", - "user_agent" : "(optional, string) User agent on which the click occurred", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. Learn more about [dispatch ID behavior]({{site.baseurl}}/help/help_articles/data/dispatch_id/). -{% endapi %} -{% api %} -## Email Deferral events {#email-deferral-events} - -{% apitags %} -Email, Deferral -{% endapitags %} - -This event occurs when an Internet Service Provider does not immediately deliver the email to a non-hard bounced email address and Braze retries the email for up to 72 hours. Typical reasons for deferrals include reputation-based email volume rate-limiting from the inbox provider, temporary connectivity issues, recipient's mailbox is full, or DNS errors. - -{% tabs %} {% tab Amplitude %} ```json // Email Deferral (users.messages.email.Deferral) @@ -4703,24 +4738,38 @@ This event occurs when an Internet Service Provider does not immediately deliver } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. +{% endapi %} + +{% api %} +## Email Delivery events {#email-delivery-events} + +{% apitags %} +Email, Delivery +{% endapitags %} +This event occurs when an email sent made it successfully to the end-users inbox. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.email.Deferral +// users.messages.email.Delivery { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "attempt_count" : "(optional, int) Number of attempts made to send the message", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "deferral_reason" : "(optional, string) [PII] The SMTP reason code and user friendly message received for this deferral event", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "email_address" : "(required, string) [PII] Email address of the user", "esp" : "(optional, string) ESP related to the event (SparkPost, SendGrid, or Amazon SES)", @@ -4730,7 +4779,6 @@ This event occurs when an Internet Service Provider does not immediately deliver "ip_pool" : "(optional, string) IP pool from which the email send was made", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "recipient_domain" : "(optional, string) Recipient's email domain", "send_id" : "(optional, string) Message send ID this message belongs to", "sending_ip" : "(optional, string) IP address from which the email send was made", "time" : "(required, int) UNIX timestamp at which the event happened", @@ -4739,24 +4787,7 @@ This event occurs when an Internet Service Provider does not immediately deliver } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. -{% endapi %} - -{% api %} -## Email Delivery events {#email-delivery-events} - -{% apitags %} -Email, Delivery -{% endapitags %} - -This event occurs when an email sent made it successfully to the end-users inbox. -{% tabs %} {% tab Amplitude %} ```json // Email Delivery (users.messages.email.Delivery) @@ -4915,10 +4946,27 @@ This event occurs when an email sent made it successfully to the end-users inbox } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. +{% endapi %} + +{% api %} +## Email Mark As Spam events {#email-mark-as-spam-events} + +{% apitags %} +Email, Spam +{% endapitags %} +This event occurs when the end-user hits the "spam" button on the email. Note that this does not represent the fact the email went into the spam folder as Braze does not track this. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.email.Delivery +// users.messages.email.MarkAsSpam { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -4940,31 +4988,14 @@ This event occurs when an email sent made it successfully to the end-users inbox "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", - "sending_ip" : "(optional, string) IP address from which the email send was made", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", + "user_agent" : "(optional, string) User agent on which the spam report occurred", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. -{% endapi %} - -{% api %} -## Email Mark As Spam events {#email-mark-as-spam-events} - -{% apitags %} -Email, Spam -{% endapitags %} - -This event occurs when the end-user hits the "spam" button on the email. Note that this does not represent the fact the email went into the spam folder as Braze does not track this. -{% tabs %} {% tab Amplitude %} ```json // Email Mark As Spam (users.messages.email.MarkAsSpam) @@ -5127,13 +5158,37 @@ This event occurs when the end-user hits the "spam" button on the email. Note th } ``` {% endtab %} +{% endtabs %} + +#### Property details + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. +{% endapi %} + +{% api %} +## Email Open events {#email-open-events} + +{% apitags %} +Email, Opens +{% endapitags %} +This event occurs when a user opens an email. Multiple events may be generated for the same campaign if a user opens the email multiple times. + +{% alert important %} +It's known behavior that the email open event fields `device_model` and `mailbox_provider` are empty. You can ignore these for now. +{% endalert %} + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.email.MarkAsSpam +// users.messages.email.Open { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "browser" : "(optional, string) Device browser - extracted from user_agent - on which the open occurred", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", @@ -5142,6 +5197,9 @@ This event occurs when the end-user hits the "spam" button on the email. Note th "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "device_class" : "(optional, string) Device class extracted from user_agent (mobile, desktop, tablet, etc...)", + "device_model" : "(optional, string) Model of the device", + "device_os" : "(optional, string) Device operating system extracted from user_agent", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "email_address" : "(required, string) [PII] Email address of the user", "esp" : "(optional, string) ESP related to the event (SparkPost, SendGrid, or Amazon SES)", @@ -5149,40 +5207,20 @@ This event occurs when the end-user hits the "spam" button on the email. Note th "from_domain" : "(optional, string) Sending domain for the email", "id" : "(required, string) Globally unique ID for this event", "ip_pool" : "(optional, string) IP pool from which the email send was made", + "is_amp" : "(optional, boolean) Indicates that this is an AMP event", + "machine_open" : "(optional, string) Populated to 'true' if the open event is triggered without user engagement, for example by an Apple device with Mail Privacy Protection enabled. Value may change over time to provide more granularity.", + "mailbox_provider" : "(optional, string) Mailbox provider value returned by the esp for this event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", - "user_agent" : "(optional, string) User agent on which the spam report occurred", + "user_agent" : "(optional, string) User agent on which the open occurred", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. -{% endapi %} - -{% api %} -## Email Open events {#email-open-events} - -{% apitags %} -Email, Opens -{% endapitags %} - -This event occurs when a user opens an email. Multiple events may be generated for the same campaign if a user opens the email multiple times. - -{% alert important %} -It's known behavior that the email open event fields `device_model` and `mailbox_provider` are empty. You can ignore these for now. -{% endalert %} -{% tabs %} {% tab Amplitude %} ```json // Email Open (users.messages.email.Open) @@ -5374,14 +5412,30 @@ It's known behavior that the email open event fields `device_model` and `mailbox } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. +{% endapi %} + +{% api %} +## Email Send events {#email-send-events} + +{% apitags %} +Email, Sends +{% endapitags %} + +This event occurs when an email send request was successfully communicated between Braze and SendGrid. Though, this does not mean the email was received in the user's inbox. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.email.Open +// users.messages.email.Send { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "browser" : "(optional, string) Device browser - extracted from user_agent - on which the open occurred", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", @@ -5390,47 +5444,22 @@ It's known behavior that the email open event fields `device_model` and `mailbox "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "device_class" : "(optional, string) Device class extracted from user_agent (mobile, desktop, tablet, etc...)", - "device_model" : "(optional, string) Model of the device", - "device_os" : "(optional, string) Device operating system extracted from user_agent", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "email_address" : "(required, string) [PII] Email address of the user", - "esp" : "(optional, string) ESP related to the event (SparkPost, SendGrid, or Amazon SES)", "external_user_id" : "(optional, string) [PII] External ID of the user", - "from_domain" : "(optional, string) Sending domain for the email", "id" : "(required, string) Globally unique ID for this event", "ip_pool" : "(optional, string) IP pool from which the email send was made", - "is_amp" : "(optional, boolean) Indicates that this is an AMP event", - "machine_open" : "(optional, string) Populated to 'true' if the open event is triggered without user engagement, for example by an Apple device with Mail Privacy Protection enabled. Value may change over time to provide more granularity.", - "mailbox_provider" : "(optional, string) Mailbox provider value returned by the esp for this event", + "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", - "user_agent" : "(optional, string) User agent on which the open occurred", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. -{% endapi %} - -{% api %} -## Email Send events {#email-send-events} - -{% apitags %} -Email, Sends -{% endapitags %} - -This event occurs when an email send request was successfully communicated between Braze and SendGrid. Though, this does not mean the email was received in the user's inbox. - -{% tabs %} {% tab Amplitude %} ```json // Email Send (users.messages.email.Send) @@ -5589,13 +5618,32 @@ This event occurs when an email send request was successfully communicated betwe } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. Learn more about [dispatch ID behavior]({{site.baseurl}}/help/help_articles/data/dispatch_id/). +- `message_extras` allow you to annotate your send events with dynamic data from Connected Content, custom attributes (such as language, country), and Canvas entry properties. Refer to [Message extras]({{site.baseurl}}/message_extras_tag/) to learn more. +{% endapi %} + +{% api %} +## Email Soft Bounce events {#email-soft-bounce-events} + +{% apitags %} +Email, Bounce +{% endapitags %} + +This event occurs when an Internet Service Provider returns a soft bounce. A soft bounce signifies that an email could not be delivered because of a temporary deliverability failure. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.email.Send +// users.messages.email.SoftBounce { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "bounce_reason" : "(optional, string) [PII] The SMTP reason code and user friendly message received for this bounce event", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", @@ -5606,38 +5654,22 @@ This event occurs when an email send request was successfully communicated betwe "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "email_address" : "(required, string) [PII] Email address of the user", + "esp" : "(optional, string) ESP related to the event (SparkPost, SendGrid, or Amazon SES)", "external_user_id" : "(optional, string) [PII] External ID of the user", + "from_domain" : "(optional, string) Sending domain for the email", "id" : "(required, string) Globally unique ID for this event", "ip_pool" : "(optional, string) IP pool from which the email send was made", - "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", + "sending_ip" : "(optional, string) IP address from which the email send was made", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. Learn more about [dispatch ID behavior]({{site.baseurl}}/help/help_articles/data/dispatch_id/). -- `message_extras` allow you to annotate your send events with dynamic data from Connected Content, custom attributes (such as language, country), and Canvas entry properties. Refer to [Message extras]({{site.baseurl}}/message_extras_tag/) to learn more. -{% endapi %} - -{% api %} -## Email Soft Bounce events {#email-soft-bounce-events} - -{% apitags %} -Email, Bounce -{% endapitags %} -This event occurs when an Internet Service Provider returns a soft bounce. A soft bounce signifies that an email could not be delivered because of a temporary deliverability failure. - -{% tabs %} {% tab Amplitude %} ```json // Email Soft Bounce (users.messages.email.SoftBounce) @@ -5800,14 +5832,34 @@ This event occurs when an Internet Service Provider returns a soft bounce. A sof } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. Learn more about [dispatch ID behavior]({{site.baseurl}}/help/help_articles/data/dispatch_id/). +{% endapi %} + +{% api %} +## Email Unsubscribe events {#email-unsubscribe-events} + +{% apitags %} +Email, Subscription +{% endapitags %} + +This event occurs when the end-user has clicked "unsubscribe" from the email. + +{% alert important %} +The `Unsubscribe` event is actually a specialized click event that is fired when your user clicks on the unsubscribe link in the email (either a normal unsubscribe link within the email body or footer, or using the [list-unsubscribe header]({{site.baseurl}}/user_guide/administrative/app_settings/manage_app_group/email_settings#include-a-list-unsubscribe-header)), not when the user changes state to unsubscribed. If subscription state change is sent through the API, or via custom (non-Braze) unsubscription link, it will not trigger an event on Currents. +{% endalert %} +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.email.SoftBounce +// users.messages.email.Unsubscribe { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "bounce_reason" : "(optional, string) [PII] The SMTP reason code and user friendly message received for this bounce event", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", @@ -5818,43 +5870,19 @@ This event occurs when an Internet Service Provider returns a soft bounce. A sof "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "email_address" : "(required, string) [PII] Email address of the user", - "esp" : "(optional, string) ESP related to the event (SparkPost, SendGrid, or Amazon SES)", "external_user_id" : "(optional, string) [PII] External ID of the user", - "from_domain" : "(optional, string) Sending domain for the email", "id" : "(required, string) Globally unique ID for this event", "ip_pool" : "(optional, string) IP pool from which the email send was made", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", - "sending_ip" : "(optional, string) IP address from which the email send was made", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. Learn more about [dispatch ID behavior]({{site.baseurl}}/help/help_articles/data/dispatch_id/). -{% endapi %} - -{% api %} -## Email Unsubscribe events {#email-unsubscribe-events} -{% apitags %} -Email, Subscription -{% endapitags %} - -This event occurs when the end-user has clicked "unsubscribe" from the email. - -{% alert important %} -The `Unsubscribe` event is actually a specialized click event that is fired when your user clicks on the unsubscribe link in the email (either a normal unsubscribe link within the email body or footer, or using the [list-unsubscribe header]({{site.baseurl}}/user_guide/administrative/app_settings/manage_app_group/email_settings#include-a-list-unsubscribe-header)), not when the user changes state to unsubscribed. If subscription state change is sent through the API, or via custom (non-Braze) unsubscription link, it will not trigger an event on Currents. -{% endalert %} - -{% tabs %} {% tab Amplitude %} ```json // Email Unsubscribe (users.messages.email.Unsubscribe) @@ -6005,56 +6033,65 @@ The `Unsubscribe` event is actually a specialized click event that is fired when } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. Learn more about [dispatch ID behavior]({{site.baseurl}}/help/help_articles/data/dispatch_id/). +{% endapi %} + +{% api %} +## Feature Flag Experiment Impression events {#feature-flag-experiment-impression-events} + +{% apitags %} +Feature Flags, Impressions +{% endapitags %} + +This event occurs whenever a user has had an opportunity to interact with your feature, or when they could have interacted if the feature is disabled (in the case of a control group in an A/B test). + +Feature flag impressions are only logged once per session. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.email.Unsubscribe +// users.messages.featureflag.Impression { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_id" : "(optional, string) API ID of the app on which this event occurred", + "browser" : "(optional, string) Device browser - extracted from user_agent - on which the open occurred", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", - "email_address" : "(required, string) [PII] Email address of the user", + "carrier" : "(optional, string) Carrier of the device", + "country" : "(optional, string) [PII] Country of the user", + "device_id" : "(optional, string) ID of the device on which the event occurred", + "device_model" : "(optional, string) Model of the device", "external_user_id" : "(optional, string) [PII] External ID of the user", + "feature_flag_id_name" : "(optional, string) The Feature Flag Rollout identifier", + "gender" : "(optional, string) [PII] Gender of the user, one of ['M', 'F', 'O', 'N', 'P']", "id" : "(required, string) Globally unique ID for this event", - "ip_pool" : "(optional, string) IP pool from which the email send was made", + "language" : "(optional, string) [PII] Language of the user", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "send_id" : "(optional, string) Message send ID this message belongs to", + "os_version" : "(optional, string) Version of the operating system of the device", + "platform" : "(optional, string) Platform of the device", + "resolution" : "(optional, string) Resolution of the device", + "sdk_version" : "(optional, string) Version of the Braze SDK in use during the event", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - - The behavior for `dispatch_id` differs between Canvas and campaigns because Braze treats Canvas steps (except for entry steps, which can be scheduled) as triggered events, even when they are scheduled. Learn more about [dispatch ID behavior]({{site.baseurl}}/help/help_articles/data/dispatch_id/). -{% endapi %} - -{% api %} -## Feature Flag Experiment Impression events {#feature-flag-experiment-impression-events} - -{% apitags %} -Feature Flags, Impressions -{% endapitags %} -This event occurs whenever a user has had an opportunity to interact with your feature, or when they could have interacted if the feature is disabled (in the case of a control group in an A/B test). - -Feature flag impressions are only logged once per session. - - -{% tabs %} {% tab Amplitude %} ```json // Feature Flag Experiment Impression (users.messages.featureflag.Impression) @@ -6212,12 +6249,30 @@ Feature flag impressions are only logged once per session. } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## In-App Message Abort events {#in-app-message-abort-events} + +{% apitags %} +In-App Messages, Abort +{% endapitags %} +This event occurs when an originally scheduled in-app message was aborted. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.featureflag.Impression +// users.messages.inappmessage.Abort { + "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", + "abort_type" : "(optional, string) Type of abort", + "ad_id" : "(optional, string) [PII] Advertising identifier", + "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", + "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "app_id" : "(optional, string) API ID of the app on which this event occurred", "browser" : "(optional, string) Device browser - extracted from user_agent - on which the open occurred", @@ -6230,41 +6285,27 @@ Feature flag impressions are only logged once per session. "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "card_id" : "(optional, string) API ID of the card", "carrier" : "(optional, string) Carrier of the device", - "country" : "(optional, string) [PII] Country of the user", "device_id" : "(optional, string) ID of the device on which the event occurred", "device_model" : "(optional, string) Model of the device", - "external_user_id" : "(optional, string) [PII] External ID of the user", - "feature_flag_id_name" : "(optional, string) The Feature Flag Rollout identifier", - "gender" : "(optional, string) [PII] Gender of the user, one of ['M', 'F', 'O', 'N', 'P']", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", + "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "language" : "(optional, string) [PII] Language of the user", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "os_version" : "(optional, string) Version of the operating system of the device", "platform" : "(optional, string) Platform of the device", "resolution" : "(optional, string) Resolution of the device", - "sdk_version" : "(optional, string) Version of the Braze SDK in use during the event", + "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", - "user_id" : "(required, string) Braze user ID of the user who performed this event" + "user_id" : "(required, string) Braze user ID of the user who performed this event", + "version" : "(required, string) Which version of in-app message, legacy or triggered" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## In-App Message Abort events {#in-app-message-abort-events} - -{% apitags %} -In-App Messages, Abort -{% endapitags %} - -This event occurs when an originally scheduled in-app message was aborted. -{% tabs %} {% tab Amplitude %} ```json // In-App Message Abort (users.messages.inappmessage.Abort) @@ -6447,67 +6488,60 @@ This event occurs when an originally scheduled in-app message was aborted. } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## In-App Message Click events {#in-app-message-click-events} + +{% apitags %} +In-App Messages, Clicks +{% endapitags %} + +This event occurs when a user clicks on an in-app message. +{% alert note %} +`dispatch_id` is deprecated and will be removed in the next Currents release. +{% endalert %} + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.inappmessage.Abort +// users.messages.inappmessage.Click { - "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", - "abort_type" : "(optional, string) Type of abort", "ad_id" : "(optional, string) [PII] Advertising identifier", "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(optional, string) API ID of the app on which this event occurred", - "browser" : "(optional, string) Device browser - extracted from user_agent - on which the open occurred", + "app_id" : "(required, string) API ID of the app on which this event occurred", + "button_id" : "(optional, string) ID of the button clicked, if this click represents a click on a button", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "card_id" : "(optional, string) API ID of the card", - "carrier" : "(optional, string) Carrier of the device", "device_id" : "(optional, string) ID of the device on which the event occurred", "device_model" : "(optional, string) Model of the device", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "os_version" : "(optional, string) Version of the operating system of the device", "platform" : "(optional, string) Platform of the device", - "resolution" : "(optional, string) Resolution of the device", "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", - "user_id" : "(required, string) Braze user ID of the user who performed this event", - "version" : "(required, string) Which version of in-app message, legacy or triggered" + "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## In-App Message Click events {#in-app-message-click-events} - -{% apitags %} -In-App Messages, Clicks -{% endapitags %} - -This event occurs when a user clicks on an in-app message. -{% alert note %} -`dispatch_id` is deprecated and will be removed in the next Currents release. -{% endalert %} - -{% tabs %} {% tab Amplitude %} ```json // In-App Message Click (users.messages.inappmessage.Click) @@ -6688,10 +6722,31 @@ This event occurs when a user clicks on an in-app message. } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). +- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. +{% endapi %} + +{% api %} +## In-App Message Impression events {#in-app-message-impression-events} + +{% apitags %} +In-App Messages, Impressions +{% endapitags %} + +This event occurs when a user views an in-app message. + +{% alert note %} +`dispatch_id` is deprecated and will be removed in the next Currents release. +{% endalert %} +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.inappmessage.Click +// users.messages.inappmessage.Impression { "ad_id" : "(optional, string) [PII] Advertising identifier", @@ -6699,7 +6754,6 @@ This event occurs when a user clicks on an in-app message. "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "app_id" : "(required, string) API ID of the app on which this event occurred", - "button_id" : "(optional, string) ID of the button clicked, if this click represents a click on a button", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", @@ -6713,6 +6767,8 @@ This event occurs when a user clicks on an in-app message. "device_model" : "(optional, string) Model of the device", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", + "locale_key" : "(optional, string) [PII] The key corresponding to the translations (for example 'en-us') used to compose this message (null for default).", + "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "os_version" : "(optional, string) Version of the operating system of the device", @@ -6724,28 +6780,7 @@ This event occurs when a user clicks on an in-app message. } ``` {% endtab %} -{% endtabs %} -#### Property details - -- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). -- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. -{% endapi %} - -{% api %} -## In-App Message Impression events {#in-app-message-impression-events} - -{% apitags %} -In-App Messages, Impressions -{% endapitags %} - -This event occurs when a user views an in-app message. - -{% alert note %} -`dispatch_id` is deprecated and will be removed in the next Currents release. -{% endalert %} - -{% tabs %} {% tab Amplitude %} ```json // In-App Message Impression (users.messages.inappmessage.Impression) @@ -6930,61 +6965,56 @@ This event occurs when a user views an in-app message. } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). +- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. +{% endapi %} + +{% api %} +## LINE Abort events {#line-abort-events} + +{% apitags %} +LINE, Abort +{% endapitags %} + +This event occurs when a scheduled LINE message cannot be delivered, before sending to LINE. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.inappmessage.Impression +// users.messages.line.Abort { - "ad_id" : "(optional, string) [PII] Advertising identifier", - "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", - "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", + "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", + "abort_type" : "(optional, string) Type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(required, string) API ID of the app on which this event occurred", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", - "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", - "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "card_id" : "(optional, string) API ID of the card", "device_id" : "(optional, string) ID of the device on which the event occurred", - "device_model" : "(optional, string) Model of the device", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "locale_key" : "(optional, string) [PII] The key corresponding to the translations (for example 'en-us') used to compose this message (null for default).", - "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", + "line_channel_id" : "(required, string) The LINE Channel ID the message was sent to or received from", + "line_channel_name" : "(required, string) The LINE Channel Name the message was sent to or received from", "message_variation_id" : "(optional, string) API ID of the message variation this user received", - "message_variation_name" : "(optional, string) Name of the message variation", - "os_version" : "(optional, string) Version of the operating system of the device", - "platform" : "(optional, string) Platform of the device", + "native_line_id" : "(required, string) [PII] The user's Line ID from which the message was sent to or received from", "send_id" : "(optional, string) Message send ID this message belongs to", + "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). -- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. -{% endapi %} - -{% api %} -## LINE Abort events {#line-abort-events} - -{% apitags %} -LINE, Abort -{% endapitags %} - -This event occurs when a scheduled LINE message cannot be delivered, before sending to LINE. -{% tabs %} {% tab Amplitude %} ```json // Abort (users.messages.line.Abort) @@ -7139,14 +7169,29 @@ This event occurs when a scheduled LINE message cannot be delivered, before send } ``` {% endtab %} +{% endtabs %} + +#### Property details +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## LINE Click events {#line-click-events} + +{% apitags %} +LINE, Clicks +{% endapitags %} + +This event occurs when a user clicks a link in a LINE message where the link's domain matches the click tracking domain. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.line.Abort +// users.messages.line.Click { - "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", - "abort_type" : "(optional, string) Type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", @@ -7159,36 +7204,23 @@ This event occurs when a scheduled LINE message cannot be delivered, before send "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", + "is_suspected_bot_click" : "(optional, boolean) Whether this event was processed as a bot event", "line_channel_id" : "(required, string) The LINE Channel ID the message was sent to or received from", "line_channel_name" : "(required, string) The LINE Channel Name the message was sent to or received from", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "native_line_id" : "(required, string) [PII] The user's Line ID from which the message was sent to or received from", "send_id" : "(optional, string) Message send ID this message belongs to", + "short_url" : "(required, string) Shortened url that was clicked", "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", + "url" : "(required, string) URL that the user clicked on", + "user_agent" : "(optional, string) User agent on which the click occurred", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## LINE Click events {#line-click-events} -{% apitags %} -LINE, Clicks -{% endapitags %} - -This event occurs when a user clicks a link in a LINE message where the link's domain matches the click tracking domain. - -{% tabs %} {% tab Amplitude %} ```json // Click (users.messages.line.Click) @@ -7350,10 +7382,27 @@ This event occurs when a user clicks a link in a LINE message where the link's d } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## LINE Inbound Receive events {#line-inbound-receive-events} + +{% apitags %} +LINE, Inbound Received +{% endapitags %} + +This event occurs when a LINE message is received from a user. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.line.Click +// users.messages.line.InboundReceive { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -7368,40 +7417,21 @@ This event occurs when a user clicks a link in a LINE message where the link's d "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "is_suspected_bot_click" : "(optional, boolean) Whether this event was processed as a bot event", "line_channel_id" : "(required, string) The LINE Channel ID the message was sent to or received from", "line_channel_name" : "(required, string) The LINE Channel Name the message was sent to or received from", + "media_id" : "(optional, string) The LINE-generated ID which can be used to retrieve inbound media from LINE", + "message_body" : "(optional, string) Typed response from the user", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "native_line_id" : "(required, string) [PII] The user's Line ID from which the message was sent to or received from", "send_id" : "(optional, string) Message send ID this message belongs to", - "short_url" : "(required, string) Shortened url that was clicked", "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", - "url" : "(required, string) URL that the user clicked on", - "user_agent" : "(optional, string) User agent on which the click occurred", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## LINE Inbound Receive events {#line-inbound-receive-events} - -{% apitags %} -LINE, Inbound Received -{% endapitags %} - -This event occurs when a LINE message is received from a user. -{% tabs %} {% tab Amplitude %} ```json // LINE Inbound Receive (users.messages.line.InboundReceive) @@ -7556,10 +7586,27 @@ This event occurs when a LINE message is received from a user. } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## LINE Send events {#line-send-events} + +{% apitags %} +LINE, Sends +{% endapitags %} + +This event occurs when a LINE message is sent to LINE. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.line.InboundReceive +// users.messages.line.Send { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -7576,8 +7623,7 @@ This event occurs when a LINE message is received from a user. "id" : "(required, string) Globally unique ID for this event", "line_channel_id" : "(required, string) The LINE Channel ID the message was sent to or received from", "line_channel_name" : "(required, string) The LINE Channel Name the message was sent to or received from", - "media_id" : "(optional, string) The LINE-generated ID which can be used to retrieve inbound media from LINE", - "message_body" : "(optional, string) Typed response from the user", + "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "native_line_id" : "(required, string) [PII] The user's Line ID from which the message was sent to or received from", "send_id" : "(optional, string) Message send ID this message belongs to", @@ -7588,24 +7634,7 @@ This event occurs when a LINE message is received from a user. } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## LINE Send events {#line-send-events} - -{% apitags %} -LINE, Sends -{% endapitags %} - -This event occurs when a LINE message is sent to LINE. -{% tabs %} {% tab Amplitude %} ```json // Send (users.messages.line.Send) @@ -7756,37 +7785,6 @@ This event occurs when a LINE message is sent to LINE. } ``` {% endtab %} - -{% tab Cloud Storage %} -```json -// users.messages.line.Send - -{ - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", - "campaign_name" : "(optional, string) Name of the campaign", - "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", - "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", - "canvas_step_name" : "(optional, string) Name of the Canvas step", - "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", - "device_id" : "(optional, string) ID of the device on which the event occurred", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", - "external_user_id" : "(optional, string) [PII] External ID of the user", - "id" : "(required, string) Globally unique ID for this event", - "line_channel_id" : "(required, string) The LINE Channel ID the message was sent to or received from", - "line_channel_name" : "(required, string) The LINE Channel Name the message was sent to or received from", - "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", - "message_variation_id" : "(optional, string) API ID of the message variation this user received", - "native_line_id" : "(required, string) [PII] The user's Line ID from which the message was sent to or received from", - "send_id" : "(optional, string) Message send ID this message belongs to", - "subscription_group_id" : "(optional, string) Subscription group API ID", - "time" : "(required, int) UNIX timestamp at which the event happened", - "timezone" : "(optional, string) Time zone of the user", - "user_id" : "(required, string) Braze user ID of the user who performed this event" -} -``` -{% endtab %} {% endtabs %} #### Property details @@ -7805,6 +7803,27 @@ Live Activity, Outcome This event occurs when Braze receives a response from a third party provider (e.g. APNs) after the Live Activity send {% tabs %} +{% tab Cloud Storage %} +```json +// users.messages.liveactivity.Outcome + +{ + "activity_attributes_type" : "(optional, string) Live Activity attribute type", + "activity_id" : "(optional, string) Live Activity identifier", + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "app_id" : "(optional, string) API ID of the app on which this event occurred", + "external_user_id" : "(optional, string) [PII] External ID of the user", + "id" : "(required, string) Globally unique ID for this event", + "live_activity_event_outcome" : "(optional, string) Outcome of Live Activity event", + "live_activity_event_type" : "(optional, string) Event type of Live Activity. One of ['start', 'update', 'end']", + "push_to_start_token" : "(optional, string) Live Activity push to start token", + "time" : "(required, int) UNIX timestamp at which the event happened", + "update_token" : "(optional, string) Live Activity update token", + "user_id" : "(required, string) Braze user ID of the user who performed this event" +} +``` +{% endtab %} + {% tab Amplitude %} ```json // Live Activity Outcome (users.messages.liveactivity.Outcome) @@ -7920,10 +7939,23 @@ This event occurs when Braze receives a response from a third party provider (e. } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Live Activity Send events {#live-activity-send-events} + +{% apitags %} +Live Activity, Sends +{% endapitags %} + +This event occurs when Braze backend makes a request to its provider regarding Live Activity +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.liveactivity.Outcome +// users.messages.liveactivity.Send { "activity_attributes_type" : "(optional, string) Live Activity attribute type", @@ -7932,7 +7964,6 @@ This event occurs when Braze receives a response from a third party provider (e. "app_id" : "(optional, string) API ID of the app on which this event occurred", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "live_activity_event_outcome" : "(optional, string) Outcome of Live Activity event", "live_activity_event_type" : "(optional, string) Event type of Live Activity. One of ['start', 'update', 'end']", "push_to_start_token" : "(optional, string) Live Activity push to start token", "time" : "(required, int) UNIX timestamp at which the event happened", @@ -7941,20 +7972,7 @@ This event occurs when Braze receives a response from a third party provider (e. } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Live Activity Send events {#live-activity-send-events} - -{% apitags %} -Live Activity, Sends -{% endapitags %} - -This event occurs when Braze backend makes a request to its provider regarding Live Activity -{% tabs %} {% tab Amplitude %} ```json // Live Activity Send (users.messages.liveactivity.Send) @@ -8066,40 +8084,53 @@ This event occurs when Braze backend makes a request to its provider regarding L } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Push Notification Abort events {#push-notification-abort-events} + +{% apitags %} +Abort, Push +{% endapitags %} + +This event occurs if a push notification message was aborted based on Liquid aborts, etc. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.liveactivity.Send +// users.messages.pushnotification.Abort { - "activity_attributes_type" : "(optional, string) Live Activity attribute type", - "activity_id" : "(optional, string) Live Activity identifier", + "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", + "abort_type" : "(optional, string) Type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "app_id" : "(optional, string) API ID of the app on which this event occurred", + "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", + "campaign_name" : "(optional, string) Name of the campaign", + "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", + "canvas_name" : "(optional, string) Name of the Canvas", + "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", + "canvas_step_name" : "(optional, string) Name of the Canvas step", + "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", + "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "device_id" : "(optional, string) ID of the device on which the event occurred", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "live_activity_event_type" : "(optional, string) Event type of Live Activity. One of ['start', 'update', 'end']", - "push_to_start_token" : "(optional, string) Live Activity push to start token", + "message_variation_id" : "(optional, string) API ID of the message variation this user received", + "message_variation_name" : "(optional, string) Name of the message variation", + "platform" : "(required, string) Platform of the device", + "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", - "update_token" : "(optional, string) Live Activity update token", + "timezone" : "(optional, string) Time zone of the user", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} -{% endapi %} - -{% api %} -## Push Notification Abort events {#push-notification-abort-events} - -{% apitags %} -Abort, Push -{% endapitags %} - -This event occurs if a push notification message was aborted based on Liquid aborts, etc. - -{% tabs %} {% tab Amplitude %} ```json // Push Notification Abort (users.messages.pushnotification.Abort) @@ -8257,22 +8288,39 @@ This event occurs if a push notification message was aborted based on Liquid abo } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## Push Notification Bounce events {#push-notification-bounce-events} + +{% apitags %} +Push, Sends, Bounce +{% endapitags %} + +This event occurs when an error is received from either Apple Push Notification Service or Fire Cloud Messaging. This means that the push message was bounced, and therefore not delivered to the user's device. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.pushnotification.Abort +// users.messages.pushnotification.Bounce { - "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", - "abort_type" : "(optional, string) Type of abort", + "ad_id" : "(optional, string) [PII] Advertising identifier", + "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", + "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(optional, string) API ID of the app on which this event occurred", + "app_id" : "(required, string) API ID of the app on which this event occurred", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", @@ -8282,7 +8330,7 @@ This event occurs if a push notification message was aborted based on Liquid abo "id" : "(required, string) Globally unique ID for this event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "platform" : "(required, string) Platform of the device", + "platform" : "(optional, string) Platform of the device", "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", @@ -8290,24 +8338,7 @@ This event occurs if a push notification message was aborted based on Liquid abo } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} -{% api %} -## Push Notification Bounce events {#push-notification-bounce-events} - -{% apitags %} -Push, Sends, Bounce -{% endapitags %} - -This event occurs when an error is received from either Apple Push Notification Service or Fire Cloud Messaging. This means that the push message was bounced, and therefore not delivered to the user's device. - -{% tabs %} {% tab Amplitude %} ```json // Push Notification Bounce (users.messages.pushnotification.Bounce) @@ -8473,10 +8504,27 @@ This event occurs when an error is received from either Apple Push Notification } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager or account manager to enable the feature flipper for sending `ad_id`. +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). +{% endapi %} + +{% api %} +## Push Notification iOS Foreground Open events {#push-notification-ios-foreground-open-events} + +{% apitags %} +Push, iOS, Sends +{% endapitags %} +This event is not supported by our [Swift SDK](https://github.com/braze-inc/braze-swift-sdk) and is now deprecated using our [Obj-C SDK](https://github.com/Appboy/appboy-ios-sdk). + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.pushnotification.Bounce +// users.messages.pushnotification.IosForeground { "ad_id" : "(optional, string) [PII] Advertising identifier", @@ -8498,7 +8546,7 @@ This event occurs when an error is received from either Apple Push Notification "id" : "(required, string) Globally unique ID for this event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "platform" : "(optional, string) Platform of the device", + "platform" : "(required, string) Platform of the device", "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", @@ -8506,24 +8554,7 @@ This event occurs when an error is received from either Apple Push Notification } ``` {% endtab %} -{% endtabs %} -#### Property details - -- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager or account manager to enable the feature flipper for sending `ad_id`. -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). -{% endapi %} - -{% api %} -## Push Notification iOS Foreground Open events {#push-notification-ios-foreground-open-events} - -{% apitags %} -Push, iOS, Sends -{% endapitags %} - -This event is not supported by our [Swift SDK](https://github.com/braze-inc/braze-swift-sdk) and is now deprecated using our [Obj-C SDK](https://github.com/Appboy/appboy-ios-sdk). - -{% tabs %} {% tab Amplitude %} ```json // Push Notification iOS Foreground Open (users.messages.pushnotification.IosForeground) @@ -8642,10 +8673,34 @@ This event is not supported by our [Swift SDK](https://github.com/braze-inc/braz } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). +- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). +{% endapi %} + +{% api %} +## Push Notification Open events {#push-notification-open-events} + +{% apitags %} +Push, Opens +{% endapitags %} + +This event occurs when a user directly clicks on the Push notification to open the application. Currently, Push Open Events refer specifically to "Direct Opens" rather than "Total Opens". This does not include statistics shown at the campaign level of "influenced opens" as these are not attributed at the user level. + +{% alert note %} +In rare cases, a push open may appear before the corresponding push send event in Currents data because of the following: +- Your SDK has an incorrect clock. +- High batch write latency. The recorded send time can lag behind early deliveries, so very quick opens may be logged before the batch's final send timestamp is written. Large sends are dispatched and recorded in batches. +{% endalert %} +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.pushnotification.IosForeground +// users.messages.pushnotification.Open { "ad_id" : "(optional, string) [PII] Advertising identifier", @@ -8653,21 +8708,26 @@ This event is not supported by our [Swift SDK](https://github.com/braze-inc/braz "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "app_id" : "(required, string) API ID of the app on which this event occurred", + "button_action_type" : "(optional, string) Action type of the push notification button, null if not from a button click. One of ['uri', 'deep_link', 'none', 'close']", + "button_string" : "(optional, string) Identifier (button_string) of the push notification button clicked. null if not from a button click", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "device_id" : "(optional, string) ID of the device on which the event occurred", + "device_model" : "(optional, string) Model of the device", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "platform" : "(required, string) Platform of the device", + "os_version" : "(optional, string) Version of the operating system of the device", + "platform" : "(optional, string) Platform of the device", "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", @@ -8675,31 +8735,7 @@ This event is not supported by our [Swift SDK](https://github.com/braze-inc/braz } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). -- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). -{% endapi %} - -{% api %} -## Push Notification Open events {#push-notification-open-events} - -{% apitags %} -Push, Opens -{% endapitags %} -This event occurs when a user directly clicks on the Push notification to open the application. Currently, Push Open Events refer specifically to "Direct Opens" rather than "Total Opens". This does not include statistics shown at the campaign level of "influenced opens" as these are not attributed at the user level. - -{% alert note %} -In rare cases, a push open may appear before the corresponding push send event in Currents data because of the following: -- Your SDK has an incorrect clock. -- High batch write latency. The recorded send time can lag behind early deliveries, so very quick opens may be logged before the batch's final send timestamp is written. Large sends are dispatched and recorded in batches. -{% endalert %} - -{% tabs %} {% tab Amplitude %} ```json // Push Notification Open (users.messages.pushnotification.Open) @@ -8872,10 +8908,28 @@ In rare cases, a push open may appear before the corresponding push send event i } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). +- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). +{% endapi %} + +{% api %} +## Push Notification Send events {#push-notification-send-events} + +{% apitags %} +Push, Sends +{% endapitags %} +This event occurs when Braze processes a push message for a user, communicating this to Apple Push Notification Service or Fire Cloud Messaging. This does not mean the push was delivered to the device, just that a message was sent. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.pushnotification.Open +// users.messages.pushnotification.Send { "ad_id" : "(optional, string) [PII] Advertising identifier", @@ -8883,26 +8937,23 @@ In rare cases, a push open may appear before the corresponding push send event i "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "app_id" : "(required, string) API ID of the app on which this event occurred", - "button_action_type" : "(optional, string) Action type of the push notification button, null if not from a button click. One of ['uri', 'deep_link', 'none', 'close']", - "button_string" : "(optional, string) Identifier (button_string) of the push notification button clicked. null if not from a button click", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "device_id" : "(optional, string) ID of the device on which the event occurred", - "device_model" : "(optional, string) Model of the device", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", + "locale_key" : "(optional, string) [PII] The key corresponding to the translations (for example 'en-us') used to compose this message (null for default).", + "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "os_version" : "(optional, string) Version of the operating system of the device", - "platform" : "(optional, string) Platform of the device", + "platform" : "(required, string) Platform of the device", "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", @@ -8910,25 +8961,7 @@ In rare cases, a push open may appear before the corresponding push send event i } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). -- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). -{% endapi %} - -{% api %} -## Push Notification Send events {#push-notification-send-events} - -{% apitags %} -Push, Sends -{% endapitags %} - -This event occurs when Braze processes a push message for a user, communicating this to Apple Push Notification Service or Fire Cloud Messaging. This does not mean the push was delivered to the device, just that a message was sent. -{% tabs %} {% tab Amplitude %} ```json // Push Notification Send (users.messages.pushnotification.Send) @@ -9102,61 +9135,53 @@ This event occurs when Braze processes a push message for a user, communicating } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). +- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. +- `message_extras` allow you to annotate your send events with dynamic data from Connected Content, custom attributes (such as language, country), and Canvas entry properties. Refer to [Message extras]({{site.baseurl}}/message_extras_tag/) to learn more. +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). +{% endapi %} + +{% api %} +## RCS Abort events {#rcs-abort-events} + +{% apitags %} +RCS, Abort +{% endapitags %} +This event is created when an RCS send is interrupted due to an error detected within Braze, and the message is dropped. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.pushnotification.Send +// users.messages.rcs.Abort { - "ad_id" : "(optional, string) [PII] Advertising identifier", - "ad_id_type" : "(optional, string) One of ['ios_idfa', 'google_ad_id', 'windows_ad_id', 'roku_ad_id']", - "ad_tracking_enabled" : "(optional, boolean) Whether advertising tracking is enabled for the device", + "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", + "abort_type" : "(optional, string) The type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "app_id" : "(required, string) API ID of the app on which this event occurred", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", - "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "device_id" : "(optional, string) ID of the device on which the event occurred", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "locale_key" : "(optional, string) [PII] The key corresponding to the translations (for example 'en-us') used to compose this message (null for default).", - "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "platform" : "(required, string) Platform of the device", - "send_id" : "(optional, string) Message send ID this message belongs to", + "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", - "timezone" : "(optional, string) Time zone of the user", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details -- For `ad_id`, `ad_id_type`, and `ad_tracking_enabled`, you need to explicitly collect the iOS IDFA and Android Google advertising ID through the native SDKs. Learn more about this setup for [iOS]({{site.baseurl}}/developer_guide/analytics/managing_data_collection/?sdktab=swift) and [Android]({{site.baseurl}}/developer_guide/sdk_integration/?sdktab=android#android_google-advertising-id). -- If you're using Kafka to ingest [Currents]({{site.baseurl}}/user_guide/data/braze_currents/) data, contact your customer success manager to enable sending `ad_id`. -- `message_extras` allow you to annotate your send events with dynamic data from Connected Content, custom attributes (such as language, country), and Canvas entry properties. Refer to [Message extras]({{site.baseurl}}/message_extras_tag/) to learn more. -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). -{% endapi %} - -{% api %} -## RCS Abort events {#rcs-abort-events} - -{% apitags %} -RCS, Abort -{% endapitags %} - -This event is created when an RCS send is interrupted due to an error detected within Braze, and the message is dropped. - -{% tabs %} {% tab Amplitude %} ```json // Abort (users.messages.rcs.Abort) @@ -9292,14 +9317,25 @@ This event is created when an RCS send is interrupted due to an error detected w } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## RCS Click events {#rcs-click-events} + +{% apitags %} +RCS, Clicks +{% endapitags %} + +An event that is created when the user interacts with an RCS message in a way that involves tapping or clicking on a UI element. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.rcs.Abort +// users.messages.rcs.Click { - "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", - "abort_type" : "(optional, string) The type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", @@ -9308,31 +9344,28 @@ This event is created when an RCS send is interrupted due to an error detected w "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", - "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "device_id" : "(optional, string) ID of the device on which the event occurred", + "element_label" : "(optional, string) Optional details about the clicked element, such as the text of a suggested reply or button. \nExample: Button or chip text (will be reply message body for reply chips and buttons)", + "element_type" : "(optional, string) Specifies if an interaction_type that is common across suggestions and buttons came from a suggestion or button. Examples: Suggestion, Button", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", + "interaction_type" : "(required, string) The type of interaction that generated the click. Example string values: Text URL, Reply, OpenURL", + "is_suspected_bot_click" : "(optional, boolean) Whether this event was processed as a bot event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", + "send_id" : "(optional, string) Message send ID this message belongs to", + "short_url" : "(optional, string) The shortened URL that a user clicks on", "subscription_group_id" : "(optional, string) Subscription group API ID", + "suspected_bot_click_reason" : "(optional, array of string) Reasons why this event was classified as a bot", "time" : "(required, int) UNIX timestamp at which the event happened", - "user_id" : "(required, string) Braze user ID of the user who performed this event" + "url" : "(optional, string) The full URL that the user clicked on", + "user_agent" : "(optional, string) User agent on which the click occurred", + "user_id" : "(required, string) Braze user ID of the user who performed this event", + "user_phone_number" : "(required, string) [PII] The user's phone number from which the message was received" } ``` {% endtab %} -{% endtabs %} -{% endapi %} - -{% api %} -## RCS Click events {#rcs-click-events} - -{% apitags %} -RCS, Clicks -{% endapitags %} - -An event that is created when the user interacts with an RCS message in a way that involves tapping or clicking on a UI element. - -{% tabs %} {% tab Amplitude %} ```json // Click (users.messages.rcs.Click) @@ -9502,10 +9535,23 @@ An event that is created when the user interacts with an RCS message in a way th } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## RCS Delivery events {#rcs-delivery-events} + +{% apitags %} +RCS, Delivery +{% endapitags %} + +This event is created when an RCS message is successfully delivered to a user's mobile device. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.rcs.Click +// users.messages.rcs.Delivery { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -9516,41 +9562,23 @@ An event that is created when the user interacts with an RCS message in a way th "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", + "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "device_id" : "(optional, string) ID of the device on which the event occurred", - "element_label" : "(optional, string) Optional details about the clicked element, such as the text of a suggested reply or button. \nExample: Button or chip text (will be reply message body for reply chips and buttons)", - "element_type" : "(optional, string) Specifies if an interaction_type that is common across suggestions and buttons came from a suggestion or button. Examples: Suggestion, Button", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", + "from_rcs_sender" : "(optional, string) The RCS sender ID or agent name used to send the message", "id" : "(required, string) Globally unique ID for this event", - "interaction_type" : "(required, string) The type of interaction that generated the click. Example string values: Text URL, Reply, OpenURL", - "is_suspected_bot_click" : "(optional, boolean) Whether this event was processed as a bot event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", - "short_url" : "(optional, string) The shortened URL that a user clicks on", "subscription_group_id" : "(optional, string) Subscription group API ID", - "suspected_bot_click_reason" : "(optional, array of string) Reasons why this event was classified as a bot", "time" : "(required, int) UNIX timestamp at which the event happened", - "url" : "(optional, string) The full URL that the user clicked on", - "user_agent" : "(optional, string) User agent on which the click occurred", - "user_id" : "(required, string) Braze user ID of the user who performed this event", - "user_phone_number" : "(required, string) [PII] The user's phone number from which the message was received" + "to_phone_number" : "(required, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", + "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## RCS Delivery events {#rcs-delivery-events} -{% apitags %} -RCS, Delivery -{% endapitags %} - -This event is created when an RCS message is successfully delivered to a user's mobile device. - -{% tabs %} {% tab Amplitude %} ```json // Delivery (users.messages.rcs.Delivery) @@ -9702,12 +9730,30 @@ This event is created when an RCS message is successfully delivered to a user's } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## RCS Inbound Received events {#rcs-inbound-received-events} + +{% apitags %} +RCS, Inbound Received +{% endapitags %} + +This event is created when Braze receives an RCS message that originates from the user. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.rcs.Delivery +// users.messages.rcs.InboundReceive { + "action" : "(required, string) Action taken in response to this message. (for example Subscribed, Unsubscribed or None).", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", @@ -9716,40 +9762,22 @@ This event is created when an RCS message is successfully delivered to a user's "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", - "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "device_id" : "(optional, string) ID of the device on which the event occurred", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", - "from_rcs_sender" : "(optional, string) The RCS sender ID or agent name used to send the message", "id" : "(required, string) Globally unique ID for this event", + "media_urls" : "(optional, array of string) Media URLs from the user", + "message_body" : "(required, string) Typed response from the user", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", - "to_phone_number" : "(required, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", - "user_id" : "(required, string) Braze user ID of the user who performed this event" + "to_rcs_sender" : "(required, string) The inbound RCS sender that the message was sent to", + "user_id" : "(required, string) Braze user ID of the user who performed this event", + "user_phone_number" : "(required, string) [PII] The user's phone number from which the message was received" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## RCS Inbound Received events {#rcs-inbound-received-events} -{% apitags %} -RCS, Inbound Received -{% endapitags %} - -This event is created when Braze receives an RCS message that originates from the user. - -{% tabs %} {% tab Amplitude %} ```json // Inbound Receive (users.messages.rcs.InboundReceive) @@ -9898,13 +9926,25 @@ This event is created when Braze receives an RCS message that originates from th } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## RCS Read events {#rcs-read-events} + +{% apitags %} +RCS, Read +{% endapitags %} + +This event is created when a user opens an RCS message on their device, indicating that they have seen or read the message content. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.rcs.InboundReceive +// users.messages.rcs.Read { - "action" : "(required, string) Action taken in response to this message. (for example Subscribed, Unsubscribed or None).", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", @@ -9913,35 +9953,18 @@ This event is created when Braze receives an RCS message that originates from th "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", + "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "media_urls" : "(optional, array of string) Media URLs from the user", - "message_body" : "(required, string) Typed response from the user", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "send_id" : "(optional, string) Message send ID this message belongs to", - "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", - "to_rcs_sender" : "(required, string) The inbound RCS sender that the message was sent to", - "user_id" : "(required, string) Braze user ID of the user who performed this event", - "user_phone_number" : "(required, string) [PII] The user's phone number from which the message was received" + "to_phone_number" : "(required, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", + "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## RCS Read events {#rcs-read-events} - -{% apitags %} -RCS, Read -{% endapitags %} - -This event is created when a user opens an RCS message on their device, indicating that they have seen or read the message content. -{% tabs %} {% tab Amplitude %} ```json // Read (users.messages.rcs.Read) @@ -10071,10 +10094,23 @@ This event is created when a user opens an RCS message on their device, indicati } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## RCS Rejection events {#rcs-rejection-events} + +{% apitags %} +RCS, Rejection +{% endapitags %} +An event that is created when an RCS message fails to be delivered to a user's mobile device due to intervention by the carrier. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.rcs.Read +// users.messages.rcs.Rejection { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -10082,34 +10118,28 @@ This event is created when a user opens an RCS message on their device, indicati "campaign_name" : "(optional, string) Name of the campaign", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "device_id" : "(optional, string) ID of the device on which the event occurred", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", + "error" : "(optional, string) Error name", "external_user_id" : "(optional, string) [PII] External ID of the user", + "from_rcs_sender" : "(optional, string) The RCS sender ID or agent name used to send the message", "id" : "(required, string) Globally unique ID for this event", + "is_sms_fallback" : "(optional, boolean) Indicates if SMS fallback was attempted for this rejected RCS message. It is linked/paired to the SMS Delivery event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", + "provider_error_code" : "(optional, string) The error code from the provider", + "send_id" : "(optional, string) Message send ID this message belongs to", + "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", "to_phone_number" : "(required, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## RCS Rejection events {#rcs-rejection-events} - -{% apitags %} -RCS, Rejection -{% endapitags %} -An event that is created when an RCS message fails to be delivered to a user's mobile device due to intervention by the carrier. - -{% tabs %} {% tab Amplitude %} ```json // Rejection (users.messages.rcs.Rejection) @@ -10273,10 +10303,23 @@ An event that is created when an RCS message fails to be delivered to a user's m } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## RCS Send events {#rcs-send-events} + +{% apitags %} +RCS, Sends +{% endapitags %} + +This event is created when an RCS messages is sent out of Braze to our last-mile delivery partners. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.rcs.Rejection +// users.messages.rcs.Send { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -10284,19 +10327,19 @@ An event that is created when an RCS message fails to be delivered to a user's m "campaign_name" : "(optional, string) Name of the campaign", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "category" : "(optional, string) Keyword category name, only populated for auto-reply messages: 'opt-in', 'opt-out', 'help', or custom value", "device_id" : "(optional, string) ID of the device on which the event occurred", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", - "error" : "(optional, string) Error name", "external_user_id" : "(optional, string) [PII] External ID of the user", "from_rcs_sender" : "(optional, string) The RCS sender ID or agent name used to send the message", "id" : "(required, string) Globally unique ID for this event", - "is_sms_fallback" : "(optional, boolean) Indicates if SMS fallback was attempted for this rejected RCS message. It is linked/paired to the SMS Delivery event", + "message_extras" : "(optional, string) A JSON string of the tagged key-value pairs during liquid rendering", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "provider_error_code" : "(optional, string) The error code from the provider", "send_id" : "(optional, string) Message send ID this message belongs to", "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", @@ -10305,20 +10348,7 @@ An event that is created when an RCS message fails to be delivered to a user's m } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## RCS Send events {#rcs-send-events} - -{% apitags %} -RCS, Sends -{% endapitags %} - -This event is created when an RCS messages is sent out of Braze to our last-mile delivery partners. -{% tabs %} {% tab Amplitude %} ```json // Send (users.messages.rcs.Send) @@ -10478,56 +10508,52 @@ This event is created when an RCS messages is sent out of Braze to our last-mile } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## SMS Abort events {#sms-abort-events} + +{% apitags %} +Abort, SMS +{% endapitags %} + +This event occurs if an SMS message was aborted based on Liquid aborts, etc. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.rcs.Send +// users.messages.sms.Abort { + "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", + "abort_type" : "(optional, string) Type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", + "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "category" : "(optional, string) Keyword category name, only populated for auto-reply messages: 'opt-in', 'opt-out', 'help', or custom value", - "device_id" : "(optional, string) ID of the device on which the event occurred", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", - "from_rcs_sender" : "(optional, string) The RCS sender ID or agent name used to send the message", "id" : "(required, string) Globally unique ID for this event", - "message_extras" : "(optional, string) A JSON string of the tagged key-value pairs during liquid rendering", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "send_id" : "(optional, string) Message send ID this message belongs to", "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", - "to_phone_number" : "(required, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## SMS Abort events {#sms-abort-events} - -{% apitags %} -Abort, SMS -{% endapitags %} -This event occurs if an SMS message was aborted based on Liquid aborts, etc. - -{% tabs %} {% tab Amplitude %} ```json // SMS Abort (users.messages.sms.Abort) @@ -10667,52 +10693,54 @@ This event occurs if an SMS message was aborted based on Liquid aborts, etc. } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## SMS Carrier Send events {#sms-carrier-send-events} + +{% apitags %} +SMS, Sends +{% endapitags %} + +This event occurs when an SMS is sent to the carrier. + +{% alert important %} +`CarrierSend` is supported only for users on legacy infrastructure. +{% endalert %} +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.sms.Abort +// users.messages.sms.CarrierSend { - "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", - "abort_type" : "(optional, string) Type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", + "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", "id" : "(required, string) Globally unique ID for this event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", + "send_id" : "(optional, string) Message send ID this message belongs to", "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", + "timezone" : "(optional, string) Time zone of the user", + "to_phone_number" : "(optional, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## SMS Carrier Send events {#sms-carrier-send-events} - -{% apitags %} -SMS, Sends -{% endapitags %} -This event occurs when an SMS is sent to the carrier. - -{% alert important %} -`CarrierSend` is supported only for users on legacy infrastructure. -{% endalert %} - -{% tabs %} {% tab Amplitude %} ```json // SMS Carrier Send (users.messages.sms.CarrierSend) @@ -10868,10 +10896,27 @@ This event occurs when an SMS is sent to the carrier. } ``` {% endtab %} +{% endtabs %} +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## SMS Delivery events {#sms-delivery-events} + +{% apitags %} +SMS, Delivery +{% endapitags %} + +This event occurs when an SMS was successfully delivered to the user's mobile phone. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.sms.CarrierSend +// users.messages.sms.Delivery { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -10887,6 +10932,7 @@ This event occurs when an SMS is sent to the carrier. "external_user_id" : "(optional, string) [PII] External ID of the user", "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", "id" : "(required, string) Globally unique ID for this event", + "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", @@ -10898,24 +10944,7 @@ This event occurs when an SMS is sent to the carrier. } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## SMS Delivery events {#sms-delivery-events} - -{% apitags %} -SMS, Delivery -{% endapitags %} - -This event occurs when an SMS was successfully delivered to the user's mobile phone. -{% tabs %} {% tab Amplitude %} ```json // SMS Delivery (users.messages.sms.Delivery) @@ -11075,10 +11104,27 @@ This event occurs when an SMS was successfully delivered to the user's mobile ph } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## SMS Delivery Failure events {#sms-delivery-failure-events} + +{% apitags %} +SMS, Delivery +{% endapitags %} + +This event occurs when an SMS experiences delivery failure. Use this event and the provided error codes to help troubleshoot issues with SMS delivery. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.sms.Delivery +// users.messages.sms.DeliveryFailure { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -11091,12 +11137,13 @@ This event occurs when an SMS was successfully delivered to the user's mobile ph "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", + "error" : "(optional, string) Error name", "external_user_id" : "(optional, string) [PII] External ID of the user", - "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", "id" : "(required, string) Globally unique ID for this event", "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", + "provider_error_code" : "(optional, string) Error code from the SMS provider", "send_id" : "(optional, string) Message send ID this message belongs to", "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", @@ -11106,24 +11153,7 @@ This event occurs when an SMS was successfully delivered to the user's mobile ph } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## SMS Delivery Failure events {#sms-delivery-failure-events} - -{% apitags %} -SMS, Delivery -{% endapitags %} -This event occurs when an SMS experiences delivery failure. Use this event and the provided error codes to help troubleshoot issues with SMS delivery. - -{% tabs %} {% tab Amplitude %} ```json // SMS Delivery Failure (users.messages.sms.DeliveryFailure) @@ -11287,13 +11317,35 @@ This event occurs when an SMS experiences delivery failure. Use this event and t } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). +{% endapi %} + +{% api %} +## SMS Inbound Received events {#sms-inbound-received-events} + +{% apitags %} +SMS, Inbound Received +{% endapitags %} + +This event occurs when one of your users sends an SMS to a phone number in one of your Braze SMS subscription groups. + +When Braze receives an inbound SMS, we attribute that inbound message to any user that shares that phone number. As a result, you may receive multiple events per inbound message if multiple users in your Braze instance share the same phone number. If you require attribution of specific user IDs based on previous messages sent to that user, you can use the SMS Delivered event to attribute Inbound Received events to the user ID who most recently received a message from your Braze number. + +If we detect that this inbound message is a reply to an outbound campaign or Canvas component sent from Braze, we will also include the campaign or Canvas metadata with the event. Braze defines a reply as an inbound message coming within four hours of an outbound message. However, there is a one-minute cache for the attributed campaign information of the last outbound SMS received. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.sms.DeliveryFailure +// users.messages.sms.InboundReceive { - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", + "action" : "(required, string) Action taken in response to this message. (for example Subscribed, Unsubscribed or None).", + "app_group_id" : "(required, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", @@ -11302,46 +11354,21 @@ This event occurs when an SMS experiences delivery failure. Use this event and t "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", - "error" : "(optional, string) Error name", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", + "inbound_phone_number" : "(required, string) The inbound number that the message was sent to", + "media_urls" : "(optional, array of string) Media URLs from the user", + "message_body" : "(required, string) Typed response from the user", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "provider_error_code" : "(optional, string) Error code from the SMS provider", - "send_id" : "(optional, string) Message send ID this message belongs to", "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", - "timezone" : "(optional, string) Time zone of the user", - "to_phone_number" : "(optional, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", - "user_id" : "(required, string) Braze user ID of the user who performed this event" + "user_id" : "(optional, string) Braze user ID of the user who performed this event", + "user_phone_number" : "(required, string) [PII] The user's phone number from which the message was received" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## SMS Inbound Received events {#sms-inbound-received-events} - -{% apitags %} -SMS, Inbound Received -{% endapitags %} -This event occurs when one of your users sends an SMS to a phone number in one of your Braze SMS subscription groups. - -When Braze receives an inbound SMS, we attribute that inbound message to any user that shares that phone number. As a result, you may receive multiple events per inbound message if multiple users in your Braze instance share the same phone number. If you require attribution of specific user IDs based on previous messages sent to that user, you can use the SMS Delivered event to attribute Inbound Received events to the user ID who most recently received a message from your Braze number. - -If we detect that this inbound message is a reply to an outbound campaign or Canvas component sent from Braze, we will also include the campaign or Canvas metadata with the event. Braze defines a reply as an inbound message coming within four hours of an outbound message. However, there is a one-minute cache for the attributed campaign information of the last outbound SMS received. - - -{% tabs %} {% tab Amplitude %} ```json // SMS Inbound Received (users.messages.sms.InboundReceive) @@ -11494,14 +11521,26 @@ If we detect that this inbound message is a reply to an outbound campaign or Can } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## SMS Rejection events {#sms-rejection-events} + +{% apitags %} +SMS, Rejection +{% endapitags %} + +This event occurs when an SMS send gets rejected by the carrier, this can happen for several reasons. Use this event and the provided error codes to help troubleshoot issues with SMS delivery. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.sms.InboundReceive +// users.messages.sms.Rejection { - "action" : "(required, string) Action taken in response to this message. (for example Subscribed, Unsubscribed or None).", - "app_group_id" : "(required, string) API ID of the app group this user belongs to", + "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", @@ -11510,34 +11549,25 @@ If we detect that this inbound message is a reply to an outbound campaign or Can "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", + "error" : "(optional, string) Error name", "external_user_id" : "(optional, string) [PII] External ID of the user", + "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", "id" : "(required, string) Globally unique ID for this event", - "inbound_phone_number" : "(required, string) The inbound number that the message was sent to", - "media_urls" : "(optional, array of string) Media URLs from the user", - "message_body" : "(required, string) Typed response from the user", + "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID\nIt can be linked to the RCS Rejection event via a send ID and dispatch ID. (Event property)", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", + "provider_error_code" : "(optional, string) Error code from the SMS provider", + "send_id" : "(optional, string) Message send ID this message belongs to", "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", - "user_id" : "(optional, string) Braze user ID of the user who performed this event", - "user_phone_number" : "(required, string) [PII] The user's phone number from which the message was received" + "timezone" : "(optional, string) Time zone of the user", + "to_phone_number" : "(optional, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", + "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## SMS Rejection events {#sms-rejection-events} - -{% apitags %} -SMS, Rejection -{% endapitags %} - -This event occurs when an SMS send gets rejected by the carrier, this can happen for several reasons. Use this event and the provided error codes to help troubleshoot issues with SMS delivery. -{% tabs %} {% tab Amplitude %} ```json // SMS Rejection (users.messages.sms.Rejection) @@ -11705,10 +11735,27 @@ This event occurs when an SMS send gets rejected by the carrier, this can happen } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## SMS Send events {#sms-send-events} + +{% apitags %} +SMS, Sends +{% endapitags %} + +This event occurs when a user sends an SMS. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.sms.Rejection +// users.messages.sms.Send { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -11720,15 +11767,13 @@ This event occurs when an SMS send gets rejected by the carrier, this can happen "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "category" : "(optional, string) Keyword category name, only populated for auto-reply messages: 'opt-in', 'opt-out', 'help', or custom value", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", - "error" : "(optional, string) Error name", "external_user_id" : "(optional, string) [PII] External ID of the user", - "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", "id" : "(required, string) Globally unique ID for this event", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID\nIt can be linked to the RCS Rejection event via a send ID and dispatch ID. (Event property)", + "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "provider_error_code" : "(optional, string) Error code from the SMS provider", "send_id" : "(optional, string) Message send ID this message belongs to", "subscription_group_id" : "(optional, string) Subscription group API ID", "time" : "(required, int) UNIX timestamp at which the event happened", @@ -11738,24 +11783,7 @@ This event occurs when an SMS send gets rejected by the carrier, this can happen } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## SMS Send events {#sms-send-events} -{% apitags %} -SMS, Sends -{% endapitags %} - -This event occurs when a user sends an SMS. - -{% tabs %} {% tab Amplitude %} ```json // SMS Send (users.messages.sms.Send) @@ -11915,10 +11943,27 @@ This event occurs when a user sends an SMS. } ``` {% endtab %} +{% endtabs %} +#### Property details + +- `message_extras` allow you to annotate your send events with dynamic data from Connected Content, custom attributes (such as language, country), and Canvas entry properties. Refer to [Message extras]({{site.baseurl}}/message_extras_tag/) to learn more. +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). +{% endapi %} + +{% api %} +## SMS Short Link Click events {#sms-short-link-click-events} + +{% apitags %} +SMS, Clicks +{% endapitags %} + +This event occurs when a user clicks an SMS short link. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.sms.Send +// users.messages.sms.ShortLinkClick { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -11930,40 +11975,23 @@ This event occurs when a user sends an SMS. "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "category" : "(optional, string) Keyword category name, only populated for auto-reply messages: 'opt-in', 'opt-out', 'help', or custom value", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", + "is_suspected_bot_click" : "(optional, boolean) Whether this event was processed as a bot event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "send_id" : "(optional, string) Message send ID this message belongs to", - "subscription_group_id" : "(optional, string) Subscription group API ID", - "time" : "(required, int) UNIX timestamp at which the event happened", - "timezone" : "(optional, string) Time zone of the user", - "to_phone_number" : "(optional, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", - "user_id" : "(required, string) Braze user ID of the user who performed this event" -} -``` -{% endtab %} -{% endtabs %} - -#### Property details - -- `message_extras` allow you to annotate your send events with dynamic data from Connected Content, custom attributes (such as language, country), and Canvas entry properties. Refer to [Message extras]({{site.baseurl}}/message_extras_tag/) to learn more. -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). -{% endapi %} - -{% api %} -## SMS Short Link Click events {#sms-short-link-click-events} - -{% apitags %} -SMS, Clicks -{% endapitags %} - -This event occurs when a user clicks an SMS short link. + "short_url" : "(required, string) Shortened url that was clicked", + "suspected_bot_click_reason" : "(optional, array of string) Why this event was classified as a bot", + "time" : "(required, int) UNIX timestamp at which the event happened", + "timezone" : "(optional, string) Time zone of the user", + "url" : "(required, string) URL that the user clicked on", + "user_agent" : "(optional, string) User agent on which the click occurred", + "user_id" : "(required, string) Braze user ID of the user who performed this event", + "user_phone_number" : "(optional, string) [PII] The user's phone number from which the message was received" +} +``` +{% endtab %} -{% tabs %} {% tab Amplitude %} ```json // SMS Short Link Click (users.messages.sms.ShortLinkClick) @@ -12122,51 +12150,51 @@ This event occurs when a user clicks an SMS short link. } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## Webhook Abort events {#webhook-abort-events} + +{% apitags %} +Abort, Webhooks +{% endapitags %} + +This event occurs if a webhook message was aborted based on Liquid aborts, etc. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.sms.ShortLinkClick +// users.messages.webhook.Abort { + "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", + "abort_type" : "(optional, string) Type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "device_id" : "(optional, string) ID of the device on which the event occurred", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "is_suspected_bot_click" : "(optional, boolean) Whether this event was processed as a bot event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "short_url" : "(required, string) Shortened url that was clicked", - "suspected_bot_click_reason" : "(optional, array of string) Why this event was classified as a bot", + "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", - "url" : "(required, string) URL that the user clicked on", - "user_agent" : "(optional, string) User agent on which the click occurred", - "user_id" : "(required, string) Braze user ID of the user who performed this event", - "user_phone_number" : "(optional, string) [PII] The user's phone number from which the message was received" + "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## Webhook Abort events {#webhook-abort-events} - -{% apitags %} -Abort, Webhooks -{% endapitags %} - -This event occurs if a webhook message was aborted based on Liquid aborts, etc. -{% tabs %} {% tab Amplitude %} ```json // Webhook Abort (users.messages.webhook.Abort) @@ -12316,14 +12344,29 @@ This event occurs if a webhook message was aborted based on Liquid aborts, etc. } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## Webhook Failure events {#webhook-failure-events} + +{% apitags %} +Failure, Webhooks +{% endapitags %} + +This event occurs if a webhook message was delivered but failed with an error response from the endpoint. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.webhook.Abort +// users.messages.webhook.Failure { - "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", - "abort_type" : "(optional, string) Type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", @@ -12334,37 +12377,28 @@ This event occurs if a webhook message was aborted based on Liquid aborts, etc. "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "device_id" : "(optional, string) ID of the device on which the event occurred", + "content_length" : "(optional, int) Content length of the response", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", + "endpoint_url" : "(optional, string) The endpoint URL of the failed webhook", "external_user_id" : "(optional, string) [PII] External ID of the user", + "host" : "(optional, string) The host of the webhook URL that returned a failure response", + "http_status_code" : "(optional, int) HTTP status code of the response", "id" : "(required, string) Globally unique ID for this event", + "is_terminal" : "(optional, boolean) Whether this event was the terminal attempt in a send", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", + "raw_response" : "(optional, string) Truncated raw response from endpoint", + "retry_count" : "(optional, int) Number of webhook sends attempted before giving up", "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", - "timezone" : "(optional, string) Time zone of the user", - "user_id" : "(required, string) Braze user ID of the user who performed this event" + "url_path" : "(optional, string) The path of the webhook URL that returned a failure response", + "user_id" : "(required, string) Braze user ID of the user who performed this event", + "webhook_duration" : "(optional, int) Total duration of this request in milliseconds", + "webhook_failure_source" : "(optional, string) To tell whether an error was created by Braze or by the endpoint itself. The source field could be External Endpoint, Treat no status code to host unreachable" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## Webhook Failure events {#webhook-failure-events} - -{% apitags %} -Failure, Webhooks -{% endapitags %} - -This event occurs if a webhook message was delivered but failed with an error response from the endpoint. -{% tabs %} {% tab Amplitude %} ```json // Webhook Failure (users.messages.webhook.Failure) @@ -12540,10 +12574,27 @@ This event occurs if a webhook message was delivered but failed with an error re } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} +{% api %} +## Webhook Send events {#webhook-send-events} + +{% apitags %} +Webhooks, Sends +{% endapitags %} + +This event occurs when a webhook was processed and sent to the third party specified in that webhook. Note that this does not signify whether or not the request was received. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.webhook.Failure +// users.messages.webhook.Send { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -12552,49 +12603,23 @@ This event occurs if a webhook message was delivered but failed with an error re "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "content_length" : "(optional, int) Content length of the response", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", - "endpoint_url" : "(optional, string) The endpoint URL of the failed webhook", "external_user_id" : "(optional, string) [PII] External ID of the user", - "host" : "(optional, string) The host of the webhook URL that returned a failure response", - "http_status_code" : "(optional, int) HTTP status code of the response", "id" : "(required, string) Globally unique ID for this event", - "is_terminal" : "(optional, boolean) Whether this event was the terminal attempt in a send", + "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "raw_response" : "(optional, string) Truncated raw response from endpoint", - "retry_count" : "(optional, int) Number of webhook sends attempted before giving up", "send_id" : "(optional, string) Message send ID this message belongs to", "time" : "(required, int) UNIX timestamp at which the event happened", - "url_path" : "(optional, string) The path of the webhook URL that returned a failure response", - "user_id" : "(required, string) Braze user ID of the user who performed this event", - "webhook_duration" : "(optional, int) Total duration of this request in milliseconds", - "webhook_failure_source" : "(optional, string) To tell whether an error was created by Braze or by the endpoint itself. The source field could be External Endpoint, Treat no status code to host unreachable" + "timezone" : "(optional, string) Time zone of the user", + "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). -{% endapi %} - -{% api %} -## Webhook Send events {#webhook-send-events} - -{% apitags %} -Webhooks, Sends -{% endapitags %} - -This event occurs when a webhook was processed and sent to the third party specified in that webhook. Note that this does not signify whether or not the request was received. - -{% tabs %} {% tab Amplitude %} ```json // Webhook Send (users.messages.webhook.Send) @@ -12740,52 +12765,56 @@ This event occurs when a webhook was processed and sent to the third party speci } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `message_extras` allow you to annotate your send events with dynamic data from Connected Content, custom attributes (such as language or country), and Canvas entry properties. Refer to [Message extras]({{site.baseurl}}/message_extras_tag/) to learn more. +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). +{% endapi %} + +{% api %} +## WhatsApp Abort events {#whatsapp-abort-events} + +{% apitags %} +WhatsApp, Abort +{% endapitags %} + +This event occurs if a WhatsApp message was aborted based on Liquid aborts, etc. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.webhook.Send +// users.messages.whatsapp.Abort { + "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", + "abort_type" : "(optional, string) Type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", "canvas_name" : "(optional, string) Name of the Canvas", "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", + "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "device_id" : "(optional, string) ID of the device on which the event occurred", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "send_id" : "(optional, string) Message send ID this message belongs to", - "time" : "(required, int) UNIX timestamp at which the event happened", + "subscription_group_id" : "(optional, string) Subscription group API ID", + "time" : "(required, long) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", + "to_phone_number" : "(optional, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `message_extras` allow you to annotate your send events with dynamic data from Connected Content, custom attributes (such as language or country), and Canvas entry properties. Refer to [Message extras]({{site.baseurl}}/message_extras_tag/) to learn more. -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). -{% endapi %} -{% api %} -## WhatsApp Abort events {#whatsapp-abort-events} - -{% apitags %} -WhatsApp, Abort -{% endapitags %} - -This event occurs if a WhatsApp message was aborted based on Liquid aborts, etc. - -{% tabs %} {% tab Amplitude %} ```json // WhatsApp Abort (users.messages.whatsapp.Abort) @@ -12941,14 +12970,29 @@ This event occurs if a WhatsApp message was aborted based on Liquid aborts, etc. } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## WhatsApp Tracked Link Click events {#whatsapp-tracked-link-click-events} + +{% apitags %} +WhatsApp, Clicks +{% endapitags %} +This event occurs when a user clicks a link or button in a WhatsApp message where the link's domain matches the click tracking domain. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.whatsapp.Abort +// users.messages.whatsapp.Click { - "abort_log" : "(optional, string) [PII] Log message describing abort details (up to 128 chars)", - "abort_type" : "(optional, string) Type of abort", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", @@ -12960,37 +13004,21 @@ This event occurs if a WhatsApp message was aborted based on Liquid aborts, etc. "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "device_id" : "(optional, string) ID of the device on which the event occurred", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "subscription_group_id" : "(optional, string) Subscription group API ID", - "time" : "(required, long) UNIX timestamp at which the event happened", + "short_url" : "(required, string) Shortened url that was clicked", + "time" : "(required, int) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", - "to_phone_number" : "(optional, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", - "user_id" : "(required, string) Braze user ID of the user who performed this event" + "url" : "(required, string) URL that the user clicked on", + "user_agent" : "(optional, string) User agent on which the click occurred", + "user_id" : "(required, string) Braze user ID of the user who performed this event", + "user_phone_number" : "(optional, string) [PII] The user's phone number from which the message was received" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## WhatsApp Tracked Link Click events {#whatsapp-tracked-link-click-events} - -{% apitags %} -WhatsApp, Clicks -{% endapitags %} -This event occurs when a user clicks a link or button in a WhatsApp message where the link's domain matches the click tracking domain. - -{% tabs %} {% tab Amplitude %} ```json // WhatsApp Tracked Link Click (users.messages.whatsapp.Click) @@ -13142,10 +13170,23 @@ This event occurs when a user clicks a link or button in a WhatsApp message wher } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## WhatsApp Delivery events {#whatsapp-delivery-events} + +{% apitags %} +WhatsApp, Delivery +{% endapitags %} + +This event occurs when an WhatsApp message sent made it successfully to the user's device. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.whatsapp.Click +// users.messages.whatsapp.Delivery { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -13159,34 +13200,25 @@ This event occurs when a user clicks a link or button in a WhatsApp message wher "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "device_id" : "(optional, string) ID of the device on which the event occurred", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", + "flow_id" : "(optional, string) The unique ID of the Flow in the WhatsApp Manager. Present if the message includes a CTA to respond to a WhatsApp Flow", + "from_phone_number" : "(required, string) Phone number used to send in e.164 format (for example +14155552671)", "id" : "(required, string) Globally unique ID for this event", + "message_id" : "(optional, string) The unique ID generated by Meta for this message", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "short_url" : "(required, string) Shortened url that was clicked", - "time" : "(required, int) UNIX timestamp at which the event happened", + "send_id" : "(optional, string) Message send ID this message belongs to", + "subscription_group_id" : "(optional, string) Subscription group API ID", + "template_name" : "(optional, string) [PII] Name of the template in the WhatsApp manager. Present if sending a Template Message", + "time" : "(required, long) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", - "url" : "(required, string) URL that the user clicked on", - "user_agent" : "(optional, string) User agent on which the click occurred", - "user_id" : "(required, string) Braze user ID of the user who performed this event", - "user_phone_number" : "(optional, string) [PII] The user's phone number from which the message was received" + "to_phone_number" : "(optional, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", + "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## WhatsApp Delivery events {#whatsapp-delivery-events} -{% apitags %} -WhatsApp, Delivery -{% endapitags %} - -This event occurs when an WhatsApp message sent made it successfully to the user's device. - -{% tabs %} {% tab Amplitude %} ```json // WhatsApp Delivery (users.messages.whatsapp.Delivery) @@ -13354,10 +13386,27 @@ This event occurs when an WhatsApp message sent made it successfully to the user } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## WhatsApp Failure events {#whatsapp-failure-events} + +{% apitags %} +WhatsApp, Failure +{% endapitags %} + +This event occurs when WhatsApp cannot deliver the message to the user. A hard bounce signifies a permanent deliverability failure. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.whatsapp.Delivery +// users.messages.whatsapp.Failure { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -13379,6 +13428,8 @@ This event occurs when an WhatsApp message sent made it successfully to the user "message_id" : "(optional, string) The unique ID generated by Meta for this message", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", + "provider_error_code" : "(required, string) Error code from WhatsApp", + "provider_error_title" : "(required, string) Description of error from WhatsApp", "send_id" : "(optional, string) Message send ID this message belongs to", "subscription_group_id" : "(optional, string) Subscription group API ID", "template_name" : "(optional, string) [PII] Name of the template in the WhatsApp manager. Present if sending a Template Message", @@ -13389,24 +13440,7 @@ This event occurs when an WhatsApp message sent made it successfully to the user } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## WhatsApp Failure events {#whatsapp-failure-events} - -{% apitags %} -WhatsApp, Failure -{% endapitags %} - -This event occurs when WhatsApp cannot deliver the message to the user. A hard bounce signifies a permanent deliverability failure. -{% tabs %} {% tab Amplitude %} ```json // WhatsApp Failure (users.messages.whatsapp.Failure) @@ -13582,12 +13616,30 @@ This event occurs when WhatsApp cannot deliver the message to the user. A hard b } ``` {% endtab %} +{% endtabs %} + +#### Property details +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## WhatsApp Inbound Received events {#whatsapp-inbound-received-events} + +{% apitags %} +WhatsApp, Inbound Received +{% endapitags %} + +This event occurs when one of your users sends a WhatsApp message to a phone number in one of your Braze WhatsApp subscription groups. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.whatsapp.Failure +// users.messages.whatsapp.InboundReceive { + "action" : "(required, string) Action taken in response to this message. (for example Subscribed, Unsubscribed or None).", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", @@ -13598,45 +13650,30 @@ This event occurs when WhatsApp cannot deliver the message to the user. A hard b "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", + "catalog_id" : "(optional, string) Catalog ID of a product if a product is referenced in the inbound message. Otherwise, empty.", "device_id" : "(optional, string) ID of the device on which the event occurred", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", - "flow_id" : "(optional, string) The unique ID of the Flow in the WhatsApp Manager. Present if the message includes a CTA to respond to a WhatsApp Flow", - "from_phone_number" : "(required, string) Phone number used to send in e.164 format (for example +14155552671)", + "flow_id" : "(optional, string) The unique ID of the Flow in the WhatsApp Manager. Present if the user is responding to a WhatsApp Flow.", + "flow_response_json" : "(optional, string) [PII] The form values the user responded with. Present if the user is responding to a WhatsApp Flow.", "id" : "(required, string) Globally unique ID for this event", + "in_reply_to" : "(optional, string) The message_id of the message this message was replying to", + "inbound_phone_number" : "(required, string) The inbound number that the message was sent to", + "media_urls" : "(optional, array of string) Media URLs from the user", + "message_body" : "(optional, string) Typed response from the user", "message_id" : "(optional, string) The unique ID generated by Meta for this message", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "provider_error_code" : "(required, string) Error code from WhatsApp", - "provider_error_title" : "(required, string) Description of error from WhatsApp", - "send_id" : "(optional, string) Message send ID this message belongs to", + "product_id" : "(optional, string) Product SKU if a product is referenced in the inbound message. Otherwise, empty.", + "quick_reply_text" : "(optional, string) Text of button pressed by the user", "subscription_group_id" : "(optional, string) Subscription group API ID", - "template_name" : "(optional, string) [PII] Name of the template in the WhatsApp manager. Present if sending a Template Message", "time" : "(required, long) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", - "to_phone_number" : "(optional, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", - "user_id" : "(required, string) Braze user ID of the user who performed this event" + "user_id" : "(optional, string) Braze user ID of the user who performed this event", + "user_phone_number" : "(required, string) [PII] The user's phone number from which the message was received" } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## WhatsApp Inbound Received events {#whatsapp-inbound-received-events} - -{% apitags %} -WhatsApp, Inbound Received -{% endapitags %} - -This event occurs when one of your users sends a WhatsApp message to a phone number in one of your Braze WhatsApp subscription groups. -{% tabs %} {% tab Amplitude %} ```json // WhatsApp Inbound Received (users.messages.whatsapp.InboundReceive) @@ -13823,13 +13860,25 @@ This event occurs when one of your users sends a WhatsApp message to a phone num } ``` {% endtab %} +{% endtabs %} + +{% endapi %} + +{% api %} +## WhatsApp Read events {#whatsapp-read-events} + +{% apitags %} +WhatsApp, Read +{% endapitags %} +This event occurs when an WhatsApp message is read by the user. + +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.whatsapp.InboundReceive +// users.messages.whatsapp.Read { - "action" : "(required, string) Action taken in response to this message. (for example Subscribed, Unsubscribed or None).", "app_group_id" : "(optional, string) API ID of the app group this user belongs to", "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", "campaign_name" : "(optional, string) Name of the campaign", @@ -13840,43 +13889,26 @@ This event occurs when one of your users sends a WhatsApp message to a phone num "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", - "catalog_id" : "(optional, string) Catalog ID of a product if a product is referenced in the inbound message. Otherwise, empty.", "device_id" : "(optional, string) ID of the device on which the event occurred", + "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", - "flow_id" : "(optional, string) The unique ID of the Flow in the WhatsApp Manager. Present if the user is responding to a WhatsApp Flow.", - "flow_response_json" : "(optional, string) [PII] The form values the user responded with. Present if the user is responding to a WhatsApp Flow.", + "flow_id" : "(optional, string) The unique ID of the Flow in the WhatsApp Manager. Present if the message includes a CTA to respond to a WhatsApp Flow", + "from_phone_number" : "(required, string) Phone number used to send in e.164 format (for example +14155552671)", "id" : "(required, string) Globally unique ID for this event", - "in_reply_to" : "(optional, string) The message_id of the message this message was replying to", - "inbound_phone_number" : "(required, string) The inbound number that the message was sent to", - "media_urls" : "(optional, array of string) Media URLs from the user", - "message_body" : "(optional, string) Typed response from the user", "message_id" : "(optional, string) The unique ID generated by Meta for this message", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", - "product_id" : "(optional, string) Product SKU if a product is referenced in the inbound message. Otherwise, empty.", - "quick_reply_text" : "(optional, string) Text of button pressed by the user", + "send_id" : "(optional, string) Message send ID this message belongs to", "subscription_group_id" : "(optional, string) Subscription group API ID", + "template_name" : "(optional, string) [PII] Name of the template in the WhatsApp manager. Present if sending a Template Message", "time" : "(required, long) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", - "user_id" : "(optional, string) Braze user ID of the user who performed this event", - "user_phone_number" : "(required, string) [PII] The user's phone number from which the message was received" + "to_phone_number" : "(optional, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", + "user_id" : "(required, string) Braze user ID of the user who performed this event" } ``` {% endtab %} -{% endtabs %} - -{% endapi %} - -{% api %} -## WhatsApp Read events {#whatsapp-read-events} - -{% apitags %} -WhatsApp, Read -{% endapitags %} - -This event occurs when an WhatsApp message is read by the user. -{% tabs %} {% tab Amplitude %} ```json // WhatsApp Read (users.messages.whatsapp.Read) @@ -14044,10 +14076,27 @@ This event occurs when an WhatsApp message is read by the user. } ``` {% endtab %} +{% endtabs %} + +#### Property details + +- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). + +{% endapi %} + +{% api %} +## WhatsApp Send events {#whatsapp-send-events} + +{% apitags %} +WhatsApp, Sends +{% endapitags %} + +This event occurs when a send request was successfully communicated between Braze and WhatsApp. Though, this does not mean the message was received by the user. +{% tabs %} {% tab Cloud Storage %} ```json -// users.messages.whatsapp.Read +// users.messages.whatsapp.Send { "app_group_id" : "(optional, string) API ID of the app group this user belongs to", @@ -14059,19 +14108,19 @@ This event occurs when an WhatsApp message is read by the user. "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", "canvas_step_name" : "(optional, string) Name of the Canvas step", "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", - "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "device_id" : "(optional, string) ID of the device on which the event occurred", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "external_user_id" : "(optional, string) [PII] External ID of the user", "flow_id" : "(optional, string) The unique ID of the Flow in the WhatsApp Manager. Present if the message includes a CTA to respond to a WhatsApp Flow", "from_phone_number" : "(required, string) Phone number used to send in e.164 format (for example +14155552671)", "id" : "(required, string) Globally unique ID for this event", + "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", "message_id" : "(optional, string) The unique ID generated by Meta for this message", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", "subscription_group_id" : "(optional, string) Subscription group API ID", - "template_name" : "(optional, string) [PII] Name of the template in the WhatsApp manager. Present if sending a Template Message", + "template_name" : "(optional, string) [PII] Name of the template in the WhatsApp Manager. Present if sending a Template Message", "time" : "(required, long) UNIX timestamp at which the event happened", "timezone" : "(optional, string) Time zone of the user", "to_phone_number" : "(optional, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", @@ -14079,24 +14128,7 @@ This event occurs when an WhatsApp message is read by the user. } ``` {% endtab %} -{% endtabs %} - -#### Property details - -- `dispatch_id` is an ID for a specific message dispatch, such as a campaign send. All push events that originate from the same dispatch include the same `dispatch_id`. Use `dispatch_id` to group events that belong to the same dispatch, allowing you to group and correlate the push message lifecycle for that dispatch (such as Send, Bounce, and Open). - -{% endapi %} - -{% api %} -## WhatsApp Send events {#whatsapp-send-events} - -{% apitags %} -WhatsApp, Sends -{% endapitags %} - -This event occurs when a send request was successfully communicated between Braze and WhatsApp. Though, this does not mean the message was received by the user. -{% tabs %} {% tab Amplitude %} ```json // WhatsApp Send (users.messages.whatsapp.Send) @@ -14268,41 +14300,6 @@ This event occurs when a send request was successfully communicated between Braz } ``` {% endtab %} - -{% tab Cloud Storage %} -```json -// users.messages.whatsapp.Send - -{ - "app_group_id" : "(optional, string) API ID of the app group this user belongs to", - "campaign_id" : "(optional, string) API ID of the campaign this event belongs to", - "campaign_name" : "(optional, string) Name of the campaign", - "canvas_id" : "(optional, string) API ID of the Canvas this event belongs to", - "canvas_name" : "(optional, string) Name of the Canvas", - "canvas_step_id" : "(optional, string) API ID of the Canvas step this event belongs to", - "canvas_step_message_variation_id" : "(optional, string) API ID of the Canvas step message variation this user received", - "canvas_step_name" : "(optional, string) Name of the Canvas step", - "canvas_variation_id" : "(optional, string) API ID of the Canvas variation this event belongs to", - "device_id" : "(optional, string) ID of the device on which the event occurred", - "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", - "external_user_id" : "(optional, string) [PII] External ID of the user", - "flow_id" : "(optional, string) The unique ID of the Flow in the WhatsApp Manager. Present if the message includes a CTA to respond to a WhatsApp Flow", - "from_phone_number" : "(required, string) Phone number used to send in e.164 format (for example +14155552671)", - "id" : "(required, string) Globally unique ID for this event", - "message_extras" : "(optional, string) [PII] A JSON string of the tagged key-value pairs during liquid rendering", - "message_id" : "(optional, string) The unique ID generated by Meta for this message", - "message_variation_id" : "(optional, string) API ID of the message variation this user received", - "message_variation_name" : "(optional, string) Name of the message variation", - "send_id" : "(optional, string) Message send ID this message belongs to", - "subscription_group_id" : "(optional, string) Subscription group API ID", - "template_name" : "(optional, string) [PII] Name of the template in the WhatsApp Manager. Present if sending a Template Message", - "time" : "(required, long) UNIX timestamp at which the event happened", - "timezone" : "(optional, string) Time zone of the user", - "to_phone_number" : "(optional, string) [PII] Phone number of the user receiving the message in e.164 format (for example +14155552671)", - "user_id" : "(required, string) Braze user ID of the user who performed this event" -} -``` -{% endtab %} {% endtabs %} #### Property details From a77721e1423f1dea10407b73f8f7856037b11ac0 Mon Sep 17 00:00:00 2001 From: Bre Fitzgerald <82903296+bre-fitzgerald@users.noreply.github.com> Date: Mon, 12 Jan 2026 14:18:20 -0800 Subject: [PATCH 03/11] Add related articles to user profiles (#11487) Co-authored-by: Lydia Xie <87040416+lydia-xie@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../_user_guide/engagement_tools/segments/user_profiles.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/_docs/_user_guide/engagement_tools/segments/user_profiles.md b/_docs/_user_guide/engagement_tools/segments/user_profiles.md index 932f9653d3b..82e27fd3b75 100644 --- a/_docs/_user_guide/engagement_tools/segments/user_profiles.md +++ b/_docs/_user_guide/engagement_tools/segments/user_profiles.md @@ -152,4 +152,10 @@ Some fields may be absent in a user's **Message History** tab in the following s - If a particular message is missing entirely from the messaging history but appears in the **Campaigns Received** log, it's likely the user received the campaign before being identified as the current user. If an existing profile is orphaned, the **Campaigns Received** log is transferred, but the messaging history is not. - When data is missing for **Campaign/Canvas**, a manual test may have been sent. Manual tests are logged in the **Messaging History** tab, but the campaign or Canvas that was sent won't be logged. +## Related articles + +- [User profile lifecycle]({{site.baseurl}}/user_guide/data/unification/user_data/user_profile_lifecycle/) +- [POST: Export user profile by identifier]({{site.baseurl}}/api/endpoints/export/user_data/post_users_identifier/) +- [POST: Delete users]({{site.baseurl}}/api/endpoints/user_data/post_user_delete/) + From 77c13b715481ab80987c6896e08e0ba4bffe58a8 Mon Sep 17 00:00:00 2001 From: Zeyuan Zhao <38015013+zzhaobraze@users.noreply.github.com> Date: Mon, 12 Jan 2026 17:49:12 -0500 Subject: [PATCH 04/11] [NOTIX] fix non-english hash anchors (#11508) --- assets/js/documents.js | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/assets/js/documents.js b/assets/js/documents.js index 4fa58cb14c0..ae8f8476ded 100644 --- a/assets/js/documents.js +++ b/assets/js/documents.js @@ -283,22 +283,25 @@ $(document).ready(function() { $(window).scroll(scrollHandler); // See if sdk tabs should be changed based on url hash - const sdk_hash = $(window.location.hash); - if (sdk_hash.is(':header')) { - const sdk_el = sdk_hash.closest("[data-sdk-tab]"); - let sdk_tab = sdk_el.attr('data-sdk-tab'); - // add sdk tab to query header - if (sdk_tab) { - sdk_tab = sdk_tab.replace('sdk-',''); - let tab_replace = { - 'sdktab': sdk_tab - }; - let query_str = replaceParams(window.location.search, tab_replace, true) + '#' + sdk_hash.attr('id'); - if (window.location.pathname.substr(-1) != '/') { - window.history.replaceState(null, null, window.location.pathname + '/' + query_str); - } - else { - window.history.replaceState(null, null, window.location.pathname + query_str); + let location_hash = window.location.hash.slice(1); + if (location_hash) { + const sdk_hash = $('#' + decodeURIComponent(location_hash)); + if (sdk_hash.is(':header')) { + const sdk_el = sdk_hash.closest("[data-sdk-tab]"); + let sdk_tab = sdk_el.attr('data-sdk-tab'); + // add sdk tab to query header + if (sdk_tab) { + sdk_tab = sdk_tab.replace('sdk-',''); + let tab_replace = { + 'sdktab': sdk_tab + }; + let query_str = replaceParams(window.location.search, tab_replace, true) + '#' + sdk_hash.attr('id'); + if (window.location.pathname.substr(-1) != '/') { + window.history.replaceState(null, null, window.location.pathname + '/' + query_str); + } + else { + window.history.replaceState(null, null, window.location.pathname + query_str); + } } } } From 39103e315af9e4eee920c1eba0c7c5ca00894ab7 Mon Sep 17 00:00:00 2001 From: Lydia Xie Date: Mon, 12 Jan 2026 14:51:30 -0800 Subject: [PATCH 05/11] edits --- .../customer_behavior_events.md | 4 +- .../message_engagement_events.md | 40 +++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/customer_behavior_events.md b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/customer_behavior_events.md index d060c9368ec..d1f59c7bc36 100644 --- a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/customer_behavior_events.md +++ b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/customer_behavior_events.md @@ -925,7 +925,7 @@ When a user starts their first session, both a `FirstSession` and a `SessionStar Live Activity, Push To Start Token {% endapitags %} -This event occurs when Braze syncs Live Activity push to start token with the user +This event occurs when Braze syncs the Live Activity push to start token with the user. {% tabs %} {% tab Cloud Storage %} @@ -1143,7 +1143,7 @@ This event occurs when Braze syncs Live Activity update token with the user Push, Token State Change {% endapitags %} -This event occurs when a push token is inserted, updated or removed. Use this to track the states of push tokens. +This event occurs when a push token is inserted, updated, or removed. Use this to track the states of push tokens. {% tabs %} {% tab Cloud Storage %} diff --git a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md index 6dacb9d897e..feb87e18325 100644 --- a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md +++ b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md @@ -5850,7 +5850,7 @@ Email, Subscription This event occurs when the end-user has clicked "unsubscribe" from the email. {% alert important %} -The `Unsubscribe` event is actually a specialized click event that is fired when your user clicks on the unsubscribe link in the email (either a normal unsubscribe link within the email body or footer, or using the [list-unsubscribe header]({{site.baseurl}}/user_guide/administrative/app_settings/manage_app_group/email_settings#include-a-list-unsubscribe-header)), not when the user changes state to unsubscribed. If subscription state change is sent through the API, or via custom (non-Braze) unsubscription link, it will not trigger an event on Currents. +The `Unsubscribe` event is a specialized click event that is fired when your user clicks the unsubscribe link in the email (either a normal unsubscribe link within the email body or footer, or using the [list-unsubscribe header]({{site.baseurl}}/user_guide/administrative/app_settings/manage_app_group/email_settings#include-a-list-unsubscribe-header)), not when the user changes state to unsubscribed. If subscription state change is sent through the API or with a custom (non-Braze) unsubscription link, it does not trigger an event on Currents. {% endalert %} {% tabs %} @@ -6499,7 +6499,7 @@ This event occurs when an originally scheduled in-app message was aborted. In-App Messages, Clicks {% endapitags %} -This event occurs when a user clicks on an in-app message. +This event occurs when a user clicks an in-app message. {% alert note %} `dispatch_id` is deprecated and will be removed in the next Currents release. @@ -7950,7 +7950,7 @@ This event occurs when Braze receives a response from a third party provider (e. Live Activity, Sends {% endapitags %} -This event occurs when Braze backend makes a request to its provider regarding Live Activity +This event occurs when the Braze system makes a request to its provider regarding Live Activity. {% tabs %} {% tab Cloud Storage %} @@ -10330,7 +10330,7 @@ An event that is created when an RCS message fails to be delivered to a user's m RCS, Sends {% endapitags %} -This event is created when an RCS messages is sent out of Braze to our last-mile delivery partners. +This event is created when an RCS message is sent out of Braze to our last-mile delivery partners. {% tabs %} {% tab Cloud Storage %} @@ -10946,7 +10946,7 @@ This event occurs when an SMS was successfully delivered to the user's mobile ph "external_user_id" : "(optional, string) [PII] External ID of the user", "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", "id" : "(required, string) Globally unique ID for this event", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", @@ -10977,7 +10977,7 @@ This event occurs when an SMS was successfully delivered to the user's mobile ph "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", @@ -11015,7 +11015,7 @@ This event occurs when an SMS was successfully delivered to the user's mobile ph "distinct_id" : "(required, string) [PII] External ID of the user", "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", "$insert_id" : "(required, string) Globally unique ID for this event", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", @@ -11053,7 +11053,7 @@ This event occurs when an SMS was successfully delivered to the user's mobile ph "device_id" : "(optional, string) ID of the device on which the event occurred", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", @@ -11106,7 +11106,7 @@ This event occurs when an SMS was successfully delivered to the user's mobile ph "device_id" : "(optional, string) ID of the device on which the event occurred", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "send_id" : "(optional, string) Message send ID this message belongs to", @@ -11153,7 +11153,7 @@ This event occurs when an SMS experiences delivery failure. Use this event and t "error" : "(optional, string) Error name", "external_user_id" : "(optional, string) [PII] External ID of the user", "id" : "(required, string) Globally unique ID for this event", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "provider_error_code" : "(optional, string) Error code from the SMS provider", @@ -11185,7 +11185,7 @@ This event occurs when an SMS experiences delivery failure. Use this event and t "canvas_variation_name" : "(optional, string) Name of the Canvas variation this user received", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "error" : "(optional, string) Error name", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "provider_error_code" : "(optional, string) Error code from the SMS provider", @@ -11224,7 +11224,7 @@ This event occurs when an SMS experiences delivery failure. Use this event and t "distinct_id" : "(required, string) [PII] External ID of the user", "error" : "(optional, string) Error name", "$insert_id" : "(required, string) Globally unique ID for this event", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "provider_error_code" : "(optional, string) Error code from the SMS provider", @@ -11263,7 +11263,7 @@ This event occurs when an SMS experiences delivery failure. Use this event and t "device_id" : "(optional, string) ID of the device on which the event occurred", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "error" : "(optional, string) Error name", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "provider_error_code" : "(optional, string) Error code from the SMS provider", @@ -11317,7 +11317,7 @@ This event occurs when an SMS experiences delivery failure. Use this event and t "device_id" : "(optional, string) ID of the device on which the event occurred", "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "error" : "(optional, string) Error name", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "provider_error_code" : "(optional, string) Error code from the SMS provider", @@ -11544,7 +11544,7 @@ If we detect that this inbound message is a reply to an outbound campaign or Can SMS, Rejection {% endapitags %} -This event occurs when an SMS send gets rejected by the carrier, this can happen for several reasons. Use this event and the provided error codes to help troubleshoot issues with SMS delivery. +This event occurs when an SMS send gets rejected by the carrier. This can happen for several reasons. Use this event and the provided error codes to help troubleshoot issues with SMS delivery. {% tabs %} {% tab Cloud Storage %} @@ -11566,7 +11566,7 @@ This event occurs when an SMS send gets rejected by the carrier, this can happen "external_user_id" : "(optional, string) [PII] External ID of the user", "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", "id" : "(required, string) Globally unique ID for this event", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID\nIt can be linked to the RCS Rejection event via a send ID and dispatch ID. (Event property)", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID\nIt can be linked to the RCS Rejection event via a send ID and dispatch ID. (Event property)", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "provider_error_code" : "(optional, string) Error code from the SMS provider", @@ -11599,7 +11599,7 @@ This event occurs when an SMS send gets rejected by the carrier, this can happen "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "error" : "(optional, string) Error name", "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID\nIt can be linked to the RCS Rejection event via a send ID and dispatch ID. (Event property)", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID\nIt can be linked to the RCS Rejection event via a send ID and dispatch ID. (Event property)", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "provider_error_code" : "(optional, string) Error code from the SMS provider", @@ -11639,7 +11639,7 @@ This event occurs when an SMS send gets rejected by the carrier, this can happen "error" : "(optional, string) Error name", "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", "$insert_id" : "(required, string) Globally unique ID for this event", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID\nIt can be linked to the RCS Rejection event via a send ID and dispatch ID. (Event property)", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID\nIt can be linked to the RCS Rejection event via a send ID and dispatch ID. (Event property)", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "provider_error_code" : "(optional, string) Error code from the SMS provider", @@ -11679,7 +11679,7 @@ This event occurs when an SMS send gets rejected by the carrier, this can happen "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "error" : "(optional, string) Error name", "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID\nIt can be linked to the RCS Rejection event via a send ID and dispatch ID. (Event property)", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID\nIt can be linked to the RCS Rejection event via a send ID and dispatch ID. (Event property)", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "provider_error_code" : "(optional, string) Error code from the SMS provider", @@ -11734,7 +11734,7 @@ This event occurs when an SMS send gets rejected by the carrier, this can happen "dispatch_id" : "(optional, string) ID of the dispatch this message belongs to", "error" : "(optional, string) Error name", "from_phone_number" : "(optional, string) Phone number used to send in e.164 format (for example +14155552671)", - "is_sms_fallback" : "(optional, boolean) Indicates that a SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID\nIt can be linked to the RCS Rejection event via a send ID and dispatch ID. (Event property)", + "is_sms_fallback" : "(optional, boolean) Indicates that an SMS fallback message was sent due to a rejected RCS message. The message could result in delivery, delivery failure, or rejection. It can be linked to the RCS Rejection event via a send ID and dispatch ID\nIt can be linked to the RCS Rejection event via a send ID and dispatch ID. (Event property)", "message_variation_id" : "(optional, string) API ID of the message variation this user received", "message_variation_name" : "(optional, string) Name of the message variation", "provider_error_code" : "(optional, string) Error code from the SMS provider", From d8d847b38b1be28d7a0c3925af1178e4a52ec73d Mon Sep 17 00:00:00 2001 From: Lydia Xie Date: Mon, 12 Jan 2026 14:51:57 -0800 Subject: [PATCH 06/11] edits --- .../event_glossary/message_engagement_events.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md index feb87e18325..5c32227cf04 100644 --- a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md +++ b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md @@ -1633,7 +1633,7 @@ This event occurs when a user has exited a Canvas by performing an event. Canvas {% endapitags %} -This event occurs when a user convert for a Canvas experiment step. +This event occurs when a user converts for a Canvas experiment step. {% tabs %} {% tab Cloud Storage %} @@ -8694,7 +8694,7 @@ This event is not supported by our [Swift SDK](https://github.com/braze-inc/braz Push, Opens {% endapitags %} -This event occurs when a user directly clicks on the Push notification to open the application. Currently, Push Open Events refer specifically to "Direct Opens" rather than "Total Opens". This does not include statistics shown at the campaign level of "influenced opens" as these are not attributed at the user level. +This event occurs when a user directly clicks on the push notification to open the application. Currently, Push Open Events refer specifically to "Direct Opens" rather than "Total Opens". This does not include statistics shown at the campaign level of "influenced opens" as these are not attributed at the user level. {% alert note %} In rare cases, a push open may appear before the corresponding push send event in Currents data because of the following: From 01a61b7b1d806f35971855205426218a82e6eb7a Mon Sep 17 00:00:00 2001 From: Lydia Xie Date: Mon, 12 Jan 2026 15:17:43 -0800 Subject: [PATCH 07/11] fix tab --- .../braze_currents/event_glossary/message_engagement_events.md | 1 + 1 file changed, 1 insertion(+) diff --git a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md index 5c32227cf04..4b7d30d963c 100644 --- a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md +++ b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/message_engagement_events.md @@ -13448,6 +13448,7 @@ This event occurs when WhatsApp cannot deliver the message to the user. A hard b } ``` {% endtab %} +{% endtabs %} #### Property details From da7f672165cca5b0872cdf5cce9969fd7b0623d4 Mon Sep 17 00:00:00 2001 From: Rachel Feinberg <135255868+rachel-feinberg@users.noreply.github.com> Date: Mon, 12 Jan 2026 16:01:16 -0800 Subject: [PATCH 08/11] [BD-5145] Add testing tabs and redirects (#11439) Co-authored-by: Lydia Xie <87040416+lydia-xie@users.noreply.github.com> --- .../campaigns/testing_and_more.md | 2 +- .../testing_and_more/sending_test_messages.md | 217 ++++++++++-------- .../content_cards/testing.md | 2 +- .../email/best_practices.md | 2 +- .../message_building_by_channel/email/faq.md | 2 +- .../email/testing.md | 9 + .../in-app_messages/testing.md | 2 +- .../line/testing.md | 9 + .../message_building_by_channel/push/faq.md | 2 +- .../push/testing.md | 9 + .../push/troubleshooting.md | 2 +- .../sms_mms_rcs/mms.md | 2 +- .../sms_mms_rcs/rcs.md | 2 +- .../sms_mms_rcs/sms.md | 2 +- .../sms_mms_rcs/testing.md | 9 + .../webhooks/testing.md | 9 + .../whatsapp/faqs.md | 2 +- .../whatsapp/meta_resources.md | 2 +- .../whatsapp/testing.md | 9 + assets/img/whatsapp/whatsapp_test.png | Bin 0 -> 139073 bytes 20 files changed, 184 insertions(+), 111 deletions(-) create mode 100644 _docs/_user_guide/message_building_by_channel/email/testing.md create mode 100644 _docs/_user_guide/message_building_by_channel/line/testing.md create mode 100644 _docs/_user_guide/message_building_by_channel/push/testing.md create mode 100644 _docs/_user_guide/message_building_by_channel/sms_mms_rcs/testing.md create mode 100644 _docs/_user_guide/message_building_by_channel/webhooks/testing.md create mode 100644 _docs/_user_guide/message_building_by_channel/whatsapp/testing.md create mode 100644 assets/img/whatsapp/whatsapp_test.png diff --git a/_docs/_user_guide/engagement_tools/campaigns/testing_and_more.md b/_docs/_user_guide/engagement_tools/campaigns/testing_and_more.md index 28bba8387bc..1a72da5cad0 100644 --- a/_docs/_user_guide/engagement_tools/campaigns/testing_and_more.md +++ b/_docs/_user_guide/engagement_tools/campaigns/testing_and_more.md @@ -15,7 +15,7 @@ description: "This landing page is home to campaign testing and tips. Here, you guide_featured_title: "Section articles" guide_featured_list: - name: Send Test Messages - link: /docs/developer_guide/in_app_messages/sending_test_messages/ + link: /docs/user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages/ image: /assets/img/braze_icons/mail-01.svg - name: API-Triggered and Action-Based Campaigns link: /docs/user_guide/engagement_tools/campaigns/testing_and_more/triggered_action_based/ diff --git a/_docs/_user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages.md b/_docs/_user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages.md index 543e840f421..b2d1b3c34e9 100644 --- a/_docs/_user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages.md +++ b/_docs/_user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages.md @@ -30,101 +30,33 @@ A convenient way to organize your test users is by creating a [Content Test Grou For steps to send test messages, refer to the following section for your respective channel. {% tabs local %} -{% tab Email %} - -1. Draft your email message. -2. Select **Preview and Test**. -3. Select the **Test Send** tab and add your email address or user ID in the **Add individual users** field. -4. Select **Send Test** to send your drafted email to your inbox. - -![Test Email]({% image_buster /assets/img_archive/testemail.png %}){: style="max-width:40%;" } - -{% endtab %} -{% tab Push %} - -#### Mobile push - -1. Draft your mobile push. -2. Select the **Test** tab and add your email address or user ID in the **Add Individual Users** field. -3. Select **Send Test** to send your drafted message to your device. - -![Test push]({% image_buster /assets/img_archive/testpush.png %}) - -#### Web push - -1. Create your web push. -2. Select the **Test** tab. -3. Select **Send Test to Myself**. -4. Select **Send Test** to send your web push to your web browser. - -![Test web push]({% image_buster /assets/img_archive/testwebpush.png %}) - -If you have already accepted push messages from the Braze dashboard, the push will come through in the corner of your screen. Otherwise, click **Allow** when prompted, and the message will appear. - -{% endtab %} -{% tab In-App Message %} - -{% alert warning %} -To send a test to either [Content Test Groups]({{site.baseurl}}/user_guide/administrative/app_settings/developer_console/internal_groups_tab/#content-test-groups) or individual users, push must be enabled on your test devices before sending. For example, you must have push enabled on your iOS device in order to tap the notification before the test message displays. {% endalert %} - -If you have push notifications set up within your app and on your test device, you can send test in-app messages to your app to see what it looks like in real-time. - -1. Draft your in-app message. -2. Select the **Test** tab and add your email address or user ID to the **Add Individual Users** field. -3. Select **Send Test** to send your push message to your device. - -A test push message will appear at the top of your device screen. - -![Test In App]({% image_buster /assets/img_archive/test-in-app.png %}) +{% tab Banners %} {% alert important %} -Test sends may result in more than one in-app message being sent to each recipient. +Before you can test Banner messages in Braze, you'll need to create a Banner campaign in Braze. Additionally, verify that the placement you want to test is already [placed in your app or website]({{site.baseurl}}/developer_guide/banners/placements). {% endalert %} -Directly clicking and opening the push message will send you to your app, where you can view your in-app message test. Note this in-app message testing feature relies on the user clicking a test push notification to trigger the in-app message. As such, the user must be eligible to receive push notifications in the relevant app for the successful delivery of the test push notification. - -### Preview - -You can preview your in-app message as you compose it in the **Preview** tab. This should help you visualize what your final message will look like from your user's perspective. You can preview what your message will look like to a random user, a specific user, or a customized user. You can also preview messages for either mobile devices or tablets. +After creating your Banner message, you can preview your Banner or send a test message. -![Compose tab when building an in-app message showing the preview of what the message will look like. A user is not selected, so the Liquid added in the body section displays as is.]({% image_buster /assets/img/in-app-message-preview.png %}) +1. Draft your Banner message. +2. Select **Preview** to preview your Banner or send a test message. +3. To send a test message, add either a content test group or one or more individual users as **Test Recipients**, then select **Send Test**. -Braze has three generations of in-app messages available. You can fine-tune to which devices your messages should be sent, based on which Generation they support. +You'll be able to view your test message on the device for up to 5 minutes. -![Switching between generations when previewing an in-app message.]({% image_buster /assets/img/iam-generations.gif %}){: height="50%" width="50%"} +![Preview tab of the Banner composer.]({% image_buster /assets/img/banners/preview_banner.png %}) -{% alert warning %} -In **Preview**, the view of your message might not be identical to its actual rendering on the user's device. We always recommend sending a test message to a device to ensure that your media, copy, personalization, and custom attributes generate correctly. +{% alert note %} +Keep in mind, your preview may not be identical to the final render on a user's device due to differences across hardware. {% endalert %} ### Test checklist -- Do the images and media show up and act as expected? -- Does the Liquid function as expected? Have you accounted for a [default attribute value]({{site.baseurl}}/user_guide/personalization_and_dynamic_content/liquid/conditional_logic/#accounting-for-null-attribute-values) if the Liquid returns no information? +- Is your Banner campaign assigned to a placement? +- Do the images and media show up and act as expected on your targeted device types and screen sizes? +- Do your links and buttons direct the user to where they should go? +- Does the Liquid function as expected? Have you accounted for a default attribute value in the event that the Liquid returns no information? - Is your copy clear, concise, and correct? -- Do your buttons direct the user where they should go? - -### Accessibility scanner - -To support accessibility best practices, Braze automatically scans the content of in-app messages created using the traditional HTML editor against accessibility standards. This scanner helps identify content that may not meet Web Content Accessibility Guidelines ([WCAG](https://www.w3.org/WAI/standards-guidelines/wcag/)) standards. WCAG is a set of internationally recognized technical standards developed by the World Wide Web Consortium (W3C) to make web content more accessible to people with disabilities. - -![Accessibility scan results]({% image_buster /assets/img/Accessibilty_Scanner_IAM.png %}) - -{% alert note %} -The in-app message accessibility scanner only runs on messages built with custom HTML. -{% endalert %} - -#### How it works - -The scanner runs automatically on custom HTML messages and evaluates your entire HTML message against the full [WCAG 2.1 AA rule set](https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1¤tsidebar=%23col_customize&levels=aaa). For each flagged issue, it shows: - -- The specific HTML element involved -- A description of the accessibility issue -- A link to additional context or remediation guidance - -#### Understanding automated accessibility testing - -{% multi_lang_include accessibility/automated_testing.md %} {% endtab %} {% tab Content Card %} @@ -198,40 +130,117 @@ A common use case is trying to debug why a user can't see a particular Content C From there, you can review your message settings and content to drill down and determine why a user can't see a particular Content Card. {% endtab %} -{% tab Banners %} +{% tab Email %} + +1. Draft your email message. +2. Select **Preview and Test**. +3. Select the **Test Send** tab and add your email address or user ID in the **Add individual users** field. +4. Select **Send Test** to send your drafted email to your inbox. + +![Test Email]({% image_buster /assets/img_archive/testemail.png %}){: style="max-width:40%;" } + +{% endtab %} +{% tab In-app message %} + +{% alert warning %} +To send a test to either [Content Test Groups]({{site.baseurl}}/user_guide/administrative/app_settings/developer_console/internal_groups_tab/#content-test-groups) or individual users, push must be enabled on your test devices before sending. For example, you must have push enabled on your iOS device in order to tap the notification before the test message displays. {% endalert %} + +If you have push notifications set up within your app and on your test device, you can send test in-app messages to your app to see what it looks like in real-time. + +1. Draft your in-app message. +2. Select the **Test** tab and add your email address or user ID to the **Add Individual Users** field. +3. Select **Send Test** to send your push message to your device. + +A test push message will appear at the top of your device screen. + +![Test In App]({% image_buster /assets/img_archive/test-in-app.png %}) {% alert important %} -Before you can test Banner messages in Braze, you'll need to create a Banner campaign in Braze. Additionally, verify that the placement you want to test is already [placed in your app or website]({{site.baseurl}}/developer_guide/banners/placements). +Test sends may result in more than one in-app message being sent to each recipient. {% endalert %} -After creating your Banner message, you can preview your Banner or send a test message. +Directly clicking and opening the push message will send you to your app, where you can view your in-app message test. Note this in-app message testing feature relies on the user clicking a test push notification to trigger the in-app message. As such, the user must be eligible to receive push notifications in the relevant app for the successful delivery of the test push notification. -1. Draft your Banner message. -2. Select **Preview** to preview your Banner or send a test message. -3. To send a test message, add either a content test group or one or more individual users as **Test Recipients**, then select **Send Test**. +### Preview -You'll be able to view your test message on the device for up to 5 minutes. +You can preview your in-app message as you compose it in the **Preview** tab. This should help you visualize what your final message will look like from your user's perspective. You can preview what your message will look like to a random user, a specific user, or a customized user. You can also preview messages for either mobile devices or tablets. -![Preview tab of the Banner composer.]({% image_buster /assets/img/banners/preview_banner.png %}) +![Compose tab when building an in-app message showing the preview of what the message will look like. A user is not selected, so the Liquid added in the body section displays as is.]({% image_buster /assets/img/in-app-message-preview.png %}) -{% alert note %} -Keep in mind, your preview may not be identical to the final render on a user's device due to differences across hardware. +Braze has three generations of in-app messages available. You can fine-tune to which devices your messages should be sent, based on which Generation they support. + +![Switching between generations when previewing an in-app message.]({% image_buster /assets/img/iam-generations.gif %}){: height="50%" width="50%"} + +{% alert warning %} +In **Preview**, the view of your message might not be identical to its actual rendering on the user's device. We always recommend sending a test message to a device to ensure that your media, copy, personalization, and custom attributes generate correctly. {% endalert %} ### Test checklist -- Is your Banner campaign assigned to a placement? -- Do the images and media show up and act as expected on your targeted device types and screen sizes? -- Do your links and buttons direct the user to where they should go? -- Does the Liquid function as expected? Have you accounted for a default attribute value in the event that the Liquid returns no information? +- Do the images and media show up and act as expected? +- Does the Liquid function as expected? Have you accounted for a [default attribute value]({{site.baseurl}}/user_guide/personalization_and_dynamic_content/liquid/conditional_logic/#accounting-for-null-attribute-values) if the Liquid returns no information? - Is your copy clear, concise, and correct? +- Do your buttons direct the user where they should go? + +### Accessibility scanner + +To support accessibility best practices, Braze automatically scans the content of in-app messages created using the traditional HTML editor against accessibility standards. This scanner helps identify content that may not meet Web Content Accessibility Guidelines ([WCAG](https://www.w3.org/WAI/standards-guidelines/wcag/)) standards. WCAG is a set of internationally recognized technical standards developed by the World Wide Web Consortium (W3C) to make web content more accessible to people with disabilities. + +![Accessibility scan results]({% image_buster /assets/img/Accessibilty_Scanner_IAM.png %}) + +{% alert note %} +The in-app message accessibility scanner only runs on messages built with custom HTML. +{% endalert %} + +#### How it works + +The scanner runs automatically on custom HTML messages and evaluates your entire HTML message against the full [WCAG 2.1 AA rule set](https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1¤tsidebar=%23col_customize&levels=aaa). For each flagged issue, it shows: + +- The specific HTML element involved +- A description of the accessibility issue +- A link to additional context or remediation guidance + +#### Understanding automated accessibility testing + +{% multi_lang_include accessibility/automated_testing.md %} {% endtab %} -{% tab SMS/MMS %} +{% tab LINE %} -After creating your SMS or MMS message, you can send a test message to your phone to see what it will look like in real-time. +1. Create your LINE message. +2. Select the **Test** tab and select at least one Content Test Group or individual user to receive this test message. +3. Select **Send Test** to send your message. + +![Test LINE message.]({% image_buster /assets/img/line/test_preview.png %}) + +{% endtab %} +{% tab Push %} + +#### Mobile push -1. Draft your SMS or MMS message. +1. Draft your mobile push. +2. Select the **Test** tab and add your email address or user ID in the **Add Individual Users** field. +3. Select **Send Test** to send your drafted message to your device. + +![Test push]({% image_buster /assets/img_archive/testpush.png %}) + +#### Web push + +1. Create your web push. +2. Select the **Test** tab. +3. Select **Send Test to Myself**. +4. Select **Send Test** to send your web push to your web browser. + +![Test web push]({% image_buster /assets/img_archive/testwebpush.png %}) + +If you have already accepted push messages from the Braze dashboard, the push will come through in the corner of your screen. Otherwise, click **Allow** when prompted, and the message will appear. + +{% endtab %} +{% tab SMS/MMS and RCS %} + +After creating your SMS, MMS, or RCS message, you can send a test message to your phone to see what it will look like in real-time. + +1. Draft your SMS, MMS, or RCS message. 2. Select the **Test** tab and select at least one Content Test Group or individual user to receive this test message. 3. Select **Send Test** to send your test message. @@ -244,6 +253,16 @@ After creating your webhook, you can do a test send to check the webhook respons ![Test Content Card]({% image_buster /assets/img/webhook_test.png %}) +{% endtab %} +{% tab WhatsApp %} + +1. Create your WhatsApp message. +2. Select the **Test** tab and select at least one Content Test Group or individual user to receive this test message. +3. Initiate a conversation window by sending a WhatsApp message to the phone number associated with the subscription group you’re using for this message. The associated phone number is listed in the alert on the **Test** tab. +4. Select **Send Test** to send your message. + +![Test WhatsApp message.]({% image_buster /assets/img/whatsapp/whatsapp_test.png %}) + {% endtab %} {% endtabs %} diff --git a/_docs/_user_guide/message_building_by_channel/content_cards/testing.md b/_docs/_user_guide/message_building_by_channel/content_cards/testing.md index 5c7c8c2af2d..d66c03dc481 100644 --- a/_docs/_user_guide/message_building_by_channel/content_cards/testing.md +++ b/_docs/_user_guide/message_building_by_channel/content_cards/testing.md @@ -2,7 +2,7 @@ nav_title: Testing noindex: true layout: redirect -redirect_to: /docs/user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages/ +redirect_to: /docs/user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages/?tab=content%20card page_order: 3 channel: - content cards diff --git a/_docs/_user_guide/message_building_by_channel/email/best_practices.md b/_docs/_user_guide/message_building_by_channel/email/best_practices.md index 2e4bd9cd2fe..f55dbdf950d 100644 --- a/_docs/_user_guide/message_building_by_channel/email/best_practices.md +++ b/_docs/_user_guide/message_building_by_channel/email/best_practices.md @@ -1,5 +1,5 @@ --- -page_order: 13 +page_order: 14 nav_title: Best practices article_title: Email Best Practices layout: dev_guide diff --git a/_docs/_user_guide/message_building_by_channel/email/faq.md b/_docs/_user_guide/message_building_by_channel/email/faq.md index cc65ac9a46c..7572fecbd9a 100644 --- a/_docs/_user_guide/message_building_by_channel/email/faq.md +++ b/_docs/_user_guide/message_building_by_channel/email/faq.md @@ -1,7 +1,7 @@ --- nav_title: FAQ article_title: Email FAQ -page_order: 14 +page_order: 15 description: "This page provides answers to frequently asked questions about email messaging." channel: email diff --git a/_docs/_user_guide/message_building_by_channel/email/testing.md b/_docs/_user_guide/message_building_by_channel/email/testing.md new file mode 100644 index 00000000000..3bd66276f32 --- /dev/null +++ b/_docs/_user_guide/message_building_by_channel/email/testing.md @@ -0,0 +1,9 @@ +--- +nav_title: Testing +noindex: true +layout: redirect +redirect_to: /docs/user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages/?tab=email +page_order: 13 +channel: + - email +--- \ No newline at end of file diff --git a/_docs/_user_guide/message_building_by_channel/in-app_messages/testing.md b/_docs/_user_guide/message_building_by_channel/in-app_messages/testing.md index 806aaec5a40..9e2b47ee363 100644 --- a/_docs/_user_guide/message_building_by_channel/in-app_messages/testing.md +++ b/_docs/_user_guide/message_building_by_channel/in-app_messages/testing.md @@ -2,7 +2,7 @@ nav_title: Testing noindex: true layout: redirect -redirect_to: /docs/user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages/ +redirect_to: /docs/user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages/?tab=in-app%20message page_order: 4.5 channel: - in-app messages diff --git a/_docs/_user_guide/message_building_by_channel/line/testing.md b/_docs/_user_guide/message_building_by_channel/line/testing.md new file mode 100644 index 00000000000..3c1efeb01ee --- /dev/null +++ b/_docs/_user_guide/message_building_by_channel/line/testing.md @@ -0,0 +1,9 @@ +--- +nav_title: Testing +noindex: true +layout: redirect +redirect_to: /docs/user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages/?tab=line +page_order: 5 +channel: + - LINE +--- \ No newline at end of file diff --git a/_docs/_user_guide/message_building_by_channel/push/faq.md b/_docs/_user_guide/message_building_by_channel/push/faq.md index 2900d34de66..e3d48502ff6 100644 --- a/_docs/_user_guide/message_building_by_channel/push/faq.md +++ b/_docs/_user_guide/message_building_by_channel/push/faq.md @@ -1,7 +1,7 @@ --- nav_title: FAQs article_title: Push FAQs -page_order: 80 +page_order: 25 description: "This article addresses some of the most frequently asked questions that arise when setting up push campaigns." page_type: FAQ channel: diff --git a/_docs/_user_guide/message_building_by_channel/push/testing.md b/_docs/_user_guide/message_building_by_channel/push/testing.md new file mode 100644 index 00000000000..67aa1446ca4 --- /dev/null +++ b/_docs/_user_guide/message_building_by_channel/push/testing.md @@ -0,0 +1,9 @@ +--- +nav_title: Testing +noindex: true +layout: redirect +redirect_to: /docs/user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages/?tab=push +page_order: 23 +channel: + - push +--- \ No newline at end of file diff --git a/_docs/_user_guide/message_building_by_channel/push/troubleshooting.md b/_docs/_user_guide/message_building_by_channel/push/troubleshooting.md index b23379f3d49..bcd7e8f1109 100644 --- a/_docs/_user_guide/message_building_by_channel/push/troubleshooting.md +++ b/_docs/_user_guide/message_building_by_channel/push/troubleshooting.md @@ -1,7 +1,7 @@ --- nav_title: Troubleshooting article_title: Troubleshooting Push -page_order: 23 +page_order: 24 page_type: reference description: "This page contains troubleshooting steps for various issues relating to the Push messaging channel." channel: push diff --git a/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/mms.md b/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/mms.md index 232c6fceb89..f7c945ee5b4 100644 --- a/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/mms.md +++ b/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/mms.md @@ -1,7 +1,7 @@ --- nav_title: "MMS" article_title: About MMS -page_order: 15 +page_order: 16 description: "This reference article covers what MMS messages are and general use cases for the MMS channel." page_type: reference alias: /about_mms/ diff --git a/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/rcs.md b/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/rcs.md index 76e6eec8f59..2112e8549fa 100644 --- a/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/rcs.md +++ b/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/rcs.md @@ -3,7 +3,7 @@ nav_title: "RCS" article_title: About Rich Communication Services (RCS) alias: /about_rcs/ page_type: reference -page_order: 14 +page_order: 15 description: "This reference article covers general use cases of the RCS channel and requirements needed to get your RCS channel ready for use." --- diff --git a/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/sms.md b/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/sms.md index 66d4a5056b3..4b48c700214 100644 --- a/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/sms.md +++ b/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/sms.md @@ -1,7 +1,7 @@ --- nav_title: "SMS" article_title: About SMS -page_order: 13 +page_order: 14 description: "This reference article covers general use cases of the SMS channel and requirements needed to get SMS up and running." page_type: reference alias: /about_sms/ diff --git a/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/testing.md b/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/testing.md new file mode 100644 index 00000000000..c1e7896ae88 --- /dev/null +++ b/_docs/_user_guide/message_building_by_channel/sms_mms_rcs/testing.md @@ -0,0 +1,9 @@ +--- +nav_title: Testing +noindex: true +layout: redirect +redirect_to: /docs/user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages/?tab=sms%2Fmms%20and%20rcs +page_order: 13 +channel: + - SMS +--- \ No newline at end of file diff --git a/_docs/_user_guide/message_building_by_channel/webhooks/testing.md b/_docs/_user_guide/message_building_by_channel/webhooks/testing.md new file mode 100644 index 00000000000..5e22af22c0f --- /dev/null +++ b/_docs/_user_guide/message_building_by_channel/webhooks/testing.md @@ -0,0 +1,9 @@ +--- +nav_title: Testing +noindex: true +layout: redirect +redirect_to: /docs/user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages/?tab=webhook +page_order: 11 +channel: + - webhooks +--- \ No newline at end of file diff --git a/_docs/_user_guide/message_building_by_channel/whatsapp/faqs.md b/_docs/_user_guide/message_building_by_channel/whatsapp/faqs.md index 79cb7d40d79..94bba898d1a 100644 --- a/_docs/_user_guide/message_building_by_channel/whatsapp/faqs.md +++ b/_docs/_user_guide/message_building_by_channel/whatsapp/faqs.md @@ -1,7 +1,7 @@ --- nav_title: FAQ article_title: WhatsApp FAQ -page_order: 10 +page_order: 11 description: "This article addresses some of the most frequently asked questions that arise when setting up WhatsApp campaigns." page_type: FAQ channel: diff --git a/_docs/_user_guide/message_building_by_channel/whatsapp/meta_resources.md b/_docs/_user_guide/message_building_by_channel/whatsapp/meta_resources.md index 0015b5cb7db..1e0fb06ef61 100644 --- a/_docs/_user_guide/message_building_by_channel/whatsapp/meta_resources.md +++ b/_docs/_user_guide/message_building_by_channel/whatsapp/meta_resources.md @@ -1,7 +1,7 @@ --- nav_title: Meta resources article_title: Meta Resources -page_order: 11 +page_order: 12 description: "This article provides helpful Meta documentation, information, and resources to improve your understanding of the WhatsApp integration." page_type: reference channel: diff --git a/_docs/_user_guide/message_building_by_channel/whatsapp/testing.md b/_docs/_user_guide/message_building_by_channel/whatsapp/testing.md new file mode 100644 index 00000000000..2dee6c91a4f --- /dev/null +++ b/_docs/_user_guide/message_building_by_channel/whatsapp/testing.md @@ -0,0 +1,9 @@ +--- +nav_title: Testing +noindex: true +layout: redirect +redirect_to: /docs/user_guide/engagement_tools/campaigns/testing_and_more/sending_test_messages/?tab=whatsapp +page_order: 10 +channel: + - WhatsApp +--- \ No newline at end of file diff --git a/assets/img/whatsapp/whatsapp_test.png b/assets/img/whatsapp/whatsapp_test.png new file mode 100644 index 0000000000000000000000000000000000000000..83b2600b27499b927ed5960f708811255c79b99b GIT binary patch literal 139073 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⪙E9Jzk-wJ;zz@LqU(me77C+O&y~V&uZtb4Gt0 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 MN>MWJ55uSb4^gg{@&Et; literal 0 HcmV?d00001 From 29e0b13ff972a82e645af8d8305ab263bd75fa21 Mon Sep 17 00:00:00 2001 From: Lydia Xie <87040416+lydia-xie@users.noreply.github.com> Date: Tue, 13 Jan 2026 09:45:25 -0800 Subject: [PATCH 09/11] [BD-5418] Unsubscribe clicks don't count towards Winning Path clicks (#11511) Co-authored-by: Adam Evans --- .../experiment_step/winning_path.md | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/_docs/_user_guide/engagement_tools/canvas/canvas_components/experiment_step/winning_path.md b/_docs/_user_guide/engagement_tools/canvas/canvas_components/experiment_step/winning_path.md index 2e3e731b5d9..31c2e452578 100644 --- a/_docs/_user_guide/engagement_tools/canvas/canvas_components/experiment_step/winning_path.md +++ b/_docs/_user_guide/engagement_tools/canvas/canvas_components/experiment_step/winning_path.md @@ -10,7 +10,7 @@ tool: Canvas > Winning Path is similar to [Winning Variant]({{site.baseurl}}/user_guide/engagement_tools/testing/multivariant_testing/optimizations/) in campaigns, and lets you automate your A/B tests. -When Winning Path is turned on in an Experiment Path step, after a specified period of time, all subsequent users will be sent down the path with the highest conversion rate. +When Winning Path is turned on in an Experiment Path step, after a specified period of time, all subsequent users are sent down the path with the highest conversion rate. ## Using Winning Path @@ -26,20 +26,18 @@ Specify the conversion event that should determine the winner. If there are no c If you choose opens or clicks as your conversion event, make sure the first step in the path is a [Message step]({{site.baseurl}}/user_guide/engagement_tools/canvas/canvas_components/message_step). Braze only counts engagement from the first Message step in each respective path. If the path starts with a different step (like a Delay or Audience Path step) and the message comes later, that message won’t be included when evaluating performance. -Next, set the **Experiment Window**. The **Experiment Window** specifies how long the experiment will run before the Winning Path is determined and all users that follow are sent down that path. The window begins when the first user enters the step. +Next, set the **Experiment Window**. The **Experiment Window** specifies how long the experiment runs before the Winning Path is determined and all users who follow are sent down that path. The window begins when the first user enters the step. ![Winning Path Settings with the conversion event "Clicks" selected for a 12-hour experiment window.]({% image_buster /assets/img/experiment_step/experiment_winning_settings.png %}) ### Step 3: Determine fallback {#statistical-significance} -By default, if the results of the test aren't enough to determine a statistically significant winner, all future users will be sent down the best performing path. +By default, if the results of the test aren't enough to determine a statistically significant winner, all future users are sent down the best-performing path. Alternatively, you can select **Continue sending all future users the mix of paths**. This option sends future users down the mix of paths according to the percentages specified in the experiment path distribution. -Alternatively, you can select **Continue sending all future users the mix of paths**. This option will send future users down the mix of paths according to the percentages specified in the experiment path distribution. - -!["Continue sending all future users the mix of paths" selected as what will happen to users if the test result isn't statistically significant.]({% image_buster /assets/img/experiment_step/experiment_winning_statistical.png %}) +!["Continue sending all future users the mix of paths" selected as what happens to users if the test result isn't statistically significant.]({% image_buster /assets/img/experiment_step/experiment_winning_statistical.png %}) {% alert note %} -A Delay Group will only appear in your path distribution if your Canvas is set up for one-time entry and your Experiment step has three paths or fewer. Recurring and triggered Canvases will not have a Delay Group when Winning Path is turned on. +A Delay Group appears in your path distribution only if your Canvas is set up for one-time entry and your Experiment step has three paths or fewer. Recurring and triggered Canvases do not have a Delay Group when Winning Path is turned on. {% endalert %} ### Step 4: Add your paths and launch the Canvas @@ -48,11 +46,11 @@ A single Experiment Path component can contain up to four paths. However, if you Finish setting up your Canvas as needed, then launch it. When the first user has entered the experiment, you can check the Canvas to see analytics as they come in and [track your experiment's performance]({{site.baseurl}}/user_guide/engagement_tools/canvas/canvas_components/experiment_step/#tracking-performance). -After a Winning Path concludes, all subsequent users who enter the Canvas will go down the Winning Path, including users who re-entered and were previously in the control group of the Experiment Path step. +After a Winning Path concludes, all subsequent users who enter the Canvas go down the Winning Path, including users who re-entered and were previously in the control group of the Experiment Path step. ## Analytics {#analytics} -If Winning Path was turned on, your analytics view is separated into two tabs: **Initial Experiment** and **Winning Path**. +If Winning Path is turned on, your analytics view is separated into two tabs: **Initial Experiment** and **Winning Path**. - **Initial Experiment:** Shows the metrics for each path during the experiment window. You can see a summary of how all the paths performed for the specified conversion events and which path was selected as the winner. - **Winning Path:** Shows only the metrics for the Winning Path starting from the moment the Initial Experiment finished. @@ -61,11 +59,11 @@ If Winning Path was turned on, your analytics view is separated into two tabs: * ### One-time entry {#one-time-entry} -When using Winning Paths in a Canvas where users are allowed to enter only once, a Delay Group is automatically included. During the duration of the experiment, a percentage of users will be held in the Delay Group while the remaining users enter your Experiment Paths. +When using Winning Paths in a Canvas where users are allowed to enter only once, a Delay Group is automatically included. During the duration of the experiment, a percentage of users are held in the Delay Group while the remaining users enter your Experiment Paths. ![Experiment Step with a Delay Group for Winning Path]({% image_buster /assets/img/experiment_step/experiment_one_time.png %}){: style="max-width:75%"} -When the test is complete and a Winning Path is determined, the users assigned to the Delay Group will be directed to the chosen path, and continue through the Canvas. +When the test finishes and a Winning Path is determined, the users assigned to the Delay Group are directed to the chosen path and continue through the Canvas. ![Experiment Step with a Delay Group sent down the Winning Path]({% image_buster /assets/img/experiment_step/experiment_one_time_results.png %}){: style="max-width:75%"} @@ -73,5 +71,8 @@ When the test is complete and a Winning Path is determined, the users assigned t We don't recommend using local time delivery in Canvases with Winning Paths. This is because experiment windows begin when the first user passes through. Users who are in very early time zones may enter the step and trigger the start of the experiment window much earlier than you expect, which can result in the Experiment concluding before the bulk of your users in more typical time zones have had enough time to enter the Canvas or convert, or both. -Alternatively, if you wish to use local delivery, use an experiment window of 24-48 or more hours. That way, users in early time zones enter the Canvas and trigger the experiment to start, but plenty of time in the experiment window remains. Users in later time zones will still have sufficient time to enter the Canvas and the Experiment Step with Winning Paths and possibly convert before the experiment window expires. +Alternatively, if you wish to use local delivery, use an experiment window of 24-48 or more hours. That way, users in early time zones enter the Canvas and trigger the experiment to start, but plenty of time in the experiment window remains. Users in later time zones still have sufficient time to enter the Canvas and the Experiment Step with Winning Paths and possibly convert before the experiment window expires. + +### Variants based on clicks +If you're setting up a Winning Path variant based on clicks, every interaction counts as a click unless it is identified as an unsubscribe click by Braze. From 5fd5aa8e84e5118d2d102c5bd80f3a4c8bd3980e Mon Sep 17 00:00:00 2001 From: Rachel Feinberg <135255868+rachel-feinberg@users.noreply.github.com> Date: Tue, 13 Jan 2026 11:16:49 -0800 Subject: [PATCH 10/11] Update Release Notes template & fix Jan 2026 (#11517) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- _docs/_releases/2026/1_8_26.md | 8 +-- _docs/_releases/home.md | 10 ++-- .../contributing/templates/release_notes.md | 51 ++++++++++--------- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/_docs/_releases/2026/1_8_26.md b/_docs/_releases/2026/1_8_26.md index 38cff635375..b025442cf60 100644 --- a/_docs/_releases/2026/1_8_26.md +++ b/_docs/_releases/2026/1_8_26.md @@ -7,7 +7,7 @@ page_type: reference # January 8, 2026 release -## Data flexibility +## Data & Reporting ### eCommerce recommended events @@ -46,7 +46,7 @@ In the [Cloud Data Ingestion **Sync Log** dashboard]({{site.baseurl}}/user_guide * **Rows with errors:** Downloads a file containing only the rows that had an **Error** status. * **All rows:** Downloads a file containing every row processed in the run. -## Robust channels +## Channels & Touchpoints ### Bring Your Own (BYO) WhatsApp connector @@ -68,13 +68,13 @@ With [dynamic BCC]({{site.baseurl}}/user_guide/administrative/app_settings/email As an alternative to a rate limit that gets shared across an entire multi-channel campaign or Canvas, you can select a specific rate limit per channel. In this case, the rate limit will apply to each of your selected channels. For example, you can set your campaign or Canvas to send a maximum of 5,000 webhooks and 2,500 SMS messages per minute across the campaign or Canvas. For more details, see [Rate limiting and frequency capping]({{site.baseurl}}/user_guide/engagement_tools/campaigns/building_campaigns/rate-limiting). -## New Braze partnerships +## Partnerships ### LILT - Localization [LILT]({{site.baseurl}}/partners/lilt/) is the complete AI solution for enterprise translation and content creation. LILT enables global organizations to scale and optimize their content, product, communications, and support operations, with AI agents and fully automated workflows. -## SDK updates +## SDK breaking updates The following SDK updates have been released. Breaking updates are listed below; all other updates can be found by checking the corresponding SDK changelogs. diff --git a/_docs/_releases/home.md b/_docs/_releases/home.md index 851de74de84..483c41f1d12 100644 --- a/_docs/_releases/home.md +++ b/_docs/_releases/home.md @@ -17,7 +17,7 @@ For more information on any of the updates listed on this page, contact your acc {% details January 8, 2026 %} ## January 8, 2026 release -### Data flexibility +### Data & Reporting #### eCommerce recommended events @@ -56,7 +56,7 @@ In the [Cloud Data Ingestion **Sync Log** dashboard]({{site.baseurl}}/user_guide * **Rows with errors:** Downloads a file containing only the rows that had an **Error** status. * **All rows:** Downloads a file containing every row processed in the run. -### Robust channels +### Channels & Touchpoints #### Bring Your Own (BYO) WhatsApp connector @@ -78,17 +78,17 @@ With [dynamic BCC]({{site.baseurl}}/user_guide/administrative/app_settings/email As an alternative to a rate limit that gets shared across an entire multi-channel campaign or Canvas, you can select a specific rate limit per channel. In this case, the rate limit will apply to each of your selected channels. For example, you can set your campaign or Canvas to send a maximum of 5,000 webhooks and 2,500 SMS messages per minute across the campaign or Canvas. For more details, see [Rate limiting and frequency capping]({{site.baseurl}}/user_guide/engagement_tools/campaigns/building_campaigns/rate-limiting). -### New Braze partnerships +### Partnerships #### LILT - Localization [LILT]({{site.baseurl}}/partners/lilt/) is the complete AI solution for enterprise translation and content creation. LILT enables global organizations to scale and optimize their content, product, communications, and support operations, with AI agents and fully automated workflows. -### SDK updates +### SDK breaking updates The following SDK updates have been released. Breaking updates are listed below; all other updates can be found by checking the corresponding SDK changelogs. --[Android 40.1.1](https://github.com/braze-inc/braze-android-sdk/blob/master/CHANGELOG.md#4011) +- [Android 40.1.1](https://github.com/braze-inc/braze-android-sdk/blob/master/CHANGELOG.md#4011) - [Android SDK 40.1.0](https://github.com/braze-inc/braze-android-sdk/blob/master/CHANGELOG.md#4010) - [Swift SDK 14.0.0](https://github.com/braze-inc/braze-swift-sdk/blob/main/CHANGELOG.md) - Removes News Feed. diff --git a/_includes/contributing/templates/release_notes.md b/_includes/contributing/templates/release_notes.md index d2a18ae9122..3e635742d8e 100644 --- a/_includes/contributing/templates/release_notes.md +++ b/_includes/contributing/templates/release_notes.md @@ -11,63 +11,63 @@ page_type: reference # MONTH DAY, YEAR release - -## Data flexibility + +## Data & Reporting -CONTENT. + +### RELEASE_NOTE_TITLE -## Unlocking creativity + +{% multi_lang_include release_type.md release="Early access" %} + CONTENT. -## Robust channels - -CONTENT. +### RELEASE_NOTE_TITLE -## AI and ML automation +{% multi_lang_include release_type.md release="General availability" %} CONTENT. - -## SECTION_TITLE +### RELEASE_NOTE_TITLE -CONTENT. +{% multi_lang_include release_type.md release="Beta" %} -### SUBSECTION_TITLE +## BrazeAITM -{% multi_lang_include release_type.md release="Early access" %} +### RELEASE_NOTE_TITLE CONTENT. -### SUBSECTION_TITLE +## Orchestration -{% multi_lang_include release_type.md release="General availability" %} +### RELEASE_NOTE_TITLE CONTENT. -### SUBSECTION_TITLE +## Channels & Touchpoints -{% multi_lang_include release_type.md release="Beta" %} +### RELEASE_NOTE_TITLE CONTENT. -### SUBSECTION_TITLE + +## Partnerships -CONTENT. +### PARTNER_NAME - PARTNER_CATEGORY - -## New Braze partnerships +CONTENT. -### PARTNER_NAME +### PARTNER_NAME - PARTNER_CATEGORY CONTENT. -### PARTNER_NAME + +## SDK CONTENT. - -## SDK updates +### SDK breaking updates The following SDK updates have been released. Breaking updates are listed below; all other updates can be found by checking the corresponding SDK changelogs. @@ -75,6 +75,7 @@ The following SDK updates have been released. Breaking updates are listed below; - OPTIONAL_CONTEXT. - [SDK_NAME](LINK_TO_GITHUB_CHANGELOG) - [SDK_NAME](LINK_TO_GITHUB_CHANGELOG) + ````` {% endraw %} {% enddetails %} \ No newline at end of file From 14c2d0ce720b060dc908ae898505c4681cd6176a Mon Sep 17 00:00:00 2001 From: davidnelson-braze Date: Tue, 13 Jan 2026 11:31:02 -0800 Subject: [PATCH 11/11] Change release date for Version 4 to 2026-01-08 (#11518) --- .../braze_currents/event_glossary/currents_changelogs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/currents_changelogs.md b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/currents_changelogs.md index 265e7f90284..524ae61bcd5 100644 --- a/_docs/_user_guide/data/distribution/braze_currents/event_glossary/currents_changelogs.md +++ b/_docs/_user_guide/data/distribution/braze_currents/event_glossary/currents_changelogs.md @@ -7,7 +7,7 @@ tool: Currents # Currents changelog -## Changes in Version 4 (release date 2026-01-07) +## Changes in Version 4 (release date 2026-01-08) * Field changes to event type `users.behaviors.pushnotification.TokenStateChange`: * Added new `string` field `push_token`: Push token of the event