{"id":1422,"date":"2026-06-12T09:00:00","date_gmt":"2026-06-12T14:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=1422"},"modified":"2026-03-07T03:49:13","modified_gmt":"2026-03-07T08:49:13","slug":"google-app-indexing-setup","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/google-app-indexing-setup\/","title":{"rendered":"Google App Indexing: Setup and Configuration"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Google App Indexing lets your app content appear directly in Google Search results. When a user searches for something your app contains, Google can show a link that opens the app directly to that content, or prompt installation if the app is not installed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is not just an SEO tactic. It is a user acquisition and re-engagement channel. Users who find your content through search and land directly in your app skip the browser entirely, resulting in higher engagement and better conversion rates.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide covers the full setup process: <a href=\"https:\/\/developers.google.com\/digital-asset-links\/v1\/getting-started\" rel=\"nofollow noopener\" target=\"_blank\">Digital Asset Links<\/a> verification, deep link handling, content indexing, and Search Console validation. For the broader app indexing strategy, see <a href=\"https:\/\/tolinku.com\/blog\/app-indexing-seo-mobile-apps\/\">app indexing and SEO for mobile apps<\/a>. For Android App Links implementation, see the <a href=\"https:\/\/tolinku.com\/blog\/android-app-links-complete-guide\/\">Android App Links guide<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How Google App Indexing Works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Google App Indexing connects your web content to your app content through deep links. The flow works like this:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Google crawls your website and finds deep links (App Links or custom scheme URLs).<\/li>\n<li>Google verifies that your app handles those URLs via <a href=\"https:\/\/developers.google.com\/digital-asset-links\/v1\/getting-started\" rel=\"nofollow noopener\" target=\"_blank\">Digital Asset Links<\/a>.<\/li>\n<li>When a user on an Android device searches for content that matches your indexed pages, Google shows an &quot;Open in app&quot; button or directly opens the app.<\/li>\n<li>If the user does not have the app installed, Google may show an install prompt alongside the search result.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">There are two types of app indexing:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>HTTP deep links (App Links):<\/strong> Your app handles <code>https:\/\/<\/code> URLs that match your website. This is the preferred method because it uses the same URLs as your website.<\/li>\n<li><strong>Custom scheme deep links:<\/strong> Your app handles URLs like <code>yourapp:\/\/products\/123<\/code>. These are less preferred because they require explicit annotation in your web pages.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before setting up app indexing, you need:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>A website with indexable content.<\/strong> Google needs web pages to crawl. Each page that you want indexed in-app must have a corresponding web URL.<\/li>\n<li><strong>An Android app with deep link handling.<\/strong> Your app must handle incoming URLs and route them to the correct content.<\/li>\n<li><strong>Digital Asset Links verification.<\/strong> Your website must host an <code>assetlinks.json<\/code> file that declares your app as a handler for your domain.<\/li>\n<li><strong>Google Search Console access.<\/strong> You need access to verify and monitor your app indexing status.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Set Up Android App Links<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Android App Links are the foundation of Google App Indexing. They tell Android (and Google) that your app can handle specific HTTPS URLs.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Add Intent Filters<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In your <code>AndroidManifest.xml<\/code>, add intent filters for the URLs your app handles:<\/p>\n\n\n\n<pre><code class=\"language-xml\">&lt;activity android:name=&quot;.ProductActivity&quot;\n    android:exported=&quot;true&quot;&gt;\n    &lt;intent-filter android:autoVerify=&quot;true&quot;&gt;\n        &lt;action android:name=&quot;android.intent.action.VIEW&quot; \/&gt;\n        &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\n        &lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; \/&gt;\n        &lt;data\n            android:scheme=&quot;https&quot;\n            android:host=&quot;www.yourapp.com&quot;\n            android:pathPrefix=&quot;\/products&quot; \/&gt;\n    &lt;\/intent-filter&gt;\n&lt;\/activity&gt;\n\n&lt;activity android:name=&quot;.ArticleActivity&quot;\n    android:exported=&quot;true&quot;&gt;\n    &lt;intent-filter android:autoVerify=&quot;true&quot;&gt;\n        &lt;action android:name=&quot;android.intent.action.VIEW&quot; \/&gt;\n        &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; \/&gt;\n        &lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; \/&gt;\n        &lt;data\n            android:scheme=&quot;https&quot;\n            android:host=&quot;www.yourapp.com&quot;\n            android:pathPrefix=&quot;\/articles&quot; \/&gt;\n    &lt;\/intent-filter&gt;\n&lt;\/activity&gt;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>android:autoVerify=&quot;true&quot;<\/code> attribute tells Android to verify your app&#39;s ownership of these URLs using Digital Asset Links.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Handle Incoming Deep Links<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In each Activity, extract the URL and route to the correct content:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">class ProductActivity : AppCompatActivity() {\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n\n        val uri = intent.data ?: return\n        val productId = uri.lastPathSegment ?: return\n\n        \/\/ Load the product\n        loadProduct(productId)\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Host Digital Asset Links<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create the <code>assetlinks.json<\/code> file and host it at <code>https:\/\/www.yourapp.com\/.well-known\/assetlinks.json<\/code>:<\/p>\n\n\n\n<pre><code class=\"language-json\">[\n  {\n    &quot;relation&quot;: [&quot;delegate_permission\/common.handle_all_urls&quot;],\n    &quot;target&quot;: {\n      &quot;namespace&quot;: &quot;android_app&quot;,\n      &quot;package_name&quot;: &quot;com.yourapp.android&quot;,\n      &quot;sha256_cert_fingerprints&quot;: [\n        &quot;AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99&quot;\n      ]\n    }\n  }\n]\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Get Your SHA-256 Fingerprint<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For your debug keystore:<\/p>\n\n\n\n<pre><code class=\"language-bash\">keytool -list -v -keystore ~\/.android\/debug.keystore -alias androiddebugkey -storepass android -keypass android\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For your release keystore:<\/p>\n\n\n\n<pre><code class=\"language-bash\">keytool -list -v -keystore your-release-key.keystore\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If you use <a href=\"https:\/\/developer.android.com\/studio\/publish\/app-signing\" rel=\"nofollow noopener\" target=\"_blank\">Google Play App Signing<\/a>, get the SHA-256 fingerprint from the Google Play Console under Setup &gt; App signing.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verify the File<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">After hosting the file, verify it with Google&#39;s tool:<\/p>\n\n\n\n<pre><code class=\"language-bash\">curl -s &quot;https:\/\/digitalassetlinks.googleapis.com\/v1\/statements:list?source.web.site=https:\/\/www.yourapp.com&amp;relation=delegate_permission\/common.handle_all_urls&quot; | python3 -m json.tool\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The response should include your app&#39;s package name and fingerprint.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/tolinku.com\/docs\/developer\/app-links\/\">Tolinku<\/a> automatically generates and hosts the <code>assetlinks.json<\/code> file for your custom deep link domain based on your Appspace&#39;s Android configuration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Add Web Markup<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For Google to connect your web pages to your app content, add <code>link<\/code> elements to your HTML pages:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Option A: App Links Meta Tags<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If your web URLs and app URLs use the same structure (recommended):<\/p>\n\n\n\n<pre><code class=\"language-html\">&lt;head&gt;\n  &lt;!-- Android App Link --&gt;\n  &lt;link rel=&quot;alternate&quot; href=&quot;android-app:\/\/com.yourapp.android\/https\/www.yourapp.com\/products\/123&quot; \/&gt;\n&lt;\/head&gt;\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Option B: Schema.org Markup<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Add <a href=\"https:\/\/developers.google.com\/search\/docs\/appearance\/structured-data\/intro-structured-data\" rel=\"nofollow noopener\" target=\"_blank\">structured data<\/a> to your pages:<\/p>\n\n\n\n<pre><code class=\"language-html\">&lt;script type=&quot;application\/ld+json&quot;&gt;\n{\n  &quot;@context&quot;: &quot;https:\/\/schema.org&quot;,\n  &quot;@type&quot;: &quot;Product&quot;,\n  &quot;name&quot;: &quot;Product Name&quot;,\n  &quot;url&quot;: &quot;https:\/\/www.yourapp.com\/products\/123&quot;,\n  &quot;potentialAction&quot;: {\n    &quot;@type&quot;: &quot;ViewAction&quot;,\n    &quot;target&quot;: [\n      &quot;https:\/\/www.yourapp.com\/products\/123&quot;,\n      &quot;android-app:\/\/com.yourapp.android\/https\/www.yourapp.com\/products\/123&quot;\n    ]\n  }\n}\n&lt;\/script&gt;\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Option C: Sitemap<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Add app deep links to your <a href=\"https:\/\/developers.google.com\/search\/docs\/crawling-indexing\/sitemaps\/build-sitemap\" rel=\"nofollow noopener\" target=\"_blank\">XML sitemap<\/a>:<\/p>\n\n\n\n<pre><code class=\"language-xml\">&lt;urlset xmlns=&quot;http:\/\/www.sitemaps.org\/schemas\/sitemap\/0.9&quot;\n        xmlns:xhtml=&quot;http:\/\/www.w3.org\/1999\/xhtml&quot;&gt;\n  &lt;url&gt;\n    &lt;loc&gt;https:\/\/www.yourapp.com\/products\/123&lt;\/loc&gt;\n    &lt;xhtml:link rel=&quot;alternate&quot;\n                href=&quot;android-app:\/\/com.yourapp.android\/https\/www.yourapp.com\/products\/123&quot; \/&gt;\n  &lt;\/url&gt;\n&lt;\/urlset&gt;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Test App Indexing<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Test with adb<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Verify that your app handles deep links correctly:<\/p>\n\n\n\n<pre><code class=\"language-bash\"># Test a deep link\nadb shell am start -a android.intent.action.VIEW \\\n  -d &quot;https:\/\/www.yourapp.com\/products\/123&quot; \\\n  com.yourapp.android\n\n# Verify App Links\nadb shell pm verify-app-links --re-verify com.yourapp.android\nadb shell pm get-app-links com.yourapp.android\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Test with Google&#39;s URL Testing Tool<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use the <a href=\"https:\/\/search.google.com\/search-console\/about\" rel=\"nofollow noopener\" target=\"_blank\">URL Inspection tool<\/a> in Google Search Console to test specific URLs. It shows whether Google can find your app link annotations and whether the page is eligible for app indexing.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Test with the App Indexing API (Optional)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Google provides an <a href=\"https:\/\/developers.google.com\/app-indexing\" rel=\"nofollow noopener\" target=\"_blank\">App Indexing API<\/a> that lets you proactively report viewed content from your app. This is optional but can help Google discover new content faster:<\/p>\n\n\n\n<pre><code class=\"language-kotlin\">import com.google.firebase.appindexing.FirebaseAppIndex\nimport com.google.firebase.appindexing.Indexable\n\nclass ProductActivity : AppCompatActivity() {\n    override fun onStart() {\n        super.onStart()\n\n        val url = &quot;https:\/\/www.yourapp.com\/products\/$productId&quot;\n        val indexable = Indexable.Builder()\n            .setName(productName)\n            .setUrl(url)\n            .build()\n\n        FirebaseAppIndex.getInstance(this).update(indexable)\n    }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Monitor in Search Console<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Link Your App<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In <a href=\"https:\/\/search.google.com\/search-console\" rel=\"nofollow noopener\" target=\"_blank\">Google Search Console<\/a>:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go to your website property.<\/li>\n<li>Navigate to Settings &gt; Associations.<\/li>\n<li>Add your Android app (by package name).<\/li>\n<li>Verify ownership via the Google Play Console.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Check Indexing Status<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">After linking, check:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Coverage report:<\/strong> Shows which of your app-linked pages are indexed.<\/li>\n<li><strong>Enhancement report:<\/strong> Shows app indexing-specific issues (missing <code>assetlinks.json<\/code>, broken deep links).<\/li>\n<li><strong>Performance report:<\/strong> Filter by &quot;App&quot; to see clicks and impressions from app results.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Common Issues<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Issue<\/th>\n<th>Cause<\/th>\n<th>Fix<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>&quot;App not verified&quot;<\/td>\n<td><code>assetlinks.json<\/code> not found or incorrect<\/td>\n<td>Verify file is served at correct URL with correct content<\/td>\n<\/tr>\n<tr>\n<td>&quot;Deep link not handled&quot;<\/td>\n<td>App does not have intent filter for the URL<\/td>\n<td>Add matching intent filter in <code>AndroidManifest.xml<\/code><\/td>\n<\/tr>\n<tr>\n<td>&quot;Page not indexed&quot;<\/td>\n<td>Google has not crawled the page yet<\/td>\n<td>Submit URL in Search Console, wait for crawl<\/td>\n<\/tr>\n<tr>\n<td>&quot;Soft 404&quot;<\/td>\n<td>Page returns 200 but has no meaningful content<\/td>\n<td>Ensure pages have real content, not empty shells<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Best Practices<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">URL Structure<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use the same URL structure for your website and app. If your website has <code>https:\/\/www.yourapp.com\/products\/123<\/code>, your app should handle that exact URL. This eliminates the need for complex URL mapping.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Canonical URLs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ensure your web pages have proper <a href=\"https:\/\/developers.google.com\/search\/docs\/crawling-indexing\/canonicalization\" rel=\"nofollow noopener\" target=\"_blank\">canonical tags<\/a>. Google uses canonical URLs when associating web content with app content. If your canonicals point elsewhere, app indexing may not work.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Content Parity<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Google expects your app content to match your web content. If a user clicks an app-indexed result and the app shows different content than the web page, Google may demote or remove the app result.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Deep Link Every Indexable Page<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every web page that you want indexed in-app needs a corresponding deep link. If you have 10,000 product pages on your website but only handle deep links for 100 products, only those 100 are eligible for app indexing.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tolinku and App Indexing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/tolinku.com\/features\/deep-linking\">Tolinku<\/a> handles the infrastructure side of app indexing: hosting the <code>assetlinks.json<\/code> file, managing your custom domain, and routing deep links to the correct in-app content. Configure your routes in the <a href=\"https:\/\/tolinku.com\/docs\/developer\/app-links\/\">Tolinku dashboard<\/a> and Tolinku serves the verification files automatically.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For iOS indexing, see <a href=\"https:\/\/tolinku.com\/blog\/apple-spotlight-indexing\/\">Apple Spotlight indexing<\/a>. For the broader app indexing strategy, see <a href=\"https:\/\/tolinku.com\/blog\/app-indexing-seo-mobile-apps\/\">app indexing and SEO for mobile apps<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Set up Google App Indexing to surface your app content in search results. Configure Digital Asset Links, implement deep link handling, test indexing, and verify in Search Console.<\/p>\n","protected":false},"author":2,"featured_media":1421,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"Google App Indexing: Setup and Configuration","rank_math_description":"Set up Google App Indexing to surface your app in search. Configure Digital Asset Links, test indexing, and verify in Search Console.","rank_math_focus_keyword":"Google App Indexing","rank_math_canonical_url":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-google-app-indexing-setup.png","rank_math_facebook_image_id":"","rank_math_twitter_title":"","rank_math_twitter_description":"","rank_math_twitter_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-google-app-indexing-setup.png","footnotes":""},"categories":[16],"tags":[25,64,20,354,69,355,63,72],"class_list":["post-1422","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-marketing","tag-android","tag-app-indexing","tag-deep-linking","tag-google-search","tag-mobile-development","tag-search-console","tag-seo","tag-tutorial"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1422","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/comments?post=1422"}],"version-history":[{"count":4,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1422\/revisions"}],"predecessor-version":[{"id":2598,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1422\/revisions\/2598"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/1421"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=1422"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=1422"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=1422"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}