Braze (SDK)
Purpose of Feature
As the world’s No.1 MMA (Mobile Marketing Automation) solution, Braze can offer precise targeted campaigns by creating user segments based on tracking and acquisition information from Airbridge (e.g. User driven from a certain paid channel and/or campaign through Airbridge).
Integration Requirements
- Integration is available for both iOS and Android.
- Both Airbridge and Braze SDKs must be installed on your app for integration.
Integration
Integration with Braze will happen on the client-side via SDK-to-SDK. This means that once both SDKs are installed and the below settings are complete, Airbridge will automatically start sending data to Braze. Not only does this eliminate the need for manual data uploads, data will also be sent in near real-time once attribution data is fetched from the Airbridge servers. Additional custom attributions can also be configured, and it can be used for more detailed user segmentations to fine tune your campaigns in Braze.
AirbridgeConfig config = new AirbridgeConfig.Builder(BuildConfig.AIRBRIDGE_APP_NAME, BuildConfig.AIRBRIDGE_APP_TOKEN)
.setOnAttributionResultReceiveListener(new OnAttributionResultReceiveListener() {
@Override
public void onAttributionResultReceived(Map<String, String> result) {
String channel = result.get("attributedChannel");
String campaign = result.get("attributedCampaign");
String adGroup = result.get("attributedAdGroup");
String adCreative = result.get("attributedAdCreative");
AttributionData data = new AttributionData(
channel != null ? channel : "",
campaign != null ? campaign : "",
adGroup != null ? adGroup : "",
adCreative != null ? adCreative : "",
);
Appboy.getInstance(applicationContext).getCurrentUser().setAttributionData(data);
// NOTE: Data points will be consumed
Appboy.getInstance(applicationContext).getCurrentUser().setCustomUserAttribute("airbridge_ad_content", result.get("attributedContent"));
Appboy.getInstance(applicationContext).getCurrentUser().setCustomUserAttribute("airbridge_term", result.get("attributedTerm"));
Appboy.getInstance(applicationContext).getCurrentUser().setCustomUserAttribute("airbridge_sub_id", result.get("attributedSubPublisher"));
Appboy.getInstance(applicationContext).getCurrentUser().setCustomUserAttribute("airbridge_sub_id_1", result.get("attributedSubSubPublisher1"));
Appboy.getInstance(applicationContext).getCurrentUser().setCustomUserAttribute("airbridge_sub_id_2", result.get("attributedSubSubPublisher2"));
Appboy.getInstance(applicationContext).getCurrentUser().setCustomUserAttribute("airbridge_sub_id_3", result.get("attributedSubSubPublisher3"));
}
})
.build();
Airbridge.init(this, config);
val config = AirbridgeConfig.Builder(BuildConfig.AIRBRIDGE_APP_NAME, BuildConfig.AIRBRIDGE_APP_TOKEN)
.setOnAttributionResultReceiveListener(object : OnAttributionResultReceiveListener {
override fun onAttributionResultReceived(result: Map<String, String>) {
val data = AttributionData(
result["attributedChannel"] ?: "",
result["attributedCampaign"] ?: "",
result["attributedAdGroup"] ?: "",
result["attributedAdCreative"] ?: ""
)
Appboy.getInstance(applicationContext).currentUser?.setAttributionData(data)
// NOTE: Data points will be consumed
Appboy.getInstance(applicationContext).currentUser?.setCustomUserAttribute("airbridge_ad_content", result["attributedContent"])
Appboy.getInstance(applicationContext).currentUser?.setCustomUserAttribute("airbridge_term", result["attributedTerm"])
Appboy.getInstance(applicationContext).currentUser?.setCustomUserAttribute("airbridge_sub_id", result["attributedSubPublisher"])
Appboy.getInstance(applicationContext).currentUser?.setCustomUserAttribute("airbridge_sub_id_1", result["attributedSubSubPublisher1"])
Appboy.getInstance(applicationContext).currentUser?.setCustomUserAttribute("airbridge_sub_id_2", result["attributedSubSubPublisher2"])
Appboy.getInstance(applicationContext).currentUser?.setCustomUserAttribute("airbridge_sub_id_3", result["attributedSubSubPublisher3"])
}
})
.build()
Airbridge.init(this, config)
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AirBridge.setting()?.attributionCallback = { attribution in
let data = ABKAttributionData(network: attribution["attributedChannel"],
campaign: attribution["attributedCampaign"],
adGroup: attribution["attributedAdGroup"],
creative: attribution["attributedAdCreative"])
// NOTE: Data points will be consumed
Appboy.sharedInstance()?.user.attributionData = data
[
"attributedContent": "airbridge_content",
"attributedTerm": "airbridge_term",
"attributedSubPublisher": "airbridge_sub_id",
"attributedSubSubPublisher1": "airbridge_sub_id_1",
"attributedSubSubPublisher2": "airbridge_sub_id_2",
"attributedSubSubPublisher3": "airbridge_sub_id_3",
].forEach { (key, brazeKey) in
guard let value = attribution[key] else {
return
}
Appboy.sharedInstance()?.user.setCustomAttributeWithKey(brazeKey, andStringValue: value)
}
Appboy.sharedInstance()?.flushDataAndProcessRequestQueue()
}
AirBridge.getInstance("YOUR_APP_TOKEN", appName: "YOUR_APP_NAME", withLaunchOptions: launchOptions)
return true
}
}
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
AirBridge.setting.attributionCallback = ^(NSDictionary<NSString*, NSString*>* _Nonnull attribution) {
ABKAttributionData* data = [[ABKAttributionData alloc] initWithNetwork:attribution[@"attributedChannel"]
campaign:attribution[@"attributedCampaign"]
adGroup:attribution[@"attributedAdGroup"]
creative:attribution[@"attributedAdCreative"]];
[Appboy.sharedInstance.user setAttributionData:data];
// NOTE: Data points will be consumed
NSDictionary* keyMap = @{
@"attributedContent": @"airbridge_content",
@"attributedTerm": @"airbridge_term",
@"attributedSubPublisher": @"airbridge_sub_id",
@"attributedSubSubPublisher1": @"airbridge_sub_id_1",
@"attributedSubSubPublisher2": @"airbridge_sub_id_2",
@"attributedSubSubPublisher3": @"airbridge_sub_id_3",
};
for (NSString* key in keyMap.allKeys) {
NSString* brazeKey = keyMap[key];
NSString* value = attribution[key];
[Appboy.sharedInstance.user setCustomAttributeWithKey:brazeKey andStringValue:value];
}
[Appboy.sharedInstance flushDataAndProcessRequestQueue];
};
[AirBridge getInstance:"YOUR_APP_TOKEN" appName:"YOUR_APP_NAME" withLaunchOptions:launchOptions];
return YES;
}
@end
Airbridge.state.setAttributionListener(attribution => {
ReactAppboy.setAttributionData(
attribution['attributedChannel'] || null,
attribution['attributedCampaign'] || null,
attribution['attributedAdGroup'] || null,
attribution['attributedAdCreative'] || null,
)
// NOTE: Data points will be consumed
ReactAppboy.setCustomUserAttribute('airbridge_ad_content', attribution['attributedContent'] || null)
ReactAppboy.setCustomUserAttribute('airbridge_term', attribution['attributedTerm'] || null)
ReactAppboy.setCustomUserAttribute('airbridge_sub_id', attribution['attributedSubPublisher'] || null)
ReactAppboy.setCustomUserAttribute('airbridge_sub_id_1', attribution['attributedSubSubPublisher1'] || null)
ReactAppboy.setCustomUserAttribute('airbridge_sub_id_2', attribution['attributedSubSubPublisher2'] || null)
ReactAppboy.setCustomUserAttribute('airbridge_sub_id_3', attribution['attributedSubSubPublisher3'] || null)
});
public class AirbridgeManager : MonoBehaviour
{
private void Awake()
{
//Please register an object for messages as below to receive attribution data.
AirbridgeUnity.SetOnAttributionReceived("AirbridgeManager");
}
// Method will call by Airbridge when attribution result received
private void OnAttributionResultReceived(string jsonString)
{
// Airbridge ↔ Braze integration
Dictionary<string, object> attributionData = AirbridgeJson.Deserialize(jsonString) as Dictionary<string, object>;
AppboyBinding.SetAttributionData(
TryGetValueOrEmptyString(attributionData, "attributedChannel"),
TryGetValueOrEmptyString(attributionData, "attributedCampaign"),
TryGetValueOrEmptyString(attributionData, "attributedAdGroup"),
TryGetValueOrEmptyString(attributionData, "attributedAdCreative")
);
// NOTE: Data points will be consumed
AppboyBinding.SetCustomUserAttribute("airbridge_ad_content", TryGetValueOrEmptyString(attributionData, "attributedContent"));
AppboyBinding.SetCustomUserAttribute("airbridge_term", TryGetValueOrEmptyString(attributionData, "attributedTerm"));
AppboyBinding.SetCustomUserAttribute("airbridge_sub_id", TryGetValueOrEmptyString(attributionData, "attributedSubPublisher"));
AppboyBinding.SetCustomUserAttribute("airbridge_sub_id_1", TryGetValueOrEmptyString(attributionData, "attributedSubPublisher1"));
AppboyBinding.SetCustomUserAttribute("airbridge_sub_id_2", TryGetValueOrEmptyString(attributionData, "attributedSubPublisher2"));
AppboyBinding.SetCustomUserAttribute("airbridge_sub_id_3", TryGetValueOrEmptyString(attributionData, "attributedSubPublisher3"));
}
private string TryGetValueOrEmptyString(Dictionary<string, object> dict, string key)
{
if (dict.TryGetValue(key, out var value))
{
return value as string ?? "";
}
return "";
}
}
Integrated Data
Airbridge can send ten different types of data to Braze. The data is used by Braze as "User Install Attributions" and "Custom Attributions". It can be viewed on the Braze dashboard and used for filtering.
Aside from the four basic types of data (attributedChannel
, attributedCampaign
, attributedAdGroup
, attributedAdCreative
) defined by Braze, Airbridge can send six additional data fields (attributedContent
, attributedTerm
, attributedSubPublisher
, attributedSubPublisher1
, attributedSubPublisher2
, attributedSubPublisher3
) as custom attributions.
Braze data points will be used when you send optional data because it is sent as custom user attributes.
Airbridge | Braze Segment Filter | Type | Description | Example |
---|---|---|---|---|
attributedChannel | Install Attribution Source | Install Attribution Data | Name of Ad channel | naver.performance_da |
attributedCampaign | Install Attribution Campaign | Install Attribution Data | Name of Campaign | springpromotion_campaign |
attributedAdGroup | Install Attribution Ad Group | Install Attribution Data | Name of adGroup | female_2030 |
attributedAdCreative | Install Attribution Ad | Install Attribution Data | Name of adCreative | adcreative_1 |
attributedContent (Optional) | airbridge_content | Custom User Attribute | Name of ad copy, slogan, or promotion | slim_fit |
attributedTerm (Optional) | airbridge_term | Custom User Attribute | Ad search keyword | jeans |
attributedSubPublisher (Optional) | airbridge_sub_id | Custom User Attribute | Sub publisher configured by the marketer or media | banner |
attributedSubSubPublisher1 (Optional) | airbridge_sub_id_1 | Custom User Attribute | Sub sub publisher 1 configured by the marketer or media | sub_id_1 |
attributedSubSubPublisher2 (Optional) | airbridge_sub_id_2 | Custom User Attribute | Sub sub publisher 2 configured by the marketer or media | sub_id_2 |
attributedSubSubPublisher3 (Optional) | airbridge_sub_id_3 | Custom User Attribute | Sub sub publisher 3 configured by the marketer or media | sub_id_3 |
Updated almost 2 years ago