Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Sticky Social Apps

Sticky Social Apps

Best practices and strategies for keeping people engaged in your application

beardouglas

May 29, 2013
Tweet

More Decks by beardouglas

Other Decks in Education

Transcript

  1. developers
    Making Sticky Social Apps
    Bear Douglas and Christine Abernathy
    github: beardouglas, caabernathy
    @beardigsit @caabernathy
    Wednesday, May 29, 13

    View Slide

  2. The Lifecycle of a Sticky App
    Wednesday, May 29, 13

    View Slide

  3. The Lifecycle of a Sticky App
    What can I
    find here?
    Contribute
    content
    Add friends
    Discover / Engage
    Wednesday, May 29, 13

    View Slide

  4. Solving the empty room problem
    What can I
    find here?
    Contribute
    content
    Add friends
    Discover / Engage
    Wednesday, May 29, 13

    View Slide

  5. Wednesday, May 29, 13

    View Slide

  6. Wednesday, May 29, 13

    View Slide

  7. Code: Fetching a person’s list of friends using app
    Wednesday, May 29, 13

    View Slide

  8. Code: Fetching a person’s list of friends using app
    String fqlQuery = "SELECT uid, name FROM user WHERE uid IN " +
    "(SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 25) AND is_app_user = 1";
    Bundle params = new Bundle();
    params.putString("q", fqlQuery);
    Request request = new Request(Session.getActiveSession(), "/fql", params, HttpMethod.GET,
    new Request.Callback() {
    Wednesday, May 29, 13

    View Slide

  9. Code: Fetching a person’s list of friends using app
    String fqlQuery = "SELECT uid, name FROM user WHERE uid IN " +
    "(SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 25) AND is_app_user = 1";
    Bundle params = new Bundle();
    params.putString("q", fqlQuery);
    Request request = new Request(Session.getActiveSession(), "/fql", params, HttpMethod.GET,
    new Request.Callback() {
    @Override
    public void onCompleted(Response response) {
    // Get the array of data returned
    JSONArray dataArray = (JSONArray) response.getGraphObject().getProperty("data");
    if (dataArray.length() > 0) {
    // Cast this into a defined interface representing the response
    GraphObjectList result = GraphObject.Factory.createList(dataArray, MyResult.class);
    requestOpenGraphData(result);
    }
    }
    });
    Wednesday, May 29, 13

    View Slide

  10. Code: Fetching a person’s list of friends using app
    request.executeAsync();
    String fqlQuery = "SELECT uid, name FROM user WHERE uid IN " +
    "(SELECT uid2 FROM friend WHERE uid1 = me() LIMIT 25) AND is_app_user = 1";
    Bundle params = new Bundle();
    params.putString("q", fqlQuery);
    Request request = new Request(Session.getActiveSession(), "/fql", params, HttpMethod.GET,
    new Request.Callback() {
    @Override
    public void onCompleted(Response response) {
    // Get the array of data returned
    JSONArray dataArray = (JSONArray) response.getGraphObject().getProperty("data");
    if (dataArray.length() > 0) {
    // Cast this into a defined interface representing the response
    GraphObjectList result = GraphObject.Factory.createList(dataArray, MyResult.class);
    requestOpenGraphData(result);
    }
    }
    });
    Wednesday, May 29, 13

    View Slide

  11. Code: Reading Open Graph Data from a list of friends
    Wednesday, May 29, 13

    View Slide

  12. Code: Reading Open Graph Data from a list of friends
    private void requestOpenGraphData(GraphObjectList friends) {
    RequestBatch requestBatch = new RequestBatch();
    for (MyResult friend : friends) {
    Wednesday, May 29, 13

    View Slide

  13. Code: Reading Open Graph Data from a list of friends
    private void requestOpenGraphData(GraphObjectList friends) {
    RequestBatch requestBatch = new RequestBatch();
    for (MyResult friend : friends) {
    Request ogDataRequest = Request.newGraphPathRequest(
    Session.getActiveSession(),
    friend.getUid()+"/resourcebrowser:browse",
    new Request.Callback() {
    public void onCompleted(Response response) {
    FacebookRequestError error = response.getError();
    if (error == null) {
    // Process the data for display
    }
    }
    });
    requestBatch.add(ogDataRequest);
    Wednesday, May 29, 13

    View Slide

  14. Code: Reading Open Graph Data from a list of friends
    }
    requestBatch.executeAsync();
    }
    private void requestOpenGraphData(GraphObjectList friends) {
    RequestBatch requestBatch = new RequestBatch();
    for (MyResult friend : friends) {
    Request ogDataRequest = Request.newGraphPathRequest(
    Session.getActiveSession(),
    friend.getUid()+"/resourcebrowser:browse",
    new Request.Callback() {
    public void onCompleted(Response response) {
    FacebookRequestError error = response.getError();
    if (error == null) {
    // Process the data for display
    }
    }
    });
    requestBatch.add(ogDataRequest);
    Wednesday, May 29, 13

    View Slide

  15. Demo: Reading Open Graph Data
    https://github.com/beardouglas/andevcon/
    Wednesday, May 29, 13

    View Slide

  16. Pro Tips
    Wednesday, May 29, 13

    View Slide

  17. Pro Tips
    ▪Personalize around friends and interests
    Wednesday, May 29, 13

    View Slide

  18. Pro Tips
    ▪Personalize around friends and interests
    ▪Consider building up your own graph
    Wednesday, May 29, 13

    View Slide

  19. Pro Tips
    ▪Personalize around friends and interests
    ▪Consider building up your own graph
    ▪Put aggregation data logic on a server
    Wednesday, May 29, 13

    View Slide

  20. Contributing content
    What can I
    find here?
    Contribute
    content
    Add friends
    Discover / Engage
    Wednesday, May 29, 13

    View Slide

  21. Case study: TripAdvisor
    Average user engagement increased
    Users who connect through Facebook are
    x as likely to contribute content
    “Cities I’ve Visited” app saw x increase in monthly
    active users after adding Open Graph
    Wednesday, May 29, 13

    View Slide

  22. What is Open Graph?
    Wednesday, May 29, 13

    View Slide

  23. Wednesday, May 29, 13

    View Slide

  24. User + Action + Object = Story
    Wednesday, May 29, 13

    View Slide

  25. ________ + ________ + ________ = Story
    Wednesday, May 29, 13

    View Slide

  26. ________ + ________ + ________
    Christine ate a meal = Story
    Wednesday, May 29, 13

    View Slide

  27. Telling Stories: Using Open Graph
    Wednesday, May 29, 13

    View Slide

  28. Telling Stories: Using Open Graph
    Common
    Wednesday, May 29, 13

    View Slide

  29. Telling Stories: Using Open Graph
    Common Custom
    Wednesday, May 29, 13

    View Slide

  30. Open Graph and Sharing
    Wednesday, May 29, 13

    View Slide

  31. Open Graph and Sharing
    Object API
    Wednesday, May 29, 13

    View Slide

  32. Open Graph and Sharing
    User Owned Objects
    Object API
    Wednesday, May 29, 13

    View Slide

  33. Open Graph and Sharing
    Share Dialog
    User Owned Objects
    Object API
    Wednesday, May 29, 13

    View Slide

  34. Example: Common Story
    Wednesday, May 29, 13

    View Slide

  35. Example: Common Story
    Wednesday, May 29, 13

    View Slide

  36. Example: Common Story
    Wednesday, May 29, 13

    View Slide

  37. Code: Creating the Story
    Wednesday, May 29, 13

    View Slide

  38. Code: Creating the Story
    // Create a batch request
    RequestBatch requestBatch = new RequestBatch();
    Wednesday, May 29, 13

    View Slide

  39. Code: Creating the Story
    // Create a batch request
    RequestBatch requestBatch = new RequestBatch();
    // Create object creation request
    Bundle objectParams = new Bundle();
    JSONObject book = new JSONObject();
    book.put("title", "A Game of Thrones");
    // ...
    objectParams.putString("object", book.toString());
    Request objectRequest = new Request(session,"me/objects/books.book", objectParams, HttpMethod.POST, null);
    objectRequest.setBatchEntryName("objectCreate");
    requestBatch.add(objectRequest);
    Wednesday, May 29, 13

    View Slide

  40. Code: Creating the Story
    // Create a batch request
    RequestBatch requestBatch = new RequestBatch();
    // Create the publish action request
    Bundle actionParams = new Bundle();
    actionParams.putString("book", "{result=objectCreate:$.id}");
    Request actionRequest = new Request(session,"me/books.reads", actionParams, HttpMethod.POST, null);
    requestBatch.add(actionRequest);
    // Create object creation request
    Bundle objectParams = new Bundle();
    JSONObject book = new JSONObject();
    book.put("title", "A Game of Thrones");
    // ...
    objectParams.putString("object", book.toString());
    Request objectRequest = new Request(session,"me/objects/books.book", objectParams, HttpMethod.POST, null);
    objectRequest.setBatchEntryName("objectCreate");
    requestBatch.add(objectRequest);
    Wednesday, May 29, 13

    View Slide

  41. Code: Creating the Story
    // Execute the batch request
    requestBatch.executeAsync();
    // Create a batch request
    RequestBatch requestBatch = new RequestBatch();
    // Create the publish action request
    Bundle actionParams = new Bundle();
    actionParams.putString("book", "{result=objectCreate:$.id}");
    Request actionRequest = new Request(session,"me/books.reads", actionParams, HttpMethod.POST, null);
    requestBatch.add(actionRequest);
    // Create object creation request
    Bundle objectParams = new Bundle();
    JSONObject book = new JSONObject();
    book.put("title", "A Game of Thrones");
    // ...
    objectParams.putString("object", book.toString());
    Request objectRequest = new Request(session,"me/objects/books.book", objectParams, HttpMethod.POST, null);
    objectRequest.setBatchEntryName("objectCreate");
    requestBatch.add(objectRequest);
    Wednesday, May 29, 13

    View Slide

  42. Creating a Custom Story
    Wednesday, May 29, 13

    View Slide

  43. Creating a Custom Story
    ▪ Model your data
    create a collage
    Wednesday, May 29, 13

    View Slide

  44. Creating a Custom Story
    ▪ Model your data
    ▪ Set up your custom story
    create a collage
    Wednesday, May 29, 13

    View Slide

  45. Creating a Custom Story
    ▪ Model your data
    ▪ Set up your custom story
    ▪ Create test objects
    create a collage
    Wednesday, May 29, 13

    View Slide

  46. Creating a Custom Story
    ▪ Model your data
    ▪ Set up your custom story
    ▪ Create test objects
    ▪ Publish test actions
    create a collage
    Wednesday, May 29, 13

    View Slide

  47. Demo: Creating a Story
    https://github.com/beardouglas/andevcon/
    Wednesday, May 29, 13

    View Slide

  48. Pro Tip: User control and Explicit Sharing
    Wednesday, May 29, 13

    View Slide

  49. Pro Tip: User control and Explicit Sharing
    Wednesday, May 29, 13

    View Slide

  50. Pro Tip: User control and Explicit Sharing
    Wednesday, May 29, 13

    View Slide

  51. Pro Tip: User control and Implicit Sharing
    Wednesday, May 29, 13

    View Slide

  52. Pro Tip: User control and Implicit Sharing
    Wednesday, May 29, 13

    View Slide

  53. Pro Tip: User control and Implicit Sharing
    Wednesday, May 29, 13

    View Slide

  54. Pro Tip: User control and Implicit Sharing
    Wednesday, May 29, 13

    View Slide

  55. Pro Tip: User control and Implicit Sharing
    Wednesday, May 29, 13

    View Slide

  56. http://www.parse.com/
    Introducing Parse
    Wednesday, May 29, 13

    View Slide

  57. Building Your App
    Database
    Wednesday, May 29, 13

    View Slide

  58. Building Your App
    Database REST API
    REST
    Z
    Z
    Z
    Server
    +
    +
    + users
    + security
    Caching
    Networking
    + +
    The fun stuff!
    Wednesday, May 29, 13

    View Slide

  59. Parse Lets You Focus on the Fun Stuff
    Database REST API
    REST
    Z
    Z
    Server
    +
    +
    + users
    + security
    Caching
    Networking
    + +
    The fun stuff!
    Wednesday, May 29, 13

    View Slide

  60. Parse Lets You Focus on the Fun Stuff
    no no
    no
    no
    no
    yes!
    Database REST API
    REST
    Z
    Z
    Server
    +
    +
    + users
    + security
    Caching
    Networking
    + +
    The fun stuff!
    Z
    Wednesday, May 29, 13

    View Slide

  61. Creating and Managing Users
    Wednesday, May 29, 13

    View Slide

  62. ParseUser user = new ParseUser();
    user.setUsername("my name");
    user.setPassword("my pass");
    user.setEmail("[email protected]");
    user.signUpInBackground(new SignUpCallback() { });
    Creating and Managing Users
    PFUser *user = [PFUser user];
    user.username = @"my name";
    user.password = @"my pass";
    user.email = @"[email protected]";
    [user signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { }];
    var user = new Parse.User();
    user.set("username", "my name");
    user.set("password", "my pass");
    user.set("email", "[email protected]");
    user.signUp(null, { success: function(user) { }, error: function(user, error) {} });
    Wednesday, May 29, 13

    View Slide

  63. Saving Data
    ParseObject gameScore = new ParseObject("Score");
    gameScore.put("points", 1337);
    gameScore.put("playerName", "Christine Abernathy");
    gameScore.saveInBackground();
    Wednesday, May 29, 13

    View Slide

  64. Querying Data
    ParseQuery query = new ParseQuery("Score");;
    query.whereEqualTo("playerName", "Christine Abernathy"];
    query.whereGreaterThan("points", 10000];
    query.findInBackground(new FindCallback() {
    public void done(List pointList, ParseException e) {
    // Process the result
    }
    });
    Wednesday, May 29, 13

    View Slide

  65. Other Parse Features for Cross-Platform Mobile Apps
    Wednesday, May 29, 13

    View Slide

  66. Demo: Adding Parse
    https://github.com/beardouglas/andevcon/
    Wednesday, May 29, 13

    View Slide

  67. Pro Tips
    Wednesday, May 29, 13

    View Slide

  68. Pro Tips
    ▪Track content performance through Insights
    Wednesday, May 29, 13

    View Slide

  69. Pro Tips
    ▪Track content performance through Insights
    ▪Generate image rich stories
    Wednesday, May 29, 13

    View Slide

  70. Pro Tips
    ▪Track content performance through Insights
    ▪Generate image rich stories
    ▪Use proper Open Graph tags for great previews
    Wednesday, May 29, 13

    View Slide

  71. Pro Tips
    ▪Track content performance through Insights
    ▪Generate image rich stories
    ▪Use proper Open Graph tags for great previews
    ▪Consider adding Internationalization support
    Wednesday, May 29, 13

    View Slide

  72. Add friends
    What can I
    find here?
    Contribute
    content
    Add friends
    Discover / Engage
    Wednesday, May 29, 13

    View Slide

  73. Case study: Waze
    Wazers who use Facebook drive more miles
    Users who connect through Facebook use Waze
    . x as often as other users
    User growth doubled after adding Facebook Login
    How can a mapping app be social? Enable friends to
    carpool and share directions to events
    Wednesday, May 29, 13

    View Slide

  74. Discover / Engage
    What can I
    find here?
    Contribute
    content
    Add friends
    Discover / Engage
    Wednesday, May 29, 13

    View Slide

  75. Re-engagement: Quora email
    Wednesday, May 29, 13

    View Slide

  76. Re-engagement: Upworthy
    Wednesday, May 29, 13

    View Slide

  77. Re-engagement: Instagram
    Wednesday, May 29, 13

    View Slide

  78. Wednesday, May 29, 13

    View Slide

  79. Wednesday, May 29, 13

    View Slide

  80. Your Cross-Platform Checklist
    Wednesday, May 29, 13

    View Slide

  81. Your Cross-Platform Checklist
    Use the same Facebook App ID everywhere
    Wednesday, May 29, 13

    View Slide

  82. Your Cross-Platform Checklist
    Use the same Facebook App ID everywhere
    Implement Facebook Login on every platform
    Wednesday, May 29, 13

    View Slide

  83. Your Cross-Platform Checklist
    Use the same Facebook App ID everywhere
    Enable Deep Linking for Android and iOS
    Implement Facebook Login on every platform
    Wednesday, May 29, 13

    View Slide

  84. Your Cross-Platform Checklist
    Use the same Facebook App ID everywhere
    Enable Deep Linking for Android and iOS
    Make it easy to share from every platform
    Implement Facebook Login on every platform
    Wednesday, May 29, 13

    View Slide

  85. Promote
    What can I
    find here?
    Contribute
    content
    Add friends
    Discover / Engage
    Wednesday, May 29, 13

    View Slide

  86. Promote
    What can I
    find here?
    Contribute
    content
    Add friends
    Discover / Engage
    But how do you
    even get someone
    here?
    Wednesday, May 29, 13

    View Slide

  87. Get installs directly from News Feed
    Wednesday, May 29, 13

    View Slide

  88. Best Practices
    Wednesday, May 29, 13

    View Slide

  89. Best Practices
    ▪ Real People. Real Things.
    Wednesday, May 29, 13

    View Slide

  90. Best Practices
    ▪ Real People. Real Things.
    ▪ Strong Call to Action
    Wednesday, May 29, 13

    View Slide

  91. Best Practices
    ▪ Real People. Real Things.
    ▪ Strong Call to Action
    ▪ Include Mobile Devices
    Wednesday, May 29, 13

    View Slide

  92. Best Practices
    ▪ Real People. Real Things.
    ▪ Strong Call to Action
    ▪ Include Mobile Devices
    ▪ App Screenshots
    Wednesday, May 29, 13

    View Slide

  93. Best Practices
    ▪ Real People. Real Things.
    ▪ Strong Call to Action
    ▪ Include Mobile Devices
    ▪ App Screenshots
    ▪ Test. Test. Test.
    Wednesday, May 29, 13

    View Slide

  94. Sponsored Stories
    Wednesday, May 29, 13

    View Slide

  95. Sponsoring Open Graph Stories
    Friend’s
    action
    generates
    a story
    Wednesday, May 29, 13

    View Slide

  96. Sponsoring Open Graph Stories
    Friends
    engage
    with
    story
    Sponsor
    story
    Wednesday, May 29, 13

    View Slide

  97. Sponsoring Open Graph Stories
    Friends
    engage
    with
    story
    Wednesday, May 29, 13

    View Slide

  98. Open Graph Insights
    Wednesday, May 29, 13

    View Slide

  99. Key Takeaways
    Wednesday, May 29, 13

    View Slide

  100. Key Takeaways
    ▪Pay attention to your user’s lifecycle
    Wednesday, May 29, 13

    View Slide

  101. Key Takeaways
    ▪Pay attention to your user’s lifecycle
    ▪Show engaging content first
    Wednesday, May 29, 13

    View Slide

  102. Key Takeaways
    ▪Pay attention to your user’s lifecycle
    ▪Show engaging content first
    ▪Use Open Graph to tell rich stories
    Wednesday, May 29, 13

    View Slide

  103. Key Takeaways
    ▪Pay attention to your user’s lifecycle
    ▪Show engaging content first
    ▪Use Open Graph to tell rich stories
    ▪Add cross-platform support
    Wednesday, May 29, 13

    View Slide

  104. Key Takeaways
    ▪Pay attention to your user’s lifecycle
    ▪Show engaging content first
    ▪Use Open Graph to tell rich stories
    ▪Add cross-platform support
    ▪A/B test content and ads to find the most effective
    ways to get users
    Wednesday, May 29, 13

    View Slide

  105. developers.facebook.com/android
    Facebook SDK .
    for Android
    github.com/fbsamples/android-3.0-howtos
    Wednesday, May 29, 13

    View Slide