FAQs

Is Appboy compatible with other SDKs?

Yes. We have done internal testing and verified that we are compatible with Urban Airship, Flurry, and Crittercism. That is not to say that we are not compatible with more, but that is what we have tested so far. If you are experiencing any issues you think might be due to incompatibility, feel free to contact your Customer Success manager.

Is Appboy compatible with RubyMotion?

Yes. The Appboy iOS SDK fully supports RubyMotion Apps.

Will Appboy affect my app’s performance?

Appboy should have no negative impact on your app’s performance. The Appboy SDKs have a very small footprint. We automatically change the rate that we flush user data depending on the quality of the network, in addition to allowing manual network control. We automatically batch API requests from the SDK to make sure that data is logged quickly while maintaining maximum network efficiency. Lastly, the amount of data sent from the client to Appboy within each API call is extremely small.

What is the definition of an “active user”?

Appboy defines an active user for a given time period as any users who has a session in that time period. If a user loses connectivity, we will cache the session data locally and upload it when the user regains a network connection. These sessions will also be applied to the active user count. Additionally, if your app has a registration process, Appboy will count all users as active - registered or unregistered.

Additionally, if you set User IDs to identify users, when a new user logs in they will be counted as a separate active user. Users who are updated via the API will also be counted as an active user in the time period that they are updated.

What is the definition of an “new user”?

Appboy considers a new user as any one who has newly installed your app. Alternatively, a new user can also be defined as a user with a user ID that has not been previously identified within Appboy.

What is the definition of “stickiness”?

Your app’s “Stickiness” value is a ratio of a given day’s total number of users that visited the app to your Monthly Active Users (MAUs) on that day. MAUs are calculated nightly on a rolling monthly period.

How does Local Time Zone Delivery work?

Local time zone delivery allows you to deliver messaging campaigns to a segment based on a user’s individual time zone. Without local time zone delivery, campaigns will be scheduled based on your company’s time zone settings in Appboy. For example, a London-based company sending a campaign at 12pm will reach users on the west coast of America at 4am. If your app is only available in certain countries, this may not be a risk for you, otherwise we highly recommend avoiding sending early morning push notifications to your user base!

How does Appboy recognize a user’s time zone?

Appboy will automatically determine a user’s time zone from their device. This ensures time zone accuracy and full coverage of your users. Users created through the User API or otherwise without a timezone will have your company’s time zone as their default time zone until they are recognized in your app by the SDK. To check your company’s timezone, look at your company settings on the dashboard. Click on your name in the top toolbar and then click on “Company Settings.”

How does local time zone delivery work?

Appboy will begin delivering a campaign when the first time zone in the world reaches the specified time. After delivery begins, we will continue delivering the campaign throughout the day as additional time zones reach the campaign delivery time. Please allow for sufficient time to view full campaign results from a local time zone campaign. In addition, to the typical time lag seen for email results, full campaign analytics will be available shortly after the campaign completes a full 24 hour cycle.

How do I schedule a local time zone campaign?

When scheduling a campaign, you need to choose to send it at a designated time, and then check the box next to “Send campaign to users in their local time zone.”

Appboy highly recommends that all local time zone campaigns are scheduled 24 hours in advance. Since such campaign need to send over the course of an entire day, scheduling them 24 hours in advance ensures that your message will reach your entire segment. However, you do have the ability to schedule these campaigns less than 24 hours in advance if necessary. Keep in mind that Appboy will not send messages to any users that has missed the send time by more than 1 hour. For example, if it is 1pm and you schedule a local time zone campaign campaign for 3pm, then the campaign will immediately send to all users whose local time is 3-4pm, but not to users whose local time is 5pm. In addition, the send time you choose for your campaign needs to have not yet occurred in your company’s time zone.

Editing a local time zone campaign that is scheduled less than 24 hours in advance will alter the message’s schedule for certain users. If you decide to edit a local time zone campaign to send at a later time (for instance, 7pm instead of 6pm), users who were in the targeted segment when the original send time was chosen will still receive the message at the original time (6pm). If you edit a local time zone to send at an earlier time (for instance, 4pm instead of 5pm), then the campaign will send to all segment members at the earlier time (4pm). If you have allowed users to become re-eligible for the campaign, then they will receive it again at the original time (5pm). For all subsequent occurrences of your campaign, however, your messages only send at your updated time.

When do changes to local time zone campaigns take effect?

Target segments for local time zone campaigns should include at least a 48 hour window for any time-based filters to guarantee delivery to the entire segment. For example, consider a segment targeting users on their second day with the filters:

  • First used app more than 1 day ago
  • First used app less than 2 days ago

Local time zone delivery may miss users in this segment based on the delivery time and the users’ local time zone. This is because a user can leave the segment by the time their time zone triggers delivery. Here is an example of how this could happen:

Local Time Zone Diagram

Can I create single-user segments?

Yes. You can create single user segments (or segments of a handful of users) using unique attributes that identify users, like a user name or a user ID. The segmentation stats or preview may not show this individual user though because segment stats are calculated based on a random sample with a 95% confidence interval that the result is within +/- 1%. The larger your user base is, the more likely it is that the size of your segment is a rough estimate. To ensure that your segment contains the single user you are targeting, click on “Calculate Exact Statistics” on the segment page. This will calculate the exact number of users in your segment, without any rounding.

Calculate Exact Statistics

Appboy has testing filters to target specific users by user ID or email address.

Appboy Debug Filters

Can I send myself test messages?

Yes. Check out our section on sending test messages here within the troubleshooting section.

What’s the default APNs expiration date?

Appboy sets the default expiration date for push notifications sent through APNs to 30 days.

When does the client download new content?

Appboy sends data to the SDK at the beginning of a session based on which segments the user falls into at the time of the session. The news feed or new in-app messages will not be updated during the session. However, user data during the session will be continually processed as it is sent from the client. For example, a lapsed user (last used app more than 7 days ago) will still receive content targeted at lapsed users on their first session back in the app.

When is segment membership calculated?

Appboy updates the user’s segment membership as data is sent back to our servers and processed, typically instantaneously. A user’s segment membership will not change until that session has been processed. For example, a user who falls into a lapsed user segment when the session first starts will be immediately moved out of the lapsed user segment when the session is processed.

When does Appboy upload data?

The Appboy SDK caches data (sessions, custom events, etc) and uploads it periodically. Only after the data has been uploaded will the values be updated on the dashboard. The upload interval takes into account the state of the device and is governed by the quality of the network connection:

Network Connection Quality Data Flush Interval
Great 10 Seconds
Good 30 Seconds
Poor 60 Seconds
  • If there is no network connection, data is cached locally on the device until the network connection is re-established at which time it is uploaded to Appboy.
  • No data is uploaded after a session is closed.

How do I “warm up” my email IP?

Warming Up an IP Address

Appboy will isolate customers who send large volumes of email on their own IP address to prevent the email reputation of our other customers from affecting your delivery rates and vice versa. As a result, you will have to warm your IP.

What does it actually mean to “warm up” an IP address?

IP warming is designed to ensure that you establish a positive email reputation with ISPs (Internet Service Providers) so that your messages are not filtered to spam. If you send email from a new or “cold” IP address, ISPs closely monitor the amount of email you are sending and how often your users are labeling your email as SPAM. They use that data to create an email reputation will eventually determine whether or not your emails are filtered to SPAM automatically.

Abrupt, high volume email campaigns are regarded with the most skepticism by ISPs. Given that, you should begin by sending small amounts of email, and scale gradually towards the volume of email you ultimately intend to send. Irregardless of volume, we suggest warming up your IP to be safe.

This process doesn’t guarantee that your emails won’t be filtered to spam. It is also important that you send engaging content, and send email on a consistent basis to users who want to receive it.

For more information see our Email Best Practices in Appboy Academy.

Why don’t I see “Appboy Is Working” anymore with a debug API key?

Appboy deprecated the Debug API keys in August 2014. As a result, you will no longer see “Appboy is Working” when using any legacy debug API keys you may have. You should migrate your application to the API key on your “App Settings” page in order to test messaging and recording functionality.

The production key should used with production provisioning profiles and apps that are live in the app store.

How does rate limiting work?

Appboy affords you control over marketing pressure by allowing you to limit the rate at which your users are messaged both globally and on a per channel basis using the following filters.

  • Last Received Any Campaign
  • Last Received Email Campaign
  • Last Received Push Campaign

Note: If your push campaign fails to reach the intended user we still mark that user has having received a push campaign on that day. We record the campaign receipt at the time of delivery because push token invalidation notifications from iOS and GCM are not synchronous.

What is a UserID?

A UserID is a unique identifier for a given user. A UserID can have multiple devices associated with it which provides a few benefits:

  • Provide a consistent user experience across multiple devices and platforms e.g. not sending lapsing user notifications to a user’s Android tablet when they are a loyal user of the app on the iPhone.
  • Improve the accuracy of your analytics by ensuring users aren’t creating a new user profile every time they uninstall and reinstall, or install the app on a different device.
  • Enable import of user data from sources outside the app using our RESTful User API, and target users with transactional messages using our RESTful Messaging API.
  • Search for individual users using our “Testing” filters within the segmenter, and on the “User Search” page.

We strongly recommend providing a UserID for users who have logged into your application. 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.

If you are unsure if you’ve set a UserID for your users, or are trying to perform a user search and are unaware of how UserIDs have been assigned within your app please contact your developers. Refer them to success@appboy.com if they require additional details.

Can I target users who have downloaded but not opened my app?

No, Appboy does not generate profiles for users until they have used the app for the first time.

When can GCM Registration IDs change?

GCM Registration IDs are created when the app is installed and registers for push notifications. Google will not change this registration ID except in the following cases:

  • Client App Update
  • Backup and Restore

Appboy automatically handles the deletion of the old token, and the addition of the new token to a user’s profile so long as our SDK is instrumented properly as outlined in our Android Push Documentation.

What is Deep Linking?

“Deep Linking” is a way of launching a native app and providing additional information telling it do some specific action or show specific content. It also allows Google to crawl your app content and allows users to enter your app from search results.

There are three parts to this:

  1. Identify which app to launch
  2. Instruct the app which action to perform
  3. Provide the action with any additional data it will need

“Deep Links” contain all of these things. The key is defining a custom scheme. “http:” is the scheme with which almost everyone is familiar but schemes can begin with any word. A scheme must start with a letter, but can then contain letters, numbers, plus-signs, minus-signs, and dots. Practically speaking, there is no central registry to prevent conflicts, so it is a Best Current Practice to include your domain name in the scheme.

Everything after the colon within a “Deep Link” is free-form text. It is up to you to define its structure and interpretation, however a common convention is to model it after “http:” urls, including a leading “//” (or “///”, leaving a null string where the hostname would normally appear) and query parameters (e.g. ?foo=1&bar=2). Following this approach, the action would be specified by the path and the additional data would be either in the path or in a query string. e.g. “/user/johndoe” or “/show?user=johndoe”.

These “Deep Links” are a powerful tool when used in tandem with the Appboy News Feed. “Providing “Deep Links” as the URL within News Feed items allows you to utilize the News Feed as an individualized navigation tool to direct users to content inside or outside of your app.

With iOS, it’s also possible to deep-link into your application’s settings within the iOS Settings App where a user can define their preferences for Location, Notifications, Background App Refresh etc. This can be useful if trying to re-prime users for push who have denied your initial prompt. Type “app-settings://” for your deep-link within your campaign to achieve this.

When should I put multiple apps in the same app group?

The draw to have multiple apps under one App group can be enticing as it can lead to the ability to rate limit messaging across your entire app portfolio. However, as a best practice we suggest only putting different versions of the same or very similar apps together under one app group. For example, your iOS and Android versions of the same app or your free and premium versions of the same app.

Whichever apps you choose to have in one app group will have their data aggregated which will have a notable impact on filters in Appboy:

  • Last Used App
  • First Used App
  • Session Count
  • Money Spent In-App
  • Push subscription (this becomes an all or none situation, in other words if your users unsubscribe from one app they will be unsubscribed from all of your apps under the app group)
  • Email subscription (this becomes an all or none situation - and can leave you open to compliance issues)

Note: This is not an exhaustive list. The aggregation of the data across dissimilar apps in filters like those listed above is why we do not recommend housing substantially different apps within the same app group.

If I’m relaunching a new version of my app, should I make a new app group?

If users will simply have to update the app and it’s not a new app being released to the app store, you should not create a new app group if you plan to still message users on the older version.

By creating a new app group, all of the historical data and profiles from the older version of your app will not exist in this new app group. So, once existing users upgrade to the new app version, they’ll have a new profile created that does not contain any of the behavioral data from the old app. Additionally, this user will exist on both the old app group and the new app group and can potentially have the same push token. If this happens, it can lead to users receiving an “upgrade now” marketing message intended for only old app group users, even if they’ve already upgraded.

The best way to go about this if you want to separate the old vs. new app, would be to create a new app within the same app group. This way, you can effectively target only users on the new version by selecting that app as you create your segments. If you did want to message users who are still on the old version, you can select the old app and filter the previous app version.

When does Appboy collect location?

Appboy only collects location when the application is in the foreground. As a result, our last known location filters target users based upon where they last opened the application.

Why doesn’t Appboy collect the ADID?

Google’s terms for ADID state that the advertising identifier cannot be associated with any personally-identifiable information without the user’s explicit consent. As a result, we do not automatically collect this information. You may wish to collect this yourself as a custom attribute

I was a Parse customer, how can I migrate over to Appboy?

Overview

Parse recently announced that they will be winding down their platform and retiring Parse as of January 2017. At Appboy, we know first-hand from our own projects, friends, and customers that Parse has been an important service in many apps’ technology stack. Parse began their journey in mobile at around the same that Appboy started. If you’re a Parse customer and considering alternatives given recent news, Appboy can help transition your push notifications and email.

Ease the Transition: Run Appboy side-by-side with Parse

Appboy can run side-by-side with Parse without any issues. In fact, many of our startup customers have done so for several years. Integrating Appboy well in advance of the January 2017 Parse shut down date will help you confidently transition without losing valuable customer data or messaging capabilities.

We know that Appboy won’t cover everything you were doing with Parse — in particular, while Appboy makes your data actionable for segmentation and personalization, we’re not a backend for your application. We recommend reviewing Parse’s official migration guide where you can find their open source server application and instructions on running it with MongoDB.

Importing User Data

User data can be retrieved from Parse, including the device tokens. Prior to importing data, we recommend reviewing the Appboy Academy page on data tracking best practices. In order to import user data, Appboy requires a user identifier. You can find details on our user import API here.

Push Notifications

All Parse customers should check whether their account is setup to use their own Google Cloud Messaging (GCM) API Key or the Parse default. Using the default means that you cannot directly export your GCM registrations, instead you should follow our guide to integration Parse and Appboy side-by-side. Prior to sending with imported device tokens, it’s important to check that your broadcast receiver will display notifications appropriately.

Apple’s Push Notification Service can run Appboy and Parse side-by-side with no issue. iOS device tokens can also be imported to started sending notifications immediately.

Email

You may have been using Parse’s Cloud Modules to send emails for your application. Appboy’ segmentation, personalization, and multivariate testing capabilities not only work with push notifications, but also power our email system. This is a great opportunity to up your email game!

Get started.

Yes, this is possible as long as your client code is programmed to parse the UTM parameters that are sent with the deep link and send them to Google Analytics. You should ensure that you have the appropriate Google Analytics method integrated to do this.

I’m using the EU data center, what do I need to do differently?

Appboy offers the ability to host your data in our EU data center. Please ensure you are contractually authorised to use the EU data center prior to using the following integration.

When you sign up to the Appboy dashboard in order to create campaigns and generate your API key, please ensure you are using our European dashboard accessible here.

SDK implementation

When integrating any of our SDKs, please point your SDK endpoints to https://sdk.api.appboy.eu.

Please note, if you have been set up with a custom endpoint your Customer Success Manager will advise you of the correct address. In that instance simply substitute the endpoint address listed above with the custom address supplied.

To update the default endpoint in your integration of the Appboy SDKs please add the following code:

Android

Add the following code to your appboy.xml:

<string translatable="false" name="com_appboy_custom_endpoint">sdk.api.appboy.eu</string>

Note: SDK Endpoint configuration via appboy.xml is available starting with Appboy Android SDK v2.1.1.

iOS

Starting with Appboy iOS SDK v3.0.2, you can set a custom endpoint using the Info.plist file. Add the Appboy dictionary to your Info.plist file. Inside the Appboy dictionary, add the Endpoint string subentry and set the value to your custom endpoint.

Plist

In versions prior to 3.0.2, add the following class to your application, and then instantiate it and pass it in the appboyOptions dictionary you pass to startWithApiKey:inApplication:withLaunchOptions:withAppboyOptions with the key: ABKAppboyEndpointDelegateKey

#import "Foundation/Foundation.h"
#import "ABKAppboyEndpointDelegate.h"

@interface AppboyEndpointDelegate : NSObject <ABKAppboyEndpointDelegate>
@end

@implementation AppboyEndpointDelegate
- (NSString *) getApiEndpoint:(NSString *)appboyApiEndpoint {
    return [appboyApiEndpoint stringByReplacingOccurrencesOfString:@"dev.appboy.com" withString:@"sdk.api.appboy.eu"];
}

@end

Web

For web SDK integrations initialize the SDK with a baseUrl key pointing to our EU endpoint in the options paramater. For example:

Replace appboy.initialize('YOUR-API-KEY-HERE')

with

appboy.initialize('YOUR-API-KEY-HERE',{baseUrl:'https://sdk.api.appboy.eu/api/v3'})

Xamarin iOS

Pass into your StartWithApiKey call:

NSDictionary appboyOptions = new NSDictionary("ABKAppboyEndpointDelegate", new AppboyEndpointDelegate());

Add the AppboyEndpointDelegate class:

class AppboyEndpointDelegate : ABKAppboyEndpointDelegate
{
  public override String GetApiEndpoint(String appboyApiEndpoint)
  {
    return appboyApiEndpoint.Replace("dev.appboy.com", "sdk.api.appboy.eu");
  }
}

Xamarin Android

In your Application OnCreate:

Appboy.SetAppboyEndpointProvider(new CustomEndpointProvider());

Add the CustomEndpointProvider class:

class CustomEndpointProvider : Java.Lang.Object, IAppboyEndpointProvider
{
  public Android.Net.Uri GetApiEndpoint (Android.Net.Uri uri)
  {
    return uri.BuildUpon().Authority ("sdk.api.appboy.eu").Build();
  }
}

REST APIs

To utilize Appboy’s REST APIs EU clients should follow our standard API documentation, but should replace the endpoint:

Replace

https://api.appboy.com

with

https://rest.api.appboy.eu

With the exception of that change, all other parts of the API endpoints remain the same

For example:

https://api.appboy.com/users/export/segment

becomes

https://rest.api.appboy.eu/users/export/segment