Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015

Post on 16-Apr-2017

819 views 1 download

Transcript of Life After Mobilegeddon: App Deep Linking Strategies - Pubcon October 2015

@goutaste

Using Apps to Drive Mobile-

First SEO Traffic

@goutaste

Android&

iOS Intent

@goutaste

Understanding App Packs

@goutaste

New Android App Packs

@goutaste

Types of App ResultsApp Pack App Single App Carousel Deep LinksIcon Deep Links

@goutaste

Meta-data can provide a “preview” of the type of content in the app

You don’t know what’s IN the app until you download it

App Store search is heavy on brand and head terms vs. long tail

App Store Model

@goutaste

“Google’s mission is to organize the world’s information and make it

universally accessible and useful.”- Google’s initial mission statement -

@goutaste

App Store Model vs. Search Engine Model

@goutaste

Android Deep Linking User Experience

@goutaste

“Google will be considering "high quality" apps to be a positive ranking factor in mobile search.”-Mariya Moeva (Google Webmaster Trends Analyst, SMX West 2015)

Website Parity = Positive Signal for Websites

WebApp

@goutaste

Google App Indexing: Android

@goutaste

Custom URL Scheme

HTTP URL Scheme

Android: Create Intent Filters

@goutaste

Android: Create Intent Filters

Intent Filters need:<action>

<data> android:schemeandroid:path

<category>

@goutaste

Deep Link to previously-viewed ‘Calafia Café’ screen in the Zagat app

Android App Indexing API

@goutaste

...public class MainActivity extends Activity {

  static final Uri APP_URI = Uri.parse("android-app://com.example.android.recipes/http/recipe-app.com/recipes");  static final Uri WEB_URL = Uri.parse("http://recipe-app.com/recipes/");  private GoogleApiClient mClient;    ...   }

  @Override  public void onStart() {    super.onStart();    ...

    @Override  public void onStop() {    ...    // Call end() and disconnect the client    String title = "App Indexing API Title";    Action viewAction = Action.newAction(Action.TYPE_VIEW, title, WEB_URL, APP_URI);    AppIndex.AppIndexApi.end(mClient, viewAction);    mClient.disconnect();    ...

Full code sample here: bit.ly/appindexingAPIcode

Android App Indexing API

@goutaste

...public class MainActivity extends Activity {

  static final Uri APP_URI = Uri.parse("android-app://com.example.android.recipes/http/recipe-app.com/recipes");  static final Uri WEB_URL = Uri.parse("http://recipe-app.com/recipes/");  private GoogleApiClient mClient;    ...   }

  @Override  public void onStart() {    super.onStart();    ...

    @Override  public void onStop() {    ...    // Call end() and disconnect the client    String title = "App Indexing API Title";    Action viewAction = Action.newAction(Action.TYPE_VIEW, title, WEB_URL, APP_URI);    AppIndex.AppIndexApi.end(mClient, viewAction);    mClient.disconnect();    ...

Full code sample here: bit.ly/appindexingAPIcode

Android App Indexing API

@goutaste

Update App’s Robots.txt:

User-Agent: GooglebotAllow: /

Android App Robots.txt

@goutaste

Android Custom Schemes

Requirement: Web Markup

@goutaste

android-app://com.travel_app/travel_app/travel-app.com/hotels/curtis-hotel-denver

Protocol PackageID Scheme (custom)

Host Path

Google’s Android Deep Link Format

Deep Link URL Format:

@goutaste

Rel=alternate XML Sitemaps Schema

<head> ... <link rel="alternate" href="android-app://com.travelapp.android/http/travelapp.com/examplescreen" /> ...</head>

<head> ... <link rel="alternate" href="android-app://com.travelapp.android/travelapp/examplescreen" /> <link rel="alternate" href="ios-app://123456/travelapp/examplescreen" /> ...</head>

@goutaste

Rel=alternate XML Sitemaps Schema

<?xml version="1.0" encoding="UTF-8" ?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url> <loc>http://travelwebsite.com/examplepage</loc> <xhtml:link rel="alternate" href="android-app://com.travelapp.android/travelapp/examplescreen" /> <xhtml:link rel="alternate" href="ios-app://123456/travelapp/examplescreen" /></url> <xhtml:link rel="alternate" href="android-app://com.travelapp.android/http/travelapp.com/examplescreen" />...</urlset>

@goutaste

Rel=alternate SchemaXML Sitemaps

<script type="application/ld+json">{ "@context": "http://schema.org", "@type": "WebPage", "@id": "http://travelwebsite.com/examplepage", "potentialAction": { "@type": "ViewAction", "target": "android-app://com.travelapp.android/http/travelapp.com/examplescreen" }}</script>

@goutaste

Verify Website in GP/ Log Into GSC with GP Account

@goutaste

Google App Indexing:

iOS

@goutaste

The Good News Is…

@goutaste

The Bad News Is…

@goutaste

iOS: Support Universal Links

https://subdomain.domain.com/path/subpath/

Scheme“http” or “https”

Domain or Host Name Path or Prefix

Anatomy of a Universal Link:

@goutaste

iOS: Support Universal Links

Requirements:• A registered domain• SSL access to your domain• Ability to upload a JSON file to your domain

@goutaste

iOS: Support Universal Links

1 Get Your App Ready• Modify your application

delegate• Adopt an entitlement in

Xcode that lists each domain associated with your app

READ:http://bit.ly/ios9universallinks http://bit.ly/UIApplicationDelegate-ReferenceWATCH: http://bit.ly/appleuniversallinks

@goutaste

iOS: Support Universal Links

2 Get Your Server Ready• Create an apple-app-site-

association file for each associated domain with the content your app supports and host it at the root level.

NOTE: The association file must be hosted on a domain that supports HTTPS/TLS, even if the HTTP deep links are not themselves served via HTTPS.

{ "applinks": { "apps": [], "details": {  »ABC0123.com.domain.App": { "paths":[ "*" ] } } }}

@goutaste

iOS: Support Universal Links

2 Get Your Server Ready• Create an apple-app-site-

association file for each associated domain with the content your app supports and host it at the root level.

NOTE: The association file must be hosted on a domain that supports HTTPS/TLS, even if the HTTP deep links are not themselves served via HTTPS.

{ "applinks": { "apps": [], "details": {  »ABC0123.com.domain.App": { "paths":[

”/folder/subfolder/”,

”/folder2/subfolder2/*”, ] } } }}

@goutaste

iOS: Support Cocoapods

@goutaste

iOS: Support Cocoapods

1. Use most up-to-date version of CocoaPods

2. Add ‘GoogleAppIndexing’ pod to Podfile

3. Save and Install Pod

4. Import GoogleAppIndexing

5. Register app

pod 'GoogleAppIndexing'

pod install

#import <GoogleAppIndexing/GoogleAppIndexing.h>

[[GSDAppIndexing sharedInstance] registerApp:your iTunes ID];

@goutaste

Google App Indexing:

Web Markup

@goutaste

Google App Indexing:

Web Markup

@goutaste

Google Search App Ranking Factors

Positive Ranking Factors:

• App Installation Status• Proper Technical

Implementation• Website Signals• APP INDEXING API

(extra boost!)

Negative Ranking Factors:

Content Mismatch/ Back Button Errors

Interstitials

@goutaste

Google Search App Ranking Factors

Positive Ranking Factors:

• App Installation Status• Proper Technical

Implementation• Website Signals• APP INDEXING API

(extra boost!)• Coming soon:

Engagement?

Negative Ranking Factors:

Content Mismatch/ Back Button Errors

Interstitials

@goutaste

Deep Links Without Website ParitySocial Media

Apple Search Email & Paid Ads

@goutaste

Apple Search App Indexing

in iOS 9

@goutaste

“Apple’s App Store commission is now at a

run-rate of $9 billion, more than its total revenue in the year the iPod launched.”

- Benedict Evans, @BenedictEvans -

@goutaste

Apple Search

SPOTLIGHT SAFARISIRI

@goutaste

High-EngagementApp ScreensSuggested in

‘Siri Suggest’ on iOS 9 Spotlight

Siri’s Predcitive Search Uses App Indexing

@goutaste

DEVICE INDEX(PRIVATE)

CLOUD INDEX(PUBLIC)

Apple Search Sources from Two Indexes

@goutaste

Apple Search App Indexing Methods

CoreSpotlight NSUserActivity Web Markup

@goutaste

Apple Search App Indexing

Option 1: NSUserActivity

@goutaste

Core Spotlight NSUserActivity Web Markup

Used for… Indexing public app screens that mirror content on the webDOES require corresponding web content

Add code to WEB

Public Cloud Index

Used for… Indexing app screens that contain private/ personal dataDoes NOT require corresponding web content

Add code to APPPrivate Device Index

Used for… Indexing private and public navigation points in the appDoes NOT require corresponding web content

Add code to APPPrivate Device Index and/ or Public Cloud Index

Private Public

@goutaste

Private or PublicPublic Only

Search results meta data for

display and rankings

‘Canonical’More info here: bit.ly/NSUserActivity

NSUserActivty

@goutaste

CoreSpotlight NSUserActivity Web MarkupNSUserActivit

y

with var eligibleForSearch with var eligibleForPublicIndexing

Private/Device Index

Public/ Cloud Index

PRIVATE APP SCREEN PUBLIC APP SCREEN

@goutaste

Apple Search App Indexing

Option 2: Core Spotlight

@goutaste

Core Spotlight NSUserActivity Web Markup

Used for… Indexing public app screens that mirror content on the webDOES require corresponding web content

Add code to WEB

Public Cloud Index

Used for… Indexing app screens that contain private/ personal dataDoes NOT require corresponding web content

Add code to APPPrivate Device Index

Used for… Indexing private and public navigation points in the appDoes NOT require corresponding web content

Add code to APPPrivate Device Index and/ or Public Cloud Index

Private Public

@goutaste

Search results meta data for

display and rankings

More info here: bit.ly/corespotlight

Core Spotlight

@goutaste

Apple Search App Indexing

Option 3: Web Markup

@goutaste

CoreSpotlight NSUserActivity Web MarkupNSUserActivit

y

with var eligibleForSearch with var eligibleForPublicIndexing

Private/Device Index

Public/ Cloud Index

PRIVATE APP SCREEN PUBLIC APP SCREEN

@goutaste

Core Spotlight NSUserActivity Web Markup

Used for… Indexing public app screens that mirror content on the webDOES require corresponding web content

Add code to WEB

Public Cloud Index

Used for… Indexing app screens that contain private/ personal dataDoes NOT require corresponding web content

Add code to APPPrivate Device Index

Used for… Indexing private and public navigation points in the appDoes NOT require corresponding web content

Add code to APPPrivate Device Index and/ or Public Cloud Index

Private Public

@goutaste

Web Markup – Provide URLs to Apple

@goutaste

Twitter Cards AppLinks Smart App Banners

Web Markup

@goutaste

Twitter Cards AppLinks Smart App Banners

Web Markup

@goutaste

Twitter Cards AppLinks Smart App Banners

Web Markup

@goutaste

Web Markup – Meta Data (Schema & Open Graph)

@goutaste

bit.ly/applesearchvalidator

Test URLs for Web Markup

@goutaste

Apple Search App Ranking Factors

Positive Ranking Factors:• App Installation Status• Personalized App

Engagement • App Result Click-Through

Rate • Keywords/ Title• Aggregated Engagement• Structured Data on Web • Canonical App IDs• Strength/Popularity of Web

URL

Negative Ranking Factors:

Low Engagement Over-Indexing Returns Keywords Spamming  Interstitials JavaScript blocking Applebot

(web only)

@goutaste

Deep Linking in Email &

Social Media

@goutaste

Deep Link Redirectors in Email and Social Media

@goutaste

Deep Link Redirectors in Email and Social Media

@goutaste

The End