# Braze Documentation
Index of all Developer Guide pages and their headings.
## Developer Guide
- [Braze Developer Guide](/docs/developer_guide/home/index.md)
- [Getting Started](/docs/developer_guide/getting_started/index.md): You can follow along with this guide, or you can check out Braze Learning for guided courses, such as our Marketer and Developer learning paths.
- [SDK Overview for Developers](/docs/developer_guide/getting_started/sdk_overview/index.md): Are you a marketer looking for a basic rundown of the SDK? Check out our marketer overview, instead.
- # {: style="float:right;width:120px;border:0;" class="noimgborder"}SDK overview for developers
- ## App performance
- ## SDK compatibility
- ## Default analytics and session handling
- ## Data upload and download
- ## Blocking data collection
- ## What version of the SDK am I on?
- [Platform Overview](/docs/developer_guide/getting_started/platform_overview/index.md): Check out our free Developer Learning Path course along with these articles.
- # {: style="float:right;width:120px;border:0;" class="noimgborder"}Getting started: Platform overview
- ## What is Braze?
- ### SDK
- ### Dashboard user interface
- ### REST API
- ## Data analysis and action
- ### App analytics
- ### User segmentation
- ## Multichannel messaging
- ### Customizable components
- ## Integrating Braze
- ## Resources to bookmark
- [Integration Overview](/docs/developer_guide/getting_started/integration_overview/index.md): !A venn diagram of four circles - discovery, integrate, quality assurance and maintain - centered around "time to value."{: style="max-width:50%;float:right;margin-left:15px;border:none;"}
- # {: style="float:right;width:120px;border:0;" class="noimgborder"}Getting started: Integration overview
- ## Discovery and planning {#discovery}
- ### Campaign planning
- ### Creating data requirements
- ### Customizations planning
- ### Getting dashboard access
- ### Workspaces and API keys
- ## Integration {#integration}
- ### CDP integration partners
- ### Braze SDK integration
- ### Using the Braze API
- ### Setting up product analytics
- ### Migrating legacy user data
- ### Setting up session tracking
- ### Tracking custom events, attributes, and purchase events
- ### Other tools
- ## Quality assurance {#qa}
- ### Passing Braze off to marketers
- ### Develop for the future
- ## Maintenance {#maintenance}
- ## SDK rate limits
- ### Monthly Active Users CY 24-25, Universal MAU, Web MAU, and Mobile MAU
- ### Finding your rate limits
- ### Requesting higher rate limits
- ### Changes and support
- [Architectural Overview](/docs/developer_guide/getting_started/architecture_overview/index.md): At a high level, Braze is about data. The Braze platform, powered by the SDK, the REST API, and partner integrations, allows you to aggregate and act on your data.
- # Getting started: Architectural overview
- ## Data ingestion {#ingestion}
- ### Data source breakdown
- #### MongoDB-powered features
- #### Snowflake-powered features
- ### Backend data sources through the Braze API
- ### Frontend data sources through Braze SDK
- ### Partner integrations
- ### Direct warehouse connection through Braze Cloud Data Ingestion
- ## Classification {#classification}
- ## Orchestration {#orchestration}
- ### Feature flags
- ## Personalization {#personalization}
- ## Action {#action}
- ### Messaging channels
- ## Exporting data
- ### Currents
- ### Snowflake data sharing
- ### Braze export APIs
- ### CSVs
- ## Putting it all together
- [Building with an LLM](/docs/developer_guide/getting_started/build_with_llm/index.md): AI coding assistants can help you write integration code, troubleshoot issues, and explore Braze SDK features—but only if they have the right context. The Braze Docs MCP server provides your AI assistant with direct access to Braze documentation, so it can generate accurate code snippets and answer technical questions based on the latest SDK references.
- # Building with an LLM
- ## Connecting to the Braze Docs MCP
- ### Setting up Context7
- ## Writing prompts for Braze SDK development
- ### React Native SDK
- #### Initializing the SDK
- #### Logging custom events with properties
- #### Setting up push notifications
- #### Handling in-app messages
- ### Web SDK
- #### Initializing the SDK
- #### Tracking custom events and purchases
- #### Registering for web push
- #### Managing user attributes
- ## Plain text documentation
- [Customization Overview](/docs/developer_guide/getting_started/customization_overview/index.md): The Braze SDK is a powerful toolkit, but at a high level it provides two important pieces of functionality: it helps collect and sync user data across platforms to a consolidated user profile, and also handles messaging channels like in-app messages, push notifications, and Content Cards. The articles in the Customization Guide assume you've already gone through the SDK implementation process.
- # Customization overview
- [Braze SDK Tutorials](/docs/developer_guide/tutorials/index.md)
- [Integrate the Braze SDK](/docs/developer_guide/sdk_integration/index.md): For mirrored SDK README content in docs, see Repository guides.
- # !Braze Logo{: style="float:right;width:120px;border:0;" class="noimgborder"}Integrate the Braze SDK
- ## About the Web Braze SDK
- ## Integrate the Web SDK
- ### Step 1: Install the Braze library
- ### Step 2: Initialize the SDK
- #### Troubleshooting missing sessions for anonymous users
- ### Prerequisites
- ### Step 1: Open the tag template gallery
- ### Step 2: Add the initialization tag template
- ### Step 3: Configure the tag
- ### Step 4: Choose initialization options
- ### Step 5: Set to Trigger on all pages
- ### Step 6: Verify your integration
- ## Filtering bot traffic {#bot-filtering}
- ### Limitations of SDK-side bot detection
- ### Implementing bot filtering
- #### Require user interaction
- #### Custom bot detection
- ### Best practices
- ## Optional configurations
- ### Logging
- #### Basic logging
- #### Custom logging
- ## Upgrading the SDK
- ## Other integration methods
- ### Accelerated Mobile Pages (AMP)
- #### Step 1: Include AMP web push script
- #### Step 2: Add subscription widgets
- #### Step 3: Add helper-iframe and permission-dialog
- #### Step 4: Create a service worker file
- #### Step 5: Configure the AMP web push HTML element
- ### Asynchronous Module Definition (AMD)
- #### Disable support
- #### Module loader
- ### Electron {#electron}
- ### Jest framework {#jest}
- ### SSR frameworks {#ssr}
- #### Framework-agnostic dynamic import
- #### Shared hook for Next.js and Remix
- #### Next.js (App Router)
- #### Next.js (Pages Router)
- #### Remix
- #### Logging events and updating users
- ### Tealium iQ
- ### Vite {#vite}
- ### Other tag managers
- ## Integrating the Android SDK
- ### Step 1: Update your Gradle build configuration
- ### Step 2: Configure your braze.xml
- ### Step 3: Add permissions to AndroidManifest.xml
- ### Step 4: Enable delayed initialization (optional)
- #### Step 4.1: Update your braze.xml
- #### Step 4.2: Configure push analytics (optional)
- ##### Explicitly queue {#explicitly-queue-push-analytics}
- ##### Drop {#drop-push-analytics}
- #### Step 4.3: Manually initialize the SDK
- ### Step 5: Enable user session tracking
- ## Testing session tracking
- ## Optional configurations
- ### Runtime configuration
- ### Google Advertising ID
- ### Location tracking
- ### Logging
- #### Enabling logs
- #### Verifying verbose logs
- #### Suppressing logs
- ### Multiple API keys
- ### Exclusive in-app message TalkBack
- ### R8 and ProGuard
- ## Integrating the Swift SDK
- ### Prerequisites
- ### Step 1: Install the Braze Swift SDK
- #### Step 1.1: Import SDK version
- #### Step 1.2: Select your packages
- ##### About Extension libraries
- #### Step 1.1: Install CocoaPods
- #### Step 1.2: Constructing the Podfile
- ##### About additional libraries
- ###### Extension libraries
- #### Step 1.3: Install the SDK
- #### Updating the SDK using CocoaPods
- #### Step 1.1: Download the Braze SDK
- #### Step 1.2: Choose your frameworks
- #### Step 1.3: Prepare your files
- #### Step 1.4: Integrate your frameworks
- #### Common errors for Objective-C projects
- ### Step 2: Set up delayed initialization (optional)
- #### Step 2.1: Prepare for delayed initialization
- #### Step 2.2: Configure push analytics behavior (optional)
- ##### Explicitly queue
- ##### Drop
- #### Step 2.3: Customize push automation (optional)
- #### Step 2.4: Initialize the SDK
- ### Step 3: Update your app delegate
- ## Optional configurations
- ### Logging
- #### Log levels
- #### Setting the log level
- ## Integrating the Cordova SDK
- ### Prerequisites
- ### Step 1: Add the SDK to your project
- ### Step 2: Configure your project
- ## Platform-specific syntax
- ### Integers
- ### Booleans
- ## Optional configurations {#optional}
- ## Disabling automatic session tracking (Android only) {#disable-automatic-session-tracking}
- ## About the Flutter Braze SDK
- ## Integrating the Flutter SDK
- ### Prerequisites
- ### Step 1: Integrate the Braze library
- ### Step 2: Complete native SDK setup
- #### 2.1 Set up Android
- ##### Provide credentials at compile time
- ##### Provide credentials at runtime
- #### 2.2 Set up iOS
- #### 2.1 Set up Android
- #### 2.2 Set up iOS
- ### Step 3: Set up the plugin
- #### Standard initialization
- #### Delayed initialization
- #### Platform-specific API keys
- #### Re-initialization
- ## Testing the integration
- ## About the React Native Braze SDK
- ## New Architecture compatibility
- ## React and React Native version requirements
- ## Integrating the React Native SDK
- ### Prerequisites
- ### Step 1: Integrate the Braze library
- ### Step 2: Complete native setup
- #### Method 1: Using the Expo plugin {#reactnative-using-the-expo-plugin}
- ##### 2.1 Install the Braze Expo plugin
- ##### 2.2 Add the plugin to your app.json
- ###### Configuring Android push notification icons {#android-push-icons}
- ##### 2.3 Build and run your application
- #### Method 2: Using React Native CLI {#reactnative-using-react-native-cli}
- ##### Set up Android
- ##### Set up iOS
- #### Method 1: Using the Expo plugin
- ##### Step 2.1: Install the Braze Expo plugin
- ##### Step 2.2: Add the plugin to your app.json
- ###### Configuring Android push notification icons
- ##### Step 2.3: Build and run your application
- #### Method 2: Using React Native CLI
- ##### Set up Android
- ##### Set up iOS
- ### Step 3: Initialize the SDK
- #### Standard initialization
- #### Delayed initialization
- #### Platform-specific API keys
- #### Re-initialization
- ### Step 4: Test the integration (optional)
- ## Next steps
- ## Integrating the Roku SDK
- ### Step 1: Add files
- ### Step 2: Add references
- ### Step 3: Configure
- ### Step 4: Initialize Braze
- ## Optional configurations
- ### Logging
- ## About the Unity Braze SDK
- ## Integrating the Unity SDK
- ### Prerequisites
- ### Step 1: Choose your Braze Unity package
- ### Step 2: Import the package
- ### Step 3: Configure the SDK
- #### Step 3.1: Configure AndroidManifest.xml
- #### Step 3.2: Update AndroidManifest.xml with your package name
- #### Step 3.3: Add gradle dependencies
- #### Step 3.4: Automate the Unity Android integration
- #### Step 3.1: Set your API key
- ## Customizing the Unity package
- ### Step 1: Clone the repository
- ### Step 2: Export package from repository
- ### Step 3: Import package into Unity
- ## Switch to an automated integration (Swift only) {#automated-integration}
- ## Optional configurations
- ### Verbose logging
- ### Prime 31 compatibility
- ### Amazon Device Messaging (ADM)
- ### Extending the Braze Unity player (Android only) {#extend-unity-player}
- ## Troubleshooting
- ### Error: "File could not be read"
- ## Integrating the .NET MAUI SDK
- ### Prerequisites
- ### Step 1: Get the .NET MAUI binding
- ### Step 2: Configure your Braze instance
- #### Step 2.1: Configure the Braze SDK in Braze.xml
- #### Step 2.2: Add required permissions to Android manifest
- #### Step 2.3: Track user sessions and registering for in-app messages
- ### Step 3: Test the integration
- # ChatGPT app integration
- ## Setup
- ### Step 1: Get the Braze integration file
- ### Step 2: Install dependencies
- ## Implementation
- ### Client-side integration (custom widgets)
- #### Configure widget metadata
- #### Set up the useBraze hook
- #### Display Braze Content Cards
- #### Track widget events
- ### Server-side integration (MCP server)
- #### Set up session information
- #### Track user interactions
- #### Track purchases and transactions
- ## About the Braze Vega SDK
- ## Integrating the Braze Vega SDK
- ### Step 1: Install the Braze library
- ### Step 2: Initialize the SDK
- ## Optional configurations
- ### Logging
- #### Enable logging during initialization
- #### Enable logging after initialization
- #### Custom logging
- ### Configuration options
- ## Upgrading the SDK
- ## Testing your integration
- [Google Tag Manager with the Braze SDK](/docs/developer_guide/sdk_integration/google_tag_manager/index.md): Google Tag Manager (GTM) lets you remotely add, remove, and edit tags on your website without requiring a production code release or engineering resources. Braze offers the following templates for the Web SDK:
- # Google Tag Manager with the Braze SDK
- ## About Google Tag Manager for Web {#google-tag-manager}
- ## Tag sequencing for Braze action tags
- ## Log purchases with GTM
- ## Logging custom events with GTM
- ### Step 1: Push the event to the data layer
- ### Step 2: Create a trigger in GTM
- ### Step 3: Create a Custom HTML tag
- ## Google's EU User Consent Policy
- ## Prerequisites
- ## Using Google Tag Manager for Android
- ### Step 1: Create a trigger for custom events
- ### Step 2: Log custom attributes
- ### Step 3: Call changeUser()
- ### Step 4: Add a custom tag provider {#adding-android-google-tag-provider}
- ## Prerequisites
- ## Using Google Tag Manager for Swift
- ### Step 1: Create a trigger for custom events
- ### Step 2: Log custom attributes
- ### Step 3: Call changeUser()
- ### Step 4: Add a custom tag provider {#adding-ios-google-tag-provider}
- ## Troubleshooting
- [Set up authentication for the Braze SDK](/docs/developer_guide/sdk_integration/authentication/index.md): After you enable this feature in your app, you can configure the Braze dashboard to reject any requests with an invalid or missing JSON Web Token (JWT), which includes:
- # Set up SDK authentication
- ## How it works
- ## Setting up authentication
- ### Step 1: Set up your server {#server-side-integration}
- #### Step 1.1: Generate a public/private key-pair {#generate-keys}
- #### Step 1.2: Create a JSON Web Token for the current user {#create-jwt}
- ### Step 2: Configure the SDK {#sdk-integration}
- #### Step 2.1: Enable authentication in the Braze SDK.
- #### Step 2.2: Set the current user's JWT
- #### Step 2.3: Register a callback function for invalid tokens {#sdk-callback}
- ### Step 3: Enable authentication in the dashboard {#braze-dashboard}
- #### Enforcement options {#enforcement-options}
- ## Managing public keys {#key-management}
- ### Adding a public key
- ### Assign a new primary key
- ### Deleting a key
- ## Analytics {#analytics}
- ## Error codes {#error-codes}
- ## Frequently Asked Questions (FAQ) {#faq}
- #### Does this feature need to be enabled on all of my apps at the same time? {#faq-app-by-app}
- #### What happens to users who are still on older versions of my app? {#faq-sdk-backward-compatibility}
- #### What expiration should I use when generating a JWT? {#faq-expiration}
- #### What happens if a JWT expires in the middle of a user's session? {#faq-jwt-expiration}
- #### What happens if my server-side integration breaks and I can no longer create a JWT? {#faq-server-downtime}
- #### Why does this feature use public/private keys instead of shared secrets? {#faq-shared-secrets}
- #### How will rejected requests be retried? {#faq-retry-logic}
- #### Can you use SDK authentication for anonymous users? {#faq-anonymous-users}
- #### Does SDK authentication work with user aliases? {#faq-aliases}
- #### Does enabling SDK authentication block unauthenticated activity collection? {#faq-unauthenticated-collection}
- [Debugging the Braze SDK](/docs/developer_guide/sdk_integration/debugging/index.md): For deeper investigation, you can also enable verbose logging to capture detailed SDK output and learn how to read verbose logs for specific channels.
- # Debugging the Braze SDK
- ## Prerequisites
- ## Debugging the Braze SDK
- ### Step 1: Close your app
- ### Step 2: Create a debugging session
- ### Step 3: Select a user
- ### Step 4: Relaunch the app
- ### Step 5: Complete the reproduction steps
- ### Step 6: End your session
- ### Step 7: Share or export your session (optional)
- [Verbose logging](/docs/developer_guide/sdk_integration/verbose_logging/index.md): When something isn't working as expected—such as a push notification not arriving, an in-app message not displaying, or user data not syncing—verbose logs help you identify the root cause. Instead of guessing, you can see exactly what the SDK is doing at each step.
- # Verbose logging
- ## When to use verbose logging
- ## Enabling verbose logging
- ## Collecting logs
- ## Reading verbose logs
- ## Sharing logs with Braze Support
- [Reading verbose logs](/docs/developer_guide/sdk_integration/reading_verbose_logs/index.md): Before you start, make sure you've enabled verbose logging and know how to collect logs on your platform.
- # Reading verbose logs
- ## Sessions
- ### Key log entries
- ### What to check
- ## Push notifications
- ### Token registration
- ### What to check
- ### Push delivery and click
- ### What to check
- ## In-app messages
- ### Message delivery
- ### Message display and impression
- ### Click and button events
- ### What to check
- ## Content Cards
- ### Card sync
- ### Impressions, clicks, and dismissals
- ### What to check
- ## Deep links
- ### What to check
- ## User identification
- ## Network requests
- ### Request structure
- ### What to check
- ## Common event abbreviations
- ## Troubleshooting
- ### When might a user have 0 sessions recorded against their profile?
- ### User data discrepancies when using the SDK and REST API together
- ### Data not reaching Braze
- [Braze SDK rate limits](/docs/developer_guide/sdk_integration/rate_limits/index.md): Braze SDK rate limiting uses the following features to optimize performance, minimize battery drain, reduce data usage, and ensure reliable data delivery:
- # Braze SDK rate limits
- ## Understanding SDK rate limits
- ### Asynchronous processing
- ### Adaptive rate limiting
- ### Networking optimizations
- ## Best practices
- ## Getting help
- [Integrate Braze with ChatGPT Apps](/docs/developer_guide/sdk_integration/chatgpt_apps/index.md): !A Content Card integrated into ChatGPT app.{: style="float:right;max-width:30%;border:none;" }
- # Integrate Braze with ChatGPT apps
- ## Overview
- ### Key benefits
- ## Prerequisites
- # ChatGPT app integration
- ## Setup
- ### Step 1: Get the Braze integration file
- ### Step 2: Install dependencies
- ## Implementation
- ### Client-side integration (custom widgets)
- #### Configure widget metadata
- #### Set up the useBraze hook
- #### Display Braze Content Cards
- #### Track widget events
- ### Server-side integration (MCP server)
- #### Set up session information
- #### Track user interactions
- #### Track purchases and transactions
- [About version management for the Braze SDK](/docs/developer_guide/sdk_integration/version_management/index.md): All Braze SDKs adhere to the Semantic Versioning Specification (SemVer), so given a version number MAJOR.MINOR.PATCH, we recommend the following:
- # About version management
- ## Versioning recommendations
- ## Getting notified of new releases
- ## About known issues
- [Android 13 Upgrade Guide](/docs/developer_guide/platforms/android/android_13/index.md): Refer to the Android 13 developer documentation for a full migration guide.
- # Upgrading to Android 13
- ## Android 13 Braze SDK
- ## Changes in Android 13
- ### Push permission {#push-permission}
- #### Permission prompt timing {#push-permission-timing}
- ## Preparing for Android 13 {#next-steps}
- [Upgrading to iOS 18](/docs/developer_guide/platforms/swift/ios_18/index.md): Apple's WWDC took place June 9th - 11th 2024. Learn more about their announcements in our blog post, or read on to learn how you can leverage iOS 18 with Braze.
- # Upgrading to iOS 18
- ## Changes in iOS 18
- ### Live Activities on Apple Watch
- ### Apple Vision Pro
- ### iPhone notifications on macOS
- ### Apple Intelligence
- [visionOS support](/docs/developer_guide/platforms/swift/visionos/index.md): Most features available on iOS are also available on visionOS, including:
- # visionOS support
- ## Fully supported features
- ## Partially supported features
- ## Unsupported features
- [iOS 14 SDK Upgrade Guide](/docs/developer_guide/platforms/swift/_archived_updates/ios_14/index.md): As of iOS 14.5, IDFA collection and certain data sharing will require the new AppTrackingTransparency Framework permission prompt (Learn more about IDFA).
- # iOS 14 SDK upgrade guide
- ## Summary of iOS 14 breaking changes
- ## Upgrade summary
- ## iOS 14 behavior changes
- ### Approximate location permission
- #### Overview
- #### Geofences {#geofences}
- #### Location targeting {#location-tracking}
- ### IDFA and app tracking transparency {#idfa}
- #### Overview
- #### Changes to Braze IDFA collection
- ### Push authorization {#push-provisional-auth}
- ## iOS 14 new features
- ### App privacy and data collection overview {#app-privacy}
- #### Apple developer portal questionnaire
- #### Braze default data collection
- #### Optional data collection
- [iOS 15 SDK Upgrade Guide](/docs/developer_guide/platforms/swift/_archived_updates/ios_15/index.md): As part of our annual testing of iOS betas, we have identified a change made by Apple which causes certain UI navigation bars to appear transparent instead of opaque. This will be visible on iOS 15 when using the Braze default UI for Content Cards, or when web deep links are opened inside your app instead of in a separate browser app.
- # iOS 15 SDK upgrade guide
- ## Transparency changes to UI navigations
- ## New notification settings {#notification-settings}
- ### Focus modes {#focus-mode}
- ### Interruption levels {#interruption-levels}
- ### Notification summary {#notification-summary}
- ## Location buttons {#location-buttons}
- ### Using location buttons with Braze
- ## Apple mail {#mail}
- ## Safari IP address location
- [iOS 16 Upgrade Guide](/docs/developer_guide/platforms/swift/_archived_updates/ios_16/index.md): Apple has announced two changes to their Web Push functionality.
- # iOS 16 SDK upgrade guide
- ## Changes in iOS 16
- ### Safari Web Push {#safari-web-push}
- #### Desktop Web Push (MacOS) {#macos-push}
- #### Mobile Web Push (iOS and iPadOS) {#ios-push}
- ## Preparing for iOS 16 {#next-steps}
- [iOS 17 Upgrade Guide](/docs/developer_guide/platforms/swift/_archived_updates/ios_17/index.md): The Braze Swift SDK and Objective-C SDK are both backward compatible with Xcode 14 and Xcode 15, and compatible with iOS 17 devices.
- # iOS 17 upgrade guide
- ## iOS 17 and Xcode 15 compatibility
- ## Changes in iOS 17
- ### Link tracking and UTM parameter stripping
- ### App Tracking Transparency
- #### Privacy manifests
- #### Code signing
- ### Braze SDK and privacy
- [Browser Extensions Integration for Web](/docs/developer_guide/platforms/web/browser_extensions/index.md): Integrate the Braze Web SDK within your browser extension to collect analytics and display rich messaging to users. This includes both Google Chrome Extensions and Firefox Add-Ons.
- # Browser extension
- ## What's supported
- ## What's not supported
- ## Extension types
- ## Permissions
- ## Getting started
- ### Extension popups {#popup}
- ### Background script (Manifest v2 only) {#background-script}
- ### Options page {#options-page}
- ## Initialization
- ## Push
- [Content Security Policy Headers for Web](/docs/developer_guide/platforms/web/content_security_policy/index.md): This article is intended for developers working on websites that enforce CSP rules and integrate with Braze. It is not intended as advice on how you should approach security.
- # Content security policy headers
- ## Nonce attributes {#nonce}
- ## Directives {#directives}
- ### connect-src {#connect-src}
- ### script-src {#script-src}
- ### img-src {#img-src}
- ## Font Awesome {#font-awesome}
- [Accessibility](/docs/developer_guide/platforms/web/accessibility/index.md): Braze Web SDK supports the standards provided by the Web Content Accessibility Guidelines (WCAG 2.1). We maintain a 100/100 lighthouse score for content cards and in-app messages on all of our new builds to uphold our accessibility standard.
- # Accessibility
- ## Prerequisites
- ### Notable accessibility fixes
- ## Supported accessibility features
- ## Accessibility guidelines for SDK integrations
- ### Content Cards
- #### Setting a maximum height
- #### Viewport considerations
- ### In-app messages
- ### Mobile considerations
- #### Responsive design
- ### Testing accessibility
- #### Manual test checklist
- ### Common accessibility issues
- [Smart TV support for the Web Braze SDK](/docs/developer_guide/platforms/web/smart_tvs/index.md): For a complete technical reference, check out our JavaScript Documentation or our sample apps to see the Web SDK running on a TV.
- # Smart TV support
- ## Prerequisites
- ## Configuring the Web Braze SDK
- ## Analytics
- ## In-app messages and Content Cards
- [TV and OTT Integrations for Braze](/docs/developer_guide/platforms/tv_and_ott/index.md): The following lists features and messaging channels supported today.
- # TV and OTT integrations
- ## Platforms and features
- ## Integration guides
- ### Amazon Fire TV {#fire-tv}
- ### Kindle Fire {#kindle-fire}
- ### Android TV {#android-tv}
- ### LG webOS {#lg-webos}
- ### Samsung Tizen {#tizen}
- ### Roku {#roku}
- ### Apple TV OS {#tvos}
- ### Apple Vision Pro {#vision-pro}
- ## App targeting {#app-targeting}
- ## Headless UI {#custom-ui}
- [Integration Overview for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/overview/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- [Carthage Integration for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/installation_methods/carthage_integration/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Carthage integration
- ## Import the SDK
- ### Previous versions
- ## Next steps
- ## Core only integration
- [CocoaPods Integration for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/installation_methods/cocoapods/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # CocoaPods integration
- ## Step 1: Install CocoaPods
- ## Step 2: Constructing the Podfile
- ### Subspecs
- ## Step 3: Installing the Braze SDK
- ## Next steps
- ## Updating the Braze SDK via CocoaPods
- [Swift Package Manager Integration for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/installation_methods/swift_package_manager/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Swift Package Manager integration
- ## Step 1: Adding the dependency to your project
- ### Import SDK version
- ### Select packages
- ## Step 2: Configuring your project
- ## Step 3: Editing the target's scheme
- ## Next steps
- [Manual Integration Options for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/installation_methods/manual_integration_options/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Manual integration
- ## Step 1: Downloading the Braze SDK
- ### Option 1: Dynamic XCFramework
- ### Option 2: Static XCFramework for static integration
- ## Step 2: Adding required iOS libraries
- ### SDWebImage integration
- ### Optional location tracking
- ## Step 3: Objective-C bridging header
- ## Next steps
- [Complete the iOS SDK Integration](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/completing_integration/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Complete the integration
- ## Step 1: Update your app delegate
- ## Step 2: Specify your data cluster
- ### Compile-time endpoint configuration (recommended)
- ### Runtime endpoint configuration
- ## SDK integration complete
- ## Customizing Braze on startup
- ## Appboy.sharedInstance() and Swift nullability
- ## Additional resources
- [Other SDK Customizations for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/other_sdk_customizations/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Other SDK customizations
- ## Braze log level
- ### Log levels
- ### Verbose logging
- ### Setting log level
- ## Optional IDFV collection - Swift
- ## Optional IDFA collection
- ### iOS 14.5 AppTrackingTransparency
- ### Implementing IDFA collection
- #### Step 1: Implement ABKIDFADelegate
- ##### Step 2: Set the delegate during Braze initialization
- ## Approximate iOS SDK size {#ios-sdk-size}
- [Braze SDK Integration Guide for iOS (Optional)](/docs/developer_guide/platforms/legacy_sdks/ios/initial_sdk_setup/ios_sdk_integration/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Braze iOS SDK integration guide
- ## Integration overview
- ### Create BrazeManager.swift
- #### Create BrazeManager.swift
- ### Initialize the SDK
- #### Initialize SDK from BrazeManager.swift
- ##### Handle Appboy initialization in the AppDelegate.swift
- ### Push notifications
- #### Add push certificate
- ##### Register for push notifications
- ##### Forward push notification methods
- ###### Step 1: Create extension for push notification code
- ###### Step 2: Support remote notifications
- ###### Step 3: Remote notification handling
- ###### Step 4: Forward notification responses
- ### Access user variables and methods
- #### Create user variables and methods
- ### Log analytics
- #### Create log custom event method
- ##### Create log custom attributes method
- ##### Create log purchase method
- ### In-app messages
- #### Conform to ABKInAppMessageUIDelegate
- ##### Add delegate methods
- ### Content Cards
- #### Create Content Card variables and methods
- ## Next steps
- [Push Integration for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/integration/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Push integration
- ## Step 1: Upload your APNs token
- ## Step 2: Enable push capabilities
- ## Step 3: Register for push notifications
- ### Using UserNotification framework (iOS 10+)
- ### Without UserNotifications framework
- ## Step 4: Register push tokens with Braze
- ## Step 5: Enable push handling
- ### iOS 10+
- ### Pre-iOS 10
- ## Step 6: Deep linking
- ## Step 7: Unit tests (optional)
- [iOS Push Customization](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/index.md):
- [Push Action Buttons for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/action_buttons/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Action buttons {#push-action-buttons-integration}
- ## Step 1: Adding Braze default push categories
- ## Step 2: Enable interactive push handling
- ## Push category customization
- [Custom Push Notification Sounds for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/custom_sounds/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Custom sounds
- ## Step 1: Hosting the sound in the app
- ## Step 2: Providing the dashboard with a protocol URL for the sound
- [Rich Push Notifications for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/rich_notifications/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # iOS 10 rich notifications
- ## Creating a service extension
- ## Setting up the service extension
- ### Configuring the service extension to work with Braze
- ### Example code
- ## Creating a rich notification in your dashboard
- [Push Notification Badge Counts for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/badges/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Badges
- [Ignore Braze Internal Push Notifications for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/ignoring_internal_push/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Ignore Braze internal push notifications
- ## Checking your app for automatic actions
- ## Using Braze internal push utility methods
- ## Implementation example {#internal-push-implementation-example}
- [Advanced Push Settings](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/customization/advanced_settings/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Advanced settings
- ## Extracting data from push key-value pairs
- ## Alert options
- ## Adding content-available flag
- ## Adding mutable-content flag
- ## Update app badge count
- ## Sounds
- ## Collapse ID
- ## Expiry
- [Silent Push Notifications for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/silent_push_notifications/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Silent push notifications
- ## Sending silent push notifications
- ## Use silent push notifications to trigger background work
- ## iOS silent notifications limitations
- [Push Primer for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/push_primer/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Push primer integration
- ## Step 1: Add snippet in AppDelegate.m file
- ## Step 2: Append custom event checker to AppDelegate.m file
- ## Step 3: Set up a deep link handler
- [Push Stories for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/push_story/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Push Story setup
- ## Step 1: Enable push in your app
- ## Step 2: Adding the Notification Content Extension target
- ## Step 3: Enable capabilities
- ### Adding an App Group
- ## Step 4: Adding the Push Story framework to your app
- ## Step 5: Updating your notification view controller
- ## Step 6: Set the notification content extension storyboard
- ## Step 7: Set the notification content extension plist
- ## Step 8: Updating the Braze integration in your main app
- ### Option 1: Runtime
- #### Option 2: Info.plist
- ## Next steps
- [Advanced Push Notification Implementation for iOS (Optional)](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/implementation_guide/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Push notification implementation guide
- ## Notification content app extensions
- ### Requirements
- ### Custom category configuration
- ## Use case and implementation walkthrough
- ### Interactive push notification
- #### Dashboard configuration
- #### Other use cases
- ##### Ready to log analytics?
- ### Personalized push notifications
- #### Dashboard configuration
- #### Handling key-value pairs
- #### Other use cases
- ##### Ready to log analytics?
- ### Information capture push notification
- #### Dashboard configuration
- #### Handling button actions
- ##### Dismissing pushes
- #### Other use cases
- ##### Ready to log analytics?
- ## Logging analytics
- ### Logging with the Braze API (recommended)
- ### Logging manually
- #### Step 1: Configure App Groups within Xcode
- #### Step 2: Integrate code snippets
- ##### Saving custom events
- ##### Sending custom events to Braze
- ##### Saving custom attributes
- ##### Sending custom attributes to Braze
- ##### Saving user attributes
- ##### Sending user attributes to Braze
- ##### Helper files
- [Push Notification Testing for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/testing/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Testing {#push-testing}
- [Push Notification Unit Tests for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/unit_tests/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Unit tests {#unit-tests}
- ## Step 1: Creating a unit tests target
- ## Step 2: Add the Braze SDK to your unit tests
- ## Step 3: Add OCMock to your unit tests
- ## Step 4: Finish installing the added libraries
- ## Step 5: Adding push tests
- ## Step 6: Run test suite
- [Push Notification Troubleshooting for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/push_notifications/troubleshooting/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Troubleshooting {#push-troubleshooting}
- ## Understanding the Braze/APNs workflow
- ### Step 1: Configuring the push certificate and provisioning profile
- #### Step 2: Devices register for APNs and provide Braze with push tokens
- #### Step 3: Launching a Braze push campaign
- #### Step 4: Removing invalid tokens
- ## Utilizing the push error logs
- ## Push registration issues
- ### No push registration prompt
- #### No "push registered" users showing in the dashboard
- ## Devices not receiving push notifications
- ### Users no longer "push registered" after sending a push notification
- #### Dashboard and app certificate mismatch
- ##### Uninstalls
- ##### Regenerating your provisioning profile
- #### Users still "push registered" after sending a push notification
- ##### App is foregrounded
- ##### Test notification scheduled incorrectly
- #### User not "push registered" for the app being tested
- ## Push messages not sending
- ## Message activity log errors
- ### Received unregistered sending to push token {#received-unregistered-sending}
- #### Device token not for topic
- #### BadDeviceToken sending to push token
- ## Issues after push delivery
- ### Push clicks not logged {#push-clicks-not-logged}
- #### Web links from push clicks not opening
- #### Deep links from push clicks not opening
- #### Few or no direct opens
- [In-App Message Overview for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/overview/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # In-app messages
- ## In-app message types
- ### Expected behaviors by message types
- [iOS In-App Message Customization](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/index.md):
- [Set In-App Message Delegates for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/setting_delegates/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Set delegates
- ## In-app message delegate
- ## Core in-app message delegate
- ## Method declarations
- ## Implementation samples
- [Customize In-App Message Orientation for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/customizing_orientation/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Customize orientation
- ## Setting orientation for all in-app messages
- ## Setting orientation per in-app message
- ## Method declarations
- [Customize In-App Message Display Handling for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/handling_in_app_display/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Custom handling in-app message display
- ## Overriding in-app messages before display
- ## Disabling Dark Mode
- ## Hiding the status bar during display
- ## Logging impressions and clicks
- ## Method declarations
- ## Implementation samples
- [Customize In-App Message On-Click Behavior for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/behavior_on_click/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Customize in-app message behavior on click
- ## Customizing in-app message body clicks
- ## Customizing in-app message button clicks
- ## Method declarations
- [Customize In-App Message Triggering for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/custom_triggering/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Custom in-app message triggering
- ## Step 1: Handle silent push and key-value pairs
- ## Step 2: Create a push campaign
- ## Step 3: Create an in-app message campaign
- [In-App Message in a Custom View Controller for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/custom_view_controller/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Display in-app messages in a custom view controller
- ## Method declarations
- ## Implementation samples
- [In-App Message Modal Dismissal for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/modal_dismissal/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Dismiss modal on outside tap
- [In-App Message Key-Value Pairs for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/customization/key_value_pairs/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Key-value pair extras
- [In-App Message Delivery for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/in-app_message_delivery/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # In-app message delivery
- ## Trigger types
- ## Delivery semantics
- ## Minimum time interval between triggers
- ## Failing to find a matching trigger
- ## Local in-app message delivery
- ### The in-app message stack
- #### Showing in-app messages
- #### Adding in-app messages to the stack
- #### Returning in-app messages to the stack
- #### Discarding in-app messages
- #### Manually queue in-app message display
- ### Real-time in-app message creation and display
- [Custom App Store review prompt](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/custom_app_store_review_prompt/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Custom App Store review prompt
- [In-App Message Implementation Guide for iOS (Optional)](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/implementation_guide/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # In-app messaging implementation guide
- ## Code considerations
- ### ABKInAppMessage subclasses
- ## Use cases
- ### Custom slide-up in-app message
- #### Adding additional behavior to our default UI
- ### Custom modal in-app message
- #### Dashboard configuration
- ### Custom full in-app message
- #### Dashboard configuration
- #### Intercepting in-app message touches
- [SharePlay In-App Message Implementation Guide](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/implementation_guide/shareplay/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # SharePlay in-app message implementation guide
- ## Overview
- ## Integration
- ### Step 1: Overriding and loading XIB
- ### Step 2: Configure AVPlayer for in-app messages
- #### Dashboard configuration
- ### Step 3: Create group watching activity
- #### Prepare to play
- ### Step 4: Launch in-app message from SharePlay API
- ### Step 5: Leaving a group session on in-app message dismissal
- ### Configure SharePlay button visibility
- [In-App Messaging Troubleshooting for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/in-app_messaging/troubleshooting/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Troubleshoot in-app messages
- ## Impressions
- ### Impression or click analytics aren't being logged
- #### Impressions are lower than expected
- ## Expected in-app message did not display
- ### In-app message delivery {#troubleshooting-in-app-message-delivery}
- #### Check if messages are requested and returned
- #### Troubleshoot messages not being requested
- ### Troubleshoot messages not being returned
- ### In-app message display {#troubleshooting-in-app-message-display}
- [Content Card View Controller Integration for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/integration/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Content Card integration
- ## Content Cards data model
- ### Getting the data
- ## Content Card model
- ### Base Content Card model properties - ABKContentCard
- ### Banner Content Card properties - ABKBannerContentCard
- ### Captioned image Content Card properties - ABKCaptionedImageCard
- ### Classic Content Card properties - ABKClassicContentCard
- ## Card methods
- ## Content Cards view controller integration
- ### Navigation context
- ### Modal context
- [iOS Content Card Customization](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/index.md):
- [Custom Content Card Styling for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/custom_styling/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Custom Styling
- ## Overriding default images
- ## Disabling Dark Mode
- [Customizing Content Card Feed for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/customizing_feed/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Customize the Content Cards feed
- ## Customizing UI
- ### Dynamic UI
- ### Static UI
- ## Providing custom interfaces
- ## Overriding populated Content Cards
- [Handle Content Card Clicks Manually for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/handling_clicks_manually/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Handle clicks manually
- [Content Card Read and Unread Indicators for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/read_unread_indicators/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Read and unread indicators
- ## Disabling the unviewed indicator
- ## Customizing the unviewed indicator
- [Content Card Badges for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/badges/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Badges
- ## Requesting unread Content Card counts
- ## Displaying the number of unviewed Content Cards on the app badge count
- [Content Card Carousel View for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/customization/use_cases/carousel_view/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Use case: Carousel view
- ## Implementation
- ### Step 1: Create a custom view controller
- ### Step 2: Implement analytics
- ### Step 3: Create a Content Card observer
- ## Considerations
- [Refresh the Content Card Feed for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/refreshing_the_feed/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Refresh the feed
- ## Refreshing Content Cards
- [Use Multiple Content Card Feeds for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/multiple_feeds/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Using multiple Content Card feeds
- ## Step 1: Setting key-value pairs on cards
- ## Step 2: Set Up a content card listener
- [Content Card Implementation Guide for iOS (Optional)](/docs/developer_guide/platforms/legacy_sdks/ios/content_cards/implementation_guide/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Content Card implementation guide
- ## Code considerations
- ### Content Cards as custom objects
- ## Use cases
- ### Content Cards as supplemental content
- #### Dashboard configuration
- ##### Ready to log analytics?
- ### Content Cards in a message center
- #### Dashboard configuration
- #### Further explanation
- ##### Ready to log analytics?
- ### Interactive Content Cards
- #### Dashboard configuration
- ##### Ready to log analytics?
- ## Dark Mode customization
- ## Logging impressions, clicks, and dismissals
- ### Implementation components
- ## Helper files
- [Track Sessions for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/tracking_sessions/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Session tracking for iOS
- ## Session lifecycle
- ## Customizing session timeout
- ## Testing session tracking
- [Set User IDs for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/setting_user_ids/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Set user IDs for iOS
- ## Suggested user ID naming convention
- ## Assigning a user ID
- ## User ID integration best practices and notes
- ### Automatic preservation of anonymous user history
- ### Additional notes and best practices
- ## Aliasing users
- [Track Custom Events for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/tracking_custom_events/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Track custom events for iOS
- ## Adding a custom event
- ### Adding properties
- ### Reserved keys {#event-reserved-keys}
- ## Additional resources
- [Set Custom Attributes for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/setting_custom_attributes/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Set custom attributes for iOS
- ## Assigning default user attributes
- ## Assigning custom user attributes
- ### Custom attribute with a string value
- ### Custom attribute with an integer value
- ### Custom attribute with a double value
- ### Custom attribute with a boolean value
- ### Custom attribute with a date value
- ### Custom attribute with an array value
- ### Unsetting a custom attribute
- ### Incrementing/decrementing custom attributes
- ### Setting a custom attribute via the REST API
- ### Custom attribute value limits
- #### Additional information
- ## Setting up user subscriptions
- ### Setting email subscriptions
- ### Setting push notification subscriptions
- [Log Purchases for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/logging_purchases/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Log purchases for iOS
- ## Tracking purchases and revenue
- ### Adding properties {#properties-purchases}
- ### Adding quantity
- ### Log purchases at the order level
- ### Reserved keys
- ### REST API
- [Location Tracking for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/location_tracking/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Location tracking for iOS
- ## Enabling automatic location tracking
- ### Passing location data to Braze
- [Uninstall Tracking for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/uninstall_tracking/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Uninstall tracking for iOS
- ## Step 1: Enabling background push
- ## Step 2: Checking for Braze background push
- ## Step 3: Test from the dashboard
- ## Step 4: Enable uninstall tracking
- [Disable SDK Tracking for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/analytics/disabling_tracking/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Disable data collection for iOS
- ## iOS SDK v5.7.0+
- [Deep Linking for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/advanced_use_cases/linking/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Deep linking for iOS
- ## Step 1: Register a scheme
- ## Step 2: Allowlist the custom scheme (iOS 9+)
- ## Step 3: Implement a handler
- # Universal links
- ## App transport security (ATS)
- ### ATS requirements
- ### Handling ATS requirements
- #### Confirm all links are ATS compliant (recommended)
- #### Partially disable ATS
- #### Disable ATS entirely
- ## URL encoding
- ## Customization {#linking-customization}
- ### Default WebView customization
- ### Linking handling customization
- #### Integration example: ABKURLDelegate
- ## Frequent use cases
- ### Deep linking to app settings
- [Fine Network Traffic Control for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/advanced_use_cases/fine_network_traffic_control/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Fine network traffic control
- ## Request processing policies
- ### Automatic request processing
- ### Manual request processing
- ## Setting the request processing policy
- ### Set request policy on startup
- ### Set request policy at runtime
- ## Manual shutdown of in-flight server communication
- [Localization for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/advanced_use_cases/localization/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Localization
- ## Languages supported
- [Beacon Integration for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/advanced_use_cases/beacon_integration/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Beacon integration
- ## Infillion Beacons
- [Location and Geofences for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/advanced_use_cases/locations_and_geofences/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Locations and geofences
- ## Step 1: Enable background push
- ## Step 2: Enable geofences
- ## Step 3: Check for Braze background push
- ## Step 4: Add NSLocationAlwaysUsageDescription to your Info.plist
- ## Step 5: Request authorization from the user
- ## Step 6: Enable geofences on the dashboard
- ### Enable geofences from the locations page:
- ### Enable geofences from the settings page:
- ## Disabling automatic geofence requests
- ## Manually requesting geofences
- [Google Tag Manager for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/advanced_use_cases/google_tag_manager/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Google Tag Manager for iOS
- ## Initializing the SDK {#initializing-ios-google-tag-provider}
- ## Configuring your Google Tag Manager {#configuring-ios-google-tag-manager}
- ### Custom events
- ### Logging custom attributes
- ### Calling changeUser
- ## Braze SDK custom tag provider {#adding-ios-google-tag-provider}
- [Storage for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/storage/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Storage
- ## Device properties
- [Sample Apps for iOS](/docs/developer_guide/platforms/legacy_sdks/ios/sample_apps/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Sample apps
- ## Building test applications
- [Changelog for iOS Swift SDK](/docs/developer_guide/platforms/legacy_sdks/ios/changelog/swift_changelog/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # iOS Swift SDK changelog
- [Changelog for iOS Objective-C SDK](/docs/developer_guide/platforms/legacy_sdks/ios/changelog/objc_changelog/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # iOS Objective-C SDK changelog
- # macOS
- [Initial SDK Setup for MacOS](/docs/developer_guide/platforms/legacy_sdks/macOS/initial_sdk_setup/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Initial SDK setup
- ## Supported features
- [Initial SDK Setup for tvOS](/docs/developer_guide/platforms/legacy_sdks/tvos/initial_sdk_setup/index.md): AppboyKit (also known as the Objective-C SDK) is no longer supported and has been replaced by the Swift SDK. It will no longer receive new features, bug fixes, security updates, or technical support—however, messaging and analytics will continue to function as normal. To learn more, see Introducing the New Braze Swift SDK.
- # Initial SDK setup
- ## tvOS SDK CocoaPods integration
- ### Step 1: Install CocoaPods
- ### Step 2: Constructing the Podfile
- ### Step 3: Installing the Braze SDK
- ### Step 4: Updating your app delegate
- ### Step 5: Specify your custom endpoint or data cluster
- #### Compile-time endpoint configuration (recommended)
- #### Runtime endpoint configuration
- ### SDK integration complete
- ### Updating the Braze SDK via CocoaPods
- ## Customizing Braze on startup
- ## Appboy.sharedInstance() and Swift nullability
- ## Manual integration options
- ## Identifying users and reporting analytics
- [About Banners](/docs/developer_guide/banners/index.md): Banners availability depends on your Braze package. Contact your account manager or customer success manager to get started.
- # Banners
- ## Prerequisites
- ## Why use Banners?
- ## Features
- ## About Banners {#about-banners}
- ### Placement IDs {#placement-id}
- ### Banner priority {#priority}
- ### Placement requests {#requests}
- #### Rate limiting for refresh requests
- ### Message delivery
- ### Dimensions and sizing
- ## Limitations
- ## Next steps
- [Manage Banner placements for the Braze SDK](/docs/developer_guide/banners/placements/index.md): When you create placements in your app or website, your app sends a request to Braze to fetch Banner messages for each placement.
- # Manage Banner placements
- ## About placement requests {#requests}
- #### Rate limiting for refresh requests
- ## Create a placement
- ### Prerequisites
- ### Step 1: Create placements in Braze
- ### Step 2: Refresh placements in your app {#requestBannersRefresh}
- ### Step 3: Listen for updates {#subscribeToBannersUpdates}
- ### Step 4: Insert using the placement ID {#insertBanner}
- ### Step 5: Send a test Banner (optional) {#handling-test-cards}
- ## Log impressions
- ## Logging clicks
- ### Standard Banner content (automatic)
- ### Custom Code Blocks
- ### Custom UI implementations (headless)
- #### Logging impressions
- #### Logging clicks
- ## Log dismissals
- ### Prerequisites
- ### Integrations
- #### Standard Banner integrations (drag-and-drop editor)
- #### Custom Code Blocks
- #### Dismiss a banner programmatically
- ### Log custom analytics on banner dismissal
- ### Pending dismissal storage cap
- ## Dimensions and sizing
- ## Custom properties {#custom-properties}
- ### Prerequisites
- ### Access custom properties
- [Test Banners](/docs/developer_guide/banners/testing/index.md): 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.
- # Test Banners
- ## Prerequisites
- ## Test a Banner
- [Banner analytics](/docs/developer_guide/banners/analytics/index.md): Once you've launched your campaign, you can return to the details page for that campaign to view key metrics. Navigate to the Campaigns page and select your campaign to open the details page. For sent in Canvas, refer to Canvas analytics.
- # Banner analytics
- ## Viewing analytics
- ### Time range
- ### Campaign details
- #### Estimated Audience and Current Audience
- #### Changes Since Last Viewed
- ### Message Performance
- ### Historical performance
- ### Conversion event details
- ### Conversion correlation
- ## Retention report
- ## Funnel report
- [Migrate from Content Cards to Banners](/docs/developer_guide/banners/migrating_from_content_cards/index.md): Banners offer several advantages over Content Cards for banner-style messaging:
- # Migrate from Content Cards to Banners
- ## Why migrate to Banners?
- ### Accelerated production
- ### Better UX
- ### Persistence
- ## When to migrate
- ## When to keep Content Cards
- ## Migration guide
- ### Prerequisites
- ### Subscribe to updates
- #### Content Cards approach
- #### Banners approach
- ### Display content
- #### Content Cards approach
- #### Banners approach
- ### Log analytics (custom implementations)
- #### Content Cards approach
- #### Banners approach
- ### Getting properties
- #### Content Cards approach
- #### Banners approach
- ### Handling control groups
- #### Content Cards approach
- #### Banners approach
- ## Limitations
- ### Migrating triggered messages
- ### Feature differences
- ### Product limitations
- ### SDK limitations
- ## Related articles
- [Tutorial: Displaying a Banner by Placement ID](/docs/developer_guide/banners/tutorial_displaying_banners/index.md): Before you can start this tutorial, verify that your Braze SDK meets the minimum version requirements:
- # Tutorial: Displaying a Banner by Placement ID
- ## Prerequisites
- ## Displaying banners for the Web SDK
- #### 1. Enable debugging (optional)
- #### 2. Subscribe to Banner updates
- #### 3. Insert the Banner and handle control groups
- #### 4. Refresh your Banners
- #### 5. Add a container for your Banner
- ## Prerequisites
- ## Displaying banners for the Android SDK
- #### 1. Enable debugging (optional)
- #### 2. Subscribe to Banner updates
- #### 3. Refresh your placements
- #### 4. Define BannerView in your banners.xml
- ## Prerequisites
- ## Displaying banners for the Swift SDK
- #### 1. Enable debugging (optional)
- #### 2. Refresh your placements
- #### 3. Initialize the Banner and provide a callback
- #### 4. Enable Auto Layout constraints
- #### 5. Anchor content and set height constraints
- #### 1. Enable debugging (optional)
- #### 2. Refresh your placements
- #### 3. Create a view component
- #### 4. Only display available Banners
- #### 5. Only show BannerView after it loads
- #### 6. Dynamically update Banner height
- #### 7. Limit the Banner height
- [Banners: Frequently Asked Questions](/docs/developer_guide/banners/faq/index.md): Banners are refreshed with their latest data whenever you call the refresh method—there's no need to resend or update your Banner campaign.
- # Frequently asked questions
- ## When do Banner updates appear for users?
- ## How many placements can I request in a session?
- ## How many Banner campaigns can be active simultaneously?
- ## For campaigns sharing a placement, which Banner is displayed first?
- ## Can I use Banners in my existing Content Card feed?
- ## Can Banners include video?
- ## Can I trigger a banner based on user actions?
- ## Can users dismiss a Banner?
- ## Can I export Banners campaign analytics using the Braze API?
- ## When are users segmented?
- ## How can I compose Banners to ensure the lowest latency?
- ## Are all Liquid tags supported?
- ## Can I capture click events?
- [Content Cards in the Braze SDK](/docs/developer_guide/content_cards/index.md): Using Content Cards for banner-style messages? Try out Banners— perfect for inline, persistent in-app and web messages.
- # Content Cards
- ## Prerequisites
- ## Standard feed UI
- ## Testing Content Cards on the web
- ## Card types and properties
- ### Base card model
- ### Image only
- ### Captioned image
- ### Classic
- ## Control group
- ## Card methods
- ### Default feed methods
- ### Custom feed methods
- ## Best practices
- ### Call methods in the correct order
- ### Use cached cards to persist content across page loads
- ### Log analytics for custom feeds
- ## Using Google Tag Manager
- ### Setting up Content Cards
- ### Upgrading templates {#upgrading}
- ### Troubleshooting {#troubleshooting}
- #### Enable tag debugging {#debugging}
- #### Enter debug mode
- #### Verify tag sequencing for custom events {#tag-sequencing}
- #### Enable verbose logging
- ## Prerequisites
- ## Google fragments
- ## Card types and properties
- ### Base card model {#base-card-for-android}
- ### Image only {#banner-image-card-for-android}
- ### Captioned image {#captioned-image-card-for-android}
- ### Classic {#text-Announcement-card-for-android}
- ## Card methods
- ## Prerequisites
- ## View controller contexts
- ### Navigation
- ### Modal
- ## Base card model
- ## Card methods
- ## Prerequisites
- ## Card Feeds
- ## Content Cards
- ## About Flutter Content Cards
- ## Prerequisites
- ## Card methods
- ## Receiving Content Card data
- ### Listen for Content Card data in the Dart layer
- ### Forward Content Card data from the native iOS layer
- #### Replaying the callback for Content Cards
- ## About React Native Content Cards
- ## Prerequisites
- ## Cards methods
- ## Card types and properties
- ### Base card model
- ### Image only
- ### Captioned image
- ### Classic
- ### Control
- ## Prerequisites
- ## Setting up your tvOS app
- ### Step 1: Create a new iOS app
- ### Step 2: Get your app's API key
- ### Step 3: Integrate BrazeKit
- ### Step 4: Create your custom UI
- ## Prerequisites
- ## Displaying Content Cards natively {#unity-content-cards-native-ui}
- ## Receiving Content Card data in Unity
- ## Parsing Content Cards
- ##### Example Content Cards callback
- ## Refreshing Content Cards
- ## Analytics
- ## About .NET MAUI Content Cards
- ## Prerequisites
- ## Card types and properties
- ### Base card model
- ### Banner
- ### Captioned image
- ### Classic
- ## Card methods
- [Create Content Cards](/docs/developer_guide/content_cards/creating_cards/index.md): Using Content Cards for banner-style messages? Try out Banners— perfect for inline, persistent in-app and web messages.
- # Create Content Cards
- ## Creating a card
- ### Step 1: Create a custom UI
- ### Step 2: Subscribe to card updates
- #### Step 2a: Create a private subscriber variable
- #### Step 2b: Subscribe to updates
- #### Step 2c: Unsubscribe
- #### Step 2a: Create a private subscriber variable
- #### Step 2b: Subscribe to updates
- #### Step 2c: Unsubscribe
- ##### Cancellable
- ##### AsyncStream
- ### Step 3: Implement analytics
- ### Step 4: Test your card (optional)
- ## Content Card placements
- ### Message inbox
- #### Example
- ### Carousel
- ### Image-only
- [Customize cards](/docs/developer_guide/content_cards/customizing_cards/index.md): Using Content Cards for banner-style messages? Try out Banners— perfect for inline, persistent in-app and web messages.
- [Customize the style of Content Cards](/docs/developer_guide/content_cards/customizing_cards/style/index.md): The default Content Cards UI is imported from the UI layer of the Braze SDK. From there, you can tweak certain parts of the card's styling, the order in which cards are displayed, and how the feed is shown to your users.
- # Customize the style of Content Cards
- ## Creating a custom style
- ## Customization examples
- ### Custom font
- ### Custom pinned icons
- ### Changing the unread indicator color
- ### Dark mode
- ### Disabling unread indicator
- [Customize the behavior of Content Cards](/docs/developer_guide/content_cards/customizing_cards/behavior/index.md): Braze enables you to send extra data payloads via Content Cards to user devices using key-value pairs. These can help you track internal metrics, update app content, and customize properties. Add key-value pairs using the dashboard.
- # Customize the behavior of Content Cards
- ## Key-value pairs
- ## Content Cards as supplemental content
- ### API-triggered key-value pairs
- ## Content Cards as interactive content
- ## Content Card badges
- ### Displaying the number of unread Content Cards as a badge
- [Customize the feed for Content Cards](/docs/developer_guide/content_cards/customizing_cards/feed/index.md): A session refers to the period of time the Braze SDK tracks user activity in your app after it's launched. You can also force a new session by calling the changeUser() method.
- # Customize the feed for Content Cards
- ## About the session lifecycle
- ## Refreshing the feed
- ### Automatic refresh
- ### Manual refresh
- #### Completion handler
- #### Async/Await
- ### Full sync vs. partial sync
- ### Rate limit
- ## Customizing displayed card order
- ## Customizing "empty feed" message
- ## Implementing multiple feeds
- ### Step 1: Set key-value pairs on cards
- ### Step 2: Filter Content Cards
- #### Step 2.1: Create a custom handler
- #### Step 2.2: Add it to a fragment
- [Log Analytics](/docs/developer_guide/content_cards/logging_analytics/index.md): When implementing your custom Content Cards, you can parse the Content Card objects and extract their payload data such as title, cardDescription, and imageUrl. Then, you can use the resulting model data to populate your custom UI.
- # Log analytics
- ## Logging analytics
- ### Step 1: Create a private subscriber variable
- ### Step 2: Subscribe to updates
- ### Step 3: Unsubscribe
- ### Step 1: Create a private subscriber variable
- ### Step 2: Subscribe to updates
- ### Step 3: Unsubscribe
- ### Cancellable
- ### AsyncStream
- ## Logging events
- ## Handling on-click behavior
- ## Unique dismissals higher than unique impressions
- ## Missing Content Cards analytics
- ## Content Card ID
- [Deep Linking in Content Cards](/docs/developer_guide/content_cards/deep_linking/index.md): At this time, Content Card deep links are not supported for the Web Braze SDK.
- # Deep Linking in Content Cards
- ## Prerequisites
- ## Creating a universal delegate
- ## Deep linking to app settings
- ## Customizing WebView activity {#CustomWebviewActivity}
- ## Troubleshooting
- ## Using Jetpack Compose
- ## Prerequisites
- ## Handling deep links
- ### Step 1: Register a scheme {#register-a-scheme}
- ### Step 2: Add a scheme allowlist
- ### Step 3: Implement a handler
- ## App Transport Security (ATS)
- ### Working with ATS
- ## Decoding URLs
- ## Deep linking to app settings
- ## Customization options {#customization-options}
- ### Default WebView customization
- ### Linking handling customization
- #### Universal links {#universal-links}
- ## Examples
- ### BrazeDelegate
- [Embed GIFs in Content Cards](/docs/developer_guide/content_cards/embedding_gifs/index.md): For wrapper SDKs not listed, use the relevant native Android or Swift method instead. Keep in mind, the Android and Swift Braze SDKs don't support animated GIFs natively, so you'll implement Content Card GIFs using third-party tools instead.
- # Embed GIFs in Content Cards
- ## About GIFs
- ## Integrating a custom image library
- ### Step 1: Creating the image loader delegate
- ### Fixing image loading for Android SDK 36.0.0 and later
- ### Step 2: Setting the image loader delegate
- ## Custom Image Loading with Jetpack Compose
- ## Prerequisites
- ## Integrating a custom image library
- ### Step 1: Integrate SDWebImage
- ### Step 2: Create a new Swift file
- ### Step 3: Add GIFViewProvider
- ### Step 4: Modify your AppDelegate.swift
- [Tutorial: Making an Inbox with Content Cards](/docs/developer_guide/content_cards/content_card_inbox/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK.
- # Tutorial: Making an Inbox with Content Cards
- ## Prerequisites
- ## Making an inbox with Content Cards for Android (Compose)
- ### 1. Enable debugging (optional)
- #### 2. Build a UI view
- #### 3. Subscribe to Content Card updates
- #### 4. Build a custom inbox UI
- #### 5. Track impressions and clicks
- ## Making an inbox with Content Cards for Android (RecyclerView)
- ### 1. Enable debugging (optional)
- #### 2. Build a UI view
- #### 3. Subscribe to Content Card updates
- #### 4. Build a custom inbox UI
- #### 5. Track impressions and clicks
- ## Prerequisites
- ## Making an inbox with Content Cards for Swift
- ### 1. Enable debugging (optional)
- #### 2. Build a UI View
- #### 3. Subscribe to Content Card updates
- #### 4. Build a custom inbox UI
- #### 5. Track impressions and clicks
- ## Prerequisites
- ## Making an inbox with Content Cards for Web
- ### 1. Enable debugging (optional)
- #### 2. Build the UI
- #### 3. Subscribe to Content Card updates
- #### 4. Build the inbox elements
- #### 5. Track impressions and clicks
- [In-app messages for the Braze SDK](/docs/developer_guide/in_app_messages/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. However, no additional setup is required.
- # In-app messages
- ## Prerequisites
- ## Message types
- ## Prerequisites
- ## Message types
- ## Enabling in-app messages
- ### Step 1: Register BrazeInAppMessageManager
- ### Step 2: Update the manager's blocklist (optional)
- ## Prerequisites
- ## Message types
- ## Enabling in-app messages
- ### Step 1: Create an implementation of BrazeInAppMessagePresenter
- ### Step 2: Handle no matching triggers
- ## Prerequisites
- ## About TV and OTT support
- ## Prerequisites
- ## Message types
- ## Prerequisites
- ## Message types
- ## Enabling in-app messages
- ### Customizing the in-app message presenter on iOS
- ## Prerequisites
- ## Message types
- ## Data model
- ### Messages
- ### Buttons
- ## Prerequisites
- ## Message types
- ## Enabling in-app messages
- ### Step 1: Add an observer
- ### Step 2: Access triggered messages
- ## Message fields
- ### Handling
- ### Styling
- ### Buttons
- ## Prerequisites
- ## Enabling in-app messages
- ### Step 1: Create a new iOS app
- ### Step 2: Get your app's API key
- ### Step 3: Integrate BrazeKit
- ### Step 4: Create your custom UI
- ## Prerequisites
- ## Message types
- ## Prerequisites
- ## Message types
- ## Next steps
- [Customize in-app messages for the Braze SDK](/docs/developer_guide/in_app_messages/customization/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK.
- # Customize in-app messages
- ## Prerequisites
- ## Custom styles
- ### Setting a default style
- ### Customizing the z-index
- ## Customizing message dismissals
- ## Customizing display timing
- ## Opening links in a new tab
- ## Prerequisites
- ## Setting custom manager listeners
- ### Step 1: Implement the custom manager listener
- #### Step 1.1: Implement IInAppMessageManagerListener
- #### Step 1.2: Hook into IAM view lifecycle methods (optional)
- ### Step 2: Instruct Braze to use the custom manager listener
- #### Altering in-app messages before display
- ## Setting custom factories
- ### Step 1: Implement the factory
- ### Step 2: Instruct Braze to use the factory
- #### How it works
- ## Custom styles
- ### Setting a default style
- ### Customizing the font
- ## Message dismissals
- ### Swiping to dismiss slideup messages
- ### Disabling back button dismissals
- ### Enabling outside tap dismissals
- ## Customizing the orientation
- ## Disabling dark theme {#android-in-app-message-dark-theme-customization}
- ## Customizing the Google Play review prompt
- ## Prerequisites
- ## Setting up the UI delegate (required)
- ### Step 1: Implement the BrazeInAppMessageUIDelegate protocol
- ### Step 2: Assign the delegate object
- ## On-click behavior
- ### Click action types
- ### Customizing on-click behavior
- ### Handling the custom behavior
- ## Swiping to dismiss slideup messages
- ## Customizing modal dismissals
- ## Customizing message orientation
- ## Customizing display timing
- ## Hiding the status bar
- ## Disabling dark mode
- ## Customizing the app store review prompt
- ### Step 1: Set the in-app message delegate
- ### Step 2: Disable the default App Store review message
- ### Step 3: Create a deep link
- ### Step 4: Set custom on-click behavior
- ## Prerequisites
- ## Methods for logging
- ## Handling message data
- ### Overriding the default UI delegate
- ### Overriding the default native UI
- ## Customizing the display behavior
- ## Setting a custom listener
- [Trigger in-app messages through the Braze SDK](/docs/developer_guide/in_app_messages/triggering_messages/index.md): In-app messages are triggered when the SDK logs one of the following custom event types: Session Start, Push Click, Any Purchase, Specific Purchase,and Custom Event (the last two containing robust property filters).
- # Trigger in-app messages
- ## Message triggers and delivery
- ## Types of in-app messages
- ### inapp (standard)
- ### templated_iam (templated)
- ## Key-value pairs
- ## Disabling automatic triggers
- ## Chaining two in-app messages in one session
- ## Overriding the default rate limit
- ## Manually triggering messages
- ### Using a server-side event
- #### Step 1: Create a push callback to receive the silent push
- #### Step 2: Create a push campaign
- #### Step 3: Create an in-app message campaign
- #### Step 1: Handle silent push and key-value pairs
- #### Step 2: Create a silent push campaign
- #### Step 3: Create an in-app message campaign
- ### Displaying a pre-defined message
- ### Displaying a message in real-time
- ## Causes of in-app message delays
- ## Exit-intent messages for Web
- [HTML in-app messages](/docs/developer_guide/in_app_messages/html_messages/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK.
- # HTML in-app messages
- ## Prerequisites
- ## About HTML messages
- ## Adding the interface to a WebView
- ## Embedding YouTube content
- ## Using deep links
- ## Prerequisites
- ## About HTML messages
- ## Adding the interface to a WebView
- ## Example: Logging a custom event
- [In-app message deep-linking for the Braze SDK](/docs/developer_guide/in_app_messages/deep_linking/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK.
- # In-app message deep-linking
- ## Prerequisites
- ## Creating a universal delegate
- ## Deep linking to app settings
- ## Customizing WebView activity {#CustomWebviewActivity}
- ## Troubleshooting
- ## Using Jetpack Compose
- ## Prerequisites
- ## Handling deep links
- ### Step 1: Register a scheme {#register-a-scheme}
- ### Step 2: Add a scheme allowlist
- ### Step 3: Implement a handler
- ## App Transport Security (ATS)
- ### Working with ATS
- ## Decoding URLs
- ## Deep linking to app settings
- ## Customization options {#customization-options}
- ### Default WebView customization
- ### Linking handling customization
- #### Universal links {#universal-links}
- ## Examples
- ### BrazeDelegate
- [Embed GIFs into in-app messages for the Braze SDK](/docs/developer_guide/in_app_messages/gifs/index.md): Braze offers the ability to use a custom image library to display animated GIFs. Although the example below uses Glide, any image library that supports GIFs is compatible.
- # Embed GIFs into in-app messages
- ## About GIFs
- ## Integrating a custom image library
- ### Step 1: Creating the image loader delegate
- ### Fixing image loading for Android SDK 36.0.0 and later
- ### Step 2: Setting the image loader delegate
- ## Custom Image Loading with Jetpack Compose
- ## Prerequisites
- ## Integrating a custom image library
- ### Step 1: Integrate SDWebImage
- ### Step 2: Create a new Swift file
- ### Step 3: Add GIFViewProvider
- ### Step 4: Modify your AppDelegate.swift
- [Log in-app message data through the Braze SDK](/docs/developer_guide/in_app_messages/logging_message_data/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK.
- # Log in-app message data
- ## Prerequisites
- ## Logging message data
- ## Prerequisites
- ## Logging message data
- ## Accessing message data
- ### Listen for in-app message data in the Dart layer
- ### Forward in-app message data from the native layer
- ### Replaying the callback for in-app messages (optional)
- ## Prerequisites
- ## Methods for logging
- ## Handling message data
- ### Overriding the default UI delegate
- ### Overriding the default native UI
- ## Prerequisites
- ## Logging message data
- ### Displayed messages
- ### Clicked messages
- ### Clicked buttons
- ### After processing a message
- ## Subscribing to in-app messages
- ## Parsing messages
- ## Logging message data
- [Send a test message for the Braze SDK](/docs/developer_guide/in_app_messages/sending_test_messages/index.md): After you set up a test segment, you can use it to test any of your Braze messaging channels. When set up correctly, this only needs to be done a single time.
- # Sending test messages
- ## Sending a test message
- ### Step 1: Create a designated test segment
- ### Step 2: Send the message
- ## Test limitations
- [Tutorials](/docs/developer_guide/in_app_messages/tutorials/index.md)
- [Tutorial: Conditionally displaying in-app messages](/docs/developer_guide/in_app_messages/tutorials/conditionally_displaying_messages/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. However, no additional setup is required.
- # Tutorial: Conditionally displaying in-app messages
- ## Prerequisites
- ## Conditionally displaying in-app messages for Web
- ### 1. Remove calls to automaticallyShowInAppMessages()
- #### 2. Enable debugging (optional)
- #### 3. Subscribe to in-app message updates
- #### 4. Create conditional logic
- #### 5. Display messages with showInAppMessage
- ## Prerequisites
- ## Conditionally displaying in-app messages for Android
- ### 1. Enable debugging (optional)
- #### 2. Register activity lifecycle callbacks
- #### 3. Set up an in-app message listener
- #### 4. Create conditional logic
- #### 5. Return or discard the message
- ## Prerequisites
- ## Conditionally displaying in-app messages for Swift
- ### 1. Implement the BrazeInAppMessageUIDelegate
- #### 2. Enable debugging (optional)
- #### 3. Set up your Braze UI and delegate
- #### 4. Override DisplayChoice with conditional logic
- [Tutorial: Customizing styling using key-value pairs](/docs/developer_guide/in_app_messages/tutorials/customizing_message_styling/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. However, no additional setup is required.
- # Tutorial: Customizing message styling using key-value pairs
- ## Prerequisites
- ## Customizing message styling using key-value pairs for Web
- ### 1. Remove calls to automaticallyShowInAppMessages()
- #### 2. Enable debugging (optional)
- #### 3. Subscribe to the in-app message callback handler
- #### 4. Access the message.extras property
- #### 5. Conditionally call showInAppMessage
- ## Prerequisites
- ## Customizing message styling using key-value pairs for Android
- ### 1. Enable debugging (optional)
- #### 2. Register activity lifecycle callbacks
- #### 3. Create your custom view factory class
- #### 4. Delegate to Braze’s default factory
- #### 5. Access key-value pairs from inAppMessage.extras
- #### 6. Implement a custom IInAppMessageViewFactory
- ## Prerequisites
- ## Customizing message styling using key-value pairs for Swift
- ### 1. Implement BrazeInAppMessageUIDelegate
- #### 2. Enable debugging (optional)
- #### 3. Prepare messages before they're displayed
- #### 4. Access key-value pairs from message.extras
- #### 5. Update the message's styling attributes
- [Tutorial: Deferring and restoring triggered messages](/docs/developer_guide/in_app_messages/tutorials/deferring_triggered_messages/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. However, no additional setup is required.
- # Tutorial: Deferring and restoring triggered messages
- ## Prerequisites
- ## Deferring and restoring triggered messages for Web
- ### 1. Remove calls to automaticallyShowInAppMessages()
- #### 2. Enable debugging (optional)
- #### 3. Subscribe to the in-app message callback handler
- #### 4. Defer the message instance
- #### 5. Retrieve a previously deferred message
- #### 6. Display the deferred message
- #### 7. Display a message immediately
- ## Prerequisites
- ## Deferring and restoring triggered messages for Android
- ### 1. Create a singleton Application instance
- #### 2. Enable debugging (optional)
- #### 3. Register activity lifecycle callbacks
- #### 4. Set up an in-app message listener
- #### 5. Create conditional logic
- #### 6. Create a method for displaying deferred messages
- #### 7. Trigger the method from your UI
- ## Prerequisites
- ## Deferring and restoring triggered messages for Swift
- ### 1. Implement the BrazeInAppMessageUIDelegate
- #### 2. Enable debugging (optional)
- #### 3. Set up your Braze UI and delegate
- #### 4. Override DisplayChoice with conditional logic
- #### 5. Create a method to show deferred messages
- #### 5. Trigger the method from your UI
- [Troubleshoot in-app messages for the Braze SDK](/docs/developer_guide/in_app_messages/troubleshooting/index.md): Before you debug, add yourself as a test user and review Sending test messages.
- # Troubleshoot in-app messages
- ## Start here: Match your symptom
- ## Standard investigation path
- ## Canvas in-app messages {#canvas-in-app-messages}
- ## In-app message didn't show for one user {#in-app-message-not-shown-for-one-user}
- ## In-app message didn't show on one platform {#in-app-message-not-shown-on-one-platform}
- ## In-app message didn't show for all users {#in-app-message-not-shown-for-all-users}
- ## Timing and delayed display {#timing-and-delayed-display}
- ## Delivery troubleshooting {#delivery-troubleshooting}
- ### Troubleshooting delivery {#troubleshooting-in-app-message-delivery}
- #### Check if messages are requested and returned
- ##### Troubleshoot messages not being requested {#troubleshoot-messages-not-being-requested}
- ##### Troubleshoot messages not being returned {#troubleshoot-messages-not-being-returned}
- ## Impressions and analytics {#impressions-and-analytics}
- ## Platform-specific display troubleshooting {#platform-specific-display-troubleshooting}
- ### Troubleshooting display {#troubleshooting-in-app-message-display}
- ### Troubleshooting display {#troubleshooting-in-app-message-display}
- ### Troubleshooting display {#troubleshooting-in-app-message-display}
- ### Troubleshooting asset loading (NSURLError code -1008) {#asset-loading}
- #### Domains
- #### Examples
- ##### Netfox
- ##### NetGuard
- ##### XNLogger
- [Push notifications for the Braze SDK](/docs/developer_guide/push_notifications/index.md): If Redirect to web URL with Open web URL inside app isn't selected, but the link still opens inside the app, the app may be handling the URL (for example, with universal links on iOS or App Links on Android). To open the link in the browser instead, confirm your app delegates the URL to the system browser when the user taps the notification, or adjust your app's URL handling so that the click action matches the Braze dashboard setting. See your platform's push documentation for how click actions and URL handling are configured.
- # Push notifications
- ## Prerequisites
- ## Push protocols
- ## Setting up push notifications
- ### Step 1: Configure your service worker
- ### Step 2: Register the browser
- ### Step 3: Disable skipWaiting (optional)
- ## Unsubscribing a user
- ## Alternate domains
- ### Use cases
- ### Considerations
- ### Setting up an alternate push domain
- #### Step 1: Initiate prompting flow
- #### Step 2: Register for push
- #### Step 3: Communicate between domains (optional)
- ## Frequently Asked Questions (FAQ)
- ### Service workers
- #### What if I can't register a service worker in the root directory?
- #### Can I create a service worker using a Tag Manager?
- ### Site security
- #### Is HTTPS required?
- #### When is a site considered "secure"?
- #### What if a secure site is not available?
- ## Prerequisites
- ## Built-in features
- ## About the push notification lifecycle {#push-notification-lifecycle}
- ## Setting up push notifications
- ### Rate limits
- ### Step 1: Add Firebase to your project
- ### Step 2: Add Cloud Messaging to your dependencies
- ### Step 3: Enable the Firebase Cloud Messaging API
- ### Step 4: Create a service account {#service-account}
- ### Step 5: Generate JSON credentials {#json}
- ### Step 6: Upload your JSON credentials to Braze
- ### Step 7: Set up automatic token registration
- ### Step 8: Remove automatic requests in your application class
- ## Displaying notifications
- ### Step 1: Register Braze Firebase Messaging Service
- ### Step 2: Conform small icons to design guidelines
- ### Step 3: Configure notification icons {#configure-icons}
- #### Specifying icons in braze.xml
- #### Specifying icon accent color
- ### Step 4: Add deep links
- #### Enabling automatic deep link opening
- ## Handling foreground notifications
- ### How it works
- ### Customizing foreground behavior
- #### Creating custom deep links
- #### Adding deep links
- #### Customizing back stack behavior
- ### Step 5: Define notification channels
- ### Step 6: Test notification display and analytics
- #### Testing display
- #### Testing analytics
- #### Testing from command line
- ## Conversation push notifications
- ### Usage requirements
- ## FCM quota exceeded errors
- ### Best practices
- #### Request a rate limit increase from FCM
- #### Apply a workspace rate limit
- ## Rate limits
- ## Setting up push notifications
- ### Step 1: Upload your APNs token
- ### Step 2: Enable push capabilities
- ### Step 3: Set up push handling
- #### Step 3.1: Enable automation in the push property
- #### Step 3.2: Override individual configurations (optional)
- #### Step 3.1: Register for push notifications with APNs
- #### Step 3.2: Register push tokens with Braze
- #### Step 3.3: Enable push handling
- ##### Default push handling
- ##### Foreground push handling
- ## Testing notifications {#push-testing}
- ## Subscribing to push notifications updates
- ## Handling foreground notifications
- ### How it works
- ## Push primers {#push-primers}
- ## Dynamic APNs gateway management
- ### Prerequisites
- ### How it works
- ### Frequently asked questions
- #### Why was this feature introduced?
- #### How does this impact push delivery performance?
- #### Can I disable this feature?
- ## About push notifications for Android TV
- ## Prerequisites
- ## Setting up push notifications
- ## Testing Android TV push notifications
- ## Best practices
- ## Prerequisites
- ## Enabling push deep linking
- ## Disabling basic push notifications (iOS only)
- ## Prerequisites
- ## Setting up push notifications
- ### Step 1: Complete the initial setup
- #### Step 1.1: Register for push
- #### Step 1.2: Get your Google Sender ID
- #### Step 1.3: Update your braze.xml
- #### Step 1.1: Upload APNs certificates
- #### Step 1.2: Add push notification support to your app
- ### Step 2: Listen for push notification events (optional)
- ##### Push notification event fields
- ### Step 3: Test displaying push notifications
- ## Prerequisites
- ## Setting up push notifications
- ### Step 1: Register for a Huawei developer account
- ### Step 2: Create a new Huawei app in the Braze dashboard
- ### Step 3: Integrate the Huawei messaging SDK into your app
- ### Step 4: Handle foreground notifications
- ### Step 5: Test your push notifications (optional)
- #### Step 5.1: Create a new push notification campaign
- #### Step 5.2: Send a test push
- #### Step 5.3: Set up Huawei segmentation (optional)
- ## Prerequisites
- ## Setting up push notifications {#setting-up-push-notifications}
- ### Step 1: Complete the initial setup
- #### Prerequisites
- #### Step 1.1: Update your app.json file
- #### Step 1.2: Add your Google Sender ID
- #### Step 1.3: Add the path to your Google Services JSON
- #### Step 1.1: Request for push permissions
- #### Step 1.2 (Optional): Migrate your push key
- ### Step 2: Request push notifications permission
- #### Step 2.1: Listen for push notifications (optional)
- ##### Push notification event fields
- ### Step 3: Enable deep linking (optional)
- #### Step 3.1: Store the push notification payload on app launch
- #### Step 3.2: Handle deep links from a closed state
- #### Step 3.1: Store the push notification payload on app launch {#step-3-1}
- #### Step 3.2: Handle deep links from a closed state
- #### Step 3.3: Enable Universal Links (optional)
- ### Step 4: Handle foreground notifications
- ### Step 5: Send a test push notification
- ## Using the Expo plugin
- ### Forwarding Android push to additional FMS
- ### Using app extensions with Expo Application Services {#app-extensions}
- ### Troubleshooting
- #### Push notifications stopped working {#troubleshooting-stopped-working}
- #### Device token won't register with Braze {#troubleshooting-token-registration}
- #### Deep links from push notifications don't open {#troubleshooting-deep-links}
- ## Prerequisites
- ## Setting up Safari push for mobile
- ### Step 1: Create a manifest file {#manifest}
- ### Step 2: Link the manifest file {#manifest-link}
- ### Step 3: Add a service worker {#service-worker}
- ### Step 4: Add to home screen {#add-to-homescreen}
- ### Step 5: Show the native push prompt {#push-prompt}
- ## Next steps
- ## Prerequisites
- ## Setting up push notification
- ### Step 1: Set up the platform
- #### Step 1.1: Enable Firebase
- #### Step 1.2: Set your Firebase credentials
- #### Step 1.1: Verify integration method
- #### Step 1.1: Enable ADM
- ### Step 2: Configure push notifications
- #### Step 2.1: Configure push settings {#unity_step-21-configure-push-settings}
- #### Step 2.1: Upload your APNs token
- #### Step 2.2: Enable automatic push
- #### Step 2.3: Enable background push (optional)
- #### Step 2.4: Disable automatic registration (optional)
- #### Step 2.1: Update AndroidManifest.xml
- #### Step 2.2: Store your ADM API key
- #### Step 2.3: Add ADM Jar
- #### Step 2.4: Add Client Secret and Client ID to your Braze dashboard
- ### Step 3: Set push listeners
- #### Step 3.1: Enable push received listener
- #### Step 3.2: Enable push opened listener
- #### Step 3.3: Enable push deleted listener
- #### Push listener example
- #### Step 3.1: Enable push received listener
- #### Step 3.2: Enable push opened listener
- #### Push listener example
- ## Optional configurations
- #### Deep linking to in-app resources
- #### Adding Braze push notification icons
- #### Push token callback
- ## Prerequisites
- ## Setting up push notifications
- ### Step 1: Update your project
- ### Step 2: Create your JSON credentials
- ### Step 3: Upload your JSON credentials
- ### Step 1: Complete the initial setup
- ### Step 2: Request push notifications permission
- [Customize push notifications for the Braze SDK](/docs/developer_guide/push_notifications/customization/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK. You'll also need to set up push notifications.
- # Customize push notifications
- ## Prerequisites
- ## Using a callback for push events {#push-callback}
- ## Customizing notification display {#customization-display}
- ### Step 1: Create your custom notification factory
- ### Step 2: Set your custom notification factory
- ## Rendering multicolor text
- ### Supported HTML tags
- ## Rendering inline images
- ### How it works
- ### Compatibility
- ### Sending an inline image push
- ## Settings
- ### Notification ID {#notification-id}
- ### Firebase Messaging Delivery priority {#fcm-priority}
- ### Time to live (TTL) {#ttl}
- ### Summary text {#summary-text}
- ### Custom URIs {#custom-uri}
- ### Notification display priority {#notification-priority}
- ### Sounds {#sounds}
- ## Prerequisites
- ## Customizing action buttons {#push-action-buttons-integration}
- ### Manually registering action buttons
- #### Step 1: Adding Braze default push categories {#registering}
- #### Step 2: Enable interactive push handling {#enable-push-handling}
- ## Customizing push categories {#customizing-push-categories}
- ### Step 1: Register a category
- ### Step 2: Select your categories
- ### Example: Custom push category {#example-custom-push-category}
- ## Customizing badges
- ## Customizing sounds
- ### Step 1: Host the sound in your app
- #### Converting sound files
- ### Step 2: Provide a protocol URL for the sound
- ## Settings
- ### Key-value pairs
- ### Alert options
- ### Adding content-available flag
- ### Adding mutable-content flag
- ### Collapse ID
- ### Expiry
- ## Prerequisites
- ## Settings
- ### Time to live (TTL) {#ttl}
- ### Summary text {#summary-text}
- ### Custom URIs {#custom-uri}
- ### Notification display priority
- ### Sounds {#sounds}
- ## Prerequisites
- ## Push customization in React Native
- ### iOS customization
- ### Android customization
- [Deep linking in push notifications for the Braze SDK](/docs/developer_guide/push_notifications/deep_linking/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK.
- # Deep linking in push notifications
- ## Prerequisites
- ## Creating a universal delegate
- ## Deep linking to app settings
- ## Customizing WebView activity {#CustomWebviewActivity}
- ## Troubleshooting
- ## Using Jetpack Compose
- ## Prerequisites
- ## Handling deep links
- ### Step 1: Register a scheme {#register-a-scheme}
- ### Step 2: Add a scheme allowlist
- ### Step 3: Implement a handler
- ## App Transport Security (ATS)
- ### Working with ATS
- ## Decoding URLs
- ## Deep linking to app settings
- ## Customization options {#customization-options}
- ### Default WebView customization
- ### Linking handling customization
- #### Universal links {#universal-links}
- ## Examples
- ### BrazeDelegate
- ## Prerequisites
- ## Implementing deep linking
- ### Step 1: Set up Flutter's built-in handling
- ### Step 2: Forward data to the Dart layer (optional)
- #### Example: Deep linking to an alert dialog
- ## Prerequisites
- ## Enabling push deep linking
- [iOS deep linking guide](/docs/developer_guide/push_notifications/ios_deep_linking_guide/index.md): For implementation details, see Deep linking. For troubleshooting, see Deep linking troubleshooting.
- # iOS deep linking guide
- ## Choosing a link type
- ### Custom scheme deep links
- ### Universal links
- ### "Open Web URL Inside App"
- ## What you need for each link type
- ### Custom scheme deep links
- ### Universal links
- ### "Open Web URL Inside App"
- ## When you need an AASA file {#when-aasa}
- ## When you need app code to handle links {#when-app-code}
- ## Using Branch with Braze {#branch}
- [Deep linking troubleshooting](/docs/developer_guide/push_notifications/deep_linking_troubleshooting/index.md): If a custom scheme deep link (for example, myapp://products/123) opens your app but doesn't navigate to the intended screen:
- # Deep linking troubleshooting
- ## Custom scheme deep link doesn't open the correct view
- ## Universal link opens in Safari instead of the app
- ### Verify the Associated Domains entitlement
- ### Validate the AASA file
- ### Check the AppDelegate
- ### Verify Braze SDK configuration
- ### Check for the long-press issue
- ## Deep link from email doesn't open the app
- ### Verify click-tracking domain AASA
- ### Check the redirect chain
- ## Deep link works from push but not from in-app messages (or vice versa)
- ### Check the BrazeDelegate
- ### Enable verbose logging
- ### Check for custom display delegates
- ## "Open Web URL Inside App" shows a blank or broken page
- ## Troubleshooting Branch with Braze {#branch}
- ### Verify the BrazeDelegate routes to Branch
- ### Check Branch link domain
- ### Enable both SDKs' logging
- ### Check Branch dashboard configuration
- ### Test Branch links independently
- ## General debugging tips
- ### Use verbose logging
- ### Test links in isolation
- ### Test on a physical device
- [Set up silent push notifications for the Braze SDK](/docs/developer_guide/push_notifications/silent/index.md): Before you can use this feature, you'll need to integrate the Android Braze SDK. You'll also need to set up push notifications.
- # Silent push notifications
- ## Prerequisites
- ## Setting up silent push notifications
- ## Prerequisites
- ## iOS limitations
- ## Setting up silent push notifications
- ## Sending silent push notifications
- ## Ignoring internal push notifications
- ### Step 1: Check your app for automatic actions
- ### Step 2: Use the internal push utility method
- ## Prerequisites
- ## Setting up silent push notifications
- [Set up rich push notifications for the Braze SDK](/docs/developer_guide/push_notifications/rich/index.md): Before you can use this feature, you'll need to integrate the Swift Braze SDK. You'll also need to set up push notifications.
- # Rich push notifications
- ## Prerequisites
- ## Setting up rich push notifications
- ### Step 1: Creating a service extension
- ### Step 2: Setting up the notification service extension
- ### Step 3: Adding an App Group
- ### Step 4: Integrating rich push notifications
- #### Adding the rich push framework to your app
- #### Using your own UNNotificationServiceExtension
- ### Step 5: Configuring the App Group in Braze
- ### Step 6: Creating a rich notification in your dashboard
- ## Prerequisites
- ## Setting up rich push notifications
- ### Step 1: Create a notification service extension
- ### Step 2: Add a new target
- ### Step 3: Reinstall your CocoaPods dependencies
- ## Prerequisites
- ## Using Expo to enable rich push notifications
- [Set up push stories for the Braze SDK](/docs/developer_guide/push_notifications/push_stories/index.md): Before you can use this feature, you'll need to integrate the Swift Braze SDK. You'll also need to set up push notifications, which includes implementing the UNNotification framework.
- # Push stories
- ## Prerequisites
- ## Setting up Push Stories
- ### Step 1: Adding the Notification Content Extension target {#notification-content-extension}
- ### Step 2: Enable capabilities {#enable-capabilities}
- #### Adding an App Group
- ### Step 3: Adding the Push Story framework to your app {#enable-capabilities}
- ### Step 4: Updating your notification view controller {#enable-capabilities}
- #### Custom handling push story events
- ### Step 5: Setting the Notification Content Extension plist {#notification-content-extension}
- ### Step 6: Updating the Braze integration in your main app {#update-braze}
- ## Prerequisites
- ## Setting up push stories
- ### Step 1: Create a notification content extension
- ### Step 2: Configure your push app group
- ### Step 3: Add a new target
- ### Step 4: Reinstall your CocoaPods dependencies
- ## Prerequisites
- ## Enabling push stories
- [Set up soft push prompts for the Braze SDK](/docs/developer_guide/push_notifications/soft_push_prompts/index.md): Before you can use this feature, you'll need to integrate the Web Braze SDK. You'll also need to set up push notifications.
- # Soft push prompts for Web
- ## Prerequisites
- ## About soft push prompts
- ## Setting up soft push prompts
- ### Step 1: Create a push primer campaign
- ### Step 2: Remove calls
- ### Step 3: Update integration
- [Push analytics and custom event logging](/docs/developer_guide/push_notifications/logging_message_data/index.md): Before you start, complete the initial push notification integration for your platform:
- # Push analytics and custom event logging
- ## Prerequisites
- ## Native push analytics vs. custom event logging
- ## What Braze logs automatically
- ## Preserving native push analytics with custom push handling
- ## Logging custom data from push payloads
- ### Option A: Log with the /users/track endpoint
- ### Option B: Log with SDK methods after app launch
- ## Logging from a notification content extension (Swift)
- ### Step 1: Configure app groups in Xcode
- ### Step 2: Choose what to log
- #### Saving custom events
- #### Sending custom events to Braze
- #### Saving custom attributes
- #### Sending custom attributes to Braze
- #### Saving user attributes
- #### Sending user attributes to Braze
- #### RemoteStorage helper file
- #### UserAttribute helper file
- #### EventName dictionary helper file
- ## Analyzing results
- ## Related references
- [Send Test Messages](/docs/developer_guide/push_notifications/sending_test_messages/index.md): After you set up a test segment, you can use it to test any of your Braze messaging channels. When set up correctly, this only needs to be done a single time.
- # Sending test messages
- ## Sending a test message
- ### Step 1: Create a designated test segment
- ### Step 2: Send the message
- ## Test limitations
- [About push subscription states](/docs/developer_guide/push_notifications/subscription_states/index.md): A "Push Subscription State" in Braze identifies a user's global preference for their desire to receive push notifications. Because the subscription state is user-based, it is not specific to any individual app. Subscription states become helpful flags when deciding which users to target for push notifications.
- # About push subscription states
- ## Push subscription states {#push-sub-states}
- ### Push registration and reachable users
- ### Updating push subscription states {#update-push-subscription-state}
- #### Automatic opt-in (default)
- #### SDK integration
- #### REST API
- ### Differences between push enablement and push subscription status
- ### Imported push tokens (iOS)
- ### Checking push subscription state
- [Troubleshoot push notifications for the Braze SDK](/docs/developer_guide/push_notifications/troubleshooting/index.md): If you're experiencing issues after setting up push notifications, consider the following:
- # Troubleshoot push notifications
- ## Troubleshooting
- ## Understanding the Braze push workflow
- ### Step 1: Configuring your Google Cloud API key
- ### Step 2: Devices register for FCM and provide Braze with push tokens
- ### Step 3: Launching a Braze push campaign
- ### Step 4: Removing invalid tokens
- ## Utilizing the push error logs
- ## Troubleshooting scenarios
- ### Push isn't sending
- ### No "push registered" users showing in the Braze dashboard (prior to sending messages)
- #### Incorrect sender ID
- #### Braze registration not occurring
- #### Google Play Services not present
- #### Device not connected to the internet
- ### Tapping push notification doesn't open the app
- ### Push notifications bounced
- #### Error: MismatchSenderID
- #### Error: InvalidRegistration
- #### Error: NotRegistered
- ### Push notifications sent but not displayed on users' devices
- #### Application was force quit
- #### BrazeFirebaseMessagingService not registered
- #### Firewall is blocking push
- #### Custom notification factory returning null
- ### "Push registered" users no longer enabled after sending messages
- #### Application was uninstalled
- #### Invalid Firebase Cloud Messaging server key
- ### Push clicks not logged
- ### Deep links not working
- #### Verify deep link configuration
- #### Verify custom handling logic
- #### Disable back stack behavior
- ## Understanding the Braze/APNs workflow
- ### Step 1: Configuring the push certificate and provisioning profile
- ### Step 2: Devices register for APNs and provide Braze with push tokens
- #### Considerations for push token generation
- ### Step 3: Launching a Braze push campaign
- ### Step 4: Removing invalid tokens
- ## Using the push error logs
- ### Message Activity Log errors
- #### Received unregistered sending to push token {#received-unregistered-sending}
- #### Device token not for topic
- #### BadDeviceToken sending to push token
- ## Push registration issues
- ### No push registration prompt
- ### No "push registered" users showing in the dashboard (prior to sending messages)
- ## Push notifications sent but not displayed on users’ devices
- ### "Push registered" users no longer enabled after sending messages
- #### Dashboard and app certificate mismatch
- #### Application was uninstalled
- #### Regenerating your provisioning profile
- ### Messages not delivered to "push registered" users
- #### App is foregrounded
- #### Test notification scheduled incorrectly
- ### User not "push registered" for the app being tested
- ## Push clicks not logged {#push-clicks-not-logged}
- ## Deep links not working
- ### Web links from push clicks not opening
- ### Deep links from push clicks not opening
- ## Understanding the Braze push workflow
- ### Step 1: Configuring your Google Cloud API key
- ### Step 2: Devices register for FCM and provide Braze with push tokens
- ### Step 3: Launching a Braze push campaign
- ### Step 4: Removing invalid tokens
- ## Utilizing the push error logs
- ## Troubleshooting scenarios
- ### Push isn't sending
- ### No "push registered" users showing in the Braze dashboard (prior to sending messages)
- #### Incorrect sender ID
- #### Braze registration not occurring
- #### Google Play Services not present
- #### Device not connected to the internet
- ### Tapping push notification doesn't open the app
- ### Push notifications bounced
- #### Error: MismatchSenderID
- #### Error: InvalidRegistration
- #### Error: NotRegistered
- ### Push notifications sent but not displayed on users' devices
- #### Application was force quit
- #### BrazeFirebaseMessagingService not registered
- #### Firewall is blocking push
- #### Custom notification factory returning null
- ### "Push registered" users no longer enabled after sending messages
- #### Application was uninstalled
- #### Invalid Firebase Cloud Messaging server key
- ### Push clicks not logged
- ### Deep links not working
- #### Verify deep link configuration
- #### Verify custom handling logic
- #### Disable back stack behavior
- ## Troubleshooting
- ### Push doesn't appear after app is closed from task switcher
- ### Custom notification factory not being set correctly
- ## Line breaks in push notifications {#push-linebreaks}
- [Advanced push notification examples for the Braze SDK](/docs/developer_guide/push_notifications/examples/index.md):
- # Web SDK repository guide
- ## About the Braze Web SDK
- ### What You Can Do
- ## Prerequisites
- ### Getting Your Credentials
- ## Installation
- ## Quick Start
- ## Configuration Reference
- ### Initialization Options
- ## Core Features
- ### Initialization & Setup
- #### Basic Initialization
- #### Advanced Initialization Options
- ### User Management
- #### Change User
- #### Set User Attributes
- #### Set User Location
- #### User Aliases and Subscription Groups
- #### User Logout
- ### In-App Messages
- #### Automatic Display
- #### Manual Display
- #### Custom In-App Message Handling
- #### Log In-App Message Interactions
- #### Custom HTML In-App Messages
- ### Content Cards
- #### Display Content Cards
- #### Subscribe to Content Cards Updates
- #### Log Content Card Interactions
- #### Filter Content Cards
- #### Request Content Cards Refresh
- #### Custom Content Cards
- ### Push Notifications
- #### Request Push Permission
- #### Check Push Support
- #### Unregister Push
- ### Feature Flags
- #### Get Feature Flag
- #### Subscribe to Feature Flag Updates
- #### Log Feature Flag Impressions
- #### Request Feature Flags Refresh
- ### Banners
- #### Get and Display Banners
- #### Subscribe to Banner Updates
- #### Request Banner Refresh
- ### Analytics & Events
- #### Log Custom Events
- #### Log Purchases
- #### Request Data Flush
- ### Session Management
- #### Open Session
- #### Check SDK Status
- #### Enable/Disable SDK
- ### Data Management
- #### Wipe Data
- #### Destroy SDK
- #### Get Device ID
- #### SDK Authentication
- #### Subscribe to Authentication Failures
- ## Integration Patterns
- ### SSR Frameworks
- ### Vite
- ### Jest Framework
- ### Asynchronous Module Definition (AMD)
- #### Disable AMD Support
- #### Module Loader
- ### Accelerated Mobile Pages (AMP)
- ### Electron
- ### CDN Integration
- ### Service Worker (Push Notifications)
- ### Tag Managers
- #### Tealium iQ
- #### Other Tag Managers
- ## Libraries
- ## Supported Browsers
- ## Debugging & Troubleshooting
- ## Font Awesome
- ## Additional Resources
- ## Contact
- [Android SDK repository guide](/docs/developer_guide/sdk_repository_guides/android/index.md):
- # Android SDK repository guide
- ## About the Braze Android SDK
- ## Quickstart
- ## Version support
- ## Modules
- ## Contact
- [Swift SDK repository guide](/docs/developer_guide/sdk_repository_guides/swift/index.md):
- # Swift SDK repository guide
- ## About the Braze Swift SDK
- ## Quickstart
- ## Version support
- ## Package Managers
- ## Libraries
- ## Examples
- ## Alternative Repositories
- ## Contact
- [JavaScript SDK repository guide](/docs/developer_guide/sdk_repository_guides/javascript/index.md):
- # JavaScript SDK repository guide
- ## About the Braze JavaScript SDK
- ### Architecture Overview
- ## Quickstart
- ## Prerequisites
- ### Getting Your Credentials
- ## Integration
- ### Calling the API
- ### Core Concepts
- #### Required Implementations
- #### Data Flushing
- ### Integration Patterns
- #### Basic Integration
- #### Custom Storage Implementation
- #### Custom Network Implementation
- #### Error Handling
- #### Subscription Management
- ### Common Use Cases
- #### User Identification and Attribute Tracking
- #### Event Logging and Analytics
- #### In-App Message Handling
- ### Error Handling & Edge Cases
- #### Common Error Conditions
- ### Important Implementation Notes
- ## Debugging / Troubleshooting
- ## Contact
- [Cordova SDK repository guide](/docs/developer_guide/sdk_repository_guides/cordova/index.md):
- # Cordova SDK repository guide
- ## About the Braze Cordova SDK
- ## Minimum version requirements
- ## Installing the SDK
- ## Running the sample application
- [Flutter SDK repository guide](/docs/developer_guide/sdk_repository_guides/flutter/index.md):
- # Flutter SDK repository guide
- ## About the Braze Flutter SDK
- ## Quickstart
- ### Android
- ### iOS
- ### Dart
- ## Version support
- ## Sample App
- ## Contact
- [React Native SDK repository guide](/docs/developer_guide/sdk_repository_guides/react_native/index.md):
- # React Native SDK repository guide
- ## About the Braze React Native SDK
- ### What you can do
- ## Prerequisites
- ## Installation
- ## Quick start
- ## Native setup
- ### Android
- ### iOS
- ## Configuration reference
- ### Android (braze.xml)
- ### iOS (Braze.Configuration)
- ## JavaScript / TypeScript API
- ## Core features
- ### User management
- ### In-app messages
- ### Content Cards
- ### Banners
- ### Push notifications
- ### Feature flags
- ### Analytics and purchases
- ### Data management and SDK state
- ## Events
- ## Integration notes
- ## - Jest: mock react-native native modules or the Braze Turbo module (see tests/jest.setup.js in this repo for patterns).
- ## Version support
- ## Braze Expo plugin
- ## Sample app
- ## Debugging and troubleshooting
- ## Additional resources
- ## Contact
- [Roku SDK repository guide](/docs/developer_guide/sdk_repository_guides/roku/index.md):
- # Roku SDK repository guide
- ## About the Braze Roku SDK
- ## Initial SDK Integration
- ## Step 1: Add Files
- ## Step 2: Add References
- ## Step 3: Configure
- ## Step 4: Initialize Braze
- ## In-App Message Setup
- ## Basic SDK Integration Complete
- ## Additional Reference
- [Unity SDK repository guide](/docs/developer_guide/sdk_repository_guides/unity/index.md):
- # Unity SDK repository guide
- ## About the Braze Unity SDK
- ## Plugin Setup
- ## Integration Setup
- ## Contact
- [.NET MAUI (Xamarin) SDK repository guide](/docs/developer_guide/sdk_repository_guides/xamarin/index.md):
- # .NET MAUI (Xamarin) SDK repository guide
- ## About the Braze .NET MAUI (Xamarin) SDK
- ## Components
- ## Versioning
- ### Native Bindings
- ### Xamarin & Xamarin.Forms
- ## Questions?
- [Changelogs](/docs/developer_guide/changelogs/index.md): You can also find a copy of the Web Braze SDK changelog on GitHub.
- # Braze SDK changelogs
- [Disclosures and Qualifications](/docs/developer_guide/disclosures/index.md)
- [Security Vulnerability Disclosure](/docs/developer_guide/disclosures/security_and_vulnerability_disclosure/index.md):