diff --git a/.gitignore b/.gitignore
index 897a013b30..e26089dc29 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,4 +8,3 @@ _algolia_api_key
.ruby-version
jekyll-algolia-*
**/.asset_pipeline
-/_docs/_hidden/private_betas/*
diff --git a/Archive/academy/_site/404.html b/Archive/academy/_site/404.html
index 78607a1e9e..5df55d2e86 100644
--- a/Archive/academy/_site/404.html
+++ b/Archive/academy/_site/404.html
@@ -38,7 +38,7 @@
+```gradle
+dependencies {
+ implementation "com.appboy:android-sdk-ui:+"
+}
+```
The below example shows where to place the dependency line in your `build.gradle`. Note that the version used in the example below uses an old version. Please visit [Braze Android SDK Releases][60] for the most up to date version of the Braze Android SDK.
@@ -132,22 +128,23 @@ The second argument instructs the listener to handle `registerInAppMessageManage
See the [javadoc][63] for more information. Please note that any non-standard manual session integration is not fully supported.
-### Step 5: Optional Custom Endpoint Setup
-
-If you have been set up with a custom endpoint your Customer Success Manager will advise you of the correct address. To update the default endpoint in your integration of the Braze SDKs please add the following code:
+### Step 5: Custom Endpoint Setup {#step-5-optional-custom-endpoint-setup}
-**Android**
+Your Braze representative should have already advised you of the [correct endpoint]({{ site.baseurl }}/user_guide/administrative/access_braze/sdk_endpoints/).
-Add the following code to your `appboy.xml`:
+To update the default endpoint in your integration of the Braze SDKs please add the following code to your `appboy.xml`:
```xml
YOUR_CUSTOM_ENDPOINT_OR_CLUSTER
```
-> SDK Endpoint configuration via `appboy.xml` is available starting with Braze Android SDK v2.1.1.
+The SDK Endpoint configuration via `appboy.xml` is available starting with __Braze Android SDK v2.1.1__.
### SDK Integration Complete
-Braze should now be collecting data from your application and your basic integration should be complete. Please see the following sections in order to enable custom event tracking, push messaging, the news-feed and the complete suite of Braze features.
+
+Braze will now be able to collect [specified data from your application]({{ site.baseurl }}/user_guide/data_and_analytics/user_data_collection/overview/) and your basic integration should be complete.
+
+Please see the following sections in order to enable [custom event tracking](/developer_guide/platform_integration_guides/android/analytics/tracking_custom_events/#tracking-custom-events), [push messaging](/developer_guide/platform_integration_guides/android/push_notifications/integration/), the [news feed](/developer_guide/platform_integration_guides/android/news_feed/overview/) and the [complete suite](/developer_guide/platform_integration_guides/android/initial_sdk_setup/android_sdk_integration/) of Braze features.
[1]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/news_feed/customization/#news-feed-customization
[2]: {{ site.baseurl }}/user_guide/introduction/
diff --git a/_docs/_developer_guide/platform_integration_guides/android/news_feed/categories.md b/_docs/_developer_guide/platform_integration_guides/android/news_feed/categories.md
index 1894aedcb6..4732b21a08 100644
--- a/_docs/_developer_guide/platform_integration_guides/android/news_feed/categories.md
+++ b/_docs/_developer_guide/platform_integration_guides/android/news_feed/categories.md
@@ -7,7 +7,7 @@ platform: Android
# Defining a News Feed Category
-Instances of the Braze News Feed can be configured to only receive cards from a certain “category”. This allows for effective integration of multiple News Feed streams within a single application. For more information on this feature see [Braze Academy][14]
+Instances of the Braze News Feed can be configured to only receive cards from a certain “category”. This allows for effective integration of multiple News Feed streams within a single application. For more information on this feature see more in our [News Feed best practices][14]
News Feed Categories can be defined by calling the following methods as you load the News Feed:
diff --git a/_docs/_developer_guide/platform_integration_guides/android/push_notifications/html_rendered_push.md b/_docs/_developer_guide/platform_integration_guides/android/push_notifications/html_rendered_push.md
new file mode 100644
index 0000000000..0ab33e44f9
--- /dev/null
+++ b/_docs/_developer_guide/platform_integration_guides/android/push_notifications/html_rendered_push.md
@@ -0,0 +1,59 @@
+---
+nav_title: HTML Push Notifications
+platform: Android
+page_order: 6
+search_rank: 5
+---
+## HTML Push Notifications
+
+In Braze SDK version 3.1.1, HTML can be sent to a device to render multicolor text in push notifications.
+
+![Multicolor push example][1]
+
+The above example is rendered with the following HTML:
+
+```html
+
MultiColorPush
+```
+
+```html
+
testmessage
+```
+
+> Android OS limits what HTML elements/tags are valid in push notifications. For example, `marquee` is not allowed.
+
+### Implementation
+
+In your `appboy.xml`:
+
+```xml
+true
+```
+
+Or in your [AppboyConfig][2]:
+
+{% tabs %}
+{% tab JAVA %}
+
+```java
+AppboyConfig appboyConfig = new AppboyConfig.Builder()
+ .setPushHtmlRenderingEnabled(true)
+ .build();
+Appboy.configure(this, appboyConfig);
+```
+
+{% endtab %}
+{% tab KOTLIN %}
+
+```kotlin
+val appboyConfig = AppboyConfig.Builder()
+ .setPushHtmlRenderingEnabled(true)
+ .build()
+Appboy.configure(this, appboyConfig)
+```
+
+{% endtab %}
+{% endtabs %}
+
+[1]: {% image_buster /assets/img/multicolor_android_push.png %}
+[2]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/advanced_use_cases/runtime_configuration/#runtime-configuration
diff --git a/_docs/_developer_guide/platform_integration_guides/android/push_notifications/integration.md b/_docs/_developer_guide/platform_integration_guides/android/push_notifications/integration.md
index 3f5e5d1573..583ea28a72 100644
--- a/_docs/_developer_guide/platform_integration_guides/android/push_notifications/integration.md
+++ b/_docs/_developer_guide/platform_integration_guides/android/push_notifications/integration.md
@@ -12,7 +12,7 @@ Sample push notification:
![Sample Push][27]
-Check out [Braze Academy][7] for additional best practices.
+Check out [Braze Docs][7] for additional best practices.
Braze sends push notifications to Android devices using [Firebase Cloud Messaging (FCM)][45].
@@ -22,17 +22,13 @@ For devices without Google services installed, Braze offers the option to send p
## Registering for Push
-Use Firebase to register for push.
+Use [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/) (FCM) to register for push.
> Though you could previously use GCM, Google has announced that they will remove support for GCM as soon as April 11, 2019 and automatic GCM registration is unavailable through the Braze SDK. If your app is currently supporting GCM, we advise that you speak to your development teams about transitioning to [Firebase from GCM](https://developers.google.com/cloud-messaging/android/android-migrate-fcm) as soon as possible.
### Firebase Integration
-We recommend using [Firebase Cloud Messaging](https://firebase.google.com/docs/cloud-messaging/) (FCM) for push.
-
-Apps already using any of the Firebase SDKs must use the Firebase Messaging SDK to receive Braze pushes. This is because Firebase is not guaranteed to be compatible with GCM in all versions of Google Play Services.
-
For a full sample of using Firebase with the Braze Android SDK, see our [Firebase Push sample app](https://github.com/Appboy/appboy-android-sdk/tree/master/samples/firebase-push).
#### Step 1: Enable Firebase
@@ -42,16 +38,15 @@ To get started, follow the instructions at [Add Firebase to Your Android Project
Next, add the Firebase Messaging dependency to your module's `build.gradle`:
```gradle
-compile "com.google.firebase:firebase-messaging:"
+implementation "com.google.firebase:firebase-core:${FIREBASE_CORE_VERSION}"
+implementation "com.google.firebase:firebase-messaging:${FIREBASE_PUSH_MESSAGING_VERSION}"
```
-> Firebase Messaging is the only Firebase dependency that Braze requires for push messaging.
-
#### Step 2: Configure Token Registration
-Braze push notifications won't work until a Firebase Cloud Messaging token is registered. Firebase tokens can either be registered by the Braze SDK automatically (recommended) or manually registered. Tokens can be manually registered using the [`Appboy.registerAppboyPushMessages()`][35] method either directly or using a Firebase Instance ID Service.
+Braze push notifications won't work until a Firebase Cloud Messaging token is registered. Firebase tokens can either be registered by the Braze SDK automatically (recommended) or manually registered. Tokens can be manually registered using the [`Appboy.registerAppboyPushMessages()`][35] method.
-> Make sure to use your [project number][11], not the project ID. The project number is also known as the Firebase sender ID.
+> Make sure to use your Firebase Sender ID. This is a unique numerical value created when you create your Firebase project, available in the Cloud Messaging tab of the Firebase console Settings pane. The sender ID is used to identify each sender that can send messages to the client app.
##### Option 1: Automatic Registration
@@ -93,7 +88,7 @@ Appboy.configure(this, appboyConfig)
If using a Firebase automatic registration, you can skip the manual options below.
-##### Option 2: Manual Application onCreate() Registration
+##### Option 2: Manual Registration
We recommended you call [`Appboy.registerAppboyPushMessages()`][35] from within your application [`onCreate()`][67] method to ensure that push tokens are reliably delivered to Braze.
@@ -189,28 +184,72 @@ If you're not familiar with the location of your Firebase Server Key and Sender
After completing this section, you should be able to receive and display push notifications sent by Braze.
-### Step 1: Register Braze FCM Receiver
+### Step 1: Register Braze Firebase Messaging Service
+Braze includes a service to handle push receipt and open intents. Our `AppboyFirebaseMessagingService` class will need to be registered in your `AndroidManifest.xml`.
-Braze includes a `FcmReceiver` to handle push receipt and open intents. Our `FcmReceiver` class will need to be registered in your `AndroidManifest.xml`.
+```xml
+
+
+
+
+
+```
-- Add `AppboyFcmReceiver` to your `AndroidManifest.xml`. The category should be set to your [application package name][13]:
+Braze's notification code also uses `AppboyFirebaseMessagingService` to handle open and click action tracking. This service must be registered in the `AndroidManifest.xml` in order for that to function correctly. Also, keep in mind that Braze prefixes notifications from our system with a unique key to ensure we only render notifications sent from Braze's systems. You may register additional services separately in order to render notifications sent from other FCM services.
- ```xml
-
-
-
-
-
-
- ```
+{% alert important %}
+If you already have a Firebase Messaging Service registered, do not complete this step. Instead, proceed to [Using Your Own Firebase Messaging Service](#using-your-own-firebase-messaging-service) and complete the steps listed there.
+{% endalert %}
+
+##### Using Your Own Firebase Messaging Service
+
+If you already have a Firebase Messaging Service registered, you can pass [`RemoteMessage`][75] objects to Braze via [AppboyFirebaseMessagingService.handleBrazeRemoteMessage()][74]. This method will only display a notification if the [`RemoteMessage`][75] object originated from Braze and will safely ignore if not.
+
+{% tabs %}
+{% tab JAVA %}
+
+```java
+public class MyFirebaseMessagingService extends FirebaseMessagingService {
+ @Override
+ public void onMessageReceived(RemoteMessage remoteMessage) {
+ super.onMessageReceived(remoteMessage);
+ if (AppboyFirebaseMessagingService.handleBrazeRemoteMessage(this, remoteMessage)) {
+ // This Remote Message originated from Braze and a push notification was displayed.
+ // No further action is needed.
+ } else {
+ // This Remote Message did not originate from Braze.
+ // No action was taken and you can safely pass this Remote Message to other handlers.
+ }
+ }
+}
+```
+
+{% endtab %}
+{% tab KOTLIN %}
+
+```kotlin
+class MyFirebaseMessagingService : FirebaseMessagingService() {
+ override fun onMessageReceived(remoteMessage: RemoteMessage?) {
+ super.onMessageReceived(remoteMessage)
+ if (AppboyFirebaseMessagingService.handleBrazeRemoteMessage(this, remoteMessage)) {
+ // This Remote Message originated from Braze and a push notification was displayed.
+ // No further action is needed.
+ } else {
+ // This Remote Message did not originate from Braze.
+ // No action was taken and you can safely pass this Remote Message to other handlers.
+ }
+ }
+}
+```
-Braze's notification code also uses `AppboyFcmReceiver` to handle open and click action tracking. This receiver must be registered in the `AndroidManifest.xml` in order for that to function correctly. Also, keep in mind that Braze prefixes notifications from our system with a unique key and ensures that our broadcast receivers only render notifications sent from Braze's systems. You may register additional receivers separately in order to render notifications sent from other FCM services.
+{% endtab %}
+{% endtabs %}
-**Note** Before Braze Android SDK `2.7.0`, `AppboyFcmReceiver` is known as `AppboyGcmReceiver`. Their functionality is equivalent and integration instructions remain the same, however, all references to `AppboyFcmReceiver` in your `AndroidManifest.xml` and code will need to be replaced by references to `AppboyGcmReceiver`.
+> Before Braze SDK 3.1.1, `AppboyFcmReceiver` was used to handle FCM push. The `AppboyFcmReceiver` class should be removed from your manifest and replaced with the above integration.
**Implementation Example**
-- See [`AndroidManifest.xml`][10] in the Droidboy sample app.
+- See [`AndroidManifest.xml`][70] in the Firebase Push sample app.
### Step 2: Configure Notification Icons
@@ -251,7 +290,7 @@ The icons pictured below are examples of properly designed icons:
To enable Braze to automatically open your app and any deep links when a push notification is clicked, set `com_appboy_handle_push_deep_links_automatically` to `true` in your `appboy.xml`:
-```
+```xml
true
```
@@ -336,9 +375,9 @@ Back stack configuration is only available on SDK 2.1.4 and above.
Braze SDKs 2.1.0 and above support [Android O Notification Channels][62]. In the case that a Braze notification does not contain the ID for a notification channel or that a Braze notification contains an invalid channel ID, Braze will display the notification with the default notification channel defined in the SDK. Braze users make use of [Android Notification Channels][61] within the platform to group notifications.
-To set the user facing name of the default Braze notification channel, please use `AppboyConfig.setDefaultNotificationChannelName().`
+To set the user facing name of the default Braze notification channel, please use [`AppboyConfig.setDefaultNotificationChannelName()`][72].
-To set the user facing description of the default Braze notification channel, please use `AppboyConfig.setDefaultNotificationChannelDescription()`.
+To set the user facing description of the default Braze notification channel, please use [`AppboyConfig.setDefaultNotificationChannelDescription()`][73].
If you are an existing customer who is transitioning to Android O, you should ensure that any API campaigns with the [Android Push Object][63] parameter are updated to include the `notification_channel` field. If this field is not specified, Braze will send the notification payload with the [dashboard fallback][64] channel ID.
@@ -366,7 +405,7 @@ For issues related to push display, see our [Troubleshooting Guide][57].
#### Testing Analytics
-At this point you should also have analytics logging for push notification opens. To test this, see our [Academy Page][56] on creating a push campaign. Clicking on the notification when it arrives should result in the `Direct Opens` on your campaign results page to increase by 1.
+At this point you should also have analytics logging for push notification opens. To test this, see our [Docs][56] on creating a push campaign. Clicking on the notification when it arrives should result in the `Direct Opens` on your campaign results page to increase by 1.
For issues related to push analytics, see our [Troubleshooting Guide][57].
@@ -443,7 +482,7 @@ Braze broadcasts custom intents when push notifications are received, opened, or
#### Step 1: Register your BroadcastReceiver
-Register your custom `BroadcastReceiver` to listen for Braze push opened and received intents in your [`AndroidManifest.xml`][10].
+Register your custom `BroadcastReceiver` to listen for Braze push opened and received intents in your [`AndroidManifest.xml`][71].
```xml
@@ -558,3 +597,9 @@ val myExtra = extras.getString("my_key")
[67]: https://developer.android.com/reference/android/app/Application.html#onCreate()
[68]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/advanced_use_cases/runtime_configuration/#runtime-configuration
[69]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/push_notifications/integration/#firebase-integration
+[70]: https://github.com/Appboy/appboy-android-sdk/blob/master/samples/firebase-push/src/main/AndroidManifest.xml "AndroidManifest.xml"
+[71]: https://github.com/Appboy/appboy-android-sdk/blob/master/samples/custom-broadcast/src/main/AndroidManifest.xml "AndroidManifest.xml"
+[72]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/configuration/AppboyConfig.Builder.html#setDefaultNotificationChannelName-java.lang.String-
+[73]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/configuration/AppboyConfig.Builder.html#setDefaultNotificationChannelDescription-java.lang.String-
+[74]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/AppboyFirebaseMessagingService.html#handleBrazeRemoteMessage-android.content.Context-RemoteMessage-
+[75]: https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/RemoteMessage
diff --git a/_docs/_developer_guide/platform_integration_guides/android/push_notifications/integration_baidu.md b/_docs/_developer_guide/platform_integration_guides/android/push_notifications/integration_baidu.md
index 3f5712643c..dacd42f2d4 100644
--- a/_docs/_developer_guide/platform_integration_guides/android/push_notifications/integration_baidu.md
+++ b/_docs/_developer_guide/platform_integration_guides/android/push_notifications/integration_baidu.md
@@ -1,7 +1,7 @@
---
nav_title: Baidu Integration
platform: Android
-page_order: 0
+page_order: 1
search_rank: 5
---
## Baidu Integration
diff --git a/_docs/_developer_guide/platform_integration_guides/cordova/android_and_fireos/initial_sdk_setup.md b/_docs/_developer_guide/platform_integration_guides/cordova/android_and_fireos/initial_sdk_setup.md
index 488e8f4509..9c79a7b743 100644
--- a/_docs/_developer_guide/platform_integration_guides/cordova/android_and_fireos/initial_sdk_setup.md
+++ b/_docs/_developer_guide/platform_integration_guides/cordova/android_and_fireos/initial_sdk_setup.md
@@ -6,9 +6,17 @@ page_order: 0
---
# Initial SDK Setup
-Download the SDK from [github][1] and run `cordova plugin add path_to_repo/appboy-cordova-sdk` from the root your project.
+Download the SDK from [Github][1] and run the following from the root your project:
-Alternatively, if you are running Cordova 6 or earlier, you could install directly from github, like `cordova plugin add https://github.com/appboy/appboy-cordova-sdk#master`.
+```
+cordova plugin add path_to_repo/appboy-cordova-sdk
+```
+
+Alternatively, if you are running Cordova 6 or later, you could install directly from Github:
+
+```
+cordova plugin add https://github.com/appboy/appboy-cordova-sdk#master
+```
### Configure the plugin
diff --git a/_docs/_developer_guide/platform_integration_guides/cordova/ios/initial_sdk_setup.md b/_docs/_developer_guide/platform_integration_guides/cordova/ios/initial_sdk_setup.md
index 152aaaf3eb..881a8538f0 100644
--- a/_docs/_developer_guide/platform_integration_guides/cordova/ios/initial_sdk_setup.md
+++ b/_docs/_developer_guide/platform_integration_guides/cordova/ios/initial_sdk_setup.md
@@ -8,13 +8,23 @@ page_order: 0
Installing the Braze SDK will provide you with analytics functionality, as well as push and in-app messages.
-{{ site.data.alerts.update }} As of SDK version 2.1.0, use of the iOS SDK requires XCode 8 or above.{{ site.data.alerts.end }}
+{% alert update %}
+As of SDK version 2.1.0, use of the iOS SDK requires XCode 8 or above.
+{% endalert %}
### Step 1: Get the SDK
-Download the SDK from [github][1] and run `cordova plugin add path_to_repo/appboy-cordova-sdk/` from the root your project.
+Download the SDK from [Github][1] and run the following from the root your project:
-Alternatively, if you are running Cordova 6 or earlier, you could install directly from github, like `cordova plugin add https://github.com/appboy/appboy-cordova-sdk#master`.
+```
+cordova plugin add path_to_repo/appboy-cordova-sdk/
+```
+
+Alternatively, if you are running Cordova 6 or later, you could install directly from Github:
+
+```
+cordova plugin add https://github.com/appboy/appboy-cordova-sdk#master
+```
### Configure the plugin
@@ -29,7 +39,7 @@ In your config.xml, add a `preference` element under the iOS `platform` element
Set up your applications to have the appropriate certificates for push, via the [iOS push documentation][2].
-#### Removing automatic push setup (iOS)
+#### Removing Automatic Push Setup (iOS)
If you want to turn off iOS automatic push registration, add the preference `com.appboy.ios_disable_automatic_push_registration` with a value of `true`.
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/advanced_use_cases/locations_and_geofences.md b/_docs/_developer_guide/platform_integration_guides/fireos/advanced_use_cases/locations_and_geofences.md
index ebccda9e35..9ac8e383c0 100644
--- a/_docs/_developer_guide/platform_integration_guides/fireos/advanced_use_cases/locations_and_geofences.md
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/advanced_use_cases/locations_and_geofences.md
@@ -7,7 +7,7 @@ search_rank: 4
## Locations & Geofences
-Geofences are only available in select Braze packages. For access please create a support ticket or speak with your Braze Customer Success Manager. Learn more in the [Braze Academy]({{ site.baseurl }}/developer_guide/platform_integration_guides/fireos/advanced_use_cases/locations_and_geofences/#locations--geofences).
+Geofences are only available in select Braze packages. For access please create a support ticket or speak with your Braze Customer Success Manager. Learn more in [Braze Docs]({{ site.baseurl }}/developer_guide/platform_integration_guides/fireos/advanced_use_cases/locations_and_geofences/#locations--geofences).
To support geofences for Android:
@@ -48,6 +48,15 @@ Add the Braze boot receiver to the `application` element of your `AndroidManifes
```
+{% alert note %}
+If you are using a version of the Android SDK less than `2.3.0`, the following manifest
+declaration is also required:
+
+```
+
+```
+{% endalert %}
+
### Step 3: Obtain Location Permissions from the End User
For Android M and higher versions, you must request location permissions from the end user before gathering location information or registering geofences.
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/analytics/location_tracking.md b/_docs/_developer_guide/platform_integration_guides/fireos/analytics/location_tracking.md
index 1bc65f03b8..7aca03f524 100644
--- a/_docs/_developer_guide/platform_integration_guides/fireos/analytics/location_tracking.md
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/analytics/location_tracking.md
@@ -39,5 +39,5 @@ See [here][3] for an implementation example of the above in our Droidboy sample
[1]: http://developer.android.com/guide/topics/location/strategies.html
[2]: https://developer.android.com/training/permissions/index.html
-[3]: https://github.com/Appboy/android-sdk/blob/18ea58f58f84018022b107d42a648f638b137fca/droidboy/src/main/java/com/appboy/sample/PreferencesActivity.java#L73
+[3]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/PreferencesActivity.java#L129
[4]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/AppboyUser.html#setLastKnownLocation-double-double-java.lang.Double-java.lang.Double-
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/analytics/setting_custom_attributes.md b/_docs/_developer_guide/platform_integration_guides/fireos/analytics/setting_custom_attributes.md
index 196c614471..5f91e98efb 100644
--- a/_docs/_developer_guide/platform_integration_guides/fireos/analytics/setting_custom_attributes.md
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/analytics/setting_custom_attributes.md
@@ -168,7 +168,7 @@ To set up a subscription for your users (either email or push), call the functio
| `SUBSCRIBED` | Subscribed, but not explicitly opted in |
| `UNSUBSCRIBED` | Unsubscribed and/or explicitly opted out |
-> No explicit opt-in is required by Android to send users push notifications. When a user is registered for push, they are set to `SUBSCRIBED` rather than `OPTED_IN` by default. For more information on implementing subscriptions and explicit opt-ins, visit the topic on [Braze Academy][10].
+> No explicit opt-in is required by Android to send users push notifications. When a user is registered for push, they are set to `SUBSCRIBED` rather than `OPTED_IN` by default. For more information on implementing subscriptions and explicit opt-ins, visit the topic on [Braze Docs][10].
#### Sample Code
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/analytics/setting_user_ids.md b/_docs/_developer_guide/platform_integration_guides/fireos/analytics/setting_user_ids.md
index 447e370159..72879e7413 100644
--- a/_docs/_developer_guide/platform_integration_guides/fireos/analytics/setting_user_ids.md
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/analytics/setting_user_ids.md
@@ -8,7 +8,7 @@ search_rank: 4
User IDs should be set for each of your users. These should be unchanging and accessible when a user opens the app. A database ID or a hashed email address/username is usually a good reference to use. We __strongly recommend__ providing this identifier as it will allow you to:
-- Track your users across devices and platforms, improving the quality of your behaviorial and demographic data.
+- Track your users across devices and platforms, improving the quality of your behavioral and demographic data.
- Import data about your users using our [User Data API][1].
- Target specific users with our [Messaging API][2] for both general and transactional messages.
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/analytics/uninstall_tracking.md b/_docs/_developer_guide/platform_integration_guides/fireos/analytics/uninstall_tracking.md
index 1822b1f98d..af0cdbcdca 100644
--- a/_docs/_developer_guide/platform_integration_guides/fireos/analytics/uninstall_tracking.md
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/analytics/uninstall_tracking.md
@@ -6,6 +6,6 @@ search_rank: 4
---
## Uninstall Tracking
-Uninstall Tracking utilizes Firebase Cloud Messaging's "dry run" feature to detect uninstalled devices without actually sending a push notification to the device. As such, there is no SDK or device-side work necessary for Android and FireOS. For more information, see our [Uninstall Tracking][6] page on Braze Academy.
+Uninstall Tracking utilizes Firebase Cloud Messaging's "dry run" feature to detect uninstalled devices without actually sending a push notification to the device. As such, there is no SDK or device-side work necessary for Android and FireOS. For more information, see our [Uninstall Tracking][6] page on Braze Docs.
[6]: {{ site.baseurl }}/user_guide/data_and_analytics/tracking/uninstall_tracking/#uninstall-tracking
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging.md b/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging.md
index d8b9b15259..733c313d9e 100644
--- a/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging.md
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging.md
@@ -4,9 +4,10 @@ platform: FireOS
page_order: 2
search_rank: 4
---
+
# In-App Messaging
-In-App Messages are great for creating unobtrusive calls to action, notifying people of new content in the News Feed and driving them toward it or communicating with users who have push turned off. They are also effective for other content that isn't time-sensitive enough to warrant a push notification, or permanent enough to warrant a News Feed item. You can find a detailed explanation of in-app message behavior in [Braze Academy][4].
+In-App Messages are great for creating unobtrusive calls to action, notifying people of new content in the News Feed and driving them toward it or communicating with users who have push turned off. They are also effective for other content that isn't time-sensitive enough to warrant a push notification, or permanent enough to warrant a News Feed item. You can find a detailed explanation of in-app message behavior in [Braze Docs][4].
## Integration {#in-app-messaging-integration}
@@ -174,7 +175,7 @@ Create a class that implements [`IInAppMessageManagerListener`][21]
The callbacks in your `IInAppMessageManagerListener` will be called at various points in the in-app message lifecycle.
-For example, if you set a custom manager listener, when an in-app message is received from Braze, the `beforeInAppMessageDisplayed()` method will be called. If this method returns true, that signals to `AppboyInAppMessageManager` that the in-app message will be handled by the host app and that it should not be displayed by Braze. If false is returned, the `AppboyInAppMessageManager` attempts to display the in-app message. This method should be used if you choose to display the in-app message in a customized manner.
+For example, if you set a custom manager listener, when an in-app message is received from Braze, the `beforeInAppMessageDisplayed()` method will be called. If your implementation of this method returns [`InAppMessageOperation.DISCARD`][83], that signals to Braze that the in-app message will be handled by the host app and should not be displayed by Braze. If `InAppMessageOperation.DISPLAY_NOW` is returned, Braze will attempt to display the in-app message. This method should be used if you choose to display the in-app message in a customized manner.
`IInAppMessageManagerListener` also includes delegate methods for clicks on the message itself or one of the buttons. A common use case would be intercepting a message when a button or message is clicked for further processing.
@@ -305,7 +306,7 @@ For further details on custom handling push receipts, opens, and key-value pairs
### Step 3: Create a Push Campaign
-Create a silent push campaign which is triggered via the server sent event. For details on how to create a silent push campaign please review this section of our [Academy][73].
+Create a silent push campaign which is triggered via the server sent event. You can learn how to to this with our page on [how to create a silent push campaign][73].
![serverEventTrigger][75]
@@ -409,3 +410,4 @@ Starting in Braze Android SDK version 2.0.1, Youtube and other HTML5 content can
[80]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#registerInAppMessageManager-android.app.Activity-
[81]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#unregisterInAppMessageManager-android.app.Activity-
[82]: https://developer.android.com/reference/android/app/Application.html#onCreate()
+[83]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/InAppMessageOperation.java
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/customization.md b/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/customization.md
new file mode 100644
index 0000000000..8568f92530
--- /dev/null
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/customization.md
@@ -0,0 +1,269 @@
+---
+nav_title: Customization
+platform: FireOS
+page_order: 2
+search_rank: 4
+---
+## Customization {#in-app-message-customization}
+All of Braze’s in-app message types are highly customizable across messages, images, [Font Awesome][15] icons, click actions, analytics, editable styling, custom display options, and custom delivery options. Multiple options can be configured on a per in-app message basis from [within the dashboard]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/create/). Braze additionally provides multiple levels of advanced customization to satisfy a variety of use cases and needs.
+
+### Key-Value Pair Extras
+
+In-app message objects may carry key-value pairs as `extras`. They are specified on the dashboard under "Advanced Settings" when creating an in-app message campaign. These can be used to send data down along with an in-app message for further handling by the application.
+
+Call the following when you get an in-app message object to retrieve its extras:
+
+```java
+Map getExtras()
+```
+
+See the [Javadoc][44] for more information.
+
+### Custom Styling
+
+Braze UI elements come with a default look and feel that matches the Android standard UI guidelines and provides a seamless experience. You can see these default styles in the Braze SDK's [`styles.xml`][6] file.
+
+```xml
+
+
+
+
+```
+
+If you would prefer, you can override these styles to create a look and feel that better suits your app.
+
+To override a style, copy it in its entirety to the `styles.xml` file in your own project and make modifications. The whole style must be copied over to your local `styles.xml` file in order for all attributes to be correctly set. Please note that these custom styles are for changes to individual UI elements, not wholesale changes to layouts. Layout-level changes need to be handled with custom views.
+
+#### Using Custom Styling to Set a Custom Font
+
+Braze allows for setting a custom font using the [font family guide][79]. To use it, override the style for message text, headers, and/or button text and use the `fontFamily` attribute to instruct Braze to use your custom font family.
+
+For example, to update the font on your in-app message button text, override the `Appboy.InAppMessage.Button` style and reference your custom font family. The attribute value should point to a font family in your `res/font` directory.
+
+Here is a truncated example with a custom font family, `my_custom_font_family`, referenced on the last line:
+
+```
+
+```
+
+Aside from the `Appboy.InAppMessage.Button` style for button text, the style for message text is `Appboy.InAppMessage.Message` and the style for message headers is `Appboy.InAppMessage.Header`. If you want to use your custom font family across all possible in-app message text, you can set your font family on the `Appboy.InAppMessage` style, which is the parent style for all in-app messages.
+
+> As with other custom styles, the entire style must be copied over to your local `styles.xml` file for all attributes to be correctly set.
+
+### Setting Custom Listeners
+
+Before customizing in-app messages with custom listeners, it's important to understand the [`AppboyInAppMessageManager`][34], which handles the majority of in-app message handling. As described in [Step 1][5], it must be registered for in-app messages to function appropriately.
+
+`AppboyInAppMessageManager` manages in-app message display on Android. It contains helper class instances that help it manage the lifecycle and display of in-app messages. All of these classes have standard implementations and defining custom classes is completely optional. However, doing so can add another level of control over the display and behavior of in-app messages. These customizable classes include:
+
+- [`IInAppMessageManagerListener`][21] - Implement to [custom manage in-app message display and behavior][19].
+- [`IInAppMessageViewFactory`][42] - Implement to [build custom in-app message views][12].
+- [`IInAppMessageAnimationFactory`][20] - Implement to [define custom in-app message animations][22].
+
+#### Setting a Custom Manager Listener
+
+The `AppboyInAppMessageManager` automatically handles the display and lifecycle of in-app messages. If you require more control over the lifecycle of a message, setting a custom manager listener will enable you to recieve the in-app message object at various points in the in-app message lifecycle, allowing you to handle its display yourself, perform further processing, react to user behavior, process the object's [Extras][14], and much more.
+
+##### Step 1: Implement an In-App Message Manager Listener
+
+Create a class that implements [`IInAppMessageManagerListener`][21]
+
+The callbacks in your `IInAppMessageManagerListener` will be called at various points in the in-app message lifecycle.
+
+For example, if you set a custom manager listener, when an in-app message is received from Braze, the `beforeInAppMessageDisplayed()` method will be called. If your implementation of this method returns [`InAppMessageOperation.DISCARD`][83], that signals to Braze that the in-app message will be handled by the host app and should not be displayed by Braze. If `InAppMessageOperation.DISPLAY_NOW` is returned, Braze will attempt to display the in-app message. This method should be used if you choose to display the in-app message in a customized manner.
+
+`IInAppMessageManagerListener` also includes delegate methods for clicks on the message itself or one of the buttons. A common use case would be intercepting a message when a button or message is clicked for further processing.
+
+- See [`CustomInAppMessageManagerListener.java`][36] in our Droidboy sample app for an implementation example.
+
+##### Step 2: Instruct Braze to use your In-App Message Manager Listener
+
+Once your `IInAppMessageManagerListener` is created, call `AppboyInAppMessageManager.setCustomInAppMessageManagerListener()` to instruct `AppboyInAppMessageManager`
+to use your custom `IInAppMessageManagerListener` instead of the default listener.
+
+> We recommend setting your `IInAppMessageManagerListener` in your [`Application.onCreate()`][82] before any other calls to Braze. This will ensure that the custom listener is set before any in-app message is displayed.
+
+See [`InAppMessageTesterFragment.java`][2] in the DroidBoy sample app for an example implementation.
+
+##### In-Depth: Altering In-App Messages Before Display
+
+When a new in-app message is received, and there is already an in-app message being displayed, the new message will be put onto the top of the stack and can be displayed at a later time.
+
+However, if there is no in-app message being displayed, the following delegate method in `IInAppMessageManagerListener` will be called:
+
+```java
+ @Override
+ public InAppMessageOperation beforeInAppMessageDisplayed(IInAppMessage inAppMessageBase) {
+ return InAppMessageOperation.DISPLAY_NOW;
+ }
+```
+
+The `InAppMessageOperation()` return value can be used to control when the message should be displayed. A suggested usage of this method would be to delay messages in certain parts of the app by returning `DISPLAY_LATER` when in-app messages would be distracting to the user's app experience.
+
+| `InAppMessageOperation` return value | Behavior |
+| -------------------------- | -------- |
+| `DISPLAY_NOW` | The message will be displayed |
+| `DISPLAY_LATER` | The message will be returned to the stack and displayed at the next available opportunity |
+| `DISCARD` | The message will be discarded |
+| `null` | The message will be ignored. This method should __NOT__ return `null` |
+
+See [`InAppMessageOperation.java`][45] for more details.
+
+> If you choose to `DISCARD` the in-app message and replace it with your own in-app message view, you will need to manually log in-app message clicks and impressions.
+
+On Android, this is done by calling `logClick` and `logImpression` on in-app messages, and `logButtonClick` on immersive in-app messages.
+
+> Once an in-app message has been placed on the stack, you can request for it to be retrieved and displayed at any time by calling [`AppboyInAppMessageManager.requestDisplayInAppMessage()`][67]. Calling this method requests Braze to display the next available in-app message from the stack.
+
+#### Setting a Custom View Factory
+
+Braze's suite of in-app messages types are versatile enough to cover the vast majority of custom use cases. However, if you would like to fully define the visual appearance of your in-app messages instead of using a default type, Braze makes this possible via setting a custom view factory.
+
+##### Step 1: Implement an In-App Message View Factory
+
+Create a class that implements [`IInAppMessageViewFactory`][42]
+
+- See [`CustomInAppMessageViewFactory.java`][43] in our Droidboy sample app for an implementation example.
+
+##### Step 2: Instruct Braze to use your In-App Message View Factory
+
+Once your `IInAppMessageViewFactory` is created, call `AppboyInAppMessageManager.setCustomInAppMessageViewFactory()` to instruct `AppboyInAppMessageManager`
+to use your custom `IInAppMessageViewFactory` instead of the default view factory.
+
+> We recommend setting your `IInAppMessageViewFactory` in your [`Application.onCreate()`][82] before any other calls to Braze. This will ensure that the custom view factory is set before any in-app message is displayed.
+
+See [`InAppMessageTesterFragment.java`][2] in the DroidBoy sample app for an example implementation.
+
+##### In-Depth: Implementing a Braze View Interface
+
+Braze's `slideup` in-app message view implements [`IInAppMessageView`][25]. Braze's `full` and `modal` type message views implement [`IInAppMessageImmersiveView`][24]. Implementing one of these classes will allow Braze to add click listeners to your custom view where appropriate. All Braze view classes extend Android's [View][18] class.
+
+Implementing `IInAppMessageView` allows you to define a certain portion of your custom view as clickable. Implementing `IInAppMessageImmersiveView` allows you to define message button views and a close button view.
+
+- See [`CustomInAppMessageView.java`][26] in our Droidboy sample app for an implementation example.
+
+#### Setting a Custom Animation Factory
+
+In-app messages have preset animation behavior. `Slideup` type messages slide into the screen; `full` and `modal` messages fade in and out. If you would like to define custom animation behaviors for your in-app messages, Braze makes this possible via setting a custom animation factory.
+
+##### Step 1: Implement an In-App Message Animation Factory
+
+Create a class that implements [`IInAppMessageAnimationFactory`][20]
+
+- See [`CustomInAppMessageAnimationFactory.java`][9] in our Droidboy sample app for an implementation example.
+
+##### Step 2: Instruct Braze to use your In-App Message View Factory
+
+Once your `IInAppMessageAnimationFactory` is created, call `AppboyInAppMessageManager.setCustomInAppMessageAnimationFactory()` to instruct `AppboyInAppMessageManager`
+to use your custom `IInAppMessageAnimationFactory` instead of the default animation factory.
+
+> We recommend setting your `IInAppMessageAnimationFactory` in your [`Application.onCreate()`][82] before any other calls to Braze. This will ensure that the custom animation factory is set before any in-app message is displayed.
+
+See [`InAppMessageTesterFragment.java`][2] in the DroidBoy sample app for an example implementation.
+
+### Setting Fixed Orientation
+
+To set a fixed orientation for an in-app message, first [set a custom in-app message manager listener][19]. Then, call `setOrientation()` on the `IInAppMessage` object in the `beforeInAppMessageDisplayed()` delegate method.
+
+```java
+public InAppMessageOperation beforeInAppMessageDisplayed(IInAppMessage inAppMessage) {
+ // Set the orientation to portrait
+ inAppMessage.setOrientation(Orientation.PORTRAIT);
+ return InAppMessageOperation.DISPLAY_NOW;
+}
+```
+
+## Button Text Capitalization
+
+Android Material Design specifies that Button text should be upper case by default. Braze's in-app message buttons follow this convention as well.
+
+## Youtube in HTML in-app messages
+
+Starting in Braze Android SDK version 2.0.1, Youtube and other HTML5 content can play in HTML in-app messages. This requires hardware acceleration to be enabled in the Activity where the in-app message is being displayed, please see the [Android developer guide][71] for more details. Also that hardware acceleration is only available on API versions 11 and above.
+
+## GIFs {#gifs-IAMs}
+
+{% include archive/android/gifs.md channel="in-app messages" %}
+
+
+
+
+[1]: https://github.com/Appboy/appboy-android-sdk/tree/master/samples/manual-session-integration
+[2]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/InAppMessageTesterFragment.java
+[3]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessage.html
+[4]: {{ site.baseurl }}/help/best_practices/in-app_messages/in-app_message_behavior/#in-app-message-behavior
+[5]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[6]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/res/values/styles.xml
+[7]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageManagerListener.java
+[8]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessageImmersive.html
+[9]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageAnimationFactory.java
+[12]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#setting-a-custom-view-factory
+[13]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[14]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/news_feed/#key-value-pairs
+[15]: http://fortawesome.github.io/Font-Awesome/
+[17]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#modal-in-app-messages
+[18]: http://developer.android.com/reference/android/view/View.html
+[19]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#setting-a-custom-manager-listener
+[20]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/IInAppMessageAnimationFactory.java
+[21]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/listeners/IInAppMessageManagerListener.java
+[22]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#setting-a-custom-animation-factory
+[23]: http://developer.android.com/reference/android/R.integer.html#config_shortAnimTime
+[24]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/IInAppMessageImmersiveView.java
+[25]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/IInAppMessageView.java
+[26]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageView.java
+[27]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageBase.html
+[28]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageImmersiveBase.html
+[29]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessage.java
+[30]: {{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/creating_an_in-app_message/#creating-an-in-app-message
+[34]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/AppboyInAppMessageManager.java
+[36]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageManagerListener.java
+[39]: https://developer.android.com/guide/topics/ui/dialogs.html
+[40]: {{ site.baseurl }}/docs/developer_guide/platform_integration_guides/android/in-app_messaging/#html-full-in-app-messages
+[41]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#full-in-app-messages
+[42]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/IInAppMessageViewFactory.java
+[43]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageViewFactory.java
+[44]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessage.html#getExtras()
+[45]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/InAppMessageOperation.java
+[50]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/MessageButton.html
+[51]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageHtmlFull.html
+[52]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessageHtml.html
+[53]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[54]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#in-app-message-customization
+[55]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#gifs-iams
+[59]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/initial_sdk_setup/#activity-lifecycle-callback-integration-api-14
+[60]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/res/values-xlarge/styles.xml
+[65]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[66]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/Appboy.html#requestInAppMessageRefresh--
+[67]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#requestDisplayInAppMessage--
+[68]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[69]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#ensureSubscribedToInAppMessageEvents-android.content.Context-
+[70]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/analytics/tracking_sessions/
+[71]: https://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling
+[72]: https://gist.github.com/robbiematthews/1d037e2c366e523b2dda5f2e053ea2a9
+[73]: {{ site.baseurl }}/developer_guide/platform_integration_guides/fireos/push_notifications/silent_push_notifications/#silent-push-notifications
+[75]: {% image_buster /assets/img_archive/serverSentPush.png %}
+[76]: {% image_buster /assets/img_archive/kvpConfiguration.png %}
+[77]: {% image_buster /assets/img_archive/IAMeventTrigger.png %}
+[78]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/push_notifications/integration/#step-1-register-your-broadcastreceiver
+[79]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/advanced_use_cases/font_customization/#font-customization
+[80]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#registerInAppMessageManager-android.app.Activity-
+[81]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#unregisterInAppMessageManager-android.app.Activity-
+[82]: https://developer.android.com/reference/android/app/Application.html#onCreate()
+[83]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/InAppMessageOperation.java
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/in-app_message_delivery.md b/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/in-app_message_delivery.md
new file mode 100644
index 0000000000..a513494edf
--- /dev/null
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/in-app_message_delivery.md
@@ -0,0 +1,166 @@
+---
+nav_title: In-App Message Delivery
+platform: FireOS
+page_order: 3
+search_rank: 4
+---
+
+# In-App Message Delivery
+
+## Trigger Types
+
+Our in-app message product allows you to trigger in-app message display as a result of several different event types: `Any Purchase`, `Specific Purchase`, `Session Start`, `Custom Event`, `Push Click`. Furthermore, `Specific Purchase` and `Custom Event` triggers can contain robust property filters.
+
+{% alert important %}
+Triggered in-app messages only work with custom events logged through the SDK and not through the Rest APIs. If you're working with Android, please check out how to log custom events [here]({{ site.baseurl }}/developer_guide/platform_integration_guides/android/analytics/tracking_custom_events/#tracking-custom-events). If you're working with iOS, check out how to log custom events [here]({{ site.baseurl }}/developer_guide/platform_integration_guides/ios/analytics/tracking_custom_events/#tracking-custom-events).
+{% endalert %}
+
+## Delivery Semantics
+
+All in-app messages that a user is eligible for are delivered to the user's device on session start. For more information about the SDK's session start semantics, see our [session lifecycle documentation][86]. Upon delivery, the SDK will pre-fetch assets so that they are available immediately at trigger time, minimizing display latency.
+
+When a trigger event has more than one eligible in-app message associated with it, only the in-app message with the highest priority will be delivered.
+
+For in-app messages that display immediately on deliver (*i.e.*, session start, push click) there can be some latency due to assets not being prefetched.
+
+## Minimum Time Interval Between Triggers
+
+By default, we rate limit in-app messages to once every 30 seconds to ensure a quality user experience.
+
+To override this value, set `com_appboy_trigger_action_minimum_time_interval_seconds` in your `appboy.xml`. An example can be found in our sample application's [`appboy.xml`][87].
+
+# Server-side Event Triggering
+
+By default in-app messages are triggered by custom events logged by the SDK. If you would like to trigger in-app messages by server sent events you are also able to achieve this.
+
+To enable this feature, a silent push is sent to the device which allows a custom push receiver to log an SDK based event. This SDK event will subsequently trigger the user-facing in-app message.
+
+## Step 1: Register a Custom Broadcast Receiver to Log Custom Event
+
+Register your custom `BroadcastReceiver` to listen for a specific silent push within your AndroidManifest.xml. For more information on how to register a custom `BroadcastReceiver` please review [Braze's push documentation][78].
+
+## Step 2: Create your BroadcastReceiver
+
+Your receiver will handle the intent broadcast by the silent push and log an SDK event. Starting in SDK 2.0.0, events can be logged in the background without issue. All clients implementing this solution must be on SDK v2.0.0+.
+
+It will subclass `BroadcastReceiver` and override `onReceive()`. For a detailed example, please see our [EventBroadcastReceiver.java][72] in the linked gist.
+
+> Two events will be logged for the in-app message to be delivered, one by the server and one from within your custom `BroadcastReceiver`. To ensure the same event is not duplicated, the event logged from within your `BroadcastReceiver` should be given a generic naming convention, for example "in-app message trigger event," and not the same name as the server sent event. If this is not done segmentation and user data may be affected by duplicate events being logged for a single user action.
+
+For further details on custom handling push receipts, opens, and key-value pairs please visit this section of our [Documentation][78].
+
+## Step 3: Create a Push Campaign
+
+Create a silent push campaign which is triggered via the server sent event. For details on how to create a silent push campaign please review this section of our [Docs][73].
+
+![serverEventTrigger][75]
+
+The push campaign must include key value pair extras which indicate that this push campaign is sent with the intention to log an SDK custom event. This event will be used to trigger the in-app message
+
+![kvpConfiguration][76]
+
+The [EventBroadcastReceiver.java][72] recognizes the key value pairs and logs the appropriate SDK custom event.
+
+Should you want to include any event properties to attach to your 'In-App Message Trigger' event, you can achieve this by passing these in the key value pairs of the push payload. In the example above the campaign name of the subsequent in-app message has been included. Your custom `BroadcastReceiver` can then pass the value as the parameter of the event property when logging the custom event.
+
+## Step 4: Create an In-App Message Campaign
+
+Create your user visible in-app message campaign from within Braze’s dashboard. This campaign should have an Action Based delivery, and be triggered from the custom event logged from within the custom [EventBroadcastReceiver.java][72].
+
+In the example below the specific in-app message to be triggered has been configured by sending the event property as part of the initial silent push.
+
+![serverEventTrigger][77]
+
+> If a server sent event is logged whilst the app is not in the foreground, the event will log but the in-app message will not be displayed. Should you want the event to be delayed until the application is in the foreground, a check must be included in your custom push receiver to dismiss or delay the event until the app has entered the foreground.
+
+## Local In-App Messages
+
+In-app messages can be created within the app and displayed locally in real-time. All customization options available on the dashboard are also available locally. This is particularly useful for displaying messages that you wish to trigger within the app in real-time.
+
+```java
+ // Initializes a new slideup type in-app message and specifies its message.
+ InAppMessageSlideup inAppMessage = new InAppMessageSlideup();
+ inAppMessage.setMessage("Welcome to Braze! This is a slideup in-app message.");
+```
+
+> Do not display in-app messages when the soft keyboard is displayed on screen as rendering is undefined in this circumstance.
+
+### Manually Triggering In-App Message Display
+
+The following method will manually display your in-app message.
+
+```java
+ AppboyInAppMessageManager.getInstance().addInAppMessage(inAppMessage);
+```
+
+See [`InAppMessageTesterFragment.java`][2] in the DroidBoy sample app for example usage.
+
+[1]: https://github.com/Appboy/appboy-android-sdk/tree/master/samples/manual-session-integration
+[2]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/InAppMessageTesterFragment.java
+[3]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessage.html
+[4]: {{ site.baseurl }}/help/best_practices/in-app_messages/in-app_message_behavior/#in-app-message-behavior
+[5]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[6]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/res/values/styles.xml
+[7]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageManagerListener.java
+[8]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessageImmersive.html
+[9]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageAnimationFactory.java
+[12]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#setting-a-custom-view-factory
+[13]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[14]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/news_feed/#key-value-pairs
+[15]: http://fortawesome.github.io/Font-Awesome/
+[17]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#modal-in-app-messages
+[18]: http://developer.android.com/reference/android/view/View.html
+[19]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#setting-a-custom-manager-listener
+[20]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/IInAppMessageAnimationFactory.java
+[21]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/listeners/IInAppMessageManagerListener.java
+[22]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#setting-a-custom-animation-factory
+[23]: http://developer.android.com/reference/android/R.integer.html#config_shortAnimTime
+[24]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/IInAppMessageImmersiveView.java
+[25]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/IInAppMessageView.java
+[26]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageView.java
+[27]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageBase.html
+[28]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageImmersiveBase.html
+[29]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessage.java
+[30]: {{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/creating_an_in-app_message/#creating-an-in-app-message
+[33]: {% image_buster /assets/img_archive/foodo-slideup.gif %}
+[34]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/AppboyInAppMessageManager.java
+[36]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageManagerListener.java
+[39]: https://developer.android.com/guide/topics/ui/dialogs.html
+[40]: {{ site.baseurl }}/docs/developer_guide/platform_integration_guides/android/in-app_messaging/#html-full-in-app-messages
+[41]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#full-in-app-messages
+[42]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/IInAppMessageViewFactory.java
+[43]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageViewFactory.java
+[44]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessage.html#getExtras()
+[45]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/InAppMessageOperation.java
+[50]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/MessageButton.html
+[51]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageHtmlFull.html
+[52]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessageHtml.html
+[53]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[54]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#in-app-message-customization
+[55]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#gifs-iams
+[59]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/initial_sdk_setup/#activity-lifecycle-callback-integration-api-14
+[60]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/res/values-xlarge/styles.xml
+[65]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[66]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/Appboy.html#requestInAppMessageRefresh--
+[67]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#requestDisplayInAppMessage--
+[68]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[69]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#ensureSubscribedToInAppMessageEvents-android.content.Context-
+[70]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/analytics/tracking_sessions/
+[71]: https://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling
+[72]: https://gist.github.com/robbiematthews/1d037e2c366e523b2dda5f2e053ea2a9
+[73]: {{ site.baseurl }}/developer_guide/platform_integration_guides/fireos/push_notifications/silent_push_notifications/#silent-push-notifications
+[75]: {% image_buster /assets/img_archive/serverSentPush.png %}
+[76]: {% image_buster /assets/img_archive/kvpConfiguration.png %}
+[77]: {% image_buster /assets/img_archive/IAMeventTrigger.png %}
+[78]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/push_notifications/integration/#step-1-register-your-broadcastreceiver
+[79]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/advanced_use_cases/font_customization/#font-customization
+[80]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#registerInAppMessageManager-android.app.Activity-
+[81]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#unregisterInAppMessageManager-android.app.Activity-
+[82]: https://developer.android.com/reference/android/app/Application.html#onCreate()
+[83]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/InAppMessageOperation.java
+[84]: {% image_buster /assets/img_archive/trigger-iam-composer.png %}
+[85]: {{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/creating_an_in-app_message/#original-in-app-messages
+[86]: {{ site.baseurl }}/developer_guide/platform_integration_guides/{{ include.platform }}/analytics/tracking_sessions/#session-lifecycle
+[87]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/res/values/appboy.xml
+[88]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/analytics/tracking_custom_events/#tracking-custom-events
+[89]: {{ site.baseurl }}/developer_guide/platform_integration_guides/ios/analytics/tracking_custom_events/#tracking-custom-events
diff --git a/_docs/_developer_guide/platform_integration_guides/android/in-app_messaging/in-app_message_types.md b/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/integration.md
similarity index 67%
rename from _docs/_developer_guide/platform_integration_guides/android/in-app_messaging/in-app_message_types.md
rename to _docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/integration.md
index 476a5afd70..d103f69d64 100644
--- a/_docs/_developer_guide/platform_integration_guides/android/in-app_messaging/in-app_message_types.md
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/integration.md
@@ -1,82 +1,59 @@
---
-nav_title: In-App Message Types
-page_order: 2
-search_rank: 5
-platform: Android
+nav_title: Integration
+platform: FireOS
+page_order: 1
+search_rank: 4
---
+## Integration {#in-app-messaging-integration}
-# In-App Message Types
+### Step 1: Braze In-App Message Manager Registration
-Braze offers several default in-app message types, each customizable with messages, images, [Font Awesome][15] icons, click actions, analytics, editable styling and color schemes. The currently available types are [`Slideup`][13], [`Modal`][17], [`Full`][41], and [`HTML Full`][40]. It is also possible to [define your own custom in-app message view][12].
+In-App Message display is managed by the [`AppboyInAppMessageManager`][34] class. Every activity in your app must be registered with the `AppboyInAppMessageManager` to allow it to add in-app message views to the view hierarchy. There are two ways to accomplish this:
-All in-app messages implement the [`IInAppMessage`][3] interface, which defines basic behavior and traits for all in-app messages. [`InAppMessageBase`][27] is an abstract class that implements `IInAppMessage` and provides the foundational in-app message implementation. All in-app message classes are subclasses of `InAppMessageBase`.
+#### Activity Lifecycle Callback Integration (Recommended)
-In addition, there is a subinterface of `IInAppMessage` called [`IInAppMessageImmersive`][8], which adds click action and analytics enabled [buttons][50], as well as header text and a close button. [`InAppMessageImmersiveBase`][28] is an abstract class that implements `IInAppMessageImmersive` and provides the foundational `immersive` in-app message implementation. `Modal` and `Full` in-app messages are subclasses of `InAppMessageImmersiveBase`.
+The [Activity Lifecycle Callback Integration][59] handles in-app message registration automatically, no extra integration is required. This is the recommended integration for handling in-app message registration.
-HTML Full in-app messages are [`InAppMessageHtmlFull`][51] instances, which implement [`IInAppMessageHtml`][52], another subclass of `IInAppMessage`.
+#### Manual In-App Message Registration
-{% include archive/in_app_message.md platform="Android" %}
+A manual in-app message registration requires 3 steps.
-## Local In-App Messages
+> If you did the activity lifecycle integration, then you should *not* do a manual in-app message integration.
-In-app messages can be created within the app and displayed locally in real-time. All customization options available on the dashboard are also available locally. This is particularly useful for displaying messages that you wish to trigger within the app in real-time.
-
-{% tabs %}
-{% tab JAVA %}
+* In your [`Application.onCreate()`][82], [`ensureSubscribedToInAppMessageEvents()`][69] should be called.
```java
-// Initializes a new slideup type in-app message and specifies its message.
-InAppMessageSlideup inAppMessage = new InAppMessageSlideup();
-inAppMessage.setMessage("Welcome to Braze! This is a slideup in-app message.");
-```
-
-{% endtab %}
-{% tab KOTLIN %}
-
-```kotlin
-// Initializes a new slideup type in-app message and specifies its message.
-val inAppMessage = InAppMessageSlideup()
-inAppMessage.message = "Welcome to Braze! This is a slideup in-app message."
+AppboyInAppMessageManager.getInstance().ensureSubscribedToInAppMessageEvents(context);
```
-{% endtab %}
-{% endtabs %}
-
-> Do not display in-app messages when the soft keyboard is displayed on screen as rendering is undefined in this circumstance.
-
-### Manually Triggering In-App Message Display
-
-The following method will manually display your in-app message.
-
-{% tabs %}
-{% tab JAVA %}
+* In every activity where in-app messages can be shown, [`registerInAppMessageManager()`][80] should be called in that activity's `onResume()`.
```java
-AppboyInAppMessageManager.getInstance().addInAppMessage(inAppMessage);
+@Override
+public void onResume() {
+ super.onResume();
+ // Registers the AppboyInAppMessageManager for the current Activity. This Activity will now listen for
+ // in-app messages from Braze.
+ AppboyInAppMessageManager.getInstance().registerInAppMessageManager(activity);
+}
```
-{% endtab %}
-{% tab KOTLIN %}
+* In every activity where [`registerInAppMessageManager()`][80] was called, [`unregisterInAppMessageManager()`][81] should be called in that activity's `onPause()`.
-```kotlin
-AppboyInAppMessageManager.getInstance().addInAppMessage(inAppMessage)
+```java
+@Override
+public void onPause() {
+ super.onPause();
+ // Unregisters the AppboyInAppMessageManager for the current Activity.
+ AppboyInAppMessageManager.getInstance().unregisterInAppMessageManager(activity);
+}
```
-{% endtab %}
-{% endtabs %}
-
-See [`InAppMessageTesterFragment.java`][2] in the DroidBoy sample app for example usage.
-
-#### In-Depth: Defining Custom In-App Message Types
-
-Braze's `slideup` in-app message object extends [`InAppMessageBase`][27]. Braze's `full` and `modal` type messages extend [`InAppMessageImmersiveBase`][28]. Extending one of these classes gives you the option of adding custom functionality to your locally generated in-app messages.
-
-See [`CustomInAppMessage.java`][29] in the DroidBoy sample app for an example implementation.
[1]: https://github.com/Appboy/appboy-android-sdk/tree/master/samples/manual-session-integration
[2]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/InAppMessageTesterFragment.java
[3]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessage.html
-[4]: {{ site.baseurl }}//help/best_practices/in-app_messages/in-app_message_behavior/#in-app-message-behavior
+[4]: {{ site.baseurl }}/help/best_practices/in-app_messages/in-app_message_behavior/#in-app-message-behavior
[5]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
[6]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/res/values/styles.xml
[7]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageManagerListener.java
@@ -135,3 +112,4 @@ See [`CustomInAppMessage.java`][29] in the DroidBoy sample app for an example im
[80]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#registerInAppMessageManager-android.app.Activity-
[81]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#unregisterInAppMessageManager-android.app.Activity-
[82]: https://developer.android.com/reference/android/app/Application.html#onCreate()
+[83]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/InAppMessageOperation.java
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/overview.md b/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/overview.md
new file mode 100644
index 0000000000..79873150d9
--- /dev/null
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/overview.md
@@ -0,0 +1,171 @@
+---
+nav_title: Overview
+platform: FireOS
+page_order: 0
+search_rank: 4
+---
+# In-App Messages
+
+__In-App Messages__ help you get content to your user without interrupting their day with a push notification. Customized and tailored in-app messages enhance the user experience and help your audience get the most value out of your app. With a variety of layouts and customization tools to choose from, in-app messages engage your users more than ever before.
+
+To see examples of in-app messages, check out our [Client Integration Gallery][83].
+
+{% comment %}
+Embed video on the right. Demos all of the topics mentioned on this page.
+{% endcomment %}
+
+{% alert note %}
+Braze has refreshed in-app messages! Though the creation process is very much the same, our in-app messages have a new, modern look and feel optimized for the best experiences for your customers and give you more options to personalize the experience. For more information on our most recent upgrades to in-app messages, check out our [Generation Comparison documentation]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/generations/)!
+{% endalert %}
+
+[Create an in-app message]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/create/) now!
+
+## When to Use In-App Messages
+
+In-app messages are good for a lot of things. They can be used in web apps, Android apps, iOS apps, and more!
+
+In-app messages don't deliver outside of the user's app and won't intrude on their home screen, like push notifications do. In-app messages, by their nature, exist within your app and come with context and are almost never unwelcome! They're always delivered when the user is active within your app.
+
+### Great Use Cases
+
+- New App Features
+- App Management
+- Reviews
+- App Upgrades/Updates
+- Giveaways & Sweepstakes
+- Sales and Promotions
+- Product Sales
+- Encouraging and rewarding discovery
+- [Permission Requests/Push Priming][84]
+
+## In-App Message Types
+
+Braze offers several default in-app message types, each customizable with messages, images, [Font Awesome][15] icons, click actions, analytics, editable styling and color schemes. The currently available types are `Slideup`, `Modal`, `Full`, and `HTML Full`. It is also possible to [define your own custom in-app message view][12].
+
+All in-app messages implement the [`IInAppMessage`][3] interface, which defines basic behavior and traits for all in-app messages. [`InAppMessageBase`][27] is an abstract class that implements `IInAppMessage` and provides the foundational in-app message implementation. All in-app message classes are subclasses of `InAppMessageBase`.
+
+In addition, there is a subinterface of `IInAppMessage` called [`IInAppMessageImmersive`][8], which adds click action and analytics enabled [buttons][50], as well as header text and a close button. [`InAppMessageImmersiveBase`][28] is an abstract class that implements `IInAppMessageImmersive` and provides the foundational `immersive` in-app message implementation. `Modal` and `Full` in-app messages are subclasses of `InAppMessageImmersiveBase`.
+
+HTML Full in-app messages are [`InAppMessageHtmlFull`][51] instances, which implement [`IInAppMessageHtml`][52], another subclass of `IInAppMessage`.
+
+### Expected Behaviors by Message Types
+
+These are what each in-app message type will appear like for your users.
+
+{% tabs %}
+ {% tab Slideup %}
+ [`Slideup`](https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageSlideup.html) in-app messages are so-named because they "slide up" or "slide down" from the top or bottom of the screen. They cover a small portion of the screen and provide an effective and non-intrusive messaging capability.
+
+
+
+ ![Slideup Behavior]({% image_buster /assets/img/slideup-behavior.gif %}){: style="border:0px;"}
+
+
+
+{% endtab %}
+{% tab Modal %}
+[`Modal`](https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageModal.html) in-app messages appear in the center of the screen and are framed by a translucent panel. Useful for more critical messaging, they can be equipped with up to two click action and analytics enabled buttons.
+
+
+
+ ![Modal Behavior]({% image_buster /assets/img/modal-behavior.gif %}){: style="border:0px;"}
+
+
+
+
+{% endtab %}
+{% tab Full Screen %}
+[`Full`](https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageFull.html) in-app messages are useful for maximizing the content and impact of your user communication. The upper half of a `full` in-app message contains an image and the lower half displays text as well as up to two click action and analytics enabled buttons.
+
+![Full Example]({% image_buster /assets/img_archive/In-App_Full.png %})
+
+
+{% endtab %}
+{% tab Custom HTML %}
+[`HTML Full`](https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageHtmlFull.html) in-app messages are useful for creating fully customized user content. User-defined HTML Full in-app message content is displayed in a {% if include.platform == "iOS" %}`UIWebView`{% elsif include.platform == "Android" %}`WebView`{% endif %} and may optionally contain other rich content, such as images and fonts, allowing for full control over message appearance and functionality.
+
+
+
+![Full-Screen Behavior]({% image_buster /assets/img/full-screen-behavior.gif %}){: style="border:0px;"}
+
+
+
+Full in-app message content is displayed in a `UIWebView` and may optionally contain other rich content, such as images and fonts, allowing for full control over message appearance and functionality.
+
+{% alert important %}
+Please note that we currently do not support display of custom HTML in-app messages in an iFrame on the iOS and Android platforms.
+{% endalert %}
+
+{% endtab %}
+{% endtabs %}
+
+#### In-Depth: Defining Custom In-App Message Types
+
+Braze's `slideup` in-app message object extends [`InAppMessageBase`][27]. Braze's `full` and `modal` type messages extend [`InAppMessageImmersiveBase`][28]. Extending one of these classes gives you the option of adding custom functionality to your locally generated in-app messages.
+
+See [`CustomInAppMessage.java`][29] in the DroidBoy sample app for an example implementation.
+
+[1]: https://github.com/Appboy/appboy-android-sdk/tree/master/samples/manual-session-integration
+[2]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/InAppMessageTesterFragment.java
+[3]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessage.html
+[4]: {{ site.baseurl }}//help/best_practices/in-app_messages/in-app_message_behavior/#in-app-message-behavior
+[5]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[6]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/res/values/styles.xml
+[7]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageManagerListener.java
+[8]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessageImmersive.html
+[9]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageAnimationFactory.java
+[12]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/customization/#setting-a-custom-view-factory
+[13]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[14]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/news_feed/#key-value-pairs
+[15]: http://fortawesome.github.io/Font-Awesome/
+[17]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#modal-in-app-messages
+[18]: http://developer.android.com/reference/android/view/View.html
+[19]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#setting-a-custom-manager-listener
+[20]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/IInAppMessageAnimationFactory.java
+[21]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/listeners/IInAppMessageManagerListener.java
+[22]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#setting-a-custom-animation-factory
+[23]: http://developer.android.com/reference/android/R.integer.html#config_shortAnimTime
+[24]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/IInAppMessageImmersiveView.java
+[25]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/IInAppMessageView.java
+[26]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageView.java
+[27]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageBase.html
+[28]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageImmersiveBase.html
+[29]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessage.java
+[30]: {{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/creating_an_in-app_message/#creating-an-in-app-message
+[33]: {% image_buster /assets/img_archive/foodo-slideup.gif %}
+[34]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/AppboyInAppMessageManager.java
+[36]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageManagerListener.java
+[39]: https://developer.android.com/guide/topics/ui/dialogs.html
+[40]: {{ site.baseurl }}/docs/developer_guide/platform_integration_guides/android/in-app_messaging/#html-full-in-app-messages
+[41]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#full-in-app-messages
+[42]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/IInAppMessageViewFactory.java
+[43]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/java/com/appboy/sample/CustomInAppMessageViewFactory.java
+[44]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessage.html#getExtras()
+[45]: https://github.com/Appboy/appboy-android-sdk/blob/master/android-sdk-ui/src/com/appboy/ui/inappmessage/InAppMessageOperation.java
+[50]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/MessageButton.html
+[51]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageHtmlFull.html
+[52]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/IInAppMessageHtml.html
+[53]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[54]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#in-app-message-customization
+[55]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/#gifs-iams
+[59]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/initial_sdk_setup/#activity-lifecycle-callback-integration-api-14
+[60]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/res/values-xlarge/styles.xml
+[65]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[66]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/Appboy.html#requestInAppMessageRefresh--
+[67]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#requestDisplayInAppMessage--
+[68]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/in-app_messaging/
+[69]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#ensureSubscribedToInAppMessageEvents-android.content.Context-
+[70]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/analytics/tracking_sessions/
+[71]: https://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling
+[72]: https://gist.github.com/robbiematthews/1d037e2c366e523b2dda5f2e053ea2a9
+[73]: {{ site.baseurl }}/developer_guide/platform_integration_guides/fireos/push_notifications/silent_push_notifications/#silent-push-notifications
+[75]: {% image_buster /assets/img_archive/serverSentPush.png %}
+[76]: {% image_buster /assets/img_archive/kvpConfiguration.png %}
+[77]: {% image_buster /assets/img_archive/IAMeventTrigger.png %}
+[78]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/push_notifications/integration/#step-1-register-your-broadcastreceiver
+[79]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/advanced_use_cases/font_customization/#font-customization
+[80]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#registerInAppMessageManager-android.app.Activity-
+[81]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/ui/inappmessage/AppboyInAppMessageManager.html#unregisterInAppMessageManager-android.app.Activity-
+[82]: https://developer.android.com/reference/android/app/Application.html#onCreate()
+[83]: {{ site.baseurl }}/help/best_practices/client_integration_gallery/#client-integration-iam
+[84]: {{ site.baseurl }}/help/best_practices/push/creating_custom_opt-in_prompts/#creating-custom-opt-in-prompts
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/troubleshooting.md b/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/troubleshooting.md
new file mode 100644
index 0000000000..1b7b8f62c7
--- /dev/null
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/in-app_messaging/troubleshooting.md
@@ -0,0 +1,11 @@
+---
+nav_title: Troubleshooting
+platform: FireOS
+page_order: 4
+search_rank: 4
+---
+{% include archive/troubleshooting_iams.md platform="FireOS" %}
+
+#### Android Dialogs
+
+Braze doesn't support displaying in-app messages in [Android Dialogs](https://developer.android.com/guide/topics/ui/dialogs.html) at this time.
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/initial_sdk_setup.md b/_docs/_developer_guide/platform_integration_guides/fireos/initial_sdk_setup.md
index 99e8f4157a..4824fbb2fe 100644
--- a/_docs/_developer_guide/platform_integration_guides/fireos/initial_sdk_setup.md
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/initial_sdk_setup.md
@@ -13,7 +13,7 @@ Installing the Braze SDK will provide you with basic analytics functionality as
Braze is in the process of sunsetting formal support for the Eclipse IDE as [Google is sunsetting support for the Eclipse Android Developer Tools Plugin][43]. If you need assistance with your Eclipse integration prior to migration please [email Support]({{ site.baseurl }}/support_contact/) for assistance.
### Step 1: Integrate the Braze Library
-The Braze Android SDK can optionally be integrated without UI components. However, In-App Messaging, the News Feed, and Feedback will be rendered inoperable unless you pass the custom data to a UI solely of your design. Additionally, push notifications will not work because our `BroadcastReceiver` that handles push is in the UI library. Please note that these UI elements are open source and [fully customizable][1]. We strongly recommend integration of these features. Please refer to the [Braze Academy][2] for the benefits of using the Braze News Feed, In-App Message, and Feedback UI.
+The Braze Android SDK can optionally be integrated without UI components. However, In-App Messaging, the News Feed, and Feedback will be rendered inoperable unless you pass the custom data to a UI solely of your design. Additionally, push notifications will not work because our `BroadcastReceiver` that handles push is in the UI library. Please note that these UI elements are open source and [fully customizable][1]. We strongly recommend integration of these features. Please refer to the [User Guide][2] for the benefits of using the Braze News Feed, In-App Message, and Feedback UI.
#### Basic Integration
In order to access Braze's messaging features, you must integrate the UI library. Please see the following directions to integrate the UI library depending on your IDE:
@@ -112,27 +112,27 @@ The second argument instructs the listener to handle `registerInAppMessageManage
See the [javadoc][63] for more information. Please note that any non-standard manual session integration is not fully supported.
-### Step 5: Optional Custom Endpoint Setup
+### Step 5: Custom Endpoint Setup {#step-5-optional-custom-endpoint-setup}
-If you have been set up with a custom endpoint your Customer Success Manager will advise you of the correct address. To update the default endpoint in your integration of the Braze SDKs please add the following code:
+Your Braze representative should have already advised you of the [correct endpoint]({{ site.baseurl }}/user_guide/administrative/access_braze/sdk_endpoints/).
-**Android**
-
-Add the following code to your `appboy.xml`:
+To update the default endpoint in your integration of the Braze SDKs please add the following code to your `appboy.xml`:
```
YOUR_CUSTOM_ENDPOINT_OR_CLUSTER
```
-> SDK Endpoint configuration via `appboy.xml` is available starting with Braze Android SDK v2.1.1.
+SDK Endpoint configuration via `appboy.xml` is available starting with Braze Android SDK v2.1.1.
### SDK Integration Complete
-Braze should now be collecting data from your application and your basic integration should be complete. Please see the following sections in order to enable custom event tracking, push messaging, the news-feed and the complete suite of Braze features.
+Braze will now be able to collect [specified data from your application]({{ site.baseurl }}/user_guide/data_and_analytics/user_data_collection/overview/) and your basic integration should be complete.
+
+Please see the following sections in order to enable [custom event tracking](/developer_guide/platform_integration_guides/android/analytics/tracking_custom_events/#tracking-custom-events), [push messaging](/developer_guide/platform_integration_guides/android/push_notifications/integration/), the [news feed](/developer_guide/platform_integration_guides/android/news_feed/overview/) and the [complete suite](/developer_guide/platform_integration_guides/android/initial_sdk_setup/android_sdk_integration/) of Braze features.
-## Test your Basic Integration
+## Test Your Basic Integration
-### Confirm Session Tracking is Working
-At this point you shoud have session tracking working in your Braze integration. To test this, go to the `App Usage` section of your dashboard, select your application from the select box (defaulted to `All Apps`), and set `Display Data For` to be `Today`. Then open your app and refresh the page - your main metrics should all have increased by 1.
+### Confirm Session Tracking Is Working
+At this point you should have session tracking working in your Braze integration. To test this, go to the `App Usage` section of your dashboard, select your application from the select box (defaulted to `All Apps`), and set `Display Data For` to be `Today`. Then open your app and refresh the page - your main metrics should all have increased by 1.
![Sessions working][55]
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/news_feed.md b/_docs/_developer_guide/platform_integration_guides/fireos/news_feed.md
index 0fbb49f8df..341906f82f 100644
--- a/_docs/_developer_guide/platform_integration_guides/fireos/news_feed.md
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/news_feed.md
@@ -167,7 +167,7 @@ To log an impression or click on a Card, call [`Card.logClick()`][7] and [`Card.
### Defining a News Feed Category
-Instances of the Braze News Feed can be configured to only receive cards from a certain “category”. This allows for effective integration of multiple News Feed streams within a single application. For more information on this feature see [Braze Academy][14]
+Instances of the Braze News Feed can be configured to only receive cards from a certain “category”. This allows for effective integration of multiple News Feed streams within a single application. For more information on this feature read our pages on [News Feed best practices][14]
News Feed Categories can be defined by calling the following methods as you load the News Feed:
diff --git a/_docs/_developer_guide/platform_integration_guides/fireos/push_notifications/integration.md b/_docs/_developer_guide/platform_integration_guides/fireos/push_notifications/integration.md
index 91d9431663..8dae1bc2df 100644
--- a/_docs/_developer_guide/platform_integration_guides/fireos/push_notifications/integration.md
+++ b/_docs/_developer_guide/platform_integration_guides/fireos/push_notifications/integration.md
@@ -10,7 +10,7 @@ A push notification is an out-of-app alert that appears on the user's screen whe
> ADM (Amazon Device Messaging) is not supported on non-Amazon devices. In order to test Kindle Push you must have a FireOS device ([see Amazon Listing of supported devices][32]).
-Check out [Braze Academy][8] for additional best practices.
+Check out [the Help section][8] for additional best practices.
Braze sends push notifications to Amazon devices using [Amazon Device Messaging (ADM)][14].
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/advanced_use_cases/locations_and_geofences.md b/_docs/_developer_guide/platform_integration_guides/ios/advanced_use_cases/locations_and_geofences.md
index 33dfe7ef09..1432814def 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/advanced_use_cases/locations_and_geofences.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/advanced_use_cases/locations_and_geofences.md
@@ -6,7 +6,7 @@ search_rank: 5
---
## Locations & Geofences
-Geofences are only available in select Braze packages. For access please create a support ticket or speak with your Braze Customer Success Manager. Learn more in the [Braze Academy]({{ site.baseurl }}/developer_guide/platform_integration_guides/fireos/advanced_use_cases/locations_and_geofences/#locations--geofences).
+Geofences are only available in select Braze packages. For access please create a support ticket or speak with your Braze Customer Success Manager. Learn more in [Docs]({{ site.baseurl }}/developer_guide/platform_integration_guides/fireos/advanced_use_cases/locations_and_geofences/#locations--geofences).
To support geofences for iOS:
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/analytics/setting_custom_attributes.md b/_docs/_developer_guide/platform_integration_guides/ios/analytics/setting_custom_attributes.md
index cfeb867eca..922bf7492f 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/analytics/setting_custom_attributes.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/analytics/setting_custom_attributes.md
@@ -255,7 +255,7 @@ To set up a subscription for your users (either email or push), call the functio
Users who grant permission for an app to send them push notifications are defaulted to the status of `ABKOptedin` as iOS requires an explicit opt in.
-> Users will be set to `ABKSubscribed` automatically upon receipt of a valid email address, however we suggest that you establish an explicit opt-in process and set this value to `OptedIn` upon receipt of explicit consent from your user. [See Braze Academy for details][12].
+> Users will be set to `ABKSubscribed` automatically upon receipt of a valid email address, however we suggest that you establish an explicit opt-in process and set this value to `OptedIn` upon receipt of explicit consent from your user. [See the User Guide for details][12].
#### Setting Email Subscriptions
@@ -297,7 +297,7 @@ Appboy.sharedInstance().user.setPushNotificationSubscriptionType(ABKNotification
> Users who grant permission for an app to send them push notifications are defaulted to the status of `ABKOptedin` as iOS requires an explicit optin.
-For more information on implementing subscriptions, visit the topic on [Braze Academy][10].
+For more information on implementing subscriptions, visit our page on [managing user subscriptions][10].
[1]: {{ site.baseurl }}/developer_guide/platform_wide/analytics_overview/#user-data-collection
[2]: http://en.wikipedia.org/wiki/ISO_8601
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/analytics/setting_user_ids.md b/_docs/_developer_guide/platform_integration_guides/ios/analytics/setting_user_ids.md
index 1705bd1fbf..57122fa93c 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/analytics/setting_user_ids.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/analytics/setting_user_ids.md
@@ -8,7 +8,7 @@ search_rank: 5
User IDs should be set for each of your users. These should be unchanging and accessible when a user opens the app. A database ID or a hashed email address/username is usually a good reference to use. We __strongly recommend__ providing this identifier as it will allow you to:
-- Track your users across devices and platforms, improving the quality of your behaviorial and demographic data.
+- Track your users across devices and platforms, improving the quality of your behavioral and demographic data.
- Import data about your users using our [User Data API][1].
- Target specific users with our [Messaging API][2] for both general and transactional messages.
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/analytics/uninstall_tracking.md b/_docs/_developer_guide/platform_integration_guides/ios/analytics/uninstall_tracking.md
index 09a628668f..3893b89c2f 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/analytics/uninstall_tracking.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/analytics/uninstall_tracking.md
@@ -40,7 +40,7 @@ To ensure that your app does not take any unwanted automatic actions upon receiv
#### Step 4: Enable Uninstall Tracking
-Follow the instructions for enabling [Uninstall Tracking][6] on Braze Academy.
+Follow the instructions for enabling uninstall tracking using our [article on Uninstall Tracking][6].
[1]: https://github.com/Appboy/appboy-ios-sdk/blob/master/CHANGELOG.md
[2]: https://github.com/Appboy/appboy-ios-sdk/blob/master/Example/Stopwatch/AppDelegate.m
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/customization.md b/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/customization.md
index 8780ed1650..ce2f95c46e 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/customization.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/customization.md
@@ -1,7 +1,7 @@
---
nav_title: Customization
platform: iOS
-page_order: 3
+page_order: 1
search_rank: 5
---
@@ -9,10 +9,6 @@ search_rank: 5
All of Braze's in-app message types are highly customizable across messages, images, [Font Awesome][26] icons, click actions, analytics, editable styling, custom display options, and custom delivery options. Multiple options can be configured on a per in-app message basis from [within the dashboard][13]. Braze additionally provides multiple levels of advanced customization to satisfy a variety of use cases and needs.
-![Foodo In-App Message Customization Example][21]
-
-_An example of in-app message customization from a Braze client._
-
## Key-Value Pair Extras
`ABKInAppMessage` objects may carry key-value pairs as `extras`. These are specified on the dashboard when creating an in-app message campaign. Key-value pairs can be used to send data down along with an in-app message for further handling by your app, allowing you to add custom behaviors on top of what Braze provides.
@@ -420,7 +416,7 @@ This will be called when a notification is received whilst the application is in
### Step 2: Create a Push Campaign
-Create a silent push campaign which is triggered via the server sent event. For details on how to create a silent push campaign please review this section of our [Academy][39].
+Create a silent push campaign which is triggered via the server sent event. For details on how to create a silent push campaign please review this section of our [Docs][39].
![serverEventTrigger][40]
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/local_in-app_message_delivery.md b/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/in-app_message_delivery.md
similarity index 65%
rename from _docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/local_in-app_message_delivery.md
rename to _docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/in-app_message_delivery.md
index 1ba4bcb2d9..fe3c987a15 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/local_in-app_message_delivery.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/in-app_message_delivery.md
@@ -1,29 +1,63 @@
---
-nav_title: Local In-App Message Delivery
+nav_title: In-App Message Delivery
platform: iOS
-page_order: 2
+page_order: 3
search_rank: 5
---
-# Local In-App Message Delivery
+## In-App Message Delivery
-## The In-App Message Stack
+### Trigger Types
-### Showing In-App Messages
+Our in-app message product allows you to trigger in-app message display as a result of several different event types: `Any Purchase`, `Specific Purchase`, `Session Start`, `Custom Event`, `Push Click`. Furthermore, `Specific Purchase` and `Custom Event` triggers can contain robust property filters.
+
+{% alert important %}
+Triggered in-app messages only work with custom events logged through the SDK and not through the Rest APIs. If you're working with iOS, check out how to log custom events [here]({{ site.baseurl }}/developer_guide/platform_integration_guides/ios/analytics/tracking_custom_events/#tracking-custom-events).
+{% endalert %}
+
+### Delivery Semantics
+
+All in-app messages that a user is eligible for are delivered to the user's device on session start. For more information about the SDK's session start semantics, see our [session lifecycle documentation][45]. Upon delivery, the SDK will pre-fetch assets so that they are available immediately at trigger time, minimizing display latency.
+
+When a trigger event has more than one eligible in-app message associated with it, only the in-app message with the highest priority will be delivered.
+
+For in-app messages that display immediately on delivery, (session start, push click) there can be some latency due to assets not being prefetched.
+
+### Minimum Time Interval Between Triggers
+
+By default, we rate limit in-app messages to once every 30 seconds to ensure a quality user experience.
+
+You can override this value via the `ABKMinimumTriggerTimeIntervalKey` inside the `appboyOptions` parameter passed to `startWithApiKey:inApplication:withLaunchOptions:withAppboyOptions:`. Set the `ABKMinimumTriggerTimeIntervalKey` to the integer value you want as your minimum time in seconds between in-app messages:
+
+```objc
+// Sets the minimum trigger time interval to 5 seconds
+[Appboy startWithApiKey:@"YOUR-API_KEY"
+ inApplication:application
+ withLaunchOptions:options
+ withAppboyOptions:@{ ABKMinimumTriggerTimeIntervalKey : @(5) }];
+```
+
+An example of overriding the default trigger interval can be found in our sample application's [`AppDelegate.m`][https://github.com/Appboy/appboy-ios-sdk/blob/master/Example/Stopwatch/AppDelegate.m] file.
+
+## Local In-App Message Delivery
+
+### The In-App Message Stack
+
+#### Showing In-App Messages
When a user is eligible to receive an in-app message, the `ABKInAppMessageController` will be offered the latest in-app message off the in-app message stack. The stack only persists stored in-app messages in memory and is cleared up between app launches from suspended mode.
-### Adding In-App Messages to the Stack
+#### Adding In-App Messages to the Stack
Users are eligible to receive an in-app message in the following situations:
-- An in-app message trigger event is fired ([In-App Messages][27])
-- Session start event ([In-App Messages][27])
-- A push comes in while the app is open
+- An in-app message trigger event is fired
+- Session start event
+- The app is opened from a push notification
Triggered in-app messages are placed on top of the stack when their trigger event is fired. If multiple in-app messages are in the stack and waiting to be displayed, Braze will display the most recently received in-app message first (last in, first out).
-### Returning In-App Messages to the Stack
+#### Returning In-App Messages to the Stack
A triggered in-app message can be returned back to the stack in the following situations:
@@ -32,7 +66,7 @@ A triggered in-app message can be returned back to the stack in the following si
- The deprecated `beforeInAppMessageDisplayed:withKeyboardIsUp:` [UI delegate method][38] has **NOT** been implemented, and the keyboard is currently being displayed
- The `beforeInAppMessageDisplayed:` [delegate method][30] or the deprecated `beforeInAppMessageDisplayed:withKeyboardIsUp:` [UI delegate method][38] returned `ABKDisplayInAppMessageLater`
-### Discarding In-App Messages
+#### Discarding In-App Messages
A triggered in-app message will be discarded in the following situations:
@@ -43,7 +77,7 @@ A triggered in-app message will be discarded in the following situations:
- The in-app message is a full in-app message but has no image
- The in-app message is a image-only modal in-app message but has no image
-### Manually Queue In-App Message Display
+#### Manually Queue In-App Message Display
If you wish to display an in-app message at other times within your app, you may manually display the top-most in-app message on the stack by calling the following method:
@@ -52,7 +86,7 @@ If you wish to display an in-app message at other times within your app, you may
// YOUR_IN_APP_MESSAGE_DELEGATE should be replaced with your in-app message controller delegate, if you have implemented one.
```
-## Real Time In-App Message Creation & Display
+### Real Time In-App Message Creation & Display
In-app messages can also be locally created within the app and displayed via Braze. This is particularly useful for displaying messages that you wish to trigger within the app in real-time. Braze does not support analytics on in-app messages created locally.
@@ -66,7 +100,6 @@ In-app messages can also be locally created within the app and displayed via Bra
}
```
-
[1]: #customize-inAppMessage-dashboard
[2]: #customize-inAppMessage-code
[3]: #set-delegate
@@ -86,7 +119,6 @@ In-app messages can also be locally created within the app and displayed via Bra
[17]: https://github.com/Appboy/appboy-ios-sdk/blob/master/AppboyKit/headers/AppboyKitLibrary/ABKInAppMessageView.h
[18]: https://github.com/Appboy/appboy-ios-sdk/blob/master/AppboyKit/headers/AppboyKitLibrary/ABKInAppMessageViewController.h
[19]: https://github.com/Appboy/appboy-ios-sdk/blob/master/Samples/InAppMessage/BrazeInAppMessageSample/BrazeInAppMessageSample/CustomInAppMessageViewController.m
-[21]: {% image_buster /assets/img_archive/foodo-slideup.gif %}
[23]: #setting-delegates
[25]: https://github.com/Appboy/appboy-ios-sdk/blob/master/CHANGELOG.md#2121
[26]: http://fortawesome.github.io/Font-Awesome/
@@ -105,3 +137,5 @@ In-app messages can also be locally created within the app and displayed via Bra
[40]: {% image_buster /assets/img_archive/iosServerSentPush.png %}
[41]: {% image_buster /assets/img_archive/iOSServerPush.png %}
[42]: {% image_buster /assets/img_archive/iosIAMeventTrigger.png %}
+[44]: {{ site.baseurl }}/developer_guide/platform_integration_guides/ios/analytics/tracking_custom_events/#tracking-custom-events
+[45]: {{ site.baseurl }}/developer_guide/platform_integration_guides/{{ include.platform }}/analytics/tracking_sessions/#session-lifecycle
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/in-app_message_templates.md b/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/in-app_message_templates.md
index cda956f9ab..62ffe11127 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/in-app_message_templates.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/in-app_message_templates.md
@@ -8,6 +8,12 @@ search_rank: 5
# In-App Message Templates
## Custom App Store Review Prompt
+
+{% alert note %}
+Once you implement this prompt, Braze stops automatically tracking impressions and you must log analytics with the methods found [here]({{ site.baseurl }}/developer_guide/platform_integration_guides/ios/in-app_messaging/customization/#logging-impressions-and-clicks).
+
+{% endalert %}
+
{% raw %}
Creating a campaign to ask users for an App Store review is a popular usage of in-app messages.
@@ -48,7 +54,7 @@ Next, create an In-App Messaging campaign with the following:
{% endraw %}
{% alert tip %}
- Apple limits App Store review prompts to a maximum of three (3) times per year for each user, so your campaign should be [rate-limited]({{ site.baseurl }}/user_guide/engagement_tools/campaigns/testing_and_more/rate-limiting/#user-centric-rate-limiting) to three times per year per user.
+ Apple limits App Store review prompts to a maximum of three (3) times per year for each user, so your campaign should be [rate-limited]({{ site.baseurl }}/user_guide/engagement_tools/campaigns/testing_and_more/rate-limiting/#user-centric-rate-limiting) to three times per year per user.
Users may turn off App Store review prompts. As a result, your custom review prompt should not promise that a native App Store review prompt will appear, or directly ask for a review.
{% endalert %}
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/in-app_message_types.md b/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/in-app_message_types.md
deleted file mode 100644
index 548510563a..0000000000
--- a/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/in-app_message_types.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-nav_title: In-App Message Types
-platform: iOS
-page_order: 1
-search_rank: 5
----
-
-# In-App Message Types
-Braze currently offers the following default in-app message types: `Slideup`, `Modal`, `Full` and `HTML Full`. Each in-app message type is highly customizable across content, images, icons, click actions, analytics, display and delivery.
-
-All in-app messages are subclasses of the `ABKInAppMessage`, which defines basic behavior and traits for all in-app messages. The in-app message class structures as following:
-
-![ABKInAppMessage models][29]
-
-{% include archive/in_app_message.md platform="iOS" %}
-
-[1]: #customize-inAppMessage-dashboard
-[2]: #customize-inAppMessage-code
-[3]: #set-delegate
-[4]: #customize-inAppMessage-display
-[5]: #before-display
-[6]: #manual-cue
-[7]: #situational-display
-[8]: #inAppMessage-click
-[9]: #custom-view
-[10]: #custom-inAppMessage
-[11]: #custom-complete
-[12]: #method-declarations
-[13]: {{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/creating_an_in-app_message/#creating-an-in-app-message
-[14]: https://github.com/Appboy/appboy-ios-sdk/blob/master/AppboyKit/headers/AppboyKitLibrary/ABKInAppMessage.h
-[15]: https://github.com/Appboy/appboy-ios-sdk/blob/master/AppboyKit/headers/AppboyKitLibrary/ABKInAppMessageController.h
-[16]: https://github.com/Appboy/appboy-ios-sdk/blob/master/AppboyKit/headers/AppboyKitLibrary/ABKInAppMessageControllerDelegate.h
-[17]: https://github.com/Appboy/appboy-ios-sdk/blob/master/AppboyKit/headers/AppboyKitLibrary/ABKInAppMessageView.h
-[18]: https://github.com/Appboy/appboy-ios-sdk/blob/master/AppboyKit/headers/AppboyKitLibrary/ABKInAppMessageViewController.h
-[19]: https://github.com/Appboy/appboy-ios-sdk/blob/master/Samples/InAppMessage/BrazeInAppMessageSample/BrazeInAppMessageSample/CustomInAppMessageViewController.m
-[21]: {% image_buster /assets/img_archive/foodo-slideup.gif %}
-[23]: #setting-delegates
-[25]: https://github.com/Appboy/appboy-ios-sdk/blob/master/CHANGELOG.md#2121
-[26]: http://fortawesome.github.io/Font-Awesome/
-[27]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#in-app-messages-triggered
-[29]: {% image_buster /assets/img_archive/ABKInAppMessage-models.png %}
-[30]: #in-app-message-controller-delegate
-[31]: #customizing-appboy-on-startup
-[32]: https://github.com/Appboy/appboy-ios-sdk/blob/master/AppboyKit/headers/AppboyKitLibrary/ABKInAppMessageControllerDelegate.h
-[33]: {{ site.baseurl }}/developer_guide/platform_integration_guides/ios/push_notifications/troubleshooting/#step-2-devices-register-for-apns-and-provide-braze-with-push-tokens
-[34]: https://github.com/Appboy/appboy-ios-sdk/blob/master/AppboyUI/InAppMessage/ABKInAppMessageUIDelegate.h
-[35]: https://github.com/Appboy/appboy-ios-sdk/blob/master/Samples/InAppMessage/BrazeInAppMessageSample/BrazeInAppMessageSample/ViewController.m
-[36]: https://github.com/Appboy/appboy-ios-sdk/blob/master/Samples/InAppMessage/BrazeInAppMessageSample/BrazeInAppMessageSample/AppDelegate.m
-[37]: https://github.com/Appboy/appboy-ios-sdk/tree/master/AppboyUI/InAppMessage/ViewControllers
-[38]: #in-app-mssage-ui-delegate
-[39]: {{ site.baseurl }}/developer_guide/platform_integration_guides/ios/push_notifications/silent_push_notifications/
-[40]: {% image_buster /assets/img_archive/iosServerSentPush.png %}
-[41]: {% image_buster /assets/img_archive/iOSServerPush.png %}
-[42]: {% image_buster /assets/img_archive/iosIAMeventTrigger.png %}
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/overview.md b/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/overview.md
index 91fe268f4d..8d6e7b74c7 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/overview.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/overview.md
@@ -5,11 +5,122 @@ page_order: 0
search_rank: 5
---
-# In-App Messaging
+# In-App Messages
-In-app messages are great for creating unobtrusive calls to action, notifying people of new content in the News Feed and driving them toward it or communicating with users who have push turned off. In-app messages are also effective for other content that isn't time-sensitive enough to warrant a push notification, or permanent enough to warrant a News Feed item. You can find a detailed explanation of in-app message behavior in [Braze Academy][13].
+__In-App Messages__ help you get content to your user without interrupting their day with a push notification. Customized and tailored in-app messages enhance the user experience and help your audience get the most value out of your app. With a variety of layouts and customization tools to choose from, in-app messages engage your users more than ever before.
+
+To see examples of in-app messages, check out our [Client Integration Gallery][31].
+
+{% comment %}
+Embed video on the right. Demos all of the topics mentioned on this page.
+{% endcomment %}
+
+{% alert note %}
+Braze has refreshed in-app messages! Though the creation process is very much the same, our in-app messages have a new, modern look and feel optimized for the best experiences for your customers and give you more options to personalize the experience. For more information on our most recent upgrades to in-app messages, check out our [Generation Comparison documentation]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/generations/)!
+{% endalert %}
+
+[Create an in-app message]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/create/) now!
By default, in-app messages are enabled after completing the standard SDK integration, including GIF support. Note that if you did not integrate SDWebImage, in-app messages with images will not work.
+## When to Use In-App Messages
+
+In-app messages are good for a lot of things. They can be used in web apps, Android apps, iOS apps, and more!
+
+In-app messages don't deliver outside of the user's app and won't intrude on their home screen, like push notifications do. In-app messages, by their nature, exist within your app and come with context and are almost never unwelcome! They're always delivered when the user is active within your app.
+
+### Great Use Cases
+
+- New App Features
+- App Management
+- Reviews
+- App Upgrades/Updates
+- Giveaways & Sweepstakes
+- Sales and Promotions
+- Product Sales
+- Encouraging and rewarding discovery
+- [Permission Requests/Push Priming][30]
+
+## In-App Message Types
+Braze currently offers the following default in-app message types: `Slideup`, `Modal`, `Full` and `HTML Full`. Each in-app message type is highly customizable across content, images, icons, click actions, analytics, display and delivery.
+
+All in-app messages are subclasses of the `ABKInAppMessage`, which defines basic behavior and traits for all in-app messages. The in-app message class structures as following:
+
+![ABKInAppMessage models][29]
+
+### Expected Behaviors by Message Types
+
+These are what it looks like for your users to open one of our out-of-the-box in-app message types.
+
+{% tabs %}
+ {% tab Slideup %}
+
+ [`Slideup`](http://appboy.github.io/appboy-ios-sdk/docs/interface_a_b_k_slideup.html)in-app messages are so-named because they "slide up" or "slide down" from the top or bottom of the screen. They cover a small portion of the screen and provide an effective and non-intrusive messaging capability.
+
+
+
+ ![Slideup Behavior]({% image_buster /assets/img/slideup-behavior.gif %}){: style="border:0px;"}
+
+
+
+{% endtab %}
+{% tab Modal %}
+
+[`Modal`](http://appboy.github.io/appboy-ios-sdk/docs/interface_a_b_k_modal.html)in-app messages appear in the center of the screen and are framed by a translucent panel. Useful for more critical messaging, they can be equipped with up to two click action and analytics enabled buttons.
+
+
+
+ ![Modal Behavior]({% image_buster /assets/img/modal-behavior.gif %}){: style="border:0px;"}
+
+
+
+{% endtab %}
+{% tab Full Screen %}
+
+[`Full`](http://appboy.github.io/appboy-ios-sdk/docs/interface_a_b_k_full.html)in-app messages are useful for maximizing the content and impact of your user communication. The upper half of a `full` in-app message contains an image and the lower half displays text as well as up to two click action and analytics enabled buttons.
+
+
+
+![Full-Screen Behavior]({% image_buster /assets/img/full-screen-behavior.gif %}){: style="border:0px;"}
+
+
+
+{% endtab %}
+{% tab Custom HTML %}
+
+[`HTML Full`](http://appboy.github.io/appboy-ios-sdk/docs/interface_a_b_k_h_t_m_l_full.html) in-app messages are useful for creating fully customized user content. User-defined HTML Full in-app message content is displayed in a `UIWebView`and may optionally contain other rich content, such as images and fonts, allowing for full control over message appearance and functionality.
+
+The following example shows a paginated HTML Full in-app message:
+
+![HTML5 Example]({% image_buster /assets/img_archive/ios-html-full-iam.gif %})
+
+> Full in-app message content is displayed in a UIWebView and may optionally contain other rich content, such as images and fonts, allowing for full control over message appearance and functionality. **Please note that we currently do not support display of custom HTML in-app messages in an iFrame on the iOS and Android platforms.**
+
+{% endtab %}
+{% endtabs %}
+
-[13]: {{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/creating_an_in-app_message/#creating-an-in-app-message
+[1]: http://appboy.github.io/appboy-ios-sdk/docs/interface_a_b_k_slideup.html
+[2]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageSlideup.html
+[3]: http://appboy.github.io/appboy-ios-sdk/docs/interface_a_b_k_modal.html
+[4]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageModal.html
+[5]: http://appboy.github.io/appboy-ios-sdk/docs/interface_a_b_k_full.html
+[6]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageFull.html
+[7]: http://appboy.github.io/appboy-ios-sdk/docs/interface_a_b_k_h_t_m_l_full.html
+[8]: https://appboy.github.io/appboy-android-sdk/javadocs/com/appboy/models/InAppMessageHtmlFull.html
+[9]: {% image_buster /assets/img_archive/In-App_Slideup.png %}
+[10]: {% image_buster /assets/img_archive/In-App_Modal.png %}
+[11]: {% image_buster /assets/img_archive/In-App_Full.png %}
+[12]: {% image_buster /assets/img_archive/HTML5.gif %}
+[13]: {% image_buster /assets/img_archive/trigger-iam-composer.png %}
+[14]: {{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/creating_an_in-app_message/#original-in-app-messages
+[15]: {{ site.baseurl }}/developer_guide/platform_integration_guides/{{ include.platform }}/analytics/tracking_sessions/#session-lifecycle
+[16]: https://github.com/Appboy/appboy-ios-sdk/blob/master/Example/Stopwatch/AppDelegate.m
+[17]: https://github.com/Appboy/appboy-android-sdk/blob/master/droidboy/src/main/res/values/appboy.xml
+[19]: {{ site.baseurl }}/developer_guide/platform_integration_guides/{{ include.platform }}/in-app_messaging/#in-app-messages-triggered
+[23]: {% image_buster /assets/img_archive/ios-html-full-iam.gif %}
+[24]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/analytics/tracking_custom_events/#tracking-custom-events
+[25]: {{ site.baseurl }}/developer_guide/platform_integration_guides/ios/analytics/tracking_custom_events/#tracking-custom-events
+[29]: {% image_buster /assets/img_archive/ABKInAppMessage-models.png %}
+[30]: {{ site.baseurl }}/help/best_practices/push/creating_custom_opt-in_prompts/#creating-custom-opt-in-prompts
+[31]: {{ site.baseurl }}/help/best_practices/client_integration_gallery/#client-integration-iam
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/troubleshooting_in-app_messages.md b/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/troubleshooting.md
similarity index 98%
rename from _docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/troubleshooting_in-app_messages.md
rename to _docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/troubleshooting.md
index ae5e0053b7..4752375f90 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/troubleshooting_in-app_messages.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/in-app_messaging/troubleshooting.md
@@ -1,7 +1,7 @@
---
-nav_title: Troubleshooting In-App Messages
+nav_title: Troubleshooting
platform: iOS
-page_order: 5
+page_order: 4
search_rank: 5
---
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/initial_sdk_setup/initial_sdk_setup.md b/_docs/_developer_guide/platform_integration_guides/ios/initial_sdk_setup/initial_sdk_setup.md
index 611d74940e..cbe1b413b6 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/initial_sdk_setup/initial_sdk_setup.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/initial_sdk_setup/initial_sdk_setup.md
@@ -6,6 +6,11 @@ search_rank: 5
---
# Initial SDK Setup
+
+{% alert important %}
+The iOS SDK file size is _1MB to 2MB_ for the IPA, in addition to App File, and 30MB for the Framework.
+{% endalert %}
+
{% include archive/apple/initial_setup.md platform="iOS" %}
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/push_notifications/integration.md b/_docs/_developer_guide/platform_integration_guides/ios/push_notifications/integration.md
index 74def1348b..51969ec228 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/push_notifications/integration.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/push_notifications/integration.md
@@ -4,6 +4,11 @@ platform: iOS
page_order: 0
search_rank: 5
---
+
+{% alert tip %}
+We strongly recommend that you implement the SDK via a [CocoaPod](http://cocoapods.org/). It will save you a lot of time and automate much of the process for you. However, if you are unable to do so you may complete integration manually without CocoaPods by using our manual integration instructions [here]({{ site.baseurl }}/developer_guide/platform_integration_guides/ios/initial_sdk_setup/manual_integration_options/#manual-integration-options).
+{% endalert %}
+
## Integration {#push-integration}
A push notification is an out-of-app alert that appears on the user's screen when an important update occurs. Push notifications are a valuable way to provide your users with time-sensitive and relevant content or to re-engage them with your app.
@@ -20,7 +25,7 @@ For more information and best practices on push, visit our [Braze Academy][0] pa
#### Recommended Option: Using a .p8 File (Authentication Tokens)
-As described on [this page](http://help.apple.com/xcode/mac/current/#/dev54d690a66),
+As described on [this page](https://help.apple.com/developer-account/#/devcdfbb56a3),
1. In your developer account, go to [Certificates, Identifiers & Profiles](https://developer.apple.com/account/ios/certificate).
2. Under Keys, select All and click the Add button (+) in the upper-right corner.
@@ -65,7 +70,7 @@ Alternately, you may utilize Apple's older authentication scheme (.p12 SSL certi
### Step 2: Enable Push Capabilities
-In your project settings, ensure that under the `Capabilities` tab your `Push Notifications` capability is toggled on, as described on [this page](http://help.apple.com/xcode/mac/current/#/devdfd3d04a1).
+In your project settings, ensure that under the `Capabilities` tab your `Push Notifications` capability is toggled on, as described on [this page](https://help.apple.com/developer-account/#/devcdfbb56a3).
![enable push notification][24]
@@ -411,11 +416,11 @@ Use the following code to register for Braze's default push categories when you
{% tab OBJECTIVE-C %}
```objc
-// For UserNotification.framework
+// For UserNotification.framework (iOS 10+ only)
NSSet *appboyCategories = [ABKPushUtils getAppboyUNNotificationCategorySet];
[[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:appboyCategories];
-// For UIUserNotificationSettings
+// For UIUserNotificationSettings (before iOS 10)
NSSet *appboyCategories = [ABKPushUtils getAppboyUIUserNotificationCategorySet];
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge
categories:appboyCategories];
@@ -426,11 +431,11 @@ UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTy
{% tab swift %}
```swift
-// For UserNotification.framework
+// For UserNotification.framework (iOS 10+ only)
let appboyCategories = ABKPushUtils.getAppboyUNNotificationCategorySet()
UNUserNotificationCenter.current().setNotificationCategories(appboyCategories)
-// For UIUserNotificationSettings
+// For UIUserNotificationSettings (before iOS 10)
let appboyCategories = ABKPushUtils.getAppboyUIUserNotificationCategorySet()
let settings = UIUserNotificationSettings.init(types: .badge, categories: appboyCategories)
UIApplication.shared.registerUserNotificationSettings(settings)
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/push_notifications/silent_push_notifications.md b/_docs/_developer_guide/platform_integration_guides/ios/push_notifications/silent_push_notifications.md
index df0d8cb854..0745c8e392 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/push_notifications/silent_push_notifications.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/push_notifications/silent_push_notifications.md
@@ -41,7 +41,6 @@ Braze has several features which rely on iOS Silent Push Notifications:
|---|---|
|Uninstall Tracking | User receives a silent, nightly uninstall tracking push.|
|Geofences | Silent syncing of geofences from server to device.|
-|Push Stories | User receives a push story.|
For more information, check out Apple's developer site on the [Instance Method][7] and [Unreceived Notifications][8].
diff --git a/_docs/_developer_guide/platform_integration_guides/ios/push_story.md b/_docs/_developer_guide/platform_integration_guides/ios/push_story.md
index 0677c8735e..5939ec0991 100644
--- a/_docs/_developer_guide/platform_integration_guides/ios/push_story.md
+++ b/_docs/_developer_guide/platform_integration_guides/ios/push_story.md
@@ -150,7 +150,7 @@ In your `NotificationViewController.m`, remove the default implementation and ad
Open the Info.plist file of the Notification Content Extension and add/change following keys under `NSExtension \ NSExtensionAttributes`:
-`UNNotificationExtensionCategory` = `ab_cat_push_story` (`String` type)
+`UNNotificationExtensionCategory` = `ab_cat_push_story_v2` (`String` type)
`UNNotificationExtensionDefaultContentHidden` = `YES` (`Boolean` type)
`UNNotificationExtensionInitialContentSizeRatio` = `0.65` (`Number` type)
diff --git a/_docs/_developer_guide/platform_integration_guides/react_native/android_and_fireos/analytics/logging_custom_events.md b/_docs/_developer_guide/platform_integration_guides/react_native/android_and_fireos/analytics/logging_custom_events.md
index 5e7d6e4ef7..a938a669f2 100644
--- a/_docs/_developer_guide/platform_integration_guides/react_native/android_and_fireos/analytics/logging_custom_events.md
+++ b/_docs/_developer_guide/platform_integration_guides/react_native/android_and_fireos/analytics/logging_custom_events.md
@@ -11,7 +11,7 @@ See [the Android integration instructions][1] for in depth discussion of event t
```javascript
var properties = {};
properties["KeyOne"] = "Val1";
-ReactAppboy.logCustomEvent("cordovaCustomEventWithProperties", properties);
+ReactAppboy.logCustomEvent("reactNativeCustomEventWithProperties", properties);
```
[1]: {{ site.baseurl }}/developer_guide/platform_integration_guides/android/initial_sdk_setup/
diff --git a/_docs/_developer_guide/platform_integration_guides/react_native/ios/analytics/logging_custom_events.md b/_docs/_developer_guide/platform_integration_guides/react_native/ios/analytics/logging_custom_events.md
index 2a29d749af..e03aed8fee 100644
--- a/_docs/_developer_guide/platform_integration_guides/react_native/ios/analytics/logging_custom_events.md
+++ b/_docs/_developer_guide/platform_integration_guides/react_native/ios/analytics/logging_custom_events.md
@@ -11,7 +11,7 @@ See [the iOS integration instructions][1] for in depth discussion of event track
```javascript
var properties = {};
properties["KeyOne"] = "Val1";
-ReactAppboy.logCustomEvent("cordovaCustomEventWithProperties", properties);
+ReactAppboy.logCustomEvent("reactNativeCustomEventWithProperties", properties);
```
[1]: {{ site.baseurl }}/developer_guide/platform_integration_guides/ios/analytics/tracking_custom_events/
diff --git a/_docs/_developer_guide/platform_integration_guides/unity/Analytics/setting_custom_attributes.md b/_docs/_developer_guide/platform_integration_guides/unity/Analytics/setting_custom_attributes.md
index 1edeaa4489..216b931850 100644
--- a/_docs/_developer_guide/platform_integration_guides/unity/Analytics/setting_custom_attributes.md
+++ b/_docs/_developer_guide/platform_integration_guides/unity/Analytics/setting_custom_attributes.md
@@ -138,7 +138,7 @@ To set up a subscription for your users (either email or push), call the functio
| `SUBSCRIBED` | Subscribed, but not explicitly opted in |
| `UNSUBSCRIBED` | Unsubscribed and/or explicitly opted out |
-> No explicit opt-in is required by Windows to send users push notifications. When a user is registered for push, they are set to `SUBSCRIBED` rather than `OPTED_IN` by default. For more information on implementing subscriptions and explicit opt-ins, visit the topic on [Braze Academy][10].
+> No explicit opt-in is required by Windows to send users push notifications. When a user is registered for push, they are set to `SUBSCRIBED` rather than `OPTED_IN` by default. To learn more, check out our documentation on [implementing subscriptions and explicit opt-ins][10].
- `EmailNotificationSubscriptionType`
- Users will be set to `SUBSCRIBED` automatically upon receipt of a valid email address. However, we suggest that you establish an explicit opt-in process and set this value to `OPTED_IN` upon receipt of explicit consent from your user. [See Braze Academy for details][8].
diff --git a/_docs/_developer_guide/platform_integration_guides/unity/Analytics/setting_user_ids.md b/_docs/_developer_guide/platform_integration_guides/unity/Analytics/setting_user_ids.md
index 2157ee9521..4fcd8bc86e 100644
--- a/_docs/_developer_guide/platform_integration_guides/unity/Analytics/setting_user_ids.md
+++ b/_docs/_developer_guide/platform_integration_guides/unity/Analytics/setting_user_ids.md
@@ -7,7 +7,7 @@ page_order: 0
A user ID should be set for each of your users. These should be unchanging and accessible when a user opens the app. Something like a username, or a unique identifier from your database is usually a good reference to use. We __strongly recommend__ providing this identifier. It will allow you to:
-- Track your users across devices and platforms, improving the quality of your behaviorial and demographic data.
+- Track your users across devices and platforms, improving the quality of your behavioral and demographic data.
- Import data about your users using our [User API][1] from any source.
- Target specific users with our [Messaging API][2] for both general and transactional messages.
diff --git a/_docs/_developer_guide/platform_integration_guides/unity/android/push_notifications.md b/_docs/_developer_guide/platform_integration_guides/unity/android/push_notifications.md
index d9f76aff96..201bc9c1cd 100644
--- a/_docs/_developer_guide/platform_integration_guides/unity/android/push_notifications.md
+++ b/_docs/_developer_guide/platform_integration_guides/unity/android/push_notifications.md
@@ -12,7 +12,7 @@ Sample push notification:
![Sample Push][23]
-Check out [Braze Academy][8] for additional best practices.
+Check out [our troubleshooting section][8] for additional best practices.
Braze sends push notifications to Android devices using [Firebase Cloud Messaging (FCM)][9].
diff --git a/_docs/_developer_guide/platform_integration_guides/web/analytics/setting_user_ids.md b/_docs/_developer_guide/platform_integration_guides/web/analytics/setting_user_ids.md
index 1c1e4f2664..3d5d641a70 100644
--- a/_docs/_developer_guide/platform_integration_guides/web/analytics/setting_user_ids.md
+++ b/_docs/_developer_guide/platform_integration_guides/web/analytics/setting_user_ids.md
@@ -8,7 +8,7 @@ search_rank: 5
User IDs should be set for each of your users. These should be unchanging and accessible when a user opens the app. A database ID or a hashed email address/username is usually a good reference to use. We __strongly recommend__ providing this identifier as it will allow you to:
-- Track your users across devices and platforms, improving the quality of your behaviorial and demographic data.
+- Track your users across devices and platforms, improving the quality of your behavioral and demographic data.
- Import data about your users using our [User Data API][1].
- Target specific users with our [Messaging API][2] for both general and transactional messages.
diff --git a/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/customization.md b/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/customization.md
new file mode 100644
index 0000000000..726e4a26ca
--- /dev/null
+++ b/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/customization.md
@@ -0,0 +1,74 @@
+---
+nav_title: Customization
+platform: Web
+page_order: 3
+search_rank: 5
+---
+
+## Customization {#in-app-message-customization}
+
+All of Braze’s in-app message types are highly customizable across messages, images, [Font Awesome][15] icons, click actions, analytics, editable styling, custom display options, and custom delivery options. Multiple options can be configured on a per in-app message basis from [within the dashboard]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/create/). Braze additionally provides multiple levels of advanced customization to satisfy a variety of use cases and needs.
+
+### Key-Value Pair Extras
+
+In-app message objects may carry key-value pairs as their `extras` property. These are specified on the dashboard under "Additional Message Settings" when creating an in-app message campaign. These can be used to send data down along with an in-app message for further handling by your site. For example:
+
+```javascript
+appboy.subscribeToNewInAppMessages(function(inAppMessages) {
+ if (inAppMessages[0] instanceof appboy.ab.InAppMessage) {
+ var extras = inAppMessages[0].extras;
+ for (var key in extras) {
+ if (data.hasOwnProperty(key)) {
+ console.log("key: " + key + ", value: " + extras[key]);
+ }
+ }
+ }
+
+ appboy.display.showInAppMessage(inAppMessages[0]);
+ return inAppMessages.slice(1);
+});
+```
+
+### Custom Styling
+
+Braze UI elements come with a default look and feel that create a neutral in-app message experience and and aims for consistency with other Braze mobile platforms. Braze's default styles are defined in CSS within the Braze SDK. By overriding selected styles in your application, it is possible to customize our standard in-app message types with your own background images, font families, styles, sizes, animations, and more. For instance, the following is an example override that will cause an in-app message's headers to appear italicized:
+
+```css
+ body .ab-in-app-message .ab-message-header {
+ font-style: italic;
+ }
+```
+
+See the [JSDocs][2] for more information.
+
+
+[1]: https://github.com/Appboy/appboy-web-sdk#getting-started
+[2]: https://js.appboycdn.com/web-sdk/latest/doc/ab.InAppMessage.html
+[3]: https://js.appboycdn.com/web-sdk/latest/doc/ab.SlideUpMessage.html
+[4]: {{ site.baseurl }}//help/best_practices/in-app_messages/in-app_message_behavior/#in-app-message-behavior
+[5]: #display-in-app
+[6]: https://js.appboycdn.com/web-sdk/latest/doc/ab.ModalMessage.html
+[7]: https://js.appboycdn.com/web-sdk/latest/doc/ab.FullScreenMessage.html
+[8]: https://js.appboycdn.com/web-sdk/latest/doc/ab.ControlMessage.html
+[9]: https://js.appboycdn.com/web-sdk/latest/doc/module-appboy.html#.initialize
+[10]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/analytics/tracking_sessions/#session-lifecycle
+[11]: #inapp-customization
+[12]: https://js.appboycdn.com/web-sdk/latest/doc/ab.HtmlMessage.html
+[13]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#slideup-in-app-messages
+[14]: #key-value
+[15]: https://fontawesome.com/?from=io
+[17]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#modal-in-app-messages
+[30]: {% image_buster /assets/img_archive/trigger-iam-composer.png %}
+[32]: #in-app-messages-triggered
+[33]: #original-in-app-messages-deprecated
+[35]: #styling
+[40]: #message-types
+[41]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#full-in-app-messages
+[42]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#html-in-app-messages
+[46]: #inapp-control
+[47]: {% image_buster /assets/img_archive/In-App_Full.png %}
+[48]: {% image_buster /assets/img_archive/In-App_Modal.png %}
+[49]: {% image_buster /assets/img_archive/Web_Slideup.png %}
+[50]: https://github.com/carlsednaoui/ouibounce
+[51]: {% image_buster /assets/img_archive/ios-html-full-iam.gif %}
+[52]: {{ site.baseurl }}/help/best_practices/in-app_messages/web_browsers_only/#web-html-messages
diff --git a/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/in-app_message_delivery.md b/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/in-app_message_delivery.md
new file mode 100644
index 0000000000..745ddc6487
--- /dev/null
+++ b/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/in-app_message_delivery.md
@@ -0,0 +1,95 @@
+---
+nav_title: In-App Message Delivery
+platform: Web
+page_order: 4
+search_rank: 5
+---
+## In-App Message Delivery
+
+#### Trigger Types
+
+Our in-app message product allows you to trigger in-app message display as a result of several different event types: `Any Purchase`, `Specific Purchase`, `Session Start`, `Custom Event`, `Push Click`. Furthermore, `Specific Purchase` and `Custom Event` triggers can contain robust property filters.
+
+#### Delivery Semantics
+All in-app messages that a user is eligible for are automatically delivered to the user upon a session start event. For more information about the SDK's session start semantics, see our [session lifecycle documentation][10].
+
+#### Minimum Time Interval Between Triggers
+By default we rate limit in-app messages to once every 30 seconds to ensure a quality user experience. To override this value, you can pass the `minimumIntervalBetweenTriggerActionsInSeconds` configuration option to your [`initialize`][9] function.
+
+```js
+// Sets the minimum time interval between triggered in-app messages to 5 seconds instead of the default 30
+appboy.initialize('YOUR-API-KEY', { minimumIntervalBetweenTriggerActionsInSeconds: 5 })
+```
+
+### Manual In-App Message Display
+
+If you don't want your site to immediately display new in-app messages when they're received, you can disable automatic display and register your own display subscribers. First, find and remove the call to `appboy.display.automaticallyShowNewInAppMessages()` from within your loading snippet. Then, create your own subscriber:
+
+```javascript
+appboy.subscribeToNewInAppMessages(function(inAppMessages) {
+ // Display the first in-app message. You could defer display here by pushing this message to code within in your own application.
+ // If you don't want to use Braze's built-in display capabilities, you could alternatively pass the in-app message to your own display code here.
+ appboy.display.showInAppMessage(inAppMessages[0]);
+
+ // Return an array with any remaining, unhandled messages to Braze's internal queue.
+ // These will be part of the inAppMessages param the next time this subscriber is invoked.
+ return inAppMessages.slice(1);
+});
+```
+
+The `inAppMessages` parameter will be an array of [`appboy.ab.InAppMessage`][2] subclass or [`appboy.ab.ControlMessage`][8] objects, each of which has various lifecycle event subscription methods. See the [JSDocs][2] for full documentation.
+
+> Only one [`Modal`][17] or [`Full`][41] in-app message can be displayed at a given time. If you attempt to show a second Modal or Full message while one is already showing, `appboy.display.showInAppMessage` will return false, and the message will automatically be returned to Braze's internal queue, where it will part of the `inAppMessages` array parameter the next time your subscriber is invoked.
+
+#### Local In-App Messages
+
+In-app messages can also be created within your site and displayed locally in real-time. All customization options available on the dashboard are also available locally. This is particularly useful for displaying messages that you wish to trigger within the app in real-time. However, analytics on these locally-created messages will not be available within the Braze dashboard.
+
+```javascript
+ // Displays a slideup type in-app message.
+ var message = new appboy.ab.SlideUpMessage("Welcome to Braze! This is an in-app message.");
+ message.slideFrom = appboy.ab.InAppMessage.SlideFrom.TOP;
+ appboy.display.showInAppMessage(message);
+```
+
+### Exit-Intent Messages
+
+Exit-intent in-app messages appear when visitors are about to navigate away from your site. They provide another opportunity to communicate important information to users, while not interrupting their experience on your site. To be able to send these messages, first reference the [open-source library][50] with the code below, which will log 'exit intent' as a custom event. In-app message campaigns can then be created in the dashboard using 'exit intent' as the trigger custom event.
+
+```javascript
+ var _ouibounce = ouibounce(false, {
+ callback: function() { appboy.logCustomEvent('exit intent'); }
+ });
+```
+
+
+[1]: https://github.com/Appboy/appboy-web-sdk#getting-started
+[2]: https://js.appboycdn.com/web-sdk/latest/doc/ab.InAppMessage.html
+[3]: https://js.appboycdn.com/web-sdk/latest/doc/ab.SlideUpMessage.html
+[4]: {{ site.baseurl }}//help/best_practices/in-app_messages/in-app_message_behavior/#in-app-message-behavior
+[5]: #display-in-app
+[6]: https://js.appboycdn.com/web-sdk/latest/doc/ab.ModalMessage.html
+[7]: https://js.appboycdn.com/web-sdk/latest/doc/ab.FullScreenMessage.html
+[8]: https://js.appboycdn.com/web-sdk/latest/doc/ab.ControlMessage.html
+[9]: https://js.appboycdn.com/web-sdk/latest/doc/module-appboy.html#.initialize
+[10]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/analytics/tracking_sessions/#session-lifecycle
+[11]: #inapp-customization
+[12]: https://js.appboycdn.com/web-sdk/latest/doc/ab.HtmlMessage.html
+[13]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#slideup-in-app-messages
+[14]: #key-value
+[15]: http://fortawesome.github.io/Font-Awesome/
+[17]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#modal-in-app-messages
+[30]: {% image_buster /assets/img_archive/trigger-iam-composer.png %}
+[32]: #in-app-messages-triggered
+[33]: #original-in-app-messages-deprecated
+[35]: #styling
+[40]: #message-types
+[41]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#full-in-app-messages
+[42]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#html-in-app-messages
+[46]: #inapp-control
+[47]: {% image_buster /assets/img_archive/In-App_Full.png %}
+[48]: {% image_buster /assets/img_archive/In-App_Modal.png %}
+[49]: {% image_buster /assets/img_archive/Web_Slideup.png %}
+[50]: https://github.com/carlsednaoui/ouibounce
+[51]: {% image_buster /assets/img_archive/ios-html-full-iam.gif %}
+[52]: {{ site.baseurl }}/help/best_practices/in-app_messages/web_browsers_only/#web-html-messages
diff --git a/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/integration.md b/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/integration.md
new file mode 100644
index 0000000000..f6409c03e1
--- /dev/null
+++ b/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/integration.md
@@ -0,0 +1,12 @@
+---
+nav_title: Integration
+platform: Web
+page_order: 1
+search_rank: 5
+---
+## Integration
+
+By default, in-app messages are automatically displayed as part of our [recommended integration instructions][1]. Additional customization can be done by following the steps in this guide.
+
+
+[1]: https://github.com/Appboy/appboy-web-sdk#getting-started
diff --git a/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/overview.md b/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/overview.md
new file mode 100644
index 0000000000..ed29fcdf50
--- /dev/null
+++ b/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/overview.md
@@ -0,0 +1,108 @@
+---
+nav_title: Overview
+platform: Web
+page_order: 0
+search_rank: 5
+---
+# In-App Messages
+
+__In-App Messages__ help you get content to your user without interrupting their day with a push notification. Customized and tailored in-app messages enhance the user experience and help your audience get the most value out of your app. With a variety of layouts and customization tools to choose from, in-app messages engage your users more than ever before.
+
+{% comment %}
+Embed video on the right. Demos all of the topics mentioned on this page.
+{% endcomment %}
+
+{% alert note %}
+Braze has refreshed in-app messages! Though the creation process is very much the same, our in-app messages have a new, modern look and feel optimized for the best experiences for your customers and give you more options to personalize the experience. For more information on our most recent upgrades to in-app messages, check out our [Generation Comparison documentation]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/generations/)!
+{% endalert %}
+
+## When to Use In-App Messages
+
+In-app messages are good for a lot of things. They can be used in web apps, Android apps, iOS apps, and more!
+
+In-app messages don't deliver outside of the user's app and won't intrude on their home screen, like push notifications do. In-app messages, by their nature, exist within your app and come with context and are almost never unwelcome! They're always delivered when the user is active within your app.
+
+### Great Use Cases
+
+- New App Features
+- App Management
+- Reviews
+- App Upgrades/Updates
+- Giveaways & Sweepstakes
+
+To see examples of in-app messages, check out our [Client Integration Gallery][53].
+
+### In-App Message Types
+
+Braze currently offers the following default in-app message types: [`Slideup`][13], [`Modal`][17], and [`Full`][41] and [`HTML`][42]. Each in-app message type is customizable across content, images, icons, click actions, analytics, display, and delivery.
+
+All in-app messages inherit their prototype from [`appboy.ab.InAppMessage`][2], which defines basic behavior and traits for all in-app messages. The protypical subclasses are [appboy.ab.SlideUpMessage][3], [appboy.ab.ModalMessage][6], [appboy.ab.FullScreenMessage][7], and [appboy.ab.HtmlMessage][12].
+
+### Expected Behaviors by Message Types
+
+These are what it looks like for your users to open one of our out-of-the-box in-app message types.
+
+{% tabs %}
+ {% tab Slideup %}
+
+ [`SlideUp`](https://js.appboycdn.com/web-sdk/latest/doc/ab.SlideUpMessage.html) in-app messages are so-named because traditionally on mobile platforms they "slide up" or "slide down" from the top or bottom of the screen. In the Braze Web SDK, these messages are actually displayed as more of a Growl or Toast style notification, to align with the web's dominant paradigm. They cover a small portion of the screen and provide an effective and non-intrusive messaging capability.
+
+
+
+ ![Slideup Behavior]({% image_buster /assets/img/slideup-behavior.gif %}){: style="border:0px;"}
+
+
+
+{% endtab %}
+{% tab Modal %}
+
+[`Modal`](https://js.appboycdn.com/web-sdk/latest/doc/ab.ModalMessage.html) in-app messages appear in the center of the screen and are framed by a translucent panel. Useful for more critical messaging, they can be equipped with up to two click action and analytics enabled buttons.
+
+
+
+ ![Modal Behavior]({% image_buster /assets/img/modal-behavior.gif %}){: style="border:0px;"}
+
+
+
+{% endtab %}
+{% tab Full Screen %}
+
+[`Full`](https://js.appboycdn.com/web-sdk/latest/doc/ab.FullScreenMessage.html) in-app messages are useful for maximizing the content and impact of your user communication. On narrow browser windows (e.g. the mobile web), `full` in-app messages take up the entire browser window. On larger browser windows, `full` in-app messages appear similarly to `modal` in-app messages. The upper half of a `full` in-app message contains an image and the lower half allows up to eight lines of text as well as up to two click action and analytics enabled buttons
+
+
+
+![Full-Screen Behavior]({% image_buster /assets/img/full-screen-behavior.gif %}){: style="border:0px;"}
+
+
+
+{% endtab %}
+{% tab Custom HTML %}
+
+[`HTML`](https://js.appboycdn.com/web-sdk/latest/doc/ab.HtmlMessage.html) in-app messages are useful for creating fully customized user content. User-defined HTML is displayed in an iframe and may contain rich content, such as images, fonts, videos, and interactive elements, allowing for full control over message appearance and functionality. These support a Javascript `appboyBridge` interface to call methods on the Braze Web SDK from within your HTML, see [Best Practices]({{ site.baseurl }}/help/best_practices/in-app_messages/web_browsers_only/#web-html-messages) for more details.
+
+> To enable HTML in-app messages, your SDK integration must supply the `enableHtmlInAppMessages` initialization option to Braze, e.g. `appboy.initialize('YOUR-API_KEY', {enableHtmlInAppMessages: true})`. This is for security reasons - HTML in-app messages can execute javascript so we require a site maintainer to enable them.
+
+The following example shows a paginated HTML in-app message:
+
+![HTML5 Example]({% image_buster /assets/img_archive/ios-html-full-iam.gif %})
+
+{% endtab %}
+{% endtabs %}
+
+
+
+[2]: https://js.appboycdn.com/web-sdk/latest/doc/ab.InAppMessage.html
+[3]: https://js.appboycdn.com/web-sdk/latest/doc/ab.SlideUpMessage.html
+[6]: https://js.appboycdn.com/web-sdk/latest/doc/ab.ModalMessage.html
+[7]: https://js.appboycdn.com/web-sdk/latest/doc/ab.FullScreenMessage.html
+[12]: https://js.appboycdn.com/web-sdk/latest/doc/ab.HtmlMessage.html
+[13]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#slideup-in-app-messages
+[17]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#modal-in-app-messages
+[41]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#full-in-app-messages
+[42]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#html-in-app-messages
+[47]: {% image_buster /assets/img_archive/In-App_Full.png %}
+[48]: {% image_buster /assets/img_archive/In-App_Modal.png %}
+[49]: {% image_buster /assets/img_archive/Web_Slideup.png %}
+[51]: {% image_buster /assets/img_archive/ios-html-full-iam.gif %}
+[52]: {{ site.baseurl }}/help/best_practices/in-app_messages/web_browsers_only/#web-html-messages
+[53]: {{ site.baseurl }}/help/best_practices/client_integration_gallery/#client-integration-iam
diff --git a/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/troubleshooting.md b/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/troubleshooting.md
new file mode 100644
index 0000000000..507944e051
--- /dev/null
+++ b/_docs/_developer_guide/platform_integration_guides/web/in-app_messaging/troubleshooting.md
@@ -0,0 +1,8 @@
+---
+nav_title: Troubleshooting
+platform: Web
+page_order: 5
+search_rank: 5
+---
+
+{% include archive/troubleshooting_iams.md platform="Web" %}
diff --git a/_docs/_developer_guide/platform_integration_guides/web/in_app_messaging.md b/_docs/_developer_guide/platform_integration_guides/web/in_app_messaging.md
index 39036f7fd4..34cba907a6 100644
--- a/_docs/_developer_guide/platform_integration_guides/web/in_app_messaging.md
+++ b/_docs/_developer_guide/platform_integration_guides/web/in_app_messaging.md
@@ -6,7 +6,7 @@ search_rank: 5
---
# In-App Messaging
-In-App Messages are great for creating unobtrusive calls to action, notifying people of new content in the News Feed and driving them toward it, or communicating with users who have push turned off. They are also effective for other content that isn't time-sensitive enough to warrant a push notification, or permanent enough to warrant a News Feed item. You can find a detailed explanation of in-app message behavior on [Braze Academy][4].
+In-App Messages are great for creating unobtrusive calls to action, notifying people of new content in the News Feed and driving them toward it, or communicating with users who have push turned off. They are also effective for other content that isn't time-sensitive enough to warrant a push notification, or permanent enough to warrant a News Feed item. You can find a detailed explanation of in-app message behavior on [our documentation][4].
## Integration
diff --git a/_docs/_developer_guide/platform_integration_guides/web/initial_sdk_setup.md b/_docs/_developer_guide/platform_integration_guides/web/initial_sdk_setup.md
index 6173a5b015..4699d23d72 100644
--- a/_docs/_developer_guide/platform_integration_guides/web/initial_sdk_setup.md
+++ b/_docs/_developer_guide/platform_integration_guides/web/initial_sdk_setup.md
@@ -10,7 +10,11 @@ Integrating the Braze SDK will provide you with basic analytics functionality as
## Step 1: Integrate the Braze Library
-To integrate the Braze Web SDK, simply follow the instructions in the "Getting Started" section of the [Braze Web SDK Github Repository][2]. Be sure to substitute the API key found within the "App Settings" page of the Braze dashboard for `YOUR-API-KEY-HERE`. For more detailed technical documentation, refer to [the complete JSDocs][9].
+To integrate the Braze Web SDK, follow the instructions in the "Getting Started" section of the [Braze Web SDK Github Repository][2].
+
+Substitute the API key found within the "App Settings" page (labeled "API Key" in the "Settings for ..." block) of your Braze account for `YOUR-API-KEY-HERE`. For more detailed technical documentation, refer to [the complete JSDocs][9].
+
+![API Key Location][14]
If you have been provided a custom SDK endpoint, please include this in addition to your API key:
@@ -90,3 +94,4 @@ These files must be updated in coordination with each other to ensure proper fun
[11]: {% image_buster /assets/img_archive/gtm_trigger.png %}
[12]: {% image_buster /assets/img_archive/gtm_example.png %}
[13]: https://github.com/appboy/appboy-web-sdk#alternative-google-tag-manager-installation
+[14]: {% image_buster /assets/img/api_key_location.png %}
diff --git a/_docs/_developer_guide/platform_integration_guides/windows_universal/analytics/setting_user_ids.md b/_docs/_developer_guide/platform_integration_guides/windows_universal/analytics/setting_user_ids.md
index 164df0f491..4d42cc3770 100644
--- a/_docs/_developer_guide/platform_integration_guides/windows_universal/analytics/setting_user_ids.md
+++ b/_docs/_developer_guide/platform_integration_guides/windows_universal/analytics/setting_user_ids.md
@@ -7,7 +7,7 @@ page_order: 1
User IDs should be set for each of your users. These should be unchanging and accessible when a user opens the app. A database ID or a hashed email address/username is usually a good reference to use. We __strongly recommend__ providing this identifier as it will allow you to:
-- Track your users across devices and platforms, improving the quality of your behaviorial and demographic data.
+- Track your users across devices and platforms, improving the quality of your behavioral and demographic data.
- Import data about your users using our [User Data API][1].
- Target specific users with our [Messaging API][2] for both general and transactional messages.
diff --git a/_docs/_developer_guide/platform_wide/analytics_overview.md b/_docs/_developer_guide/platform_wide/analytics_overview.md
index 98b853c7d1..a636f3ea99 100644
--- a/_docs/_developer_guide/platform_wide/analytics_overview.md
+++ b/_docs/_developer_guide/platform_wide/analytics_overview.md
@@ -27,9 +27,9 @@ The following events and attributes are captured and updated automatically by th
- Last Received Push Campaign (Date)
- Last Viewed News Feed (Date)
- Clicked Card (Integer)
-- Received Campaign
+- Received Message from Campaign
- This filter allows you to target users based on their having (not) received a previous campaign.
-- Received Campaign with Tag
+- Received Message from Campaign with Tag
- This filter allows you to target users based on their having (not) received a campaign that currently has a tag.
- Retarget Campaign
- This filter allows you to target users based on whether or not they have opened, or clicked on a specific email, push, or slideup in the past
@@ -105,7 +105,14 @@ String attributes are useful for storing user input, such as a favorite brand, a
| Check if the string attribute __exists__ on a user's profile | __IS NOT BLANK__ | __N/A__ |
| Check if the string attribute __does not exist__ on a user's profile | __IS BLANK__ | __N/A__ |
-> We use [Perl compatible regular expressions (PCRE)][11].
+{% alert tip %}
+For more on how to use our RegEx filter, check out this documentation on [Perl compatible regular expressions (PCRE)](http://www.regextester.com/pregsyntax.html).
+
+More resources on RegEx:
+- [RegEx Tester and Debugger](https://regex101.com/)
+- [RegEx: Learn More](https://regexr.com/)
+- [RegEx Tutorial](https://medium.com/factory-mind/regex-tutorial-a-simple-cheatsheet-by-examples-649dc1c3f285)
+{% endalert %}
#### Arrays
Array attributes are good for storing related lists of information about your users. For example, storing the last 100 pieces of content a user watched within an array would allow specific interest segmentation.
@@ -260,7 +267,7 @@ Adding these attributes would afford you the ability to send campaigns to users
User IDs should be set for each of your users. These should be unchanging and accessible when a user opens the app. We __strongly recommend__ providing this identifier as it will allow you to:
-- Track your users across devices and platforms, improving the quality of your behaviorial and demographic data.
+- Track your users across devices and platforms, improving the quality of your behavioral and demographic data.
- Import data about your users using our [User Data API][9].
- Target specific users with our [Messaging API][10] for both general and transactional messages.
diff --git a/_docs/_developer_guide/rest_api/api_network_connectivity_issues.md b/_docs/_developer_guide/rest_api/api_network_connectivity_issues.md
index c95ade77ae..590f534e22 100644
--- a/_docs/_developer_guide/rest_api/api_network_connectivity_issues.md
+++ b/_docs/_developer_guide/rest_api/api_network_connectivity_issues.md
@@ -38,6 +38,6 @@ To whitelist Braze's API endpoint through your firewall, our CDN provides
access to the list of assigned IP ranges via a JSON dump. You can access the public list of Fastly IP ranges [here][3].
-[1]: https://helpdesk.privateinternetaccess.com/hc/en-us/articles/219333928-What-is-an-MTR-test-and-how-do-I-run-it
+[1]: https://www.privateinternetaccess.com/helpdesk/kb/articles/what-is-an-mtr-test-and-how-do-i-run-it
[2]: http://www.fastly-debug.com/
[3]: https://api.fastly.com/public-ip-list
diff --git a/_docs/_developer_guide/rest_api/basics.md b/_docs/_developer_guide/rest_api/basics.md
index ad7053ee4b..322931f1a8 100644
--- a/_docs/_developer_guide/rest_api/basics.md
+++ b/_docs/_developer_guide/rest_api/basics.md
@@ -12,7 +12,7 @@ Braze provides a high performance REST API to allow you to track users, send mes
A REST API is a way to programmatically transfer information over the web using a predefined schema. Braze has created many different endpoints with specific requirements that will perform various actions and/or return various data. API access is done using HTTPS web requests to your company's REST API endpoint. Typically this is `https://rest.iad-01.braze.com`, but your Success Manager will provide an alternative endpoint URL if necessary.
{% alert note %}
-Customers using Braze's EU database should use `https://rest.fra-01.braze.eu/`. For more information on REST API endpoints for customers using Braze's EU database see our [FAQs]({{ site.baseurl }}/developer_guide/rest_api/basics/#what-is-a-rest-api).
+Customers using Braze's EU database should use `https://rest.fra-01.braze.eu/`. For more information on REST API endpoints for customers using Braze's EU database see our [EU/US Implementation Differences documentation]({{ site.baseurl }}/developer_guide/eu01_us3_sdk_implementation_differences/overview/).
{% endalert %}
## API Definitions
@@ -105,12 +105,13 @@ The `braze_id` serves as a unique user identifier that is set by Braze. This ide
The Braze API infrastructure is designed to handle high volumes of data across our customer base. We enforce API rate limits in order to ensure responsible use of the API.
-|Initial API Rate Limit | Value|
+|Default API Rate Limit | Value|
|---|---|
-|Requests of any kind (this does not include the `/users/track` endpoint)|250,000 per hour|
-|Requests to the Send endpoint specifying a Segment or Connected Audience|250 per minute|
-|Users modified per User Track request|75 Events, 75 Purchases, and 75 Attributes per API call|
-|Send Identifier Creation|100 per day|
+|Requests to the `/users/track` endpoint|Unlimited, though this is subject to change as noted below. |
+|Batching with the `/users/track` endpoint|75 Events, 75 Purchases, and 75 Attributes per API request. |
+|Requests to the Send endpoint specifying a Segment or Connected Audience|250 per minute. |
+|Send Identifier Creation|100 per day. |
+|Requests of any other kind|250,000 per hour. |
{% alert warning %}
API Rate Limits and their Values (limited or unlimited) are subject to change depending on proper usage of our system. We encourage sensible limits when making an API call to prevent damage or misuse.
@@ -118,7 +119,7 @@ API Rate Limits and their Values (limited or unlimited) are subject to change de
REST API rate limit increases are considered based on need for customers who are making use of the API batching capabilities. Please batch requests to our API endpoints:
-- A single request to the User Track endpoint can contain Purchases, Custom Events and/or Custom Attribute updates for up to 75 users, specified by `external_id`
+- Each `/users/track` request can contain up to 75 Purchases, 75 Events and 75 Attribute updates. These can belong to different users, that is, each of the 75 Events in a request can belong to 75 different users.
- A single request to the Messaging endpoints can reach any one of the following:
- Up to 50 specific `external_ids`, each with individual message parameters
- A segment of any size created in the Braze dashboard, specified by its `segment_id`
diff --git a/_docs/_developer_guide/rest_api/email_templates.md b/_docs/_developer_guide/rest_api/email_templates.md
index 5c7c9a61ee..64cd5add5b 100644
--- a/_docs/_developer_guide/rest_api/email_templates.md
+++ b/_docs/_developer_guide/rest_api/email_templates.md
@@ -78,14 +78,18 @@ EU-01 | `https://rest.fra-01.braze.eu/templates/email/list`
### Request Parameters
-```json
-{
- “api_key”: (required, string) your App Group REST API Key
- “modified_after”: (optional, string in ISO 8601), retrieve only templates updated at or after the given time
- “modified_before”: (optional, string in ISO 8601), retrieve only templates updated at or before the given time
- “limit”: (optional, positive number), maximum number of templates to retrieve, default to 100 if not provided, maximum acceptable value is 1000
- “offset”: (optional, positive number), number of templates to skip before returning rest of the templates that fit the search criteria
-}
+| Parameter | Required | Data Type | Description |
+|---|---|---|---|
+| `api_key` | Yes | String | Your App Group REST API Key. |
+| `modified_after` | No | String in ISO 8601 | Retrieve only templates updated at or after the given time. |
+| `modified_before` | No | String in ISO 8601 | Retrieve only templates updated at or before the given time. |
+| `limit` | No | Positive Number | Maximum number of templates to retrieve, default to 100 if not provided, maximum acceptable value is 1000. |
+| `offset` | No | Positive Number | Number of templates to skip before returning rest of the templates that fit the search criteria. |
+
+### Example Request
+
+```
+https://rest.iad-01.braze.com/templates/email/list?api_key=123abc-def5-3729-owod-23f9f3j30
```
### Successful Response Properties
@@ -118,11 +122,15 @@ EU-01 | `https://rest.fra-01.braze.eu/templates/email/info`
### Request Parameters
-```json
-{
- “api_key”: (required, string) your App Group REST API Key
- “email_template_id”: (required, string) your email template’s API Identifier
-}
+| Parameter | Required | Data Type | Description |
+|---|---|---|---|
+| `api_key` | Yes | String | Your App Group REST API Key. |
+| `email_template_id` | Yes | String | Your email template’s API Identifier. |
+
+### Example Request
+
+```
+https://rest.iad-01.braze.com/templates/email/info?api_key=123abc-def5-3729-owod-23f9f3j30& email_template_id=759c2ad9-eefc-4af1-bde4-602630644935
```
### Successful Response Properties
diff --git a/_docs/_developer_guide/rest_api/export.md b/_docs/_developer_guide/rest_api/export.md
index 2b3db4e56c..d8dac1b834 100644
--- a/_docs/_developer_guide/rest_api/export.md
+++ b/_docs/_developer_guide/rest_api/export.md
@@ -124,7 +124,7 @@ Content-Type: application/json
}
```
-The `segment_id` for a given segment can be found on our [Developer Console][13] within your dashboard or you can use the [Segment List Endpoint][5].
+The `segment_id` for a given segment can be found in your Developer Console within your Braze account or you can use the [Segment List Endpoint](#segment-list).
{% alert warning %}
Individual custom attributes cannot be exported. However, all custom attributes can be exported by including `custom_attributes` in the `fields_to_export` array (e.g. ['first_name', 'email', 'custom_attributes']).
@@ -346,7 +346,7 @@ This endpoint allows you to retrieve a daily series of the size of a segment ove
| `length` | Yes | Integer | Max number of days before ending_at to include in the returned series - must be between 1 and 100 inclusive |
| `ending_at` | No | DateTime (ISO 8601 string) | Point in time when the data series should end - defaults to time of the request |
-The `segment_id` for a given segment can be found on our [Developer Console][13] within your dashboard or you can use the [Segment List Endpoint][5].
+The `segment_id` for a given segment can be found in your Developer Console within your Braze account or you can use the [Segment List Endpoint](#segment-list).
**Example URL:**
`https://rest.iad-01.braze.com/segments/data_series?api_key=75480f9a-4db8-4057-8b7e-4d59bfd73709&segment_id=3bbc4555-8fa0-4c9b-a5c0-4505edf3e064&length=7&ending_at=2014-12-10T23:59:59-05:00`
@@ -388,7 +388,7 @@ This endpoint allows you to retrieve relevant information on the segment, which
| `segment_id` | Yes | String | Segment API Identifier |
{% alert tip %}
- The `segment_id` for a given segment can be found on our [Developer Console][13] within your dashboard or you can use the [Segment List Endpoint][5].
+The `segment_id` for a given segment can be found in your Developer Console within your Braze account or you can use the [Segment List Endpoint](#segment-list).
{% endalert %}
**Example URL:**
@@ -480,7 +480,7 @@ This endpoint allows you to retrieve a daily series of various stats for a campa
| `ending_at` | No | DateTime (ISO 8601 string) | Date on which the data series should end - defaults to time of the request |
{% alert tip %}
-The `campaign_id` for API campaigns can be found on the [Developer Console][13] page and the campaign details page within your dashboard; or you can use the [Campaign List Endpoint][8].
+The `campaign_id` for API campaigns can be found on the Developer Console page and the campaign details page within your dashboard; or you can use the [Campaign List Endpoint](#campaign-list-endpoint).
{% endalert %}
**Example URL:**
@@ -737,7 +737,7 @@ This endpoint allows you to retrieve relevant information on the campaign, which
| `campaign_id` | Yes | String | Campaign API Identifier |
{% alert tip %}
-The `campaign_id` for API campaigns can be found on the [Developer Console][13] page and the campaign details page within your dashboard or you can use the [Campaign List Endpoint][8].
+The `campaign_id` for API campaigns can be found on the Developer Console page and the campaign details page within your dashboard or you can use the [Campaign List Endpoint](#campaign-list-endpoint).
{% endalert %}
**Example URL:**
@@ -1222,7 +1222,7 @@ This endpoint allows you to retrieve a daily series of engagement stats for a ca
| `ending_at` | No | DateTime (ISO 8601 string) | Date on which the data series should end - defaults to time of the request |
{% alert tip %}
-The `card_id` for a given card can be found in the [Developer Console][13] page and on the card details page within your dashboard or you can use the [News Feed List Endpoint][11].
+The `card_id` for a given card can be found in the Developer Console page and on the card details page within your dashboard or you can use the [News Feed List Endpoint](#news-feed-list).
{% endalert %}
**Example URL:**
@@ -1268,7 +1268,7 @@ This endpoint allows you to retrieve relevant information on the card, which can
| `card_id` | Yes | String | Card API Identifier |
{% alert tip %}
-The `card_id` for a given card can be found in the [Developer Console][13] page and on the card details page within your dashboard or you can use the [News Feed List Endpoint][11].
+The `card_id` for a given card can be found in the Developer Console page and on the card details page within your dashboard or you can use the [News Feed List Endpoint](#news-feed-list).
{% endalert %}
**Example URL:**
@@ -1613,7 +1613,6 @@ The following status codes and associated error messages will be returned if you
[10]: {{ site.baseurl }}/developer_guide/platform_integration_guides/unity/x_news_feed/#news-feed
[11]: #news-feed-list
[12]: #news-feed-analytics
-[13]: https://dashboard-01.braze.com/app_settings/developer_console/
[14]: #sample-user-export-file-output
[15]: #kpi
[16]: #kpi-mau
diff --git a/_docs/_developer_guide/rest_api/messaging.md b/_docs/_developer_guide/rest_api/messaging.md
index 7da1a63107..0d88c9eaae 100644
--- a/_docs/_developer_guide/rest_api/messaging.md
+++ b/_docs/_developer_guide/rest_api/messaging.md
@@ -906,8 +906,8 @@ See the Windows Universal [toast template catalog][32] for details on the option
"message_variation_id": (optional, string) used when providing a campaign_id to specify which message variation this message should be tracked under,
"extras": (optional, valid Key-Value Hash), extra hash - for SendGrid customers, this will be passed to SendGrid as Unique Arguments,
"headers": (optional, valid Key-Value Hash), hash of custom extensions headers. Currently, only supported for SendGrid customers,
- "should_inline_css": (optional, boolean), whether to inline css on the body. If not provided, falls back to the defaullt css inlining value for the App Group,
- "attachments": (optional, array), array of json objects like [{"file_name","url"}] to define the files you need attached. Do not provide the file name's extension, it will be detected automatically from the URL.
+ "should_inline_css": (optional, boolean), whether to inline css on the body. If not provided, falls back to the default css inlining value for the App Group,
+ "attachments": (optional, array), array of json objects like [{"file_name","url"}] that define the files you need attached. Your file name's extension will be detected automatically from the URL, which should return the appropriate `Content-Type` as a response header.
}
```
diff --git a/_docs/_developer_guide/rest_api/postman_collection.md b/_docs/_developer_guide/rest_api/postman_collection.md
index 81191f4689..9b6be4f75a 100644
--- a/_docs/_developer_guide/rest_api/postman_collection.md
+++ b/_docs/_developer_guide/rest_api/postman_collection.md
@@ -15,7 +15,7 @@ Postman is a free-to-use visual editing tool for building and testing API reques
## Downloading Postman
-Postman has MacOS, Windows and Linux versions can be downloaded from their website located [here][1].
+Postman has MacOS, Windows, and Linux versions can be downloaded from their website located [here][1].
## Getting the Braze Postman Collection
@@ -29,13 +29,10 @@ The Braze Postman Collection can be added to your local Postman app by doing the
The Braze Postman Collection uses a templating variable, `{{instanceURL}}`, to substitute the REST API URL of your Braze instance into the pre-built requests. Rather than having to manually edit all requests in the Collection, you can set up this variable in your Postman environment. To do so, please follow the steps below:
-1. Click on the gear icon in the top right corner of the Postman app:
-
-![Managing Environments][2]
-
+1. Click on the gear icon in the top right corner of the Postman app. ![Managing Environments][2]{: height="40%" width="40%"}
2. Select "Manage Environments" to open a modal window which displays your active environments.
3. In the bottom right corner of the modal window, click "Add" to create a new environment.
-4. Give this environment a name (e.g. "Braze API Requests") and add keys for `instance_url` and `api_key` with values corresponding to your Braze REST API URL and Braze REST API Key as pictured below. __Please note__ The `api_key` should be encapsulated in quotes.
+4. Give this environment a name (e.g. "Braze API Requests") and add keys for `instance_url` and `api_key` with values corresponding to your Braze REST API URL and Braze REST API Key as pictured below. The `api_key` should __not__ be encapsulated in quotes.
- The value that you need to add for `instance_url` is dependent on your Braze instance. For more information, please see our [Rest API "Endpoint" documentation.][7]
- For more information on your `api_key` please see our ["App Group REST API Key" documentation.][8]
diff --git a/_docs/_developer_guide/rest_api/subscription_group_api.md b/_docs/_developer_guide/rest_api/subscription_group_api.md
index 11606be4c3..baf40dff9c 100644
--- a/_docs/_developer_guide/rest_api/subscription_group_api.md
+++ b/_docs/_developer_guide/rest_api/subscription_group_api.md
@@ -20,22 +20,29 @@ US-04 | `https://rest.iad-04.braze.com/subscription/user/status`
US-06 | `https://rest.iad-06.braze.com/subscription/user/status`
EU-01 | `https://rest.fra-01.braze.eu/subscription/user/status`
-```json
+### Request Parameters
+
+```
GET https://YOUR_REST_API_URL/subscription/user/status
-Content-Type: application/json
-{
- "api_key": (required, string) your App Group REST API Key,
- "external_id": (required, string) the external_id of the user,
- "email_address": (required, string) the email address of the user (must include at least one address and at most 50 addresses)
- "limit": (optional, integer) limit on the maximum number of results returned. Default (and max) limit is 100
- "offset": (optional, integer) offset of returned result list. Default offset is 0. For example, if there are 230 users that matches API query, limit is set to 50, and offset is 0, the first 50 users will be returned in response. If offset is changed to 50, the next 50 users will be returned.
- }
```
+| Parameter | Required | Data Type | Description |
+|---|---|---|---|
+| `api_key` | Yes | String | Your App Group REST API Key. |
+| `external_id` | Yes | String | The external_id of the user. |
+| `email` | Yes | String | The email address of the user (must include at least one address and at most 50 addresses). |
+| `limit` | No | Integer | The limit on the maximum number of results returned. Default (and max) limit is 100. |
+| `offset` | No | Integer | Number of templates to skip before returning rest of the templates that fit the search criteria. |
+
{% alert tip %}
If there are multiple users (multiple external ids) who share the same email address, all users will be returned as a separate user (even if they have the same email address or subscription group).
{% endalert %}
+### Example Request
+
+```
+https://rest.iad-03.braze.com/subscription/user/status?api_key=23abc-def5-3729-owod-23f9f3j30&email=example%2B1%40braze.com&subscription_group_id=14386d4a-60dd-42e2-9c94-5f2423b91d9f
+```
## Getting the Subscription Status
@@ -50,60 +57,21 @@ US-04 | `https://rest.iad-04.braze.com/subscription/status/get`
US-06 | `https://rest.iad-06.braze.com/subscription/status/get`
EU-01 | `https://rest.fra-01.braze.eu/subscription/status/get`
-```json
-GET https://YOUR_REST_API_URL/subscription/status/get
-Content-Type: application/json
-{
- "api_key": (required, string) your App Group REST API Key,
- "subscription_group_id": (required, string) the id of your subscription group,
- "external_id": (required*, string) the external_id of the user,
- "email_address": (required*, string) the email address of the user
- //one of eternal_id or email_address is required
- //can be passed as an array of string with a max of 100
- }
-```
-
-_Example of API call request based on email_address (shown broken out for documentation purposes only)_
+### Request Parameters
-```json
-GET https://YOUR_REST_API_URL/subscription/status/get?
-api_key=12345&
-subscription_group_id=111-222-333&
-email=bob%40bigburgers.com
-```
+| Parameter | Required | Data Type | Description |
+|---|---|---|---|
+| `api_key` | Yes | String | Your App Group REST API Key. |
+| `subscription_group_id` | Yes | String | The `id` of your subscription group. |
+| `external_id` | Yes* | String | The `external_id` of the user. |
+| `email` | Yes* | String | The email address of the user. Can be passed as an array of string with a max of 100. |
- _Example Response_
-
-```json
-Response: (status 200)
-{
- "status": {
- "bob@bigburgers.com": "unsubscribed"
- },
- "message": "success"
-}
-```
+_/* Either `external_id` or `email` are required._
-_Example of API call request based on external_id (shown broken out for documentation purposes only)_
+### Example Request
-```json
-Request:
-GET https://YOUR_REST_API_URL/subscription/status/get?
-api_key=12345&
-subscription_group_id=111-222-333&
-external_id=external-user-id-bob&
-external_id=external-user-id-john
```
-
-```json
-Response: (status 200)
-{
- "status": {
- "external-user-id-bob": "subscribed",
- "external-user-id-john": "unknown"
- },
- "message": "success"
-}
+https://rest.iad-03.braze.com/subscription/user/status?api_key=23abc-def5-3729-owod-23f9f3j30&email=example%2B1%40braze.com
```
## Updating a Subscription State
@@ -125,10 +93,10 @@ Content-Type: application/json
{
"api_key": (required, string) your App Group REST API Key,
"subscription_group_id": (required, string) the id of your subscription group,
- "subscription_group_state": (required, string) available values are “unsubscribed” (not in subscription group) or “subscribed” (in subscription group),
+ "subscription_state": (required, string) available values are “unsubscribed” (not in subscription group) or “subscribed” (in subscription group),
"external_id": (required*, string) the external_id of the user,
- "email_address": (required*, string) the email address of the user
- //one of eternal_id or email_address is required
+ "email": (required*, string) the email address of the user
+ //one of eternal_id or email is required
//can be passed as an array of string with a max of 100
}
```
diff --git a/_docs/_developer_guide/rest_api/user_data.md b/_docs/_developer_guide/rest_api/user_data.md
index 37bbeb9544..1a66323b1b 100644
--- a/_docs/_developer_guide/rest_api/user_data.md
+++ b/_docs/_developer_guide/rest_api/user_data.md
@@ -89,6 +89,7 @@ The following data types can be stored as a custom attribute:
- Dates (Must be stored in the [ISO 8601][19] format or in the `yyyy-MM-dd'T'HH:mm:ss.SSSZ` format)
- Date attributes without a timezone will default to Midnight UTC (and will be formatted on the dashboard as the equivalent of Midnight UTC in the company's timezone)
+ - Events and Attributes with timestamps in the future will default to the current time
- Strings
- Floats
- Booleans
@@ -446,6 +447,8 @@ Content-Type: application/json
}
```
+For more information on `alias_name` and `alias_label`, check out our [User Aliases documentation]({{ site.baseurl }}/user_guide/data_and_analytics/user_data_collection/user_profile_lifecycle/#user-aliases)
+
[1]: {{ site.baseurl }}/developer_guide/rest_api/basics/#endpoints
[6]: {{ site.baseurl }}/developer_guide/platform_wide/analytics_overview/#arrays
[15]: {{ site.baseurl }}/user_guide/data_and_analytics/user_data_collection/overview/#user-data-collection
diff --git a/_docs/_help/best_practices/in-app_messages/in-app_message_behavior.md b/_docs/_help/best_practices/in-app_messages/in-app_message_behavior.md
index 955f9174eb..5543919815 100644
--- a/_docs/_help/best_practices/in-app_messages/in-app_message_behavior.md
+++ b/_docs/_help/best_practices/in-app_messages/in-app_message_behavior.md
@@ -1,39 +1,5 @@
---
-nav_title: In-App Message Behavior
-page_order: 5
+hidden: true
+layout: redirect
+redirect_to: /docs/message_building_by_channel/in-app_messages/overview
---
-
-# In-App Message Behavior
-
-## How to Create an In-App Message
-
-In-app messages are created on the dashboard in 3 ways: (1) messaging campaigns, (2) attached to news feed items and (3) the Messaging API.
-
-## In-App Message Delivery Rules
-
-With the move away from original in-app messages, Braze released support for in-app messages triggered off of specific actions. This allows for in-app messages to be delivered on any screen, any user session, or after any specific user action. So long as a custom event is logged via the SDK, it can be used to trigger an in-app message at any point in a user flow.
-
-Messages are sent based on the start date/time that was listed in the campaign creator. If two in-app messages should be delivered at the same time, you can set a priority to determine the order in which the messages should display.
-
-![Priority][20]
-
-[1]: {{ site.baseurl }}/user_guide/personalization_and_dynamic_content/deep_linking_to_in-app_content/#deep-linking-to-in-app-content
-[5]: {% image_buster /assets/img_archive/inappexample.png %}
-[7]: {{ site.baseurl }}/help/faqs/
-[8]: {{ site.baseurl }}/developer_guide/platform_integration_guides/ios/in-app_messaging/#manually-queue-in-app-message-display
-[9]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#slideup-in-app-messages
-[10]: {% image_buster /assets/img_archive/braze_fullscreen.png %}
-[11]: {% image_buster /assets/img_archive/braze_modal.png %}
-[12]: {% image_buster /assets/img_archive/stopwatch_slideup_IAM.gif %}
-[13]: {% image_buster /assets/img_archive/braze_campaigndetails.png %}
-[14]: {% image_buster /assets/img_archive/web-email-capture.png %}
-[15]: {{ site.baseurl }}/user_guide/engagement_tools/campaigns/scheduling_and_organizing/scheduling_your_campaign/#action-based-delivery-event-triggered-campaigns
-[16]: {% image_buster /assets/img_archive/braze_customhtml.png %}
-[17]: {% image_buster /assets/img_archive/HTML5.gif %}
-[18]: {% image_buster /assets/img_archive/In-AppMsg_Mockups+Specs_05.png %}
-[19]: {% image_buster /assets/img_archive/In-AppMsg_Mockups+Specs_06.png %}
-[20]: {% image_buster /assets/img_archive/braze_campaignpriority.png %}
-[21]: {{ site.baseurl }}/help/best_practices/push/#creating-custom-opt-in-prompts
-[22]: https://github.com/Appboy/appboy-custom-html5-in-app-message-templates
-[23]: https://www.picsart.com?abButtonId=0
-[25]: https://imageoptim.com/
diff --git a/_docs/_help/best_practices/in-app_messages/in-app_message_specs.md b/_docs/_help/best_practices/in-app_messages/in-app_message_specs.md
index 12df2bc2d0..72b4395a08 100644
--- a/_docs/_help/best_practices/in-app_messages/in-app_message_specs.md
+++ b/_docs/_help/best_practices/in-app_messages/in-app_message_specs.md
@@ -1,59 +1,5 @@
---
-nav_title: In-App Message Specs
-page_order: 4
+hidden: true
+layout: redirect
+redirect_to: /docs/help/best_practices/in-app_messages/previous_in-app_message_generations/#specs
---
-
-# In-App Message Specs
-
-## Character and Image Limits:
-
-| Type | Aspect Ratio | Recommended Image Size | Max Image Size | File Types | Max Character Count |
-|------------------------------------|:------------:|:----------------------:|:--------------:|:-------------:|:-------------------:|
-| Portrait Full Screen (With Text) | 5:4 | 500KB | 5MB | PNG, JPG, GIF | 240 |
-| Portrait Full Screen (Image Only) | 10:16 | 500KB | 5MB | PNG, JPG, GIF | 240 |
-| Landscape Full Screen (With Text) | 16:5 | 500KB | 5MB | PNG, JPG, GIF | 240 |
-| Landscape Full Screen (Image Only) | 16:10 | 500KB | 5MB | PNG, JPG, GIF | 240 |
-| Slideup | 1:1 | 500KB | 5MB | PNG, JPG, GIF | 140 |
-| Modal (Image Only) | 1:1 | 500KB | 5MB | PNG, JPG, GIF | 140 |
-| Modal (With Text) | 29:10 | 500KB | 5MB | PNG, JPG, GIF | 140 |
-
-
-## Keeping In-App Message File Sizes Small
-
-Braze recommends you keep your images, and HTML assets zips as small as possible for several reasons:
-
-- Smaller HTML & image message payloads will download faster, and display more quickly and reliably for your customers.
-- Smaller HTML & image message payloads will keep your customer's data costs down as well. Braze in-app messages are downloaded in the background on session start so they can be triggered in real-time based upon whatever criteria you select. As a result, if you have 10 HTML in-app messages of 1MB each, your customers would all incur 10MB of data charges even if they never triggered all of those messages. This can add up quickly over time, even though the in-app messages are cached and not re-downloaded session to session.
-
-The following strategies are helpful for keeping file sizes down:
-
-- Reference fonts embedded in your application / website to customize your HTML in-app messages rather than including the font files in your HTML asset zip folder.
-- Ensure no extraneous or duplicative CSS or JS are included in your HTML asset zips.
-- Use [ImageOptim][25] on all images to compress images to their minimum possible size with no reduction in quality.
-
-### iPhone 5 Specs:
-![iPhone 5 Specs][18]
-
-### iPhone 6 Specs:
-![iPhone 6 Specs][19]
-
-[1]: {{ site.baseurl }}/user_guide/personalization_and_dynamic_content/deep_linking_to_in-app_content/#deep-linking-to-in-app-content
-[5]: {% image_buster /assets/img_archive/inappexample.png %}
-[7]: {{ site.baseurl }}/help/faqs/
-[8]: {{ site.baseurl }}/developer_guide/platform_integration_guides/ios/in-app_messaging/#manually-queue-in-app-message-display
-[9]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#slideup-in-app-messages
-[10]: {% image_buster /assets/img_archive/braze_fullscreen.png %}
-[11]: {% image_buster /assets/img_archive/braze_modal.png %}
-[12]: {% image_buster /assets/img_archive/stopwatch_slideup_IAM.gif %}
-[13]: {% image_buster /assets/img_archive/braze_campaigndetails.png %}
-[14]: {% image_buster /assets/img_archive/web-email-capture.png %}
-[15]: {{ site.baseurl }}/user_guide/engagement_tools/campaigns/scheduling_and_organizing/scheduling_your_campaign/#action-based-delivery-event-triggered-campaigns
-[16]: {% image_buster /assets/img_archive/braze_customhtml.png %}
-[17]: {% image_buster /assets/img_archive/HTML5.gif %}
-[18]: {% image_buster /assets/img_archive/In-AppMsg_Mockups+Specs_05.png %}
-[19]: {% image_buster /assets/img_archive/In-AppMsg_Mockups+Specs_06.png %}
-[20]: {% image_buster /assets/img_archive/braze_campaignpriority.png %}
-[21]: {{ site.baseurl }}/help/best_practices/push/#creating-custom-opt-in-prompts
-[22]: https://github.com/Appboy/appboy-custom-html5-in-app-message-templates
-[23]: https://www.picsart.com?abButtonId=0
-[25]: https://imageoptim.com/
diff --git a/_docs/_help/best_practices/in-app_messages/native_apps_only.md b/_docs/_help/best_practices/in-app_messages/native_apps_only.md
index 969dce86b9..edf6c69357 100644
--- a/_docs/_help/best_practices/in-app_messages/native_apps_only.md
+++ b/_docs/_help/best_practices/in-app_messages/native_apps_only.md
@@ -1,91 +1,5 @@
---
-nav_title: Native (Apps Only)
-page_order: 2
+hidden: true
+layout: redirect
+redirect_to: /docs/help/best_practices/in-app_messages/previous_in-app_message_generations/
---
-
-# Native (Apps Only)
-
-## Custom HTML Message {#native-html-messages}
-While Braze’s out-of-the box in-app messages can be customized in a variety of ways, you can gain even greater control over the look and feel of your campaigns using messages designed and built using HTML5. With some simple composition, you can unlock custom functionality and branding to match any of your needs.
-
-![HTML5 In App Message][16]
-
-Select the “Custom HTML” message type in your in-app message campaign composer. From here, you’ll see a field to input the HTML for your custom in-app message, as well as a file uploader section. This uploader accepts zipped files that should include all of the assets your HTML references (fonts, images, styles, etc.). Since the assets file and HTML code are uploaded separately, it should not be expected that the HTML will automatically populate per asset file upload. Also, as we do not currently support a preview of your HTML in-app messages, we recommend sending yourself a test HTML message before launching this type of campaign to your users.
-
-HTML5 in-app messages allow for greater control over the look and feel of a message, and anything supported by HTML5 is also supported by Braze. For example, Soundcloud uses HTML5 in-app messages to conduct a user satisfaction survey:
-
-![HTML5 Gif][17]
-
-### JavaScript Bridge (appboyBridge)
-
-From iOS version `2.29.0` and Android version `2.0.0`, HTML in-app messages support a Javascript "bridge" interface to the Braze SDK, allowing you to trigger custom Braze actions when users click on elements with links or otherwise engage with your content. The following javascript methods are supported in Braze's HTML in-app messages:
-
-{% include archive/appboyBridge.md platform="native" %}
-
-### Link-Based Actions
-
-HTML in-app messages can trigger custom Braze actions when users click on elements with links. The supported link schemes are:
-
-Supported Scheme | Corresponding Action | Supported Query Strings
---- | --- |---
-Normal Web URL or Deep Linking | For web URLs, Braze will open the new content of the link in a webview within your app by default, or in an external browser when query `abExternalOpen` is true. The HTML5 in-app message will be dismissed before opening the link. For deep linking, Braze will open your URL regardless of the value of `abExternalOpen`. | `abExternalOpen` and `abButtonId`
-`appboy://close` | Braze will dismiss the HTML in-app message. | None
-`appboy://feed` | Braze will dismiss the HTML in-app message and display a modal News Feed. | `abButtonId`
-`appboy://customEvent` | Braze will log a custom event and will NOT dismiss the HTML in-app message. | `name` All additional queries will be set as properties of the custom event.
-
-### Supported Query Strings
-
-You can customize your link actions by appending the optional URL query strings below to your HTTP(S) link:
-
-Query String Name | Value | Action
------------|-------|-------
-`abButtonId` | `{0,1}` | Braze will use the value specified as the button's ID for analytics tracking ([https://www.picsart.com?abButtonId=0][23]) *
-`name` | Arbitrary string | This represents the custom event name for use with `appboy://customEvent` (e.g., `appboy://customEvent?name=eventName`).
-`abExternalOpen` | `{true, false}` | When this query string parameter is absent or set to `false`, Braze will try to open the web link in an internal web browser inside the host app. To have Braze open the web link in an external web browser, set this parameter to `true`.
-`abDeepLink` | `{true, false}` | When this query string parameter is absent or set to `false`, Braze will try to open the web link in an internal web browser inside the host app. To have Braze handle your HTTP(S) link as a deep link, set this parameter to `true`.
-
-Analytics tracking is enabled by default for all links that have the `abButtonId` query (see above). A link with `abButtonId=0` will be represented as Button 1 on the Dashboard, while a link with `abButtonId=1` will be represented as Button 2.
-
-
-Examples:
-
-- `appboy://close`
- - sample close button: `Close`
-- `appboy://feed?abButtonId=0`
-- `appboy://customEvent?name=eventName&property1=value1&property2=value2`
- - This would log an event called `eventName` with the properties `property1`=`value1` and `property2`=`value2`.
-
-If you are interested in customizing your in-app messages, please make sure your design or development team is aware of these parameters.
-
-### HTML5 In-App Message Templates
-
-We've designed a set of six HTML5 in-app messages templates to help you get started. Check out our [Github repository][22] which contains detailed instructions on how to use and customize these templates for your needs.
-
-### Customizable Features
-
-- Fonts
-- Styles
-- Images + Videos
-- On-click behaviors
-- Interactive Components
-
-[1]: {{ site.baseurl }}/user_guide/personalization_and_dynamic_content/deep_linking_to_in-app_content/#deep-linking-to-in-app-content
-[5]: {% image_buster /assets/img_archive/inappexample.png %}
-[7]: {{ site.baseurl }}/help/faqs/
-[8]: {{ site.baseurl }}/developer_guide/platform_integration_guides/ios/in-app_messaging/#manually-queue-in-app-message-display
-[9]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#slideup-in-app-messages
-[10]: {% image_buster /assets/img_archive/braze_fullscreen.png %}
-[11]: {% image_buster /assets/img_archive/braze_modal.png %}
-[12]: {% image_buster /assets/img_archive/stopwatch_slideup_IAM.gif %}
-[13]: {% image_buster /assets/img_archive/braze_campaigndetails.png %}
-[14]: {% image_buster /assets/img_archive/web-email-capture.png %}
-[15]: {{ site.baseurl }}/user_guide/engagement_tools/campaigns/scheduling_and_organizing/scheduling_your_campaign/#action-based-delivery-event-triggered-campaigns
-[16]: {% image_buster /assets/img_archive/braze_customhtml.png %}
-[17]: {% image_buster /assets/img_archive/HTML5.gif %}
-[18]: {% image_buster /assets/img_archive/In-AppMsg_Mockups+Specs_05.png %}
-[19]: {% image_buster /assets/img_archive/In-AppMsg_Mockups+Specs_06.png %}
-[20]: {% image_buster /assets/img_archive/braze_campaignpriority.png %}
-[21]: {{ site.baseurl }}/help/best_practices/push/#creating-custom-opt-in-prompts
-[22]: https://github.com/Appboy/appboy-custom-html5-in-app-message-templates
-[23]: https://www.picsart.com?abButtonId=0
-[25]: https://imageoptim.com/
diff --git a/_docs/_help/best_practices/in-app_messages/overview.md b/_docs/_help/best_practices/in-app_messages/overview.md
index 48a1aa075c..b07e573ae2 100644
--- a/_docs/_help/best_practices/in-app_messages/overview.md
+++ b/_docs/_help/best_practices/in-app_messages/overview.md
@@ -1,42 +1,5 @@
---
-nav_title: Overview
-page_order: 0
+hidden: true
+layout: redirect
+redirect_to: /docs/help/best_practices/in-app_messages/prep_guide/
---
-# In-App Messages
-
-With the ability to leverage multiple in-app message formats, you can choose a layout that best suits your content and campaign goal. Because these formats look and interact with your users differently, they are best suited for different use cases.
-
-## Best Practices {#in-app-best-practices}
-
-- This type of message is best for users who regularly visiting your app, as your audience will only see the greeting when the app is opened.
-- Compared to an email correspondence or News Feed card, an in-app message generally appears for a set amount of time, so the text should be concise.
-- They can be particularly effective in driving feature discovery, encouraging and rewarding discovery or upselling via in-app purchases.
-- Add [protocol URLs][1] to direct your audience to another part of your app and personalize their experience.
-- For in-app messages containing an image, Braze improves load times by using a global CDN to host the image.
-- In-app messages are great for priming users to accept a permission request (i.e. [push priming][21]).
-- The aspect ratio of images are maintained and fill whichever dimension that we hit the boundary for first. No part of the image that is positioned within the image safe zone will be cropped. We recommend that images fit on a 16:10 screen, which means:
- - A portrait fullscreen with text: 5:4 image
- - Portrait fullscreen (with image only): 10:16 image
- - Landscape fullscreen with test: 16:5 image
- - Landscape fullscreen (image only): 16:10 image
-
-[1]: {{ site.baseurl }}/user_guide/personalization_and_dynamic_content/deep_linking_to_in-app_content/#deep-linking-to-in-app-content
-[5]: {% image_buster /assets/img_archive/inappexample.png %}
-[7]: {{ site.baseurl }}/help/faqs/
-[8]: {{ site.baseurl }}/developer_guide/platform_integration_guides/ios/in-app_messaging/#manually-queue-in-app-message-display
-[9]: {{ site.baseurl }}/developer_guide/platform_integration_guides/web/in_app_messaging/#slideup-in-app-messages
-[10]: {% image_buster /assets/img_archive/braze_fullscreen.png %}
-[11]: {% image_buster /assets/img_archive/braze_modal.png %}
-[12]: {% image_buster /assets/img_archive/stopwatch_slideup_IAM.gif %}
-[13]: {% image_buster /assets/img_archive/braze_campaigndetails.png %}
-[14]: {% image_buster /assets/img_archive/web-email-capture.png %}
-[15]: {{ site.baseurl }}/user_guide/engagement_tools/campaigns/scheduling_and_organizing/scheduling_your_campaign/#action-based-delivery-event-triggered-campaigns
-[16]: {% image_buster /assets/img_archive/braze_customhtml.png %}
-[17]: {% image_buster /assets/img_archive/HTML5.gif %}
-[18]: {% image_buster /assets/img_archive/In-AppMsg_Mockups+Specs_05.png %}
-[19]: {% image_buster /assets/img_archive/In-AppMsg_Mockups+Specs_06.png %}
-[20]: {% image_buster /assets/img_archive/braze_campaignpriority.png %}
-[21]: {{ site.baseurl }}/help/best_practices/push/creating_custom_opt-in_prompts/#creating-custom-opt-in-prompts
-[22]: https://github.com/Appboy/appboy-custom-html5-in-app-message-templates
-[23]: https://www.picsart.com?abButtonId=0
-[25]: https://imageoptim.com/
diff --git a/_docs/_help/best_practices/in-app_messages/prep_guide.md b/_docs/_help/best_practices/in-app_messages/prep_guide.md
new file mode 100644
index 0000000000..4207592257
--- /dev/null
+++ b/_docs/_help/best_practices/in-app_messages/prep_guide.md
@@ -0,0 +1,39 @@
+---
+nav_title: Prep Guide
+page_order: 0.5
+---
+
+# Prep Guide
+
+Before you start building your in-app message, you should consider a few of the following topics so building your message is quick and easy.
+
+## General Considerations
+
+- If you are building in Campaigns, how many variants of this message would you like to display?
+- If you are building in Canvas, will this message be paired with other messaging channels in that step?
+- When would you like [your message to expire]({{ site.baseurl }}/canvas_in-app_messages/)?
+
+## Targeting Considerations
+- In-app messages are best for users who regularly visit your app, are you including this audience?
+- Where do you want your users to meet your message? In your Web app? In your mobile app?
+- Which event triggers this message?
+- Are any of your users using older versions of your app? If so, they might not be able to see some elements of your message. Learn more [here]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/generations/).
+- What type of device or devices are you building this message for? Remember, you can preview your message using [our Preview box or Test tab]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/testing/).
+
+## Content Considerations
+- Which languages will you be using in this message?
+- What is your Header and Body copy? Are they eye-catching and relevant to your user?
+- Is your copy concise and memorable, as in-app messages only appear for a set amount of time?
+- Will you be using [Liquid]({{ site.baseurl }}/user_guide/personalization_and_dynamic_content/liquid/using_liquid/) to build more custom copy?
+- Is your image or other media within the [Safe Zone]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/creative_details/)?
+
+
+## Conversion Considerations
+- What is your goal for this message? How can you represent that in your message?
+- Do your button options offer options that make sense to your user? What is your [primary call to action]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/create/#buttons)?
+- Are you [deep-linking to other in-app content][1]? Are you using this in-app message to send and accept a [permission or push priming request][21]?
+- Do you have a message exit option? If not, you can always copy and paste this snippet to create a quick button: `X` .
+
+
+[1]: {{ site.baseurl }}/user_guide/personalization_and_dynamic_content/deep_linking_to_in-app_content/#deep-linking-to-in-app-content
+[21]: {{ site.baseurl }}/help/best_practices/push/creating_custom_opt-in_prompts/#creating-custom-opt-in-prompts
diff --git a/_docs/_help/best_practices/in-app_messages/previous_in-app_message_generations.md b/_docs/_help/best_practices/in-app_messages/previous_in-app_message_generations.md
new file mode 100644
index 0000000000..3528665f30
--- /dev/null
+++ b/_docs/_help/best_practices/in-app_messages/previous_in-app_message_generations.md
@@ -0,0 +1,159 @@
+---
+nav_title: Previous Generations
+page_order: 20
+---
+
+# Message Type Details
+
+{% alert important %}
+This section reviews previous information around our in-app messages. To see the most up-to date information on our current in-app message generation, see our [new in-app message overview documentation]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/overview/).
+{% endalert %}
+
+## Universal
+
+This will review previous information around our in-app messages. To see the most up-to date information on our current in-app message generation, see our [in-app message overview documentation]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/overview/).
+
+
+{% details Full-Screen %}
+These are the most engaging, but also the most intrusive since they cover your user’s entire screen. They are great for displaying large, rich images, and can be useful in conveying very important information, such as crucial new features and expiring promotions. Since they are more disruptive of the user experience, use these sparingly for top priority content.
+
+![Full-Screen Message]({% image_buster /assets/img_archive/braze_fullscreen.png %})
+
+__Customizable Features__
+
+- Header and body text
+- A large image
+- Up to two call to action buttons with separate on click behavior and deep links
+- Different colors for the header and body text, buttons and background
+- Key-value pairs
+
+{% enddetails %}
+{% details Modal %}
+These messages aren’t as intrusive as full-screen messages, as they still allow users to see part of your app’s UI. Since they still contain buttons and images, modal messages may be a better option than slideups if you desire a more interactive, visual campaign. These are great for medium priority content, such as app updates and non-urgent deals and events.
+
+![Modal Message]({% image_buster /assets/img_archive/braze_modal.png %})
+
+__Customizable Features__
+
+- Header and body text
+- An image or customizable badge icon
+- Up to two call to action buttons with separate on click behavior and deep links
+- Different colors for the header and body text, buttons and background
+- Key-value pairs
+
+{% enddetails %}
+
+{% details Traditional Slideup %}
+These are the least intrusive message type, though they can be more or less attention-grabbing depending on your usage of colors and badge icons. This may be the message format to use when onboarding new users and directing them towards particular in-app features, as they don’t pause the app experience and allow for continuous exploration.
+
+![Slideup Message]({% image_buster /assets/img_archive/stopwatch_slideup_IAM.gif %})
+
+__Customizable Features__
+
+- Body text
+- An image or customizable badge icon
+- Different colors for slideup background, text and icon
+- Message close behavior
+- Slideup position (top or bottom of the app screen)
+- Key-value pairs
+
+{% enddetails %}
+
+
+
+## Web
+
+This will review previous information around more customized in-app messages. To see the most up-to date information on our current in-app message generation, see our [Customization documentation]({{ site.baseurl }}/user_guide/message_building_by_channel/in-app_messages/customize/).
+
+{% details Email Capture Message %}
+Email capture messages allow you to easily prompt users of your site to submit their email address, after which it will be available within the Braze system for use in all your messaging campaigns.
+
+![Email Capture Message]({% image_buster /assets/img_archive/web-email-capture.png %})
+
+> To enable Email Capture in-app messages, your SDK integration must supply the `enableHtmlInAppMessages` initialization option to Braze, e.g. `appboy.initialize('YOUR-API_KEY', {enableHtmlInAppMessages: true})`. This is for security reasons - HTML in-app messages can execute javascript so we require a site maintainer to enable them.
+
+__Customizable Features__
+
+- Header, body, and submit button text
+- An optional image
+- An optional "Terms of Service" link
+- Different colors for the header and body text, buttons and background
+- Key-value pairs
+
+{% enddetails %}
+
+{% details Custom HTML Message %}
+
+While Braze’s out-of-the box in-app messages can be customized in a variety of ways, you can gain even greater control over the look and feel of your campaigns using messages designed and built using HTML, CSS, and Javascript. With some simple composition, you can unlock custom functionality and branding to match any of your needs. HTML in-app messages allow for greater control over the look and feel of a message, and anything supported by HTML5 is also supported by Braze.
+
+__JavaScript Bridge (appboyBridge)__
+
+HTML in-app messages support a Javascript "bridge" interface to the Braze Web SDK, allowing you to trigger custom Braze actions when users click on elements with links or otherwise engage with your content. The following javascript methods are supported in Braze's HTML in-app messages:
+
+{% include archive/appboyBridge.md platform="web" %}
+
+Additionally, for analytics tracking, any `` or `