Glossary/Metrics and growth
App indexing
Definition
App indexing is the practice of making app content discoverable through search, either by indexing the equivalent web page so its result opens in the app via a verified link, or by submitting that content to the device's own search index.
Almost everything written about app indexing describes a system that no longer exists. Google's App Indexing programme shipped in 2015, moved under Firebase, and was deprecated along with the android-app:// sitemap annotation that fed it — there is no separate app index to submit to any more. What survives are two unrelated mechanisms that both get called app indexing, and conflating them is why teams add markup that does nothing.
The two things called app indexing
| Web result that opens the app | On-device index | |
|---|---|---|
| Where the result appears | Google, Bing, an AI answer engine | Spotlight, Siri, Android device search |
| What gets indexed | Your web page | App content, from the app |
| Prerequisite | A crawlable URL for the content | The app installed and run |
| Mechanism | Verified App Link / Universal Link | NSUserActivity, CoreSpotlight, AppSearch |
| Works before install | Yes | No |
| Helps organic acquisition | Yes | Only re-engagement |
The distinction that matters commercially is the last two rows. Only the web side can bring you a user who does not have the app, because only the web side has something for a crawler to fetch. On-device indexing is a retention surface: it makes content the user has already seen findable again without opening your app first.
An app-only screen cannot be indexed by anyone
If a piece of content has no URL that returns HTML to an anonymous request, no search engine and no answer engine can index it — there is nothing to crawl. Shipping deep links for those screens makes them *routable*, not *discoverable*. Indexability is a property of the web page, and the deep link only decides where the click lands.
The web side: index the page, let the link do the routing
The working model is unglamorous. Publish the content at a real URL, mark it up so it can earn a rich result, and verify your domain for App Links and Universal Links. Google Search on Android hands a verified App Link to the app when the user has it installed and to the browser when they do not — with no app-specific submission, sitemap annotation or SDK involved.
<!-- RETIRED. The android-app:// sitemap annotation fed Google's
App Indexing programme. It is no longer supported and adds
nothing to a sitemap today. Delete it if you still ship it. -->
<url>
<loc>https://example.com/product/42</loc>
<xhtml:link rel="alternate"
href="android-app://com.example.app/https/example.com/product/42" />
</url>
<!-- CURRENT. An ordinary sitemap entry. The app association is
declared out-of-band in assetlinks.json and the AASA file,
not per-URL in the sitemap. -->
<url>
<loc>https://example.com/product/42</loc>
<lastmod>2026-09-11</lastmod>
</url>
<!-- iOS: the banner is also the signal Applebot reads to connect
this page to your App Store listing. -->
<meta name="apple-itunes-app"
content="app-id=123456789, app-argument=https://example.com/product/42">The apple-itunes-app meta tag does double duty: it renders a Smart App Banner and it associates the page with your App Store listing for Apple's crawler. The app-argument is the URL your app receives when the banner is tapped, so it should be the same canonical URL as loc rather than a bare homepage — a mismatch here is a common cause of a banner that opens the app on the wrong screen.
| Signal | Job | Still supported |
|---|---|---|
| Crawlable HTML at a canonical URL | Gets the content into the index | Required |
assetlinks.json + AASA | Makes the result open in the app | Required |
| schema.org markup on the page | Earns the richer result | Yes |
apple-itunes-app meta tag | Banner, and the Apple listing association | Yes |
android-app:// sitemap annotation | Fed the retired app index | No |
| Firebase App Indexing SDK | Submitted app content to Google | No |
The device side: submitting content to Spotlight
On-device indexing is a live, supported API on both platforms and is worth doing for a content-heavy app. On iOS it is NSUserActivity for things the user visited and CoreSpotlight for a bulk catalogue; the important detail is that the activity must carry the same URL your Universal Link uses, so that a Spotlight result and a search result route through one code path.
import CoreSpotlight
import MobileCoreServices
func indexProduct(id: String, name: String, summary: String) {
let attributes = CSSearchableItemAttributeSet(itemContentType: "public.url")
attributes.title = name
attributes.contentDescription = summary
let activity = NSUserActivity(activityType: "com.example.app.viewProduct")
activity.title = name
// The same canonical URL the Universal Link uses. This is what
// lets one router handle a Spotlight tap and a web link tap.
activity.webpageURL = URL(string: "https://example.com/product/\(id)")
activity.contentAttributeSet = attributes
activity.isEligibleForSearch = true // this device's index
activity.isEligibleForHandoff = false
// Only set this if the content is genuinely public — it makes
// the item a candidate for Apple's server-side index.
activity.isEligibleForPublicIndexing = true
activity.becomeCurrent()
}isEligibleForPublicIndexing is not a shortcut to web search
It makes the item a candidate for Apple's index, which surfaces in Siri Suggestions and Spotlight across devices. It has no effect on Google, Bing or any answer engine, and it will not index content that is behind a login. Treat it as a bonus on top of a page that is already crawlable, never as a substitute for one.
The practical failure mode on the device side is routing, not indexing. A Spotlight result hands your app an NSUserActivity rather than a URL open, so an app whose deep link handling lives only in the URL callback receives the activity and does nothing. Both entry points need to converge on the same router — the same requirement that makes how to test a deep link worth running for every surface rather than once for the browser.
For measurement, neither side gives you campaign attribution. An indexed result is organic by definition: there is no click identifier in a search result that opens your app, so the install shows up with no source unless the landing page attaches one. If organic app-opens matter to your reporting, tag the canonical URL's own query parameters server-side and treat the result as a channel rather than a campaign — see why installs go unattributed for the wider version of this problem.
Deep link debugger
An indexed result is only useful if the link behind it resolves to the app. Paste a canonical URL and the debugger shows the redirect chain, whether the domain is verified on both platforms, and where the click would actually land.
Open the deep link debugger →Frequently asked questions
- What is app indexing?
- App indexing is making content inside an app discoverable through search. In practice it means two separate things: indexing the equivalent web page so that its search result opens in the app through a verified App Link or Universal Link, and submitting content to the device's own search index through APIs like NSUserActivity, CoreSpotlight and AppSearch so it appears in Spotlight or device search.
- Is Google App Indexing still supported?
- No. The programme launched in 2015, moved under Firebase App Indexing, and was deprecated along with the android-app:// sitemap annotation it relied on. There is no separate app index to submit to. The replacement is ordinary web indexing plus domain verification: index the page, and let the verified App Link decide whether the result opens in your app or the browser.
- Do I still need the android-app:// annotation in my sitemap?
- No, and it can be removed. That xhtml:link alternate annotation existed to connect a web URL to an app URI for Google's retired app index. The association is now declared out-of-band in assetlinks.json on Android and the apple-app-site-association file on iOS, which apply to the whole domain rather than being repeated per sitemap entry.
- Can app-only content be indexed if it has no web page?
- No. A crawler can only index something it can fetch, so content with no URL returning HTML to an anonymous request cannot appear in any search engine or answer engine. Deep links make such screens routable once the user arrives, but discoverability is a property of the web page. On-device indexing can surface that content in Spotlight, but only after the user has installed and run the app.
- Does app indexing help acquisition or retention?
- The web side helps acquisition, because a crawlable page can reach someone who does not have the app and the verified link converts that visit into an app open or an install. On-device indexing helps retention only — it requires the app to be installed and to have already indexed the content, so it makes existing content easier to return to rather than bringing in new users.
Related terms
- Smart app banner — A smart app banner is a native promotional bar that Safari on iOS renders at the top of a web page when the page declares an `apple-itunes-app` meta tag, offering to open or install the associated app.
- Android App Link — An Android App Link is an HTTPS URL that opens an Android app directly, without a chooser dialog, because the system has verified through a file on the domain that the app is authorised to handle it.
- Universal Link — A Universal Link is a standard HTTPS URL that opens an iOS app directly when that app is installed and the domain has authorised it, and loads the equivalent web page when it is not.
- Web-to-app conversion — Web-to-app conversion is the process of moving a mobile web visitor into a native app, ideally landing them on the same content they were viewing rather than on a generic home screen.
- Testing a deep link — Testing a deep link means verifying three separate things — that the operating system routes the URL to the app, that the app receives it, and that the app navigates to the right screen — each of which can pass while the others fail.