Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deploy - October 8, 2024 #8232

Merged
merged 53 commits into from
Oct 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
6e639fa
BD-3318-3 Apply Diataxis standards to Creating a Content Card
rachel-feinberg Sep 17, 2024
44c4e87
Edits up to 'scheduled delivery'
rachel-feinberg Sep 19, 2024
1fff570
Edits
rachel-feinberg Sep 25, 2024
b5cbdce
CO-2975 Allow recipients to be specified via email.
davehensley Sep 27, 2024
f5fdf0c
BD-3489
lydia-xie Oct 2, 2024
3b2a439
Update drag_and_drop.md
bkasman95 Oct 3, 2024
ce62ccc
add notes to use p8
hokstuff Oct 3, 2024
5dee1b5
Doc team edits
rachel-feinberg Oct 3, 2024
ab5bc2f
Merge pull request #8203 from braze-inc/lx-bd-3489
lydia-xie Oct 3, 2024
b902679
BD-3546 Fix Liquid use case that has extra bracket
rachel-feinberg Oct 3, 2024
f0d4e6b
Merge pull request #8212 from braze-inc/bd-3546
josh-mccrowell-braze Oct 4, 2024
66a7f15
Update about.md
bkasman95 Oct 4, 2024
fb30ff5
Update create.md
bkasman95 Oct 4, 2024
b09ef4a
BD-3018 Add section for how to add Unity Push icons
rachel-feinberg Oct 4, 2024
3ba9c46
Fix 404 links
rachel-feinberg Oct 4, 2024
8f61e74
Remove duplicate
rachel-feinberg Oct 4, 2024
94f0591
BD-3544 Update Email Capture form docs
rachel-feinberg Oct 4, 2024
b44a692
Merge pull request #8218 from braze-inc/bd-3544
lydia-xie Oct 4, 2024
bc8debc
Merge pull request #8214 from braze-inc/bkasman95-patch-4
rachel-feinberg Oct 4, 2024
92cdc62
Merge pull request #8215 from braze-inc/bkasman95-patch-5
rachel-feinberg Oct 4, 2024
331795f
Wording fix for the loudly notify runbook
jzhang8023 Oct 7, 2024
e7ebe6c
BD-3520 Update tips for SMS and WhatsApp Canvas properties
rachel-feinberg Oct 7, 2024
bc0a2b6
Merge pull request #8220 from braze-inc/jizhang-loudly-hotfix
lydia-xie Oct 7, 2024
630d2fc
Merge pull request #8221 from braze-inc/bd-3520
lydia-xie Oct 7, 2024
681fbe5
BD-3552 Update LINE user ID intro
rachel-feinberg Oct 7, 2024
e18d5ae
Remove module language from audience sync
bre-fitzgerald Oct 7, 2024
4175974
Replace click with select
bre-fitzgerald Oct 7, 2024
60d9f19
Merge pull request #8224 from braze-inc/audience_sync_fixes
bre-fitzgerald Oct 7, 2024
c7839bd
Fixing bug with bdocs release
internetisaiah Oct 8, 2024
0f27319
BD-3548: Add note to clarify HTTP headers
lydia-xie Oct 8, 2024
2184861
edit
lydia-xie Oct 8, 2024
28f7f3f
Merge pull request #8209 from braze-inc/untracked-LiveActivites-p8Req…
josh-mccrowell-braze Oct 8, 2024
fa2be40
Merge pull request #8225 from braze-inc/bdocs-hotfix-07oct2024
josh-mccrowell-braze Oct 8, 2024
1bcc327
Merge pull request #8106 from braze-inc/bd-3318-3
josh-mccrowell-braze Oct 8, 2024
a1b28b9
Update _docs/_api/endpoints/messaging/send_messages/post_send_trigger…
lydia-xie Oct 8, 2024
f62110f
Update _docs/_api/endpoints/messaging/send_messages/post_send_trigger…
lydia-xie Oct 8, 2024
eb5ff9f
Update _docs/_api/objects_filters/recipient_object.md
lydia-xie Oct 8, 2024
2ff2560
Apply suggestions from code review
josh-mccrowell-braze Oct 8, 2024
720ac14
Merge pull request #8207 from braze-inc/bkasman95-patch-3
josh-mccrowell-braze Oct 8, 2024
41b7ab0
Merge pull request #8227 from braze-inc/lx-bd-2548
bre-fitzgerald Oct 8, 2024
8f16a87
BD-3493: Update how to capture user data with web form
lydia-xie Oct 8, 2024
0bcf795
Merge pull request #8217 from braze-inc/404fix
josh-mccrowell-braze Oct 8, 2024
46e2edc
lx-bd-3493
rachel-feinberg Oct 8, 2024
390fdcf
Merge pull request #8228 from braze-inc/lx-bd-3493
rachel-feinberg Oct 8, 2024
70f529f
Apply suggestions from code review
rachel-feinberg Oct 8, 2024
5991e78
Merge pull request #8216 from braze-inc/bd-3018
rachel-feinberg Oct 8, 2024
649d8c8
Merge pull request #8164 from braze-inc/CO-2975_specify_recipients_us…
lydia-xie Oct 8, 2024
ea82de2
BD-3533 Add comparison table to Company Users page
rachel-feinberg Oct 8, 2024
2418e3b
BD-3480: Clarify mention of PreferenceCenterBrazeDefault
lydia-xie Oct 8, 2024
579bef2
fix bolding
lydia-xie Oct 8, 2024
27a3f8e
Merge pull request #8230 from braze-inc/bd-3533
lydia-xie Oct 8, 2024
b1ab365
Merge pull request #8223 from braze-inc/bd-3552
lydia-xie Oct 8, 2024
0ea3352
Merge pull request #8229 from braze-inc/lx-bd-3480
rachel-feinberg Oct 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions _docs/_api/api_limits.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,10 @@ Every single API request sent to Braze returns the following information in the

This information is intentionally included in the header of the response to the API request rather than the Braze dashboard. This allows your system to better react in real time as you're interacting with our API. For example, if the `X-RateLimit-Remaining` value drops below a certain threshold, you might want to slow sending to make sure all transactional emails go out. Or, if it reaches zero, you might want to pause all sending until the time specified in `X-RateLimit-Reset` elapses.

{% alert note %}
HTTP headers will be returned in all lowercase characters. This behavior aligns with the HTTP/2 protocol that mandates all header field names must be lowercase. This differs from HTTP/1.X where header names were case-insensitive but were commonly written in various capitalizations.
{% endalert %}

If you have questions about API limits, contact your customer success manager or open a [support ticket][support].

### Optimal delay between endpoints
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,11 @@ Authorization: Bearer YOUR-REST-API-KEY
"recipients": (optional, array; if not provided and broadcast is not set to `false`, message will send to the entire segment targeted by the campaign)
[
{
// Either "external_user_id" or "user_alias" is required. Requests must specify only one.
// Either "external_user_id" or "user_alias" or "email" is required. Requests must specify only one.
"user_alias": (optional, user alias object) user alias of user to receive message,
"external_user_id": (optional, string) external identifier of user to receive message,
"email": (optional, string) email address of user to receive message,
"prioritization": (optional, array) prioritization array; required when using email,
"trigger_properties": (optional, object) personalization key-value pairs that will apply to this user (these key-value pairs will override any keys that conflict with the parent trigger_properties),
"send_to_existing_only": (optional, boolean) defaults to true, can't be used with user aliases; if set to `false`, an attributes object must also be included,
"attributes": (optional, object) fields in the attributes object will create or update an attribute of that name with the given value on the specified user profile before the message is sent and existing values will be overwritten
Expand Down Expand Up @@ -83,6 +85,10 @@ Authorization: Bearer YOUR-REST-API-KEY
- When `send_to_existing_only` is `true`, Braze will only send the message to existing users. However, this flag can't be used with user aliases.
- When `send_to_existing_only` is `false`, an attribute must be included. Braze will create a user with the `id` and attributes before sending the message.

+{% alert important %}
+Specifying a recipient by email address is currently in early access. Contact your customer success manager if you're interested in participating in this early access.
+{% endalert %}

A user's subscription group status can be updated via the inclusion of a `subscription_groups` parameter within the `attributes` object. For more details, refer to [User attributes object]({{site.baseurl}}/api/objects_filters/user_attributes_object).

## Example request
Expand Down Expand Up @@ -169,6 +175,8 @@ curl --location --request POST 'https://rest.iad-01.braze.com/campaigns/trigger/

Message sending endpoint responses will include the message's `dispatch_id` for reference back to the dispatch of the message. The `dispatch_id` is the ID of the message dispatch, a unique ID for each transmission sent from Braze. When using this endpoint, you receive a single `dispatch_id` for an entire batched set of users. For more information on `dispatch_id` check out our documentation on [Dispatch ID behavior]({{site.baseurl}}/help/help_articles/data/dispatch_id/).

If your request encounters a fatal error, refer to [Errors and responses]({{site.baseurl}}/api/errors/#fatal-errors) for the error code and description.

## Attributes object for campaigns

Braze has a messaging object called `attributes` that will allow you to add, create, or update attributes and values for a user before you send them an API-triggered campaign. Using the `campaign/trigger/send` endpoint as this API call will process the user attributes object before it processes and sends the campaign. This helps minimize the risk of there being issues caused by [race conditions]({{site.baseurl}}/help/best_practices/race_conditions/).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,11 @@ Authorization: Bearer YOUR-REST-API-KEY
// Including 'audience' will only send to users in the audience
"recipients": (optional, array; if not provided and broadcast is not set to 'false', message will send to the entire segment targeted by the Canvas)
[{
// Either "external_user_id" or "user_alias" is required. Requests must specify only one.
// Either "external_user_id" or "user_alias" or "email" is required. Requests must specify only one.
"user_alias": (optional, user alias object) user alias of user to receive message,
"external_user_id": (optional, string) external identifier of user to receive message,
"email": (optional, string) email address of user to receive message,
"prioritization": (optional, array) prioritization array; required when using email,
"canvas_entry_properties": (optional, object) personalization key-value pairs that will apply to this user (these key-value pairs will override any keys that conflict with the parent `canvas_entry_properties`)
"send_to_existing_only": (optional, boolean) defaults to true, can't be used with user aliases
"attributes": (optional, object) fields in the attributes object will create or update an attribute of that name with the given value on the specified user profile before the message is sent and existing values will be overwritten
Expand All @@ -70,6 +72,10 @@ Authorization: Bearer YOUR-REST-API-KEY

Customers using the API for server-to-server calls may need to allowlist the appropriate API URL if they're behind a firewall.

+{% alert important %}
+Specifying a recipient by email address is currently in early access. Contact your customer success manager if you're interested in participating in this early access.
+{% endalert %}

{% alert note %}
If you include both specific users in your API call and a target segment in the dashboard, the message will send to specifically the user profiles that are both in the API call and qualify for the segment filters.
{% endalert %}
Expand Down Expand Up @@ -164,6 +170,8 @@ The status code `201` could return the following response body. If the Canvas is

If your Canvas is archived, you'll see this `notice` message: "The Canvas is archived. Unarchive the Canvas to ensure trigger requests will take effect." If your Canvas is not active, you'll see this `notice` message: "The Canvas is paused. Resume the Canvas to ensure trigger requests will take effect."

If your request encounters a fatal error, refer to [Errors and responses]({{site.baseurl}}/api/errors/#fatal-errors) for the error code and description.

## Attributes object for Canvas

Use the messaging object `attributes` to add, create, or update attributes and values for a user before sending them an API-triggered Canvas using the `canvas/trigger/send` endpoint. This API call processes the user attributes object before it processes and sends the Canvas. This helps minimize the risk of issues caused by [race conditions]({{site.baseurl}}/help/best_practices/race_conditions/).
Expand Down
2 changes: 1 addition & 1 deletion _docs/_api/errors.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ All of the following error codes indicate that no messages will be sent.
| `400 Android Push Length Exceeded` | JSON payload is more than 4,000 bytes.|
| `400 Bad Request` | Cannot parse `send_at` datetime.|
| `400 Bad Request` | In your request, `in_local_time` is true but `time` has passed in your company’s time zone.|
| `401 Unauthorized` | Invalid API key |
| `401 Unauthorized` | Invalid API key. |
| `403 Forbidden` | The rate plan doesn't support, or the account is otherwise inactivated.|
| `403 Access Denied` | The REST API key you are using does not have sufficient permissions, check the API key permissions under the **Settings** page.|
| `404 Not Found` | Invalid URL. |
Expand Down
9 changes: 8 additions & 1 deletion _docs/_api/objects_filters/recipient_object.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ description: "This reference article explains the different components of the Br

> The recipients object allows you to request or write information in our endpoints.

Either `external_user_id` or `user_alias` is required in this object. **Requests must specify only one.**
Either `external_user_id`, `user_alias`, or `email` is required in this object. **Requests must specify only one.**

{% alert important %}
Specifying a recipient by email address is currently in early access. Contact your customer success manager if you're interested in participating in this early access.
{% endalert %}

The recipients object allows you to combine the [user alias object]({{site.baseurl}}/api/objects_filters/user_alias_object/), the [trigger properties object]({{site.baseurl}}/api/objects_filters/trigger_properties_object/), and the [Canvas entry properties object]({{site.baseurl}}/api/objects_filters/canvas_entry_properties_object/).

Expand All @@ -21,13 +25,16 @@ The recipients object allows you to combine the [user alias object]({{site.baseu
[{
"user_alias": (optional, User Alias Object) User alias of user to receive message,
"external_user_id": (optional, string) see External user ID,
"email": (optional, string) email address of user to receive message,
"prioritization": (optional, array) see Prioritization; required when using email,
"trigger_properties": (optional, object) personalization key-value pairs for this user when sending a campaign or message; see Trigger Properties,
"canvas_entry_properties": (optional, object) personalization key-value pairs for this user when triggering a Canvas; see Canvas Entry Properties
}]
```

- [User aliases]({{site.baseurl}}/user_guide/data_and_analytics/user_data_collection/user_profile_lifecycle/#user-aliases)
- [External user ID]({{site.baseurl}}/api/objects_filters/user_attributes_object/#braze-user-profile-fields)
- [Prioritization]({{site.baseurl}}/api/endpoints/user_data/post_user_identify/#identifying-users-by-email)

## Recipient object deduping

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@ Additionally, you can use the method [`wipeDataAndDisableForAppRun`](http://appb
Unless a user uninstalls all apps from a vendor on a given device, the next Braze SDK and app runs after calling `wipeDataAndDisableForAppRun()` will result in our server re-identifying that user via their device identifier (IDFV). In order to fully remove all user data, you should combine a call to `wipeDataAndDisableForAppRun` with a request to delete data on the server via the Braze [REST API]({{site.baseurl}}/developer_guide/rest_api/user_data/#user-delete-endpoint).

## iOS SDK v5.7.0+
For devices using iOS SDK v5.7.0 and above, when [disabling IDFV collection](https://www.braze.com/docs/developer_guide/platform_integration_guides/ios/initial_sdk_setup/other_sdk_customizations/swift_idfv/), calling [`wipeData`](https://braze-inc.github.io/braze-swift-sdk/documentation/brazekit/braze/wipedata()) will not result in our server re-identifying that user via their device identifier (IDFV).
For devices using iOS SDK v5.7.0 and above, when [disabling IDFV collection]({{site.baseurl}}/developer_guide/platform_integration_guides/legacy_sdks/ios/initial_sdk_setup/other_sdk_customizations/#optional-idfv-collection---swift/), calling [`wipeData`](https://braze-inc.github.io/braze-swift-sdk/documentation/brazekit/braze/wipedata()) will not result in our server re-identifying that user via their device identifier (IDFV).
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ noindex: true

You can create your own Content Cards interface by extending `ABKContentCardsTableViewController` to customize all UI elements and Content Cards behavior. The Content Card cells may also be subclassed and then used programmatically or by introducing a custom storyboard that registers the new classes. Check out the Content Cards [sample app](https://github.com/Appboy/appboy-ios-sdk/tree/master/Samples/ContentCards/BrazeContentCardsSampleApp) for a complete example.

It's also important to consider whether you should use a subclassing strategy versus a completely custom view controller and [subscribe for data updates]({{site.baseurl}}/developer_guide/platform_integration_guides/ios/content_cards/integration/). For example, if you subclass the `ABKContentCardsTableViewController`, you can use the [`populateContentCards` method](#overriding-populated-content-cards) to filter and order cards (recommended). However, if you use a complete view controller customization, you have more control over the card behavior—such as displaying in a carousel or adding interactive elements—but you then have to rely on an observer to implement ordering and filtering logic. You must also implement the respective analytics methods to properly log impressions, dismissal events, and clicks.
It's also important to consider whether you should use a subclassing strategy versus a completely custom view controller and [subscribe for data updates]({{site.baseurl}}/developer_guide/platform_integration_guides/legacy_sdks/ios/content_cards/integration/). For example, if you subclass the `ABKContentCardsTableViewController`, you can use the [`populateContentCards` method](#overriding-populated-content-cards) to filter and order cards (recommended). However, if you use a complete view controller customization, you have more control over the card behavior—such as displaying in a carousel or adding interactive elements—but you then have to rely on an observer to implement ordering and filtering logic. You must also implement the respective analytics methods to properly log impressions, dismissal events, and clicks.

## Customizing UI

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@ In terms of the level of development effort, the key differences between the bas

### Step 1: Create a custom view controller

To create the Content Cards carousel, create your own custom view controller (such as `UICollectionViewController`) and [subscribe for data updates]({{site.baseurl}}/developer_guide/platform_integration_guides/ios/content_cards/integration/#getting-the-data). Note that you won't be able to extend or subclass our default `ABKContentCardTableViewController`, as it's only able to handle our default Content Card types.
To create the Content Cards carousel, create your own custom view controller (such as `UICollectionViewController`) and [subscribe for data updates]({{site.baseurl}}/developer_guide/platform_integration_guides/legacy_sdks/ios/content_cards/integration/#getting-the-data). Note that you won't be able to extend or subclass our default `ABKContentCardTableViewController`, as it's only able to handle our default Content Card types.

### Step 2: Implement analytics

When creating a fully custom view controller, Content Card impressions, clicks, and dismissals are not automatically logged. You must implement the respective analytics methods to ensure impressions, dismissal events, and clicks get properly logged back to the Braze dashboard analytics.

For information on the analytics methods, refer to [Card methods]({{site.baseurl}}/developer_guide/platform_integration_guides/ios/content_cards/integration/#card-methods).
For information on the analytics methods, refer to [Card methods]({{site.baseurl}}/developer_guide/platform_integration_guides/legacy_sdks/ios/content_cards/integration/#card-methods).

{% alert note %}
The same page also details the different properties inherited from our generic Content Card model class, which you may find useful during your view implementation.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ noindex: true

<br>
{% alert important %}
Looking for the basic Content Card developer integration guide? Find it [here]({{site.baseurl}}/developer_guide/platform_integration_guides/ios/content_cards/integration/).
Looking for the basic Content Card developer integration guide? Find it [here]({{site.baseurl}}/developer_guide/platform_integration_guides/legacy_sdks/ios/content_cards/integration/).
{% endalert %}

# Content Card implementation guide
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,22 @@ description: "This landing page covers Braze SDK integration guides for CocoaPod
guide_featured_title: "Basic integration options"
guide_featured_list:
- name: CocoaPods
link: /docs/developer_guide/platform_integration_guides/ios/initial_sdk_setup/installation_methods/cocoapods/
link: /developer_guide/platform_integration_guides/legacy_sdks/ios/initial_sdk_setup/installation_methods/cocoapods/
image: /assets/img/cocoapods.png
- name: Swift Package Manager (SPM)
link: /docs/developer_guide/platform_integration_guides/ios/initial_sdk_setup/installation_methods/swift_package_manager/
link: /docs/developer_guide/platform_integration_guides/legacy_sdks/ios/initial_sdk_setup/installation_methods/swift_package_manager/
image: /assets/img/braze_icons/swift.svg
- name: Carthage
link: /docs/developer_guide/platform_integration_guides/ios/initial_sdk_setup/installation_methods/carthage_integration/
link: /docs/developer_guide/platform_integration_guides/legacy_sdks/ios/initial_sdk_setup/installation_methods/carthage_integration/
image: /assets/img/carthage.png
- name: Manual
link: /docs/developer_guide/platform_integration_guides/ios/initial_sdk_setup/installation_methods/manual_integration_options/
link: /docs/developer_guide/platform_integration_guides/legacy_sdks/ios/initial_sdk_setup/installation_methods/manual_integration_options/
image: /assets/img/braze_icons/tool-01.svg
- name: "Completing the Integration"
link: /docs/developer_guide/platform_integration_guides/ios/initial_sdk_setup/completing_integration/
link: /docs/developer_guide/platform_integration_guides/legacy_sdks/ios/initial_sdk_setup/completing_integration/
image: /assets/img/braze_icons/flag-05.svg
- name: "Other Optional SDK Customizations"
link: /docs/developer_guide/platform_integration_guides/ios/initial_sdk_setup/other_sdk_customizations/
link: /docs/developer_guide/platform_integration_guides/legacy_sdks/ios/initial_sdk_setup/ios_sdk_integration
image: /assets/img/braze_icons/user-square.svg

noindex: true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ The limits are defined by Apple and can vary based on a number of factors. They

### What other things should I watch out for during troubleshooting?

- Check that you are using a `.p8` key for authentication.
- Ensure that you are using a `.p8` key for authentication instead of a `.p12` or `.pem` file.
- Check that your push provisioning profile matches the environment you’re testing. Universal certificates may be configured in the Braze dashboard to send to either the development or production Apple Push Notification service (APNs) environment. Using a development certificate for a production app or a production certificate for a development app will not work.


Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ Additional prerequisites include:

- Live Activities are only available for iPhones and iPads on iOS 16.1 and later. To use this feature, ensure that your project is targeting this iOS version.
- The `Push Notification` entitlement must be added under **Signing & Capabilities** in your Xcode project.
- Live Activities require using a `.p8` key to send the notification. Older files such as a `.p12` or `.pem` are not supported.
- Starting with version 8.2.0 of the Braze Swift SDK, you can [remotely register a Live Activity](#step-2-start-the-activity). To use this feature, iOS 17.2 or later is required.

{% alert note %}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,6 @@ Although Braze can handle standard deep links (such as website URLs, Android URI

For setup guidance, visit [Deep Linking to In-App Resources](https://developer.android.com/training/app-links/deep-linking).

## Adding Braze push notification icons

To add push icons to your project, create an Android Archive (AAR) plug-in or Android library that contains the icon image files. For steps and information, refer to Unity's documentation: [Android Library Projects and Android Archive plug-ins](https://docs.unity3d.com/Manual/AndroidAARPlugins.html).
Loading