Deeplinkly

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-search indexing and on-device indexing are separate systems with separate requirements.
Web result that opens the appOn-device index
Where the result appearsGoogle, Bing, an AI answer engineSpotlight, Siri, Android device search
What gets indexedYour web pageApp content, from the app
PrerequisiteA crawlable URL for the contentThe app installed and run
MechanismVerified App Link / Universal LinkNSUserActivity, CoreSpotlight, AppSearch
Works before installYesNo
Helps organic acquisitionYesOnly 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.

What is dead, and what replaced it
<!-- 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.

Which signal does which job on the web side.
SignalJobStill supported
Crawlable HTML at a canonical URLGets the content into the indexRequired
assetlinks.json + AASAMakes the result open in the appRequired
schema.org markup on the pageEarns the richer resultYes
apple-itunes-app meta tagBanner, and the Apple listing associationYes
android-app:// sitemap annotationFed the retired app indexNo
Firebase App Indexing SDKSubmitted app content to GoogleNo

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.

Indexing a screen the user actually visited
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 bannerA 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 LinkAn 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 LinkA 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 conversionWeb-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 linkTesting 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.