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
- Visit any product page on your store
- Right-click → View Page Source
- Search for “application/ld+json”
- 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:
- Install from Shopify App Store
- Configure store settings
- 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
- Go to Online Store → Themes
- Click Actions → Edit Code
- Open
theme.liquid - 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
- Go to Settings → Metafields
- Add product metafields for:
gtin- Product identifiermpn- Manufacturer part numberbrand- 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
- Use Rich Results Test on product pages
- Check collection pages
- Verify blog posts
- 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
- Don’t duplicate - One schema source per type
- Include identifiers - GTIN, SKU, MPN when available
- Use vendor for brand - Consistent brand information
- Test after updates - Theme/app updates can break schema
- 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.