Shopify is one of the most popular e-commerce platforms, and proper schema markup can significantly boost your product visibility in Google search. This guide covers everything you need to know about implementing structured data on Shopify.

Shopify’s Built-in Schema

Good news: Shopify themes include basic schema markup out of the box.

Default Schema Types

Most Shopify themes include:

  • Product schema - Basic product information
  • Organization schema - Store details
  • BreadcrumbList schema - Navigation paths
  • WebSite schema - Site information

Checking Your Current Schema

  1. Visit any product page on your store
  2. Right-click → View Page Source
  3. Search for “application/ld+json”
  4. Or use Rich Results Test

Enhancing Shopify Schema

While built-in schema is good, you can enhance it for better rich results.

What’s Often Missing

  • Complete review/rating data
  • Brand information
  • GTIN/SKU identifiers
  • Detailed offers
  • FAQ schema
  • Collection page schema

Method 1: Shopify Apps

JSON-LD for SEO

Features:

  • Auto-generates comprehensive schema
  • Product, Collection, Blog, Article
  • FAQ and HowTo schema
  • Local Business support

Setup:

  1. Install from Shopify App Store
  2. Configure store settings
  3. App automatically adds schema

Smart SEO

Features:

  • Schema markup automation
  • Meta tag optimization
  • Sitemap enhancement

SEO Manager

Features:

  • Multiple schema types
  • Visual schema builder
  • Integration with theme

Method 2: Theme Customization

Edit your theme to enhance schema:

Editing theme.liquid

  1. Go to Online Store → Themes
  2. Click Actions → Edit Code
  3. Open theme.liquid
  4. Add schema before </head>

Adding Organization Schema

{% if template == 'index' %}
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "{{ shop.name }}",
  "url": "{{ shop.url }}",
  "logo": "{{ settings.logo | img_url: 'master' }}",
  "sameAs": [
    "{{ settings.social_facebook_link }}",
    "{{ settings.social_twitter_link }}",
    "{{ settings.social_instagram_link }}"
  ],
  "contactPoint": {
    "@type": "ContactPoint",
    "telephone": "{{ settings.phone_number }}",
    "contactType": "customer service"
  }
}
</script>
{% endif %}

Enhancing Product Schema

Edit product.liquid or your product template:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "{{ product.title | escape }}",
  "description": "{{ product.description | strip_html | escape }}",
  "image": [
    {% for image in product.images limit: 3 %}
    "{{ image | img_url: 'master' }}"{% unless forloop.last %},{% endunless %}
    {% endfor %}
  ],
  "sku": "{{ product.selected_or_first_available_variant.sku }}",
  "brand": {
    "@type": "Brand",
    "name": "{{ product.vendor | escape }}"
  },
  "offers": {
    "@type": "Offer",
    "url": "{{ shop.url }}{{ product.url }}",
    "priceCurrency": "{{ shop.currency }}",
    "price": "{{ product.selected_or_first_available_variant.price | money_without_currency | remove: ',' }}",
    "availability": "{% if product.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}",
    "seller": {
      "@type": "Organization",
      "name": "{{ shop.name }}"
    }
  }
  {% if product.metafields.reviews.rating %}
  ,"aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "{{ product.metafields.reviews.rating.value }}",
    "reviewCount": "{{ product.metafields.reviews.count.value }}"
  }
  {% endif %}
}
</script>

Adding Breadcrumb Schema

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Home",
      "item": "{{ shop.url }}"
    }
    {% if collection %}
    ,{
      "@type": "ListItem",
      "position": 2,
      "name": "{{ collection.title | escape }}",
      "item": "{{ shop.url }}{{ collection.url }}"
    }
    {% endif %}
    {% if product %}
    ,{
      "@type": "ListItem",
      "position": {% if collection %}3{% else %}2{% endif %},
      "name": "{{ product.title | escape }}"
    }
    {% endif %}
  ]
}
</script>

Method 3: Metafields for Custom Data

Use Shopify metafields to store schema data:

Setting Up Metafields

  1. Go to Settings → Metafields
  2. Add product metafields for:
    • gtin - Product identifier
    • mpn - Manufacturer part number
    • brand - If different from vendor

Using Metafields in Schema

{% if product.metafields.custom.gtin %}
"gtin14": "{{ product.metafields.custom.gtin }}",
{% endif %}
{% if product.metafields.custom.mpn %}
"mpn": "{{ product.metafields.custom.mpn }}",
{% endif %}

Adding FAQ Schema to Product Pages

For products with FAQ sections:

{% if product.metafields.custom.faq_json %}
<script type="application/ld+json">
{{ product.metafields.custom.faq_json }}
</script>
{% endif %}

Or use our FAQ Schema Generator and add via metafield or page content.

Review Apps and Schema

Popular review apps that add schema:

Judge.me

  • Free plan available
  • Automatic Review schema
  • Product rating integration

Loox

  • Photo reviews
  • Aggregate rating schema
  • Google Shopping integration

Yotpo

  • Enterprise-level
  • Comprehensive schema
  • UGC integration

Important Note

Only one source should provide review schema. Disable theme review schema if using an app.

Collection Page Schema

Add schema to collection pages:

{% if template contains 'collection' %}
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "CollectionPage",
  "name": "{{ collection.title | escape }}",
  "description": "{{ collection.description | strip_html | escape }}",
  "url": "{{ shop.url }}{{ collection.url }}",
  "mainEntity": {
    "@type": "ItemList",
    "numberOfItems": {{ collection.products_count }},
    "itemListElement": [
      {% for product in collection.products limit: 10 %}
      {
        "@type": "ListItem",
        "position": {{ forloop.index }},
        "url": "{{ shop.url }}{{ product.url }}"
      }{% unless forloop.last %},{% endunless %}
      {% endfor %}
    ]
  }
}
</script>
{% endif %}

Blog Article Schema

Enhance blog posts:

{% if template contains 'article' %}
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "{{ article.title | escape }}",
  "image": "{{ article.image | img_url: 'master' }}",
  "datePublished": "{{ article.published_at | date: '%Y-%m-%dT%H:%M:%S%z' }}",
  "dateModified": "{{ article.updated_at | date: '%Y-%m-%dT%H:%M:%S%z' }}",
  "author": {
    "@type": "Person",
    "name": "{{ article.author }}"
  },
  "publisher": {
    "@type": "Organization",
    "name": "{{ shop.name }}",
    "logo": {
      "@type": "ImageObject",
      "url": "{{ settings.logo | img_url: 'master' }}"
    }
  },
  "description": "{{ article.excerpt | strip_html | escape }}"
}
</script>
{% endif %}

Local Business Schema (for physical stores)

If you have a physical location:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Store",
  "name": "{{ shop.name }}",
  "image": "{{ settings.logo | img_url: 'master' }}",
  "url": "{{ shop.url }}",
  "telephone": "{{ settings.phone_number }}",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "{{ settings.address_street }}",
    "addressLocality": "{{ settings.address_city }}",
    "addressRegion": "{{ settings.address_state }}",
    "postalCode": "{{ settings.address_zip }}",
    "addressCountry": "{{ settings.address_country }}"
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "09:00",
      "closes": "18:00"
    }
  ]
}
</script>

Testing Shopify Schema

Before Launch

  1. Use Rich Results Test on product pages
  2. Check collection pages
  3. Verify blog posts
  4. Test homepage

Common Issues

  • Duplicate schema - Theme + App conflict
  • Missing prices - Currency format issues
  • No reviews - App not configured
  • Invalid JSON - Liquid errors

Best Practices

  1. Don’t duplicate - One schema source per type
  2. Include identifiers - GTIN, SKU, MPN when available
  3. Use vendor for brand - Consistent brand information
  4. Test after updates - Theme/app updates can break schema
  5. Monitor Search Console - Watch for errors

Generate Custom Schema

For pages not covered by automatic schema, use our JSON-LD Schema Generator:

Copy and add to your theme or page content.

Conclusion

Shopify provides a solid foundation for schema markup, but enhancing it significantly improves your chances of rich results. Whether you use apps, theme customization, or a combination, comprehensive schema helps your products stand out in search results.

Focus on Product schema first, then expand to other types. Always test your implementation and monitor Search Console for issues.


Need help optimizing your Shopify store’s SEO? I can help you implement comprehensive schema markup and improve your store’s search visibility. Get in touch for a consultation.