App Indexing SEO: Getting Your App Content in Search Results
Learn how to get your app content indexed by Google. Complete guide to app indexing, deep linking, and Firebase App Indexing for better app visibility.
App indexing allows Google to surface your app content in search results. When implemented correctly, users can tap search results to open specific content directly in your app.
Here’s how to get your app indexed.
What Is App Indexing?
App indexing connects your app content to Google Search:
- Search results link to app - Users see “Open in app” for relevant results
- App content in search - In-app pages appear in search results
- Deep linking - Search takes users directly to specific app screens
Benefits
- Increased app engagement
- More organic installs
- Better user experience
- Visibility for app-only content
How App Indexing Works
The Connection
- Website has content - example.com/product/123
- App has corresponding screen - Product screen for item 123
- Deep link connects them - myapp://product/123
- Google understands the link - Shows app option in results
- User taps result - Opens directly in app
Prerequisites
- Your app is published on Google Play / App Store
- You have a website with corresponding content
- Deep linking is implemented
- App is verified with Google Search Console
Setting Up App Indexing
Step 1: Implement Deep Links
Android (Intent Filters):
<!-- AndroidManifest.xml -->
<activity android:name=".ProductActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- HTTP URLs -->
<data android:scheme="https"
android:host="example.com"
android:pathPrefix="/product" />
</intent-filter>
</activity>
iOS (Universal Links):
// apple-app-site-association
{
"applinks": {
"apps": [],
"details": [{
"appID": "TEAMID.com.example.app",
"paths": ["/product/*", "/category/*"]
}]
}
}
Step 2: Verify Domain Ownership
Android App Links:
// /.well-known/assetlinks.json
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": ["YOUR_SHA256_FINGERPRINT"]
}
}]
iOS Universal Links:
Host apple-app-site-association at:
https://example.com/.well-known/apple-app-site-association
Step 3: Add App Markup to Website
On web pages with app equivalents:
<head>
<!-- iOS -->
<meta name="apple-itunes-app" content="app-id=123456789, app-argument=https://example.com/product/123">
<!-- Android -->
<link rel="alternate" href="android-app://com.example.app/https/example.com/product/123">
</head>
Step 4: Connect in Search Console
- Open Google Search Console
- Go to Settings > Associations
- Add your app
- Verify ownership
Firebase App Indexing
Firebase provides a complete app indexing solution:
Setup
// Android
implementation 'com.google.firebase:firebase-appindexing:20.0.0'
Index App Content
// Index a product
val productIndex = Indexables.newSimple(
"Product Name",
"https://example.com/product/123"
)
FirebaseAppIndex.getInstance().update(productIndex)
Log User Actions
// Log when user views content
FirebaseUserActions.getInstance().start(
Actions.newView("Product Name", "https://example.com/product/123")
)
// End action when user leaves
FirebaseUserActions.getInstance().end(action)
Benefits of Firebase
- Automatic indexing suggestions
- Search quality insights
- Error reporting
- Install attribution
Deep Linking Best Practices
URL Structure
Mirror your website URLs in app:
| Web URL | App Deep Link |
|---|---|
| example.com/product/123 | myapp://product/123 |
| example.com/category/shoes | myapp://category/shoes |
| example.com/user/profile | myapp://user/profile |
Handle Missing Content
// Check if content exists
val productId = intent.data?.lastPathSegment
if (productId == null || !productExists(productId)) {
// Fallback to home or show error
openHomeScreen()
return
}
openProductScreen(productId)
Deferred Deep Linking
For users without the app installed:
// Firebase Dynamic Links
val dynamicLink = FirebaseDynamicLinks.getInstance()
.createDynamicLink()
.setLink(Uri.parse("https://example.com/product/123"))
.setDomainUriPrefix("https://example.page.link")
.setAndroidParameters(
DynamicLink.AndroidParameters.Builder()
.build()
)
.setIosParameters(
DynamicLink.IosParameters.Builder("com.example.app")
.build()
)
.buildDynamicLink()
Flow:
- User without app taps link
- Goes to app store
- Installs app
- Opens to intended content
Testing App Indexing
Android Debug Bridge
# Test deep link
adb shell am start -a android.intent.action.VIEW \
-d "https://example.com/product/123" \
com.example.app
Search Console URL Inspection
- Enter your website URL
- Check “Google app” section
- Verify app links are detected
Google App Preview
Search for your content on mobile:
- Look for “Open in app” option
- Test actual deep link opens correct screen
Fetch as Google
Use Search Console to fetch pages:
- Check app link detection
- Verify indexing status
Common App Indexing Issues
1. Links Not Verified
Problem: Google can’t verify domain ownership.
Fix:
- Check assetlinks.json is accessible
- Verify SHA256 fingerprint
- Ensure HTTPS
# Test assetlinks.json
curl https://example.com/.well-known/assetlinks.json
2. Intent Filter Errors
Problem: App not opening from search.
Fix:
<!-- Ensure autoVerify is true -->
<intent-filter android:autoVerify="true">
<!-- ... -->
</intent-filter>
3. Content Mismatch
Problem: Web and app content don’t match.
Fix:
- Use identical product IDs
- Same URL structure
- Sync content regularly
4. iOS Universal Links Failing
Common issues:
- Wrong Team ID in association file
- Association file not at root
- CDN caching old file
Fix:
- Verify Team ID matches
- Host at
/.well-known/ - Clear CDN cache
App Indexing SEO Tips
1. Ensure Content Parity
App and web should have:
- Same products/articles
- Same categories
- Same search functionality
2. Structure URLs Consistently
Web: example.com/product/blue-shoes-123
App: myapp://product/blue-shoes-123
3. Index Important Screens
Focus on:
- Product pages
- Category listings
- Article/content pages
- Location pages (local businesses)
4. Handle App-Only Content
For content only in app:
- Create web landing pages
- Use Firebase App Indexing API
- Submit URLs to Google
5. Monitor Performance
Track in Firebase/Search Console:
- Indexed pages
- Click-through to app
- Errors
- Coverage
App-Only Content in Search
When You Don’t Have a Website
You can still get app content indexed:
// Index app-only content
val content = Indexables.newSimple(
"Exclusive App Content",
"android-app://com.example.app/content/123"
)
// Set metadata
content.setDescription("Description of content")
content.setImage("https://example.com/image.jpg")
FirebaseAppIndex.getInstance().update(content)
App Actions
Enable voice search for your app:
<!-- actions.xml -->
<actions>
<action intentName="actions.intent.ORDER_MENU_ITEM">
<fulfillment urlTemplate="myapp://order?item={menuItem.name}">
<parameter-mapping urlParameter="menuItem.name"
intentParameter="menuItem.name" />
</fulfillment>
</action>
</actions>
Checklist
Setup
- Deep links implemented (Android/iOS)
- Domain verification files hosted
- App verified in Search Console
- Firebase App Indexing added (optional)
Content
- Web pages have app link markup
- URL structures match between web and app
- Important screens have deep links
- Content parity maintained
Testing
- Deep links tested with ADB/Safari
- Search Console shows app connection
- Search results show “Open in app”
- Deferred deep linking works
Monitoring
- Search Console app stats checked
- Firebase indexing reports reviewed
- Errors addressed promptly
- New content indexed regularly
Related Resources:
Tags:
Share this article:
Ready to improve your SEO?
Get a free SEO audit and see exactly what needs fixing on your site
Start Free Audit