lunalink.ai
← lunalink.ai blog
August 31, 2026 · The lunalink.ai team

Should Shopify merchants add product schema when their theme already has it?

Laptop displaying code with reflection, perfect for tech and programming themes.
Photo by Christina Morillo on Pexels

Your theme already has product schema. An SEO app offers to add product schema too.

It sounds like an easy decision: more markup must mean more chances to appear in search.

Usually, it doesn't.

A second Product JSON-LD block can repeat data your theme already provides. If the two blocks disagree on price, stock, variants, reviews, or identifiers, you've created a new problem. The better question is not “do I have schema?” It is: what does my live product page already say, and is it complete and accurate?

Descriva is built around that question. It reads the public version of your store first, then helps you improve what is missing. It should not turn “add schema” into a reflex.

Start with the page your customers and crawlers can see

Shopify themes can use Shopify's official `structured_data` Liquid filter. On a product page, it can output JSON-LD like this:

```liquid <script type="application/ld+json"> {{ product | structured_data }} </script> ```

That output is server-rendered. It is part of the HTML Shopify sends for the page.

Shopify's filter outputs a `Product` for a product with no variants. It outputs a `ProductGroup` when the product has one or more variants.

That distinction matters. Say you sell a shirt in five sizes and three colours. A plain `Product` block added by a separate app may not describe the same thing as your theme's existing `ProductGroup` output. Before changing anything, you need to see the actual markup and understand which system produced it.

You can do a quick first check yourself in under a minute:

  • Open a live product page in your browser.
  • Right-click and choose View page source.
  • Search for `application/ld+json`.
  • Search again for `"@type":"Product"` and `"@type":"ProductGroup"`.
  • Count the JSON-LD blocks that describe the product.

Do not rely only on what you see in the Shopify theme editor. A theme app extension, an older snippet, or a previous SEO app may also be adding markup.

More structured data is not always duplicate structured data

A product page can contain more than one kind of structured data.

For example, a page may validly describe:

  • The main product
  • A breadcrumb trail
  • Reviews
  • A video

Google supports multiple structured-data items on one page when they describe different related things. Those items can be nested together or provided separately.

That is different from having two separate Product entities for the same item.

A breadcrumb block helps search engines understand where the product sits in your catalogue. A video block can describe a product demonstration. Neither is a second description of the same product's price, availability, and identifier.

The issue is not “more than one JSON-LD script.” The issue is whether two blocks both claim to be the same product.

This is why a blanket instruction to “install schema” is not very useful. It skips the inspection step.

What can go wrong with two Product blocks

Product data changes often. A sale starts. One variant sells out. A product is retired. A review count changes.

If your theme reads current Shopify product data, but an app writes its own separate Product block, those two sources can drift apart.

Google's guidance is clear: structured data should be a true representation of the visible page. It needs to be complete enough for the relevant feature and must not be misleading or mismatched.

Here are the common conflicts to look for:

  • Price: One block shows the compare-at price. The other shows the current selling price.
  • Availability: One block says `InStock` after the selected variant is sold out.
  • Variants: The theme outputs a `ProductGroup`, while another tool outputs one broad Product.
  • Identifiers: SKU, GTIN, or other identifiers differ between blocks.
  • Reviews: A stale app block reports a rating or review count that does not match the page.

None of these issues are fixed by having more markup. They are fixed by choosing a reliable source and keeping it aligned with the product page.

A Shopify Community discussion from July 2026 describes this exact pattern: a theme and an SEO app both output Product JSON-LD. That does not prove every duplicate causes a search issue. It does show why you should audit your own page before adding another generator.

Test the live URL before you edit anything

Google recommends testing structured data with the Rich Results Test and URL Inspection tool.

Start with the Rich Results Test. Paste in a live product URL, not a preview link. Check whether Google detects product structured data and whether it reports errors or warnings.

Then use URL Inspection in Google Search Console for the same URL. This gives you another view of the page Google can inspect.

When you review the result, ask four plain questions:

1. Is there already a Product or ProductGroup item? 2. Does it match the product page's current price and availability? 3. Does it include the information your products need? 4. Is another Product block repeating the same item?

If the existing markup is valid, accurate, and covers the product properly, adding a second Product block is not the next job.

Your next job may be improving the page itself. A product with a thin title, unclear material details, and no useful specifications is still hard for people and AI systems to understand. Schema can describe a page. It cannot make vague product information specific.

When adding or changing markup does make sense

There are cases where existing theme markup needs work.

Your theme may have no product structured data. It may output incomplete data. It may use product information that no longer matches what is visible. Or it may not make clear enough distinctions between products and variants.

In those cases, improve the existing implementation where possible. Replacing one weak Product block with one accurate block is cleaner than layering a second one over it.

Google also recommends putting Product markup in the initial HTML when you are optimizing for shopping results. JavaScript-generated markup can make crawls less frequent or less reliable when details like price and availability change quickly.

That is another reason to inspect implementation, not just output. A block that appears after a browser runs JavaScript is not the same as a block rendered directly by Shopify.

At Lunalink, we made a related choice when shipping Descriva. We deliberately did not request theme-write permission. We wanted merchants to grant fewer permissions. That meant finding another way to publish `llms.txt`: as a Shopify page with a redirect, rather than as a theme file.

The constraint led to a cleaner setup.

The same principle applies here. Do not give an app broad access, or add a second data source, just because that is the quickest route to a checkbox. First establish what your theme already does.

Keep your feed and page aligned too

On-page structured data is only one source of product information.

Google recommends providing product data through both on-page structured data and a Google Merchant Center feed when possible. The two sources can be combined or used to verify information.

That means duplicate JSON-LD is not a substitute for a healthy feed.

If a product's price or stock is wrong in Merchant Center, adding another Product script to the page does not solve it. If your page markup is accurate but your feed is stale, that also needs attention.

Keep the basic sources aligned:

  • Your visible product page
  • Your on-page Product or ProductGroup markup
  • Your Merchant Center feed, if you use one

One consistent set of facts is more useful than several competing ones.

How Descriva approaches the decision

Descriva audits how public systems can read your Shopify store, including the product information available to AI search tools. It can generate entity-first copy, FAQs, specification lists, and JSON-LD schema where those additions are useful.

But generation should follow an audit.

We built our free scanner to read only public store URLs: `robots.txt`, the catalogue endpoint, product markup, and policy pages. There is no install and no login for that first read. A merchant should be able to learn the basics without trusting a stranger's app first.

For product schema, that means starting with the live page output. If your theme already has accurate Product or ProductGroup JSON-LD, Descriva's job is not to pile on another copy. It is to identify real gaps and help make the store easier to understand.

A quiet next step: test one best-selling product URL in Google's Rich Results Test, then view its source and count the Product blocks before making any schema change.

Sources

shopify seoproduct schemastructured datadescriva

See how AI assistants actually read your store — a free 30-second scan, no install and no signup.

Check my store