life after mobilegeddon: app deep linking strategies - pubcon october 2015
TRANSCRIPT
@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