Engage and retain users in
the mobile world
Matteo Bonifazi
ROME 18-19 MARCH 2016
Who I am?
+Matteo Bonifazi
Android Google Developer Expert
Member of GDG Rome
@mbonifazi
matteobonifazi[at]gmail[dot]com
Do you need any Android book?
Sviluppare applicazioni per
Android in sette giorni
Android
Programmazione Avanzata
Contents
● Goat Checker story
● User acquisition
● App Invites
● App usage
● App Indexing API
Goat Checker story
For a great app, all we need is a great idea!!!
Where can we find a good idea?
Goat Checker story
Goat Checker story
What is the best scored Android question?
http://developer.android.com/reference/android/os/UserManager.html
Goat Checker story
THE IDEA
Understand if
Android user is a
goat or not
After the idea, let’s start programming
Goat Checker story
Goat Checker story
Nobody cares to
know if he/she is
a goat or not
Goat Checker story
User acquisition
How people become aware about an app?
32% family, friends and collegues
13% TV
17% search engines 14% company website
24% app store
stats from https://think.storage.googleapis.com/docs/mobile-app-marketing-insights.pdf
Implement invitation from scratch
App Invites
App Invites
App Invites from Google
● App content sharing
● Personalized onboarding flows
● Compatible for both Android & iOS
● Sharing & installation stats are fully
integrated with Google Analytics
App Invites
App Invites widget makes easy for
your users to send invites
App Invites
Send actionable cards with
Install button
App Invites
Personalized onboard flows to offer
discount offer or content
App Invites
App Invites
classpath 'com.google.gms:google-services:2.0.0-alpha5'
apply plugin: 'com.google.gms.google-services
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
AndroidManifest.xml
build.gradle
compile 'com.google.android.gms:play-services-appinvite:8.4.0'
project configuration
https://developers.google.com/mobile/add?platform=android&cntapi=appinvite
google-services.json
App Invites
public void sendInvite() {
Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.
string.invitation_title)
.setMessage(getString(R.string.invitation_message))
.setDeepLink(Uri.parse(getString(R.string.invitation_deep_link)))
.setCustomImage(Uri.parse(getString(R.string.invitation_custom_image)))
.setCallToActionText(getString(R.string.invitation_cta)).build();
startActivityForResult(intent, REQUEST_INVITE);
}
mClient = new GoogleApiClient.Builder(this).addApi(AppInvite.API).build();
App Invites
Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.
string.invitation_title))
...
.setOtherPlatformsTargetApplication(
AppInviteInvitation.IntentBuilder.PlatformMode.PROJECT_PLATFORM_IOS,
getString(R.string.ios_app_client_id))
...
.build();
App Invites
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent
data) {
if (requestCode == REQUEST_INVITE && resultCode == RESULT_OK ) {
String[] ids = AppInviteInvitation.getInvitationIds(resultCode,data);
Log.d(TAG, getString(R.string.sent_invitations_fmt, ids.length));
}
}
App Invites
boolean autoLaunchDeepLink = true;
AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this,
autoLaunchDeepLink)
.setResultCallback(new ResultCallback<AppInviteInvitationResult>(){
@Override
public void onResult(AppInviteInvitationResult result) {
Log.d(TAG, "getInvitation:onResult:+result.getStatus());
}});
Let’s start integrating App Invites
Goat Checker story
Goat Checker story
Number of downloads
Goat Checker story
App usage is still flat
Average app user has 36 apps installed
App usage
App usage
26% of installed
smartphone apps are
used daily.
1 in 4 apps are never
used.
Most installed apps are not used often
App usage
38% of app users are likely to download an
app when it’s required to complete a
purchase, half of which would uninstall it after
purchase is complete.
Consumers often abandon apps
immediately after a download.
App Indexing
App Indexing
Engage your users with install buttons for
your app in the Google search result
App Indexing
Re-engage users through Google Search
App autocompletions
App Indexing
<activity
android:name=".GoatActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="goatchecker.webs.com/"
android:scheme="http" />
</intent-filter>
</activity>
App Indexing
protected void onNewIntent(Intent intent) {
String action = intent.getAction();
String data = intent.getDataString();
if (Intent.ACTION_VIEW.equals(action) && data != null) {
String productId = data.substring(data.lastIndexOf("/") + 1);
Uri contentUri = GoatChecker.CONTENT_URI.buildUpon()
.appendPath(productId).build();
//Handle content
}
}
App Indexing
android-app://dekra.goatchecker/http/goatchecker.webs.com
Protocol Package ID PathScheme
App Indexing Markup
App Indexing
<link rel=“alternate”
href=“android-app://dekra.goatchecker/http/goatchecker.webs.com” />
Approve request on Webmaster Tools - https://www.google.com/webmasters/tools
<html>
<head>
...
<link rel="alternate" href="android-app://dekra.
goatchecker/http/goatchecker.webs.com" />
...
</head>
<body> … </body>
In the web page
App Indexing
compile 'com.google.android.gms:play-services-appindexing:8.4.0'
build.gradle
Uri APP_URI = Uri.parse
("android-app://dekra.goatchecker/http/goatchecker.webs.com");
Uri WEB_URL = Uri.parse("http://goatchecker.webs.com/");
URI definition
mClient = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
Google Client
App Indexing
mUrl = "http://goatchecker.webs.com/";
mTitle = "Are you a goat?";
public Action getAction() {
Thing object = new Thing.Builder()
.setName(mTitle).setUrl(mUrl).build();
return new Action.Builder(Action.TYPE_VIEW).setObject(object)
.setActionStatus(Action.STATUS_TYPE_COMPLETED).build();
}
App Indexing
@Override
public void onStart() {
super.onStart();
mClient.connect();
AppIndex.AppIndexApi.start(mClient, getAction());
}
@Override
public void onStop() {
AppIndex.AppIndexApi.end(mClient, getAction());
mClient.disconnect();
super.onStop();
}
App Indexing
App Indexing example https://developers.google.com/app-indexing/partners/case-studies
iOS
App Invites
● https://developers.google.com/app-invites/ios/guides/start
App Indexing - from iOS 9
● https://developers.google.com/app-indexing/ios/app
● https://developer.apple.
com/library/ios/documentation/General/Conceptual/AppSearch/
iOS Search API - from iOS 9
Questions?
Thanks!
ROME 18-19 MARCH 2016
+Matteo Bonifazi - @mbonifazi
matteobonifazi[at]gmail[dot]com
http://androidinsettegiorni.wordpress.com
All pictures belong to their respective authors
Discover today if
you are a goat

Engage and retain users in the mobile world

  • 1.
    Engage and retainusers in the mobile world Matteo Bonifazi ROME 18-19 MARCH 2016
  • 2.
    Who I am? +MatteoBonifazi Android Google Developer Expert Member of GDG Rome @mbonifazi matteobonifazi[at]gmail[dot]com
  • 3.
    Do you needany Android book? Sviluppare applicazioni per Android in sette giorni Android Programmazione Avanzata
  • 4.
    Contents ● Goat Checkerstory ● User acquisition ● App Invites ● App usage ● App Indexing API
  • 5.
    Goat Checker story Fora great app, all we need is a great idea!!!
  • 6.
    Where can wefind a good idea? Goat Checker story
  • 7.
    Goat Checker story Whatis the best scored Android question? http://developer.android.com/reference/android/os/UserManager.html
  • 8.
    Goat Checker story THEIDEA Understand if Android user is a goat or not
  • 9.
    After the idea,let’s start programming Goat Checker story
  • 10.
    Goat Checker story Nobodycares to know if he/she is a goat or not
  • 11.
  • 12.
    User acquisition How peoplebecome aware about an app? 32% family, friends and collegues 13% TV 17% search engines 14% company website 24% app store stats from https://think.storage.googleapis.com/docs/mobile-app-marketing-insights.pdf
  • 13.
    Implement invitation fromscratch App Invites
  • 14.
    App Invites App Invitesfrom Google ● App content sharing ● Personalized onboarding flows ● Compatible for both Android & iOS ● Sharing & installation stats are fully integrated with Google Analytics
  • 15.
    App Invites App Inviteswidget makes easy for your users to send invites
  • 16.
    App Invites Send actionablecards with Install button
  • 17.
    App Invites Personalized onboardflows to offer discount offer or content
  • 18.
  • 19.
    App Invites classpath 'com.google.gms:google-services:2.0.0-alpha5' applyplugin: 'com.google.gms.google-services <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> AndroidManifest.xml build.gradle compile 'com.google.android.gms:play-services-appinvite:8.4.0' project configuration https://developers.google.com/mobile/add?platform=android&cntapi=appinvite google-services.json
  • 20.
    App Invites public voidsendInvite() { Intent intent = new AppInviteInvitation.IntentBuilder(getString(R. string.invitation_title) .setMessage(getString(R.string.invitation_message)) .setDeepLink(Uri.parse(getString(R.string.invitation_deep_link))) .setCustomImage(Uri.parse(getString(R.string.invitation_custom_image))) .setCallToActionText(getString(R.string.invitation_cta)).build(); startActivityForResult(intent, REQUEST_INVITE); } mClient = new GoogleApiClient.Builder(this).addApi(AppInvite.API).build();
  • 21.
    App Invites Intent intent= new AppInviteInvitation.IntentBuilder(getString(R. string.invitation_title)) ... .setOtherPlatformsTargetApplication( AppInviteInvitation.IntentBuilder.PlatformMode.PROJECT_PLATFORM_IOS, getString(R.string.ios_app_client_id)) ... .build();
  • 22.
    App Invites @Override protected voidonActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_INVITE && resultCode == RESULT_OK ) { String[] ids = AppInviteInvitation.getInvitationIds(resultCode,data); Log.d(TAG, getString(R.string.sent_invitations_fmt, ids.length)); } }
  • 23.
    App Invites boolean autoLaunchDeepLink= true; AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, autoLaunchDeepLink) .setResultCallback(new ResultCallback<AppInviteInvitationResult>(){ @Override public void onResult(AppInviteInvitationResult result) { Log.d(TAG, "getInvitation:onResult:+result.getStatus()); }});
  • 24.
    Let’s start integratingApp Invites Goat Checker story
  • 25.
  • 26.
    Goat Checker story Appusage is still flat
  • 27.
    Average app userhas 36 apps installed App usage
  • 28.
    App usage 26% ofinstalled smartphone apps are used daily. 1 in 4 apps are never used. Most installed apps are not used often
  • 29.
    App usage 38% ofapp users are likely to download an app when it’s required to complete a purchase, half of which would uninstall it after purchase is complete. Consumers often abandon apps immediately after a download.
  • 30.
  • 31.
    App Indexing Engage yourusers with install buttons for your app in the Google search result
  • 32.
    App Indexing Re-engage usersthrough Google Search App autocompletions
  • 33.
    App Indexing <activity android:name=".GoatActivity"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="goatchecker.webs.com/" android:scheme="http" /> </intent-filter> </activity>
  • 34.
    App Indexing protected voidonNewIntent(Intent intent) { String action = intent.getAction(); String data = intent.getDataString(); if (Intent.ACTION_VIEW.equals(action) && data != null) { String productId = data.substring(data.lastIndexOf("/") + 1); Uri contentUri = GoatChecker.CONTENT_URI.buildUpon() .appendPath(productId).build(); //Handle content } }
  • 35.
  • 36.
    App Indexing <link rel=“alternate” href=“android-app://dekra.goatchecker/http/goatchecker.webs.com”/> Approve request on Webmaster Tools - https://www.google.com/webmasters/tools <html> <head> ... <link rel="alternate" href="android-app://dekra. goatchecker/http/goatchecker.webs.com" /> ... </head> <body> … </body> In the web page
  • 37.
    App Indexing compile 'com.google.android.gms:play-services-appindexing:8.4.0' build.gradle UriAPP_URI = Uri.parse ("android-app://dekra.goatchecker/http/goatchecker.webs.com"); Uri WEB_URL = Uri.parse("http://goatchecker.webs.com/"); URI definition mClient = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build(); Google Client
  • 38.
    App Indexing mUrl ="http://goatchecker.webs.com/"; mTitle = "Are you a goat?"; public Action getAction() { Thing object = new Thing.Builder() .setName(mTitle).setUrl(mUrl).build(); return new Action.Builder(Action.TYPE_VIEW).setObject(object) .setActionStatus(Action.STATUS_TYPE_COMPLETED).build(); }
  • 39.
    App Indexing @Override public voidonStart() { super.onStart(); mClient.connect(); AppIndex.AppIndexApi.start(mClient, getAction()); } @Override public void onStop() { AppIndex.AppIndexApi.end(mClient, getAction()); mClient.disconnect(); super.onStop(); }
  • 40.
    App Indexing App Indexingexample https://developers.google.com/app-indexing/partners/case-studies
  • 41.
    iOS App Invites ● https://developers.google.com/app-invites/ios/guides/start AppIndexing - from iOS 9 ● https://developers.google.com/app-indexing/ios/app ● https://developer.apple. com/library/ios/documentation/General/Conceptual/AppSearch/ iOS Search API - from iOS 9
  • 42.
  • 43.
    Thanks! ROME 18-19 MARCH2016 +Matteo Bonifazi - @mbonifazi matteobonifazi[at]gmail[dot]com http://androidinsettegiorni.wordpress.com All pictures belong to their respective authors Discover today if you are a goat