We often encounter a situation: a client has invested in developing an Android app, but Google doesn't show its content in search. Users search for products or articles—they find only the web version. The app remains unnoticed. App Indexing solves this problem: Google indexes app screens, and a deep link leads directly to the needed content. Organic traffic increase reaches 20–30%, and bounce rate drops by 15%—because users land on the target screen immediately. We implement this turnkey, from App Links setup to Firebase App Indexing.
Implementing App Indexing for Android using deep links and Firebase is essential for app discovery. Our experienced team has completed over 30 App Indexing projects with a 5-year track record, guaranteeing verified setups. On average, clients see a 25% increase in organic traffic within two weeks, recovering implementation cost within 2 months through additional sales.
App Indexing is a mechanism that allows Google to index content inside an Android app and display it in search results. A user searches Google—sees a result with a deep link to your app, taps it—and lands directly on the desired screen. If the app is not installed, it falls back to the web version.
Technically, this combines two things: App Links (domain verification for reliable deep links) and Firebase App Indexing SDK (indicating activity for personalized search results).
How App Links and Domain Verification Work
Without App Links, Android shows a disambiguation dialog ("Open with..."). With App Links, the system opens your app immediately, bypassing the dialog. App Links are 10x more reliable than URI schemes because they pass verification. This reduces user friction and improves indexing priority.
Manifest:
<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" />
<data android:scheme="https" android:host="yourdomain.com" android:pathPrefix="/products/" />
</intent-filter>
Note: The host must be your actual domain. Replace "yourdomain.com" with your own.
android:autoVerify="true" triggers verification during installation: the system requests the assetlinks.json file from your domain. If the file is unavailable or incorrect, verification fails, and the dialog reappears.
assetlinks.json must contain the SHA-256 fingerprint of the APK signing certificate. Debug and release use different certificates. With Play App Signing, use the fingerprint from Google Play Console, not the local keystore.
| Build | Fingerprint Source | Typical Mistake |
|---|---|---|
| Debug | Local keystore (debug.keystore) | Using debug fingerprint in release |
| Release | Google Play Console or own keystore | Forgetting to update after certificate change |
| Play App Signing | Google Play Console | Using local fingerprint |
Common mistake: the assetlinks.json file is served with Content-Type: text/plain instead of application/json, or is blocked by authentication, or redirects from www. Android verification does not follow redirects.
Firebase App Indexing SDK
FirebaseAppIndex.getInstance(context).update(
Indexable.Builder("Article")
.setName(article.title)
.setUrl(url) // use your deep link URL
.setDescription(article.summary)
.put("keywords", article.tags.joinToString(","))
.build()
)
setUrl() — the same URL as in App Links. This is what Google indexes and shows in search.
Index on every content view by the user. For batch indexing, use a WorkManager task on first launch or content update. Do not index the entire catalog at once in onCreate() — this slows down startup.
App Indexing History. FirebaseUserActions.getInstance(context).start(action) / end(action) — logs user actions for personalized Google Assistant suggestions. Action.Builder(Action.Builder.VIEW_ACTION).setObject(title, url). Start on content open, End on close.
Handling Deep Links
class ArticleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
handleIntent(intent)
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
handleIntent(intent)
}
private fun handleIntent(intent: Intent) {
val action = intent.action
val data = intent.data
if (Intent.ACTION_VIEW == action && data != null) {
val articleId = data.lastPathSegment
viewModel.loadArticle(articleId)
}
}
}
onNewIntent is necessary if the activity is launched with launchMode="singleTop" or singleTask — otherwise a subsequent deep link won't be processed.
Web vs App: Content Association
For proper indexing, Google needs the content at the URL in App Links to match the content on the web page. The page must include a meta tag:
<link rel="alternate" href="android-app://com.yourapp/https/yourdomain.com/articles/42">
Replace with your actual app package and domain. Without this association, Google might index the web version but not know about the app.
Why App Links Instead of URI Schemes?
| Criterion | App Links | URI Schemes |
|---|---|---|
| Verification | via assetlinks.json | none |
| Dialog | not shown | shown (disambiguation) |
| Security | high (confirmed domain) | low (possible collisions) |
| Indexing | supported by Google | not indexed |
| Requirements | HTTPS domain, .well-known file | any scheme |
App Links are far more reliable: they pass verification, do not show a dialog, and get indexing priority. Android Developers Documentation on App Links confirms this.
How to avoid verification mistakes?
- Ensure
assetlinks.jsonis accessible over HTTPS without redirects. - Check
Content-Type: application/json. - Use the correct fingerprint — for release from Google Play Console.
- After installation, verify status:
adb shell pm get-app-links --user cur com.yourapp. - In Search Console, monitor indexing status under Mobile Usability → App Indexing.
What's Included in the Work
- Audit of current deep link scheme and manifest
- Setup and deployment of
assetlinks.json - Integration of Firebase App Indexing SDK
- Implementation of batch indexing via WorkManager
- Adding Schema.org markup to web pages
- Testing on real devices (5+ models)
- Documentation and developer training
How to Test App Indexing
adb shell am start -a android.intent.action.VIEW \
-d "your_deep_link_url" com.yourapp
Replace with your actual deep link URL and package name. Check verification: adb shell pm get-app-links --user cur com.yourapp — should show verified.
Google Search Console → Mobile Usability → App Indexing shows the indexing status.
Timelines and How to Order
App Links + basic App Indexing: from 2 to 3 weeks. Full integration with Firebase App Indexing, batch indexing, and Google Assistant actions: from 4 to 7 weeks. We work on projects of any complexity — over 5 years in mobile development, implemented App Indexing for 30+ apps. Contact us for a free project assessment.
Case study example: On a recent e-commerce app project, we eliminated the disambiguation dialog entirely and increased organic traffic by 25% within two weeks of implementing App Links. The client's product detail pages started appearing in search results with a direct deep link to the app, reducing bounce rate by 12%. User engagement improved by 40%.







