Custom HTML in-app messages
While our standard 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, including the following:
- Custom fonts and styles
- Videos
- Multiple images
- On-click behaviors
- Interactive components
- Custom animations
Custom HTML messages can use the JavaScript Bridge methods to log events, set custom attributes, close the message, and more! Check out our GitHub repository that contains detailed instructions on how to use and customize HTML in-app messages for your needs, and for a set of HTML5 in-app messages templates to help you get started.
To enable HTML in-app messages through the Web SDK, you must supply the allowUserSuppliedJavascript
initialization option to Braze: for example braze.initialize('YOUR-API_KEY', {allowUserSuppliedJavascript: true})
. This is for security reasons since HTML in-app messages can execute JavaScript, so we require a site maintainer to enable them.
JavaScript bridge
HTML in-app messages for Web, Android, iOS, and Swift SDKs support a JavaScript “bridge” to interface with Braze SDK, allowing you to trigger custom Braze actions when users click on elements with links or otherwise engage with your content. These methods exist with the global brazeBridge
or appboyBridge
variable.
Braze recommends that you use the global brazeBridge
variable. The global appboyBridge
variable is deprecated but will continue to function for existing users. If you are using appboyBridge
, we suggest you migrate to brazeBridge
.
appboyBridge
was deprecated in the following SDK versions:
For example, to log a custom attribute and custom event, then close the message, you could use the following JavaScript within your HTML in-app message:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<button id="button">Set Favorite Color</button>
<script>
// Wait for the `brazeBridge` ready event, "ab.BridgeReady"
window.addEventListener("ab.BridgeReady", function(){
// Event handler when the button is clicked
document.querySelector("#button").onclick = function(){
// Track Button 1 clicks for analytics
// Note: This requires Android SDK v8.0.0, Web SDK v2.5.0, Swift SDK v5.4.0, and iOS SDK v3.23.0
brazeBridge.logClick("0");
// Set the user's custom attribute
brazeBridge.getUser().setCustomUserAttribute("favorite color", "blue");
// Track a custom event
brazeBridge.logCustomEvent("completed survey");
// Send the enqueued data to Braze
brazeBridge.requestImmediateDataFlush();
// Close this in-app message
brazeBridge.closeMessage();
};
}, false);
</script>
JavaScript Bridge methods
The following JavaScript methods are supported within Braze HTML in-app messages:
You cannot reference Liquid to insert customAttributes
into JavaScript Bridge methods.
Method Name | Description |
---|---|
brazeBridge.closeMessage() |
Close the current in-app message. Do not call this method if the in-app message is either already in the process of closing or will automatically close due to processing a deep-link. |
window.addEventListener("ab.BridgeReady", function(){...}, false) |
Callback method for when the brazeBridge has finished loading. All JavaScript code should be run within this callback function. |
brazeBridge.requestImmediateDataFlush() |
Flush queued data to the Braze servers. JS Docs |
brazeBridge.logClick(button_id_string) |
Log a button click for a given button ID. When button_id_string is left blank, a body-click will be logged instead. The button_id_string can be passed out as the button_id in in-app message click events via Currents. This method was introduced in Android SDK v8.0.0, Web SDK v2.5.0, and iOS SDK v3.23.0 The button_id_string only accepts alphanumeric characters, spaces, dashes, and underscores. Adding a character with an accent (for example, ö,â,ê) breaks the button click tracking, resulting in the button string not appearing in the campaign analytics section and clicks not being accounted for. |
brazeBridge.logCustomEvent(eventName,eventProperties) |
Log a custom event. JS Docs |
brazeBridge.logPurchase(productId, price, currencyCode, quantity, purchaseProperties) |
Log a purchase. JS Docs |
brazeBridge.display.showFeed() |
Show the News Feed. JS Docs |
brazeBridge.getUser().addAlias(alias, label) |
Adds an alias to a user. Introduced in Web SDK v2.7.0, Android v8.1.0, and iOS SDK v3.26.0 JS Docs |
brazeBridge.getUser().addToCustomAttributeArray(key, value) |
Adds to a custom attribute array. JS Docs |
brazeBridge.getUser().addToSubscriptionGroup(subscriptionGroupId) |
Adds a user to an email or SMS subscription group. JS Docs. This method was introduced in Android SDK v15.0.0, Web SDK v3.4.0, and iOS SDK v4.3.3. |
brazeBridge.getUser().removeFromSubscriptionGroup(subscriptionGroupId) |
Removes a user from an email or SMS subscription group. JS Docs. This method was introduced in Android SDK v15.0.0, Web SDK v3.4.0, and iOS SDK v4.3.3. |
brazeBridge.getUser().setFirstName(firstName) |
Set a user’s first name. JS Docs |
brazeBridge.getUser().setLastName(lastName) |
Set a user’s last name. JS Docs |
brazeBridge.getUser().setEmail(email) |
Set a user’s email address. JS Docs |
brazeBridge.getUser().setGender(gender) |
Set a user’s gender. JS Docs |
brazeBridge.getUser().setDateOfBirth(year, month, day) |
Set a user’s date of birth. JS Docs |
brazeBridge.getUser().setCountry(country) |
Set a user’s country. JS Docs |
brazeBridge.getUser().setHomeCity(city) |
Set a user’s city. JS Docs |
brazeBridge.getUser().setEmailNotificationSubscriptionType(notificationSubscriptionType) |
Set email notification subscription status. JS Docs |
brazeBridge.getUser().setPushNotificationSubscriptionType(notificationSubscriptionType) |
Set push notification subscription status. JS Docs |
brazeBridge.getUser().setPhoneNumber(phoneNumber) |
Set a user’s phone number. JS Docs |
brazeBridge.getUser().setCustomUserAttribute(key, value, merge) |
Set a custom user attribute. JS Docs |
brazeBridge.getUser().removeFromCustomAttributeArray(key, value) |
Remove a custom user attribute. JS Docs |
brazeBridge.getUser().incrementCustomUserAttribute(key, incrementValue) |
Increment a custom user attribute. JS Docs |
brazeBridge.getUser().setLanguage(language) |
Set a user’s language. Introduced in Android SDK v5.0.0 and Web SDK v2.6.0. JS Docs |
brazeBridge.getUser().setCustomLocationAttribute(key, latitude, longitude) |
Set a custom location attribute. Introduced in Android SDK v5.0.0. JS Docs |
brazeBridge.web.registerAppboyPushMessages(successCallback, deniedCallback) |
Register for web push (web only). This method is a no-op when called in a non-web environment. JS Docs |
brazeBridge.requestPushPermission(successCallback, deniedCallback) |
Register for push across Web, iOS, and Android. Note: the method’s callbacks are only supported on web. This method was introduced as of Web SDK v4.0.0, Android SDK v21.0.0, and Swift SDK v5.4.0. JS Docs |
brazeBridge.changeUser(id, sdkAuthSignature?) |
Identify user with a unique ID. JS Docs This method was introduced in Web SDK v4.3.0. |
Link-based actions
In addition to custom JavaScript, Braze SDKs can also send analytics data with these convenient URL shortcuts. Note that these query parameters and URL schemes are all case sensitive.
Button click tracking (deprecated)
The use of abButtonID
is not supported in HTML with Preview message types. For more information, see our upgrade guide.
To log button clicks for in-app message analytics, you can add abButtonId
as a query parameter to any deep link, redirect URL, or anchor element <a>
. Use ?abButtonId=0
to log a “Button 1” click, and ?abButtonId=1
to log a “Button 2” click.
As with other URL parameters, the first parameter should begin with a question mark ?
, while subsequent parameters should be separated by an ampersand &
.
Example URLs
https://example.com/?abButtonId=0
- Button 1 clickhttps://example.com/?abButtonId=1
- Button 2 clickhttps://example.com/?utm_source=braze&abButtonId=0
- Button 1 click with other existing URL parametersmyApp://deep-link?page=home&abButtonId=1
- Mobile deeplink with Button 2 click<a href="https://example.com/?abButtonId=1">
- Anchor element<a>
with Button 2 click
In-app messages support only Button 1 and Button 2 clicks. URLs that do not specify one of these two button IDs will be logged as generic “body clicks”.
Open link in new window (mobile only)
To open links outside your app in a new window, set ?abExternalOpen=true
. The message will be dismissed before opening the link.
For deep linking, Braze will open your URL regardless of the value of abExternalOpen
.
Open as deeplink (mobile only)
To have Braze handle your HTTP or HTTPS link as a deep link, set ?abDeepLink=true
.
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.
Close in-app message
To close an in-app message, you can use the brazeBridge.closeMessage()
javascript method.
For example, <a onclick="brazeBridge.closeMessage()" href="#">Close</a>
will close the in-app message.
HTML upload with preview
When crafting custom HTML in-app messages, you can preview your interactive content directly in Braze.
The message preview panel of the editor shows a realistic preview that renders the JavaScript included in your message. You can preview and interact with your custom messages from the preview panel by clicking through pagination, submitting forms or surveys, watching JavaScript animations, and more!
Any brazeBridge
JavaScript methods you use in your HTML won’t update user profiles while previewing in the dashboard.
SDK requirements
To use the HTML preview for in-app messages, you must upgrade to the following minimum Braze SDK versions:
Because this message type can only be received by certain later SDK versions, users that are on unsupported SDK versions will not receive the message. Consider adopting this message type after a significant portion of your user base is reachable, or target only those users whose app version is later than the requirements. Learn more about filtering by most recent app version.
Creating a campaign
When creating a Custom Code in-app message, choose HTML Upload with Preview as the custom type. If you haven’t previously created custom code in-app messages (live or drafts), this option is automatically applied and you won’t need to make a selection.
Keep in mind that your mobile app users need to upgrade to the supported SDK versions to receive this message. We recommend that you nudge users to upgrade their mobile apps before launching campaigns that depend on newer Braze SDK versions.
Asset files
When creating custom code in-app messages with HTML upload, you can upload campaign assets to the media library to reference in your message.
The following file types are supported for upload:
File Type | File Extension |
---|---|
Font Files | .ttf , .woff , .otf , .woff2 |
SVG Images | .svg |
JavaScript Files | .js |
CSS Files | .css |
Braze recommends uploading assets to the media library for two reasons:
- Assets added to a campaign via the media library allow your messages to be displayed even while the user is offline, or has a poor internet connection.
- Assets uploaded to Braze can be reused across campaigns.
Adding asset files
You can add new or existing assets to your campaign.
To add new assets to your campaign, use the drag-and-drop section to upload a file. Assets added in this section will also be automatically added to the media library. To add assets that you’ve already uploaded to the media library, select Add from Media Library.
After your assets are added, they will appear in the Assets for this campaign section.
If an asset’s filename matches that of a local HTML asset it will be replaced automatically (for example, cat.png
is uploaded and <img src="cat.png" />
exists).
Otherwise, hover over an asset from the list and select Copy to copy the file’s URL to your clipboard. Then paste the copied asset URL into your HTML as you normally would when referencing a remote asset.
HTML editor
Changes you make in the HTML automatically render in the preview panel as you type. Any brazeBridge
JavaScript methods you use in your HTML won’t update user profiles while previewing in the dashboard.
You can configure Editor Settings to toggle wrap text, change the font size, or choose a color theme. The code editor includes different color themes for syntax highlighting, which helps you spot potential code errors directly in the message composer and better organize your code (using spaces or tabs—whichever side of that argument you’re on).
You can press Ctrl + F (Windows) or Command + F (Mac) within the HTML editor to search within your code!
Button tracking
You can track performance within your custom code in-app message using the brazeBridge.logClick(button_id)
JavaScript method. This allows you to programmatically track “Button 1”, “Button 2”, and “Body Clicks” using brazeBridge.logClick("0")
, brazeBridge.logClick("1")
, or brazeBridge.logClick()
, respectively.
Clicks | Method |
---|---|
Button 1 | brazeBridge.logClick("0") |
Button 2 | brazeBridge.logClick("1") |
Body click | brazeBridge.logClick() |
Custom button tracking | brazeBridge.logClick("your custom name here") |
This method of button tracking replaces the prior automatic click tracking methods (such as ?abButtonId=0
), which have been removed.
You can track multiple button click events per impression. For example, to close a message and log a Button 2 click, you can use the following:
1
<a href="#" onclick="brazeBridge.logClick('1');brazeBridge.closeMessage()">✖</a>
You can also track new custom button names—up to 100 unique names per campaign. For example, brazeBridge.logClick("blue button")
or brazeBridge.logClick("viewed carousel page 3")
.
Limitations
- You can have up to 100 unique button IDs per campaign.
- Button IDs can have up to 255 characters each.
- Button IDs can only include letters, numbers, spaces, dashes, and underscores.
Backward incompatible changes
-
The most notable incompatible change with this new message type is the SDK requirements. Users whose app SDK does not meet the minimum SDK version requirements will not be shown the message.
-
The
braze://close
deeplink, which was previously supported on mobile apps, has been removed in favor of the JavaScriptbrazeBridge.closeMessage()
. This allows for cross-platform HTML messages, since the web does not support deeplinks. -
Automatic click tracking, which used
?abButtonId=0
for button IDs, and “body click” tracking on close buttons have been removed. The following code examples show how to change your HTML to use our new click tracking JavaScript methods:Before After <a href="braze://close">Close Button</a>
<a href="#" onclick="brazeBridge.logClick();brazeBridge.closeMessage()">Close Button</a>
<a href="braze://close?abButtonId=0">Close Button</a>
<a href="#" onclick="brazeBridge.logClick('0');brazeBridge.closeMessage()">Close Button</a>
<a href="app://deeplink?abButtonId=0">Track button 1</a>
<a href="app://deeplink" onclick="brazeBridge.logClick('0')">Track button 1</a>
<script>
location.href = "braze://close?abButtonId=1"
</script><script>
window.addEventListener("ab.BridgeReady", function(){
brazeBridge.logClick("1");
brazeBridge.closeMessage();
});
</script>