Skip to content
Tolinku
Tolinku
Sign In Start Free
Marketing · · 7 min read

App Indexing for E-Commerce Apps

By Tolinku Staff
|
Tolinku seo app indexing dashboard screenshot for marketing blog posts

E-commerce apps have a natural advantage for app indexing: they have thousands of product pages, each with structured data, and users actively search for products on Google. When your product pages are indexed with app links, mobile shoppers can jump directly from a search result into your app's product page, where the buying experience is typically faster and converts better than the mobile web.

This guide covers the specific strategies for indexing e-commerce app content. For the general app indexing setup, see app indexing and SEO for mobile apps. For e-commerce deep linking strategies, see deep linking for e-commerce apps.

What to Index

Product Pages (Highest Priority)

Every product in your catalog should have:

  1. A web page at a clean URL (e.g., /products/blue-running-shoes).
  2. App Links / Universal Links handling for that URL.
  3. Structured data with Product schema.
  4. Alternate link tags pointing to the Android app.
<head>
  <title>Blue Running Shoes - YourApp</title>
  <link rel="canonical" href="https://www.yourapp.com/products/blue-running-shoes" />
  <link rel="alternate" href="android-app://com.yourapp/https/www.yourapp.com/products/blue-running-shoes" />
  <meta name="apple-itunes-app" content="app-id=YOUR_ID, app-argument=https://www.yourapp.com/products/blue-running-shoes">

  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "Product",
    "name": "Blue Running Shoes",
    "image": "https://www.yourapp.com/images/blue-running-shoes.jpg",
    "description": "Lightweight running shoes with responsive cushioning for road running",
    "brand": {"@type": "Brand", "name": "RunBrand"},
    "sku": "RB-BRS-001",
    "gtin13": "0012345678901",
    "offers": {
      "@type": "Offer",
      "url": "https://www.yourapp.com/products/blue-running-shoes",
      "priceCurrency": "USD",
      "price": "129.99",
      "availability": "https://schema.org/InStock",
      "seller": {"@type": "Organization", "name": "YourApp"}
    },
    "aggregateRating": {
      "@type": "AggregateRating",
      "ratingValue": "4.5",
      "reviewCount": "230"
    },
    "potentialAction": {
      "@type": "ViewAction",
      "target": "https://www.yourapp.com/products/blue-running-shoes"
    }
  }
  </script>
</head>

Category Pages (Medium Priority)

Category and collection pages help users discover products:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "CollectionPage",
  "name": "Running Shoes",
  "description": "Browse our collection of running shoes for road, trail, and track",
  "url": "https://www.yourapp.com/categories/running-shoes",
  "numberOfItems": 45,
  "potentialAction": {
    "@type": "ViewAction",
    "target": "https://www.yourapp.com/categories/running-shoes"
  }
}
</script>

Deal and Sale Pages (High Priority, Time-Sensitive)

Sale pages attract high-intent searches ("running shoes sale," "Black Friday deals"). Index them with time-sensitive structured data:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "OfferCatalog",
  "name": "Summer Sale",
  "description": "Up to 50% off running shoes and activewear",
  "url": "https://www.yourapp.com/sale/summer",
  "potentialAction": {
    "@type": "ViewAction",
    "target": "https://www.yourapp.com/sale/summer"
  }
}
</script>

Product Structured Data for Rich Results

Google supports product rich results that show price, availability, and ratings directly in the SERP. These require specific fields:

Required Fields

Field Example Purpose
name "Blue Running Shoes" Product title
image URL to product image Shows in rich result
offers.price "129.99" Displays price
offers.priceCurrency "USD" Currency code
offers.availability InStock/OutOfStock Stock status
Field Example Purpose
aggregateRating 4.5 stars Shows star rating
review Individual reviews May show review snippets
brand "RunBrand" Brand name in results
sku "RB-BRS-001" Product identifier
gtin "0012345678901" Universal product code

Product with Reviews

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Blue Running Shoes",
  "image": ["https://www.yourapp.com/images/shoes-front.jpg", "https://www.yourapp.com/images/shoes-side.jpg"],
  "brand": {"@type": "Brand", "name": "RunBrand"},
  "offers": {
    "@type": "Offer",
    "price": "129.99",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "priceValidUntil": "2026-12-31"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.5",
    "reviewCount": "230",
    "bestRating": "5"
  },
  "review": [
    {
      "@type": "Review",
      "author": {"@type": "Person", "name": "Alex M."},
      "datePublished": "2026-02-15",
      "reviewRating": {"@type": "Rating", "ratingValue": "5"},
      "reviewBody": "Best running shoes I have owned. Lightweight and comfortable."
    }
  ],
  "potentialAction": {
    "@type": "ViewAction",
    "target": "https://www.yourapp.com/products/blue-running-shoes"
  }
}
</script>

Sitemaps for Large Catalogs

E-commerce apps often have thousands of products. Generate sitemaps programmatically:

async function generateProductSitemap(products) {
  let xml = '<?xml version="1.0" encoding="UTF-8"?>\n';
  xml += '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"\n';
  xml += '        xmlns:xhtml="http://www.w3.org/1999/xhtml"\n';
  xml += '        xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">\n';

  for (const product of products) {
    xml += '  <url>\n';
    xml += `    <loc>https://www.yourapp.com/products/${product.slug}</loc>\n`;
    xml += `    <lastmod>${product.updatedAt}</lastmod>\n`;
    xml += `    <changefreq>daily</changefreq>\n`;
    xml += `    <priority>0.8</priority>\n`;
    xml += `    <xhtml:link rel="alternate" href="android-app://com.yourapp/https/www.yourapp.com/products/${product.slug}" />\n`;

    if (product.imageUrl) {
      xml += '    <image:image>\n';
      xml += `      <image:loc>${product.imageUrl}</image:loc>\n`;
      xml += `      <image:title>${escapeXml(product.name)}</image:title>\n`;
      xml += '    </image:image>\n';
    }

    xml += '  </url>\n';
  }

  xml += '</urlset>';
  return xml;
}

Sitemap Index

For catalogs with over 50,000 products, use a sitemap index:

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://www.yourapp.com/sitemaps/products-1.xml</loc>
    <lastmod>2026-06-17</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://www.yourapp.com/sitemaps/products-2.xml</loc>
    <lastmod>2026-06-17</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://www.yourapp.com/sitemaps/categories.xml</loc>
    <lastmod>2026-06-17</lastmod>
  </sitemap>
</sitemapindex>

Your app must handle every product URL correctly:

class ProductActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val uri = intent.data ?: run {
            showHomePage()
            return
        }

        val productSlug = uri.lastPathSegment ?: run {
            showProductListing()
            return
        }

        // Load product by slug
        viewModel.loadProduct(productSlug)
    }
}

Handling Out-of-Stock and Removed Products

When a user opens a deep link to a product that no longer exists:

  1. Show a helpful fallback (similar products, category page), not a blank screen or error.
  2. Track the 404 in your analytics to identify broken deep links.
  3. On the web side, return a 410 (Gone) HTTP status for permanently removed products so Google removes them from the index.
viewModel.loadProduct(productSlug).observe(this) { result ->
    when (result) {
        is Success -> showProduct(result.product)
        is NotFound -> showSimilarProducts(productSlug)
        is Error -> showCategory()
    }
}

Measuring E-Commerce App Indexing

Search-to-Purchase Funnel

Track the complete funnel:

Google search impression
  → Click (Search Console)
    → App open via deep link (app analytics)
      → Product view (app analytics)
        → Add to cart (app analytics)
          → Purchase (app analytics + revenue tracking)

Attribution

Attribute purchases to search traffic using UTM parameters preserved through the deep link:

Search result → https://www.yourapp.com/products/shoes?utm_source=google&utm_medium=organic
  → App opens with these parameters
    → Track: purchase attributed to "google / organic"

Tolinku E-Commerce Integration

Tolinku handles deep link routing for e-commerce product URLs. Configure routes like /products/:slug in the Tolinku dashboard and Tolinku handles App Links verification, Universal Links hosting, and fallback routing for users without the app.

For e-commerce deep linking strategies, see deep linking for e-commerce apps. For app content search visibility, see app content in search results.

Get deep linking tips in your inbox

One email per week. No spam.

Ready to add deep linking to your app?

Set up Universal Links, App Links, deferred deep linking, and analytics in minutes. Free to start.