Adding Structured Data to Shopify for Google Merchant (JSON-LD)

Adding Structured Data to Shopify for Google Merchant (JSON-LD)

If you have received errors or warnings regarding missing or invalid data for prices, condition, availability, etc… Then the code below will solve this issue. Simply copy the code and paste it inside your product.liquid file using the latest JSON-LD technology. Also supports variants, while keeping the first selected product as the first iteration. Meaning if you have multiple variants such as colors, and if the second color is preselected based on the URL, then the second variant will be first listed in the structured data, followed by the other variants. This is done to follow the Google Merchant Center guidelines and while keeping SEO integrity.

This tutorial no longer supports the old Microdata technology as JSON-LD is alot faster to read for Google Bots.


Important :
It is required you remove all your old structured data coding, to avoid conflicts. If you do not know how to do this, you can ask for my help using the contact form below
<!-- Copyright FeedArmy 2019 Version 2.25 -->
{% assign fa_current_variant = product.selected_or_first_available_variant %}
<script type="application/ld+json" data-creator_name="FeedArmy">
{
  "@context": "http://schema.org/",
  "@type": "Product",
  "name": "{{ product.title | strip_html | escape }}",
  "url": "{{ shop.url }}{{ product.url }}",
  {% if product.first_available_variant.sku != blank %}
    "sku": "{{ product.first_available_variant.sku }}",
  {% else %}
    "sku": "{{ product.first_available_variant.id }}",
  {% endif %}
  {% if product.first_available_variant.barcode.size == 12 %}
    "gtin12": {{ product.first_available_variant.barcode }},
  {% endif %}
  {% if product.first_available_variant.barcode.size == 13 %}
    "gtin13": {{ product.first_available_variant.barcode }},
  {% endif %}
  {% if product.first_available_variant.barcode.size == 14 %}
    "gtin14": {{ product.first_available_variant.barcode }},
  {% endif %}
  "brand": {
    "@type": "Thing",
    "name": "{{ product.vendor | escape }}"
  },
  "description": "{{ product.description | strip_html | escape | strip_newlines }}",
  "image": "https:{{ product.featured_image.src | img_url: 'grande' }}",
  {% if product.variants %}
    "offers": {% if product.variants.size > 1 %}[{% endif %}
      {
        "@type" : "Offer",
        "priceCurrency": "{{ shop.currency }}",
        "price": "{{ fa_current_variant.price | money_without_currency  | strip_html | remove: ',' }}",
        "itemCondition" : "http://schema.org/NewCondition",
        "availability" : "http://schema.org/{% if product.available %}InStock{% else %}OutOfStock{% endif %}",
        "url" : "{{ shop.url }}{{ fa_current_variant.url }}",
        "itemOffered" :
        {
            "@type" : "Product",
            {% if fa_current_variant.image %}
              {% assign variant_image_size = fa_current_variant.image.width | append: 'x' %}
              "image": "http:{{ fa_current_variant.image.src | img_url: variant_image_size }}",
            {% endif %}
            {% if fa_current_variant.title != blank %}
              "name" : "{{ fa_current_variant.title | escape }}",
            {% endif %}
            {% if fa_current_variant.barcode.size == 12 %}
              "gtin12": {{ fa_current_variant.barcode }},
            {% endif %}
            {% if fa_current_variant.barcode.size == 13 %}
              "gtin13": {{ fa_current_variant.barcode }},
            {% endif %}
            {% if fa_current_variant.barcode.size == 14 %}
              "gtin14": {{ fa_current_variant.barcode }},
            {% endif %}
            {% if fa_current_variant.sku != blank %}
              "sku": "{{ fa_current_variant.sku }}",
            {% else %}
              "sku": "{{ fa_current_variant.id }}",
            {% endif %}
            "url": "{{ shop.url }}{{ fa_current_variant.url }}"
        }
      }{% if product.variants.size > 1 %},{% endif %}

      {% for variant in product.variants %}

      {% if variant != product.selected_or_first_available_variant %}
        {
          "@type" : "Offer",
          "priceCurrency": "{{ shop.currency }}",
          "price": "{{ variant.price | money_without_currency  | strip_html | remove: ',' }}",
          "itemCondition" : "http://schema.org/NewCondition",
          "availability" : "http://schema.org/{% if variant.available %}InStock{% else %}OutOfStock{% endif %}",
          "url" : "{{ shop.url }}{{ variant.url }}",
          "itemOffered" :
          {
              "@type" : "Product",
              {% if variant.image %}
                {% assign variant_image_size = variant.image.width | append: 'x' %}
                "image": "http:{{ variant.image.src | img_url: variant_image_size }}",
              {% endif %}
              {% if variant.title != blank %}
                "name" : "{{ variant.title | escape }}",
              {% endif %}
              {% if variant.barcode.size == 12 %}
                "gtin12": {{ variant.barcode }},
              {% endif %}
              {% if variant.barcode.size == 13 %}
                "gtin13": {{ variant.barcode }},
              {% endif %}
              {% if variant.barcode.size == 14 %}
                "gtin14": {{ variant.barcode }},
              {% endif %}
              {% if variant.sku != blank %}
                "sku": "{{ variant.sku }}",
              {% else %}
                "sku": "{{ variant.id }}",
              {% endif %}
              "url": "{{ shop.url }}{{ variant.url }}"
          }
        }
        {% unless forloop.last %},{% endunless %}
        {% endif %}
      {% endfor %}
    {% if product.variants.size > 1 %}]{% endif %}

    {% if product.metafields.spr.reviews %}
    ,"aggregateRating": {
     "@type": "AggregateRating",
     "ratingValue": {{ product.metafields.spr.reviews | split: 'ratingValue" content="' | last | split: '"' | first | plus: 0 }},
     "ratingCount": {{ product.metafields.spr.reviews | split: 'reviewCount" content="' | last | split: '"' | first | plus: 0 }}
    }
    {% endif %}
  {% endif %}
}
</script>
<!-- Copyright FeedArmy 2019 Version 2.25 -->

Once the new coding has been added, it will take Google Merchant Center several weeks to a month before the warnings inside your diagnostic panel disappear. The reason it takes so long is that Google does not check every page every day, but over a span of 30 days.

Here is a step by step guide on how to paste the code in your products.liquid file.

Step 1

Login to your Shopify Admin Panel

Shopify Login

Step 2

Open up the theme editor

shopify how to go to edit themes

Step 3

In the top right corner click on actions. A menu will appear and click on Edit Code

Edit Shopify Theme Code

Step 4

Click on Templates > product.liquid

Shopify Product Liquid File

Step 5

Depending on how your theme is built, the recommended place to paste the code us underneath the last include, this should be very near to the top. If you have any headers included, definitely after this line. Due to so many different themes, I can not explain exactly where to place it. However, it should be inserted within the first 10 lines of code. Check that you did not break anything by checking the preview results of your product landing page.

Step 6

Verify that you have done it correctly by checking the page with Google’s Structured Data Testing Tool

You will see 2 warnings, warnings are simply optional and do not affect your SEO in a negative way. These are :

  • priceValidUntil
    • This should never be filled in if the product does not expire. If you do add an expiry date, you are essentially telling crawling system that your product expires. As this is never the case with eCommerce we do not want to fill this in.
  • review
    • Currently no values are available to fill this in

The aggregatedReviews in this script only extract data for the default Shopify Review system, if you have other review systems such as yotpo, then please contact me at the bottom of this article for a custom installation.
Google Structured Data Testing Result

Tip

If you want the ability to edit your titles for Google Shopping but do not want to change the website, why not use FeedArmy for publishing your products to Google Shopping. You can also export variants and use import rules or manually edit data!

Need Help?

Changelog Structured Data for Shopify

Added product id if the sku is not assigned in Shopify
Fixed variant availability
Older changes have not been tracked yet