Don’t Be Pushy: 10 Useful Tips for Awesome Push Notifications

Parse Push

In today’s mobile world, a lot of the most popular apps are successfully using push notifications to increase user engagement. Push notifications are short messages sent directly to a user’s mobile device from within an app that, when used properly, can increase user traffic, notify customers of important information likes sales and new products, and much more. There has been a lot of chatter around the web lately about the right and wrong ways to use push notifications to generate traffic within your mobile app. In order to not annoy your users or scare them away with overly aggressive push notifications, we recommend following these 10 simple guidelines to keep people engaged and happy.

People sleep! Use local push.

If you want to notify all of your users that your online store is having a 25% off sale on all sunglasses for the month of December with a simple push notification, don’t risk waking up over 1/3rd of your customer base. If you set your push notification to send at 9 AM in the mobile device’s time zone using local push, you don’t run the risk of annoying your customers with an early morning push notification in Beijing. With local push, all of your customers with the mobile app installed will get notified at 9 am, no matter where in the world they are located.

Geo-marketing is powerful.

Many of you are probably thinking, “What is geo-marketing?” Geo-marketing is targeting audiences specifically based on their location and supplying them with relevant information. Using push notifications with geo-points within your app can be a very powerful tool. For example, do you have a restaurant review app where you sell advertising to restaurants? Imagine if you could notify one of your users when they are within a few blocks of a great new restaurant and offer them a coupon. With geo-marketing using push notifications, you can. With any push notification, be sure to limit the frequency of these notifications so that you don’t notify people too often of nearby deals.

Make it easy to turn on and turn off push notifications.

Even if you closely follow push best practices and only send relevant content, let’s face it: not everyone loves getting push notifications. Make push notifications opt-in only and within your app’s settings, make it very easy to turn off and turn on push notifications. When someone installs your app, send a quick message that asks if your user agrees to receive push notifications from your app. If they select no, don’t send them push notifications. You run the risk of the user un-installing the app if you do continue to send notifications to an opted out device.

Don’t over do it.

Most mobile devices today have tens, or even hundreds, of apps installed. With all of those apps, push notification frequency can get overwhelming. Applications with the highest frequency of irrelevant push notifications are the first applications to get un-installed. The solution is simple: don’t over do it. For social apps where people would like to be notified of someone commenting on their post or updates to a message board, notifications can be increased, but for advertising or promotional purposes, less is more. If you have multiple types of push notifications from a single app, make sure that your user can edit their push settings easily for each type of notification.

Preview your notifications.

Preview your push notifications to see how they look on mobile devices. Push notifications have to be under 200 characters for iOS devices, so we also recommend using a character count tool. One way to preview your notifications is by scheduling and sending your notifications through the Parse Push console, or you can send test notifications programmatically.

Understand your audience.

It’s no secret that different types of applications have different audiences and, in general, each audience has a different outlook on push notifications. If your app is a banking app and it uses push to notify your user that they have a low balance or fraudulent activity, your user won’t mind a quick push notification. If, however, you send them a push notification every day with promotional information, they will likely get annoyed. Along that same line, if your app is focused on daily deals, your audience would probably appreciate being notified of that day’s coupon every day.

Custom push sounds make your app recognizable.

Are you building a promotional app for a band? You can use custom push sounds, like a popular guitar riff, to notify the user of upcoming tour dates, new album releases, and more. This feature works better for promotional apps that don’t send a ton of push notifications and can become annoying when inappropriately or overly used.

Expire pushes that lose relevancy.

Not all push notifications stay relevant. If your sale runs for 30 days, don’t notify your users on day 31 of the ongoing sale because you forgot to expire your push notification. Scheduling, and subsequently expiring, push notifications is a great way to plan your push marketing strategy well in advance and then set it and forget it.

Use badge counts.

The badge count feature displays the number of notifications that have been unread within your application directly on the icon on the screen of any iOS device. For your basic to-do list application, the badge count can show the number of upcoming or immediate items that need attention. Does your app have a chat feature? Show the number of unread messages in your application easily with a badge count and keep your users coming back to chat often.

Be personable.

Sometimes it’s okay to take a break from business and let your customers know your company is not a robotic money-making machine. During the holiday season or on birthdays send a simple, “Happy Thanksgiving from Parse,” or “Happy Birthday. You’re Awesome,” instead of, “Save 15% on everything today only.” People will appreciate the friendly note and your app could see increased traffic without using a pitch.

Push notifications can be a great way to increase user engagement and get your message out when you follow the best practices of push notifications. We can’t cover every case in this post, but we’d be happy to help you figure out how to successfully utilize push notifications to keep your app relevant and keep your customers coming back for more. Questions about getting started with your own push strategy? Contact us here and we’d be happy to help you!

Ashley Smith
November 26, 2012

The Gifts HD App Makes Gift Management Easy this Holiday Season

Gifts HD

The holiday shopping season officially starts tomorrow and with the stress of buying gifts for loved ones, the Gifts HD app is here just in time. Jason Jardim created the Parse-powered app after he observed how stressful the holiday gift-giving season was for his wife and family. With the Gifts HD app, you can tap on a person and see all the gifts you have given to him or her over the years, take photos for gift tracking, run reports, generate a shopping list by store, and much more to make gift management much easier for everyone involved. We sat down with Jason to chat about how Parse is used in the Gifts HD app.

Where did the idea for Gifts HD come from?
The idea for Gifts HD came from seeing my wife with her endless sticky notes around the holiday season. The app was built with the look and feel of a sticky note and since the idea came from observing my family, it was natural that they would be the beta testers.

How did Parse help in the creation of Gifts HD?
The challenge I face as an indie developer is time and resources. With Parse, those challenges were gone! Setup with Parse was a breeze, the SDK was easy to understand, and the ability to add other platforms and expand Gifts HD to other devices is in the works. Just the time Parse has saved me is unbelievable. I
didn’t have to setup my own server, I didn’t have to put my DBA hat on anymore, and I was able to jump right into what I love the most – Making my Wife a great app to use, so I could relax and watch the Giants win the World Series!

How much time do you think Parse saved you in development time?
I honestly don’t know how many hours but we all know setting up a server, database, API’s all takes time. Parse has really been great for me. I would recommend it to anyone thinking of storing data in the cloud.

What do you love most about Parse?
The customer service is amazing. Anytime I have a question, you have answered it by email, message board, or Twitter. Also, the unbelievable rate you are releasing new products and features. Every time I turn around you are adding a new feature/service.

Gifts HD was featured in New and Noteworthy in the productivity section of the iTunes app store. Get the app here.

Ashley Smith
November 22, 2012

Visualizing your Parse data

We strongly believe that the data you store on Parse is wholly yours. With our import and export features you can perform advanced analyses on this data, but we want to make it even easier for you to gain insightful visibility into your app.

Today we are launching a revamped dashboard page with updated graphs. You can now see data for api requests and push notifications, broken down by date range or type.

This is just the tip of the iceberg. We’ll be working hard on adding in-depth analytics about your Parse data. If you have any feedback, let us know in our help forum.

Mattieu Gamache-Asselin
November 20, 2012

Introducing the SendGrid Cloud Module

A few weeks ago, we unveiled Cloud Modules, a new way to integrate your Parse app with third-party services. With that release we promised several more modules would be on their way. Today, we’re happy to announce the first of these new modules, SendGrid. SendGrid provides an easy to use email service that allows you to send and receive emails using their API. Here’s a look at how the Cloud Module works:

var sendgrid = require("sendgrid");
sendgrid.initialize("sendgridAccountSid", "sendgridAuthToken");

Parse.Cloud.define("mySendGridFunction", function(request, response) {
  sendgrid.sendEmail({
    to: "community@parse.com",
    from: "sendgrid@parse.com",
    subject: "Hello from Cloud Code!",
    text: "Using Parse and SendGrid is great!"
  }, {
    success: function(httpResponse) { response.success("Email sent!"); },
    error: function(httpResponse) { response.error("Uh oh, something went wrong"); }
  });
});

To learn more about this new module check out our Cloud Modules guide. We’ll be releasing many more, so let us know what you’d like to see next using the form below.

Mattieu Gamache-Asselin
November 19, 2012

Back to the Mac: Parse Adds OS X Support

Acorns and oak trees. The Apple ][ and the iMac. Anakin Skywalker and Darth Vader. In a long-standing tradition of little things growing up to bigger and more awesome versions of themselves, the Parse iOS SDK developers know and love has grown to now support both iOS and OS X.

Working with data and files stored in the cloud has never been easier for OS X desktop applications. We put together a quick Sample To-Do App to give an idea of how OS X apps can take advantage of everything Parse can offer. If you’re familiar with our iOS SDK, you’ll be right at home with the OS X SDK. To save an object, all you have to do is:

PFObject *jedi = [PFObject objectWithClassName:@"Jedi"];
[jedi setObject:@"Anakin" forKey:@"name"];
[jedi save];

Existing apps on iOS will work seamlessly with this new SDK release — and OS X projects will now be able to access Parse via the API that iOS developers have learned to love. Our SDK supports apps targeted at 10.6 and above. Our To-Do lists are never empty, though, so keep an eye out for even more additions for OS X developers.

Hop on over to the OS X Quickstart and iOS / OS X Guide to get started now!

Christine Yen
November 19, 2012

Parse Adds Support for Windows Phone 8

Microsoft’s latest releases aim to create mobile experiences that appeal to the individual rather than the masses.  As a result, there are even more opportunities for developers to build new and exciting apps. Your app needs a backend and Parse has you covered!

Today, we’re announcing the availability of our Windows Phone 8 SDK. If you’ve used our recently-released Windows 8 SDK, it will look familiar to you. It has all of the same great features: Parse objects, files, Cloud Code, user authentication and management, Facebook authentication, role-based access control, and queries. And just as with the Windows 8 SDK, you can use LINQ to access your data:

// Build a query
var query = from post in ParseObject.GetQuery("Post")
            where post["author"] == ParseUser.CurrentUser
            orderby post.CreatedAt descending
            select post;

// Retrieve the results
IEnumerable<ParseObject> postsByUser = await query.FindAsync();

You can quickly and painlessly install the SDK using NuGet in Visual Studio.

We’ve been working hard to keep adding features to our SDKs, and there’s plenty more to come!  Keep your eyes on our blog to see what we do next.

For more information about our Windows Phone 8 SDK, make sure to check out our Windows Guide and Windows Phone 8 Quickstart and connect your Windows Phone 8 app to Parse today!

David Poll
November 15, 2012

Local Push, Because it’s 5 O’Clock Somewhere

Everyone at Parse loves solving complex problems with stark simplicity; today we’ve helped simplify global engagement. Studies show that active push engagement increases user retention. As your app becomes more successful, however, campaigns must be more carefully crafted. Highly engaging campaigns consider the time of day which a user is most likely to respond to a push notification. News apps might find higher engagement in the morning while entertainment apps might be more successful if they schedule pushes in the evening.

Parse helps developers target the optimal time to send notifications with Push Scheduling, and we are proud to announce a powerful upgrade: Local Push. Last month I blogged about some of the information Parse automatically gathers for you in Installation objects, including the timeZone field. Did you know that there are over 450 time zones which vary by UTC offset and daylight savings rules? Did you know that midnight happens up to 40 times each day, not 24? You don’t need to. Local Push uses the timeZone field to painlessly schedule pushes relative to a users’ time zone.

To schedule a Local Push notification, just click the check box at the bottom of the scheduler in the push notification console.

If you prefer to use REST, simply omit the time zone in the push_time parameter of your API call.

curl -X POST \
  -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
  -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
        "where": {},
        "push_time": "2012-11-14T17:00:00",
        "data": {
          "alert": "Waistin away again? Play Margaritaville"
        }
      }' \

https://api.parse.com/1/push
Thomas Bouldin
November 14, 2012

Target, Schedule, and Preview Notifications in the Parse Push Console

Reaching the right users at the right time is crucial for a push notification to be effective. Our recent advanced targeting and push scheduling features delivered that ability to REST API users, and since then we’ve been hard at work adding those features to our web-based push interface. While we were at it, we added some great improvements like the ability to schedule pushes in a user’s local timezone and an estimate of your push’s reach before you even hit send. Today we’re thrilled to release this beautiful new frontend, where developers and marketers alike have control over the delivery of new notifications and insight into the impact of completed notifications.

The heart of the Parse push interface is the compose mode. The default action is to send to all available devices, but you can also choose to segment according to any of the fields that your app has set in the Installation class. The recipients counter will update as you add and change the constraints for your notification. For instance, in our example live music app AnyShow, you can notify users according to the age, location, and favorite bands that were registered in the app.

Segmenting lets you target a push and estimate its reach

You can then specify a notification message and a scheduled time for the push.  Our preview window lets you scroll through what the notification will look like in different contexts on both iOS and Android. By default the push will be sent immediately, but you can also schedule it for any time in the next two weeks. If you use the local time checkbox, Parse will try to send the push in the device’s local time. You can read the iOS and Android push docs for more information about how the Parse SDKs automatically set the timeZone field when you save an Installation object.

Visualize the impact your notification will have on devices

There’s much more to the new push console, so we encourage you to try it for yourself and let us know if you have any comments. In the meantime, we’ve enlisted Matt to create another great screencast to get you started with the new look of Parse Push:

Brian Jacokes
November 13, 2012

Log In with Facebook on Windows 8

Just a few weeks ago, Parse launched its Windows 8 SDK, and we’ve been hard at work adding features ever since. Our latest release adds login and linking with Facebook so that your users don’t have to go through the hassle of creating yet another username and password for your apps. Getting started with Facebook login is easy!

browser.Visibility = Visibility.Visible;
try
{
    // Log in and request email and user_likes permissions from Facebook.
    ParseUser user = await ParseFacebookUtils.LogInAsync(
        browser, new[] { "user_likes", "email" });
    // The user logged in with Facebook!
}
catch
{
    // User cancelled the Facebook login or did not fully authorize.
}
browser.Visibility = Visibility.Collapsed;

Once you’ve logged in, you can use any .NET-based Facebook SDK to access your user’s Facebook data. Facebook recommends using the Facebook C# SDK, which you can install from NuGet using “Install-Package Facebook”.  You can then make Facebook Graph API requests using your user’s access token like so:

var fb = new FacebookClient();
fb.AccessToken = ParseFacebookUtils.AccessToken;
var me = await fb.GetTaskAsync("me");

Take a look at our Windows guide for more information and incorporate Facebook authentication into your Windows Store app today!

 

David Poll
November 12, 2012

Animating the Cloud Modules Icon

Every time we launch a new product, we try to offer our users a delightful experience on our landing pages. This sometimes involves creating a nice animation that gives life to the product icon. We received so much great feedback for our Cloud Code icon animation that we really wanted to do something cool for our new Cloud Modules feature.

Today I’m giving you some insight on how we built the Cloud Modules icon animation, using JavaScript and a little bit of CSS3.

Let’s start by creating the HTML for this animation.

<div class="icon">
  <div class="bricks"></div>
  <div class="final_icon"></div>
</div>

We only need a div that will contain our little “bricks”, a div that will contain the final icon that will fade in at the end of the animation, and a wrapper div to correctly position the icon in the page.

Then we need to write the CSS that will make things look good.

.icon {
    position: relative;
    width: 435px;
    height: 284px;

    .bricks {
        .brick {
            width: 11px;
            height: 11px;
            @include border-radius(3px);
            @include background-image(linear-gradient(#FFFFFF, #B9B9B9));
            @include box-shadow(rgba(#FFFFFF, 0.7) 0px 0px 1px, rgba(#000000, 0.6) 0 2px 3px);
            position: absolute;
            @include single-transition(all, 0.5s, ease);

            &.displayNone {
                display: none;
            }

            &.illuminated {
              -webkit-animation: illuminatedBrick 0.7s ease-out 1;
              -moz-animation: illuminatedBrick 0.7s ease-out 1;
              animation: illuminatedBrick 0.7s ease-out 1;
            }
        }
    }
    .final_icon {
        display: none;
        margin-top: -17px;
        margin-left: -20px;
        width: 467px;
        height: 318px;
        position: absolute;
        background: url(/images/products/cloud_code/cloud_modules_final_icon.png) no-repeat;
        @include image-2x("/images/products/cloud_code/cloud_modules_final_icon@2x.png", 462px, 318px);
    }
}

Here we’re using some SASS mixins provided by Compass and a custom mixin for providing Retina assets from Jason Zimdars’s solution, and we’re also using a CSS animation called illuminatedBrick that we first need to declare.

@keyframes illuminatedBrick {
    0% {
        background-image: none;
        background-color: white;
        @include box-shadow(rgba(white, 0.7) 0px 0px 1px, rgba(#da79f3, 0.6) 0 0px 3px);
    }
    100% {
        background-image: none;
        background-color: #da79f3;
        @include box-shadow(rgba(white, 0.7) 0px 0px 1px, rgba(#da79f3, 0.6) 0 0px 25px 5px);
    }
}

Note that we also need to declare @-webkit-keyframes and @-moz-keyframes if we want to support all WebKit based browsers and Firefox.

Let’s now write the JavaScript magic that will create all the bricks and animate them.

We first declare a matrix of all the relative coordinates of the bricks. Each brick position depends on its predecessor. This way, it becomes very easy to change the positioning or behavior of the animation if needed. And we add the bricks to the bricks div using a loop.

var matrix = [[0,0], [0,-12], [0,-12], [0,-12], [0,-12], [0,-12], [0,-12], [0,-12], [0,-12], 
[0,-12], [0,-12], [0,-12], [0,-12], [0,-12], [0,-12], [0,-12], [0,-12], [0,-12], [0,-12], 
[0,-12], [0,-12], [0,-12], [0,-12], [0,-12], [-2,-12], [-5,-12], [-5,-12], [-9,-11], [-10,-10], 
[-11,-9], [-12,-7], [-12,-5], [-12,-4], [-12,1], [-12,1], [-12,3], [-12,4], [-12,5], [-12,7], 
[-10,10], [-8,11], [-7, 11], [-3,12], [-12,5], [-12,5], [-12,6], [-11,9], [-11,9], [-10,10], 
[-6,12], [-6,11], [-5,12], [-3,12], [-1,12], [0,12], [0,12], [2,12], [4,12], [4,12], [9,10], 
[9,11], [10,10], [10,10], [11,8], [-4,12], [-2,12], [3,12], [6,12], [6,12], [11,10], [11,8], 
[12,4], [12,1], [3,12], [6,12], [10,10], [10,10], [11,7], [12,4], [12,3], [12,0], [12,-2], 
[12,-2], [12,-2], [12,-8], [10,-10], [8,-11], [7,-12]];

// Creation of the bricks
for (i=0; i<matrix.length; i++) {
  $(".bricks").append("<div class='brick displayNone'></div>");
}

Then we position the bricks, using the first brick as a reference.

// Positioning of the first brick
var currentY = 218;
var currentX = 361;

// Positioning of the rest of the bricks, using the matrix and the first brick as a reference.
for (i=0; i<matrix.length; i++) {
  currentY += matrix[i][0];
  currentX += matrix[i][1];
  var currentBrick = $(".brick")[i];
  $(currentBrick).css("top", currentY +"px");
  $(currentBrick).css("right", currentX +"px");
}

We now show the bricks one by one, with a little animation.

var x = 0;
$(".brick").each(function(index) {
  // here we calculate the timeout we'll add to each brick, so they show up one after 
  // the other, and we add a deceleration at the end to make it look better
  x += 20+(x/60);
  if(index > 80){
    x += (x/50);
  }

  var brick = $(this);
  setTimeout(function() {
    $(brick).removeClass("displayNone");
    $(brick).animate({
      top: '+=50'
    });
  }, x);
});

At the end, we illuminate the bricks using our illuminated class that uses the CSS3 animation.

setTimeout(function() {
  $(".brick").addClass("illuminated");
}, x + 500);

Then we hide all the bricks and fade in the final icon.

setTimeout(function() {
  $(".brick").fadeOut(300);
  setTimeout(function() { $(".bricks").hide(); }, 400); // this prevents some weird bugs
  $(".final_icon").fadeIn(1000);
}, x + 900);

To summarize, we’re using JavaScript to create and position the bricks using relative coordinates, and animating them using timeouts and the jQuery .animate() function, and then we use a CSS3 animation to light up the bricks before they disappear.

As an example, here’s a light version of the animation (no illumination of the bricks before showing the final icon).

Christophe Tauziet
November 9, 2012

Archives

Categories

RSS Feed Follow us Like us