Engage and retain users in the mobile world

43
Engage and retain users in the mobile world Matteo Bonifazi ROME 18-19 MARCH 2016

Transcript of Engage and retain users in the mobile world

Page 1: Engage and retain users in the mobile world

Engage and retain users in the mobile world

Matteo Bonifazi

ROME 18-19 MARCH 2016

Page 2: Engage and retain users in the mobile world

Who I am?

+Matteo Bonifazi

Android Google Developer Expert

Member of GDG Rome

@mbonifazi

matteobonifazi[at]gmail[dot]com

Page 4: Engage and retain users in the mobile world

Contents

● Goat Checker story

● User acquisition

● App Invites

● App usage

● App Indexing API

Page 5: Engage and retain users in the mobile world

Goat Checker story

For a great app, all we need is a great idea!!!

Page 6: Engage and retain users in the mobile world

Where can we find a good idea?

Goat Checker story

Page 7: Engage and retain users in the mobile world

Goat Checker storyWhat is the best scored Android question?

http://developer.android.com/reference/android/os/UserManager.html

Page 8: Engage and retain users in the mobile world

Goat Checker story

THE IDEA

Understand if Android user is a

goat or not

Page 9: Engage and retain users in the mobile world

After the idea, let’s start programming

Goat Checker story

Page 10: Engage and retain users in the mobile world

Goat Checker story

Nobody cares to know if he/she is

a goat or not

Page 11: Engage and retain users in the mobile world

Goat Checker story

Page 12: Engage and retain users in the mobile world

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

Page 13: Engage and retain users in the mobile world

Implement invitation from scratch

App Invites

Page 14: Engage and retain users in the mobile world

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

Page 15: Engage and retain users in the mobile world

App Invites

App Invites widget makes easy for your users to send invites

Page 16: Engage and retain users in the mobile world

App Invites

Send actionable cards with Install button

Page 17: Engage and retain users in the mobile world

App Invites

Personalized onboard flows to offer discount offer or content

Page 18: Engage and retain users in the mobile world

App Invites

Page 19: Engage and retain users in the mobile world

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

Page 20: Engage and retain users in the mobile world

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();

Page 21: Engage and retain users in the mobile world

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();

Page 22: Engage and retain users in the mobile world

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));

}

}

Page 23: Engage and retain users in the mobile world

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());

}});

Page 24: Engage and retain users in the mobile world

Let’s start integrating App Invites

Goat Checker story

Page 25: Engage and retain users in the mobile world

Goat Checker story

Number of downloads

Page 26: Engage and retain users in the mobile world

Goat Checker story

App usage is still flat

Page 27: Engage and retain users in the mobile world

Average app user has 36 apps installed

App usage

Page 28: Engage and retain users in the mobile world

App usage

26% of installed smartphone apps are

used daily.

1 in 4 apps are never used.

Most installed apps are not used often

Page 29: Engage and retain users in the mobile world

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.

Page 30: Engage and retain users in the mobile world

App Indexing

Page 31: Engage and retain users in the mobile world

App Indexing

Engage your users with install buttons for your app in the Google search result

Page 32: Engage and retain users in the mobile world

App Indexing

Re-engage users through Google Search App autocompletions

Page 33: Engage and retain users in the mobile world

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>

Page 34: Engage and retain users in the mobile world

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

}

}

Page 35: Engage and retain users in the mobile world

App Indexing

android-app://dekra.goatchecker/http/goatchecker.webs.com

Protocol Package ID PathScheme

App Indexing Markup

Page 36: Engage and retain users in the mobile world

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

Page 37: Engage and retain users in the mobile world

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

Page 38: Engage and retain users in the mobile world

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();

}

Page 39: Engage and retain users in the mobile world

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();

}

Page 40: Engage and retain users in the mobile world

App Indexing

App Indexing example https://developers.google.com/app-indexing/partners/case-studies

Page 42: Engage and retain users in the mobile world

Questions?

Page 43: Engage and retain users in the mobile world

Thanks!

ROME 18-19 MARCH 2016

+Matteo Bonifazi - @mbonifazi

matteobonifazi[at]gmail[dot]com

http://androidinsettegiorni.wordpress.comAll pictures belong to their respective authors

Discover today if you are a goat