TL;DR
- Search Console's "unparsable structured data" means a syntax error made Google discard the entire markup block, not just one bad field, and Google is explicit that every item in that report is a critical error, never a warning.
- On Shopify, the usual causes are three specific mistakes: a trailing comma, unescaped characters (quotes, line breaks) inside a product title or description, or two JSON-LD objects concatenated in the same
<script>tag without an array wrapper. - You can tell whether the theme or an app produced the broken block by copying a text fragment from it and searching for that fragment in Online Store → Themes → Edit code.
If you build or maintain Shopify storefronts for clients, you've probably seen this line in Search Console and had no clean way to trace it: "unparsable structured data." It's one of the few reports where Google states severity plainly, every item listed is a critical failure, not a warning. The frustrating part is that nothing on the rendered page looks broken. No console error, no visual regression, no failed build. A single stray character in a Liquid snippet, or a JSON-LD block an app injects at runtime, quietly invalidates the whole document, and the client's product schema (price, availability, rating) disappears from how Google reads the page, with no trace in a normal QA pass.
This post covers the three syntax errors that actually cause this on Shopify, how to figure out whether it's your theme code or a third-party app, and how to fix and revalidate it.
What does "unparsable structured data" actually mean?
Google's own definition is unusually direct. The report lists structured data that "could not be parsed because of a serious syntax error", and "the intended type of structured data (Job, Event, and so on) could not be determined because of the parsing error." Google isn't flagging a schema mismatch here. It saw a markup block, failed to parse it as JSON, and couldn't even tell what it was supposed to describe.
The same page adds a detail worth building process around: "All items in this report are critical structured data errors; there are no warnings or valid items." There's no severity triage to do. Anything that shows up here is broken.
What does the client actually lose when a block fails to parse?
The page stays indexed and keeps ranking on its text content. What disappears is everything that specific block declared. If the failing block was the Product markup, the price, availability, and rating it carried are simply absent as far as Google is concerned, and the page loses eligibility for the rich result it used to qualify for. Where a Merchant Center feed depends on on-page data, the product can drop out of that feed too.
This is why the bug usually surfaces sideways: someone notices review stars vanished from a listing, or a client asks why a competitor's price shows up in search but theirs doesn't, and the root cause traces back to a schema block that stopped parsing weeks earlier.
Which syntax errors cause this on Shopify themes?
Two JSON documents concatenated. The theme writes one Product object into a <script type="application/ld+json"> tag, and an app appends a second object into the same tag with nothing separating them:
<script type="application/ld+json">
{"@type":"Product","name":"Wool Beanie"}{"@type":"AggregateRating","ratingValue":"4.5"}
</script>
Two valid objects placed back to back are not valid JSON. Both get discarded. The fix is either separate <script> tags or wrapping both in a @graph array.
A trailing comma.
{
"@type": "Offer",
"price": "24.00",
"priceCurrency": "USD",
}
That trailing comma after "USD" invalidates the entire document, not just that line. It's the single most common hand-edit mistake in a Liquid snippet.
Unescaped characters inside a value. A product title containing a straight double quote or a line break, interpolated into JSON without escaping:
"name": "{{ product.title }}"
If product.title is Men's "Classic" Wool Beanie, that renders broken JSON. This one is the sneakiest because it only breaks on the products whose text happens to contain the offending character, so it looks intermittent until you spot the pattern. The reliable fix is Shopify's json filter instead of raw interpolation:
"name": {{ product.title | json }}
| json handles escaping for you and also gets you correct quoting (no manual ".." wrapper needed).
How do you find whether the theme or an app injected the broken block?
Once a validator has shown you the failing block, copy a distinctive text fragment from it and search for that fragment in Online Store → Themes → Edit code.
If the fragment is in the theme files, the theme is generating the block and you can fix it directly. If it appears on the rendered page but nowhere in the theme source, an app is injecting it at runtime, editing theme code won't touch it. The fix in that case is in the app's own settings (most reviews, SEO, and social apps have a toggle for structured data output) or a support ticket with the app vendor.
This distinction matters for maintenance, not just for the immediate fix. A theme fix stays fixed until someone edits the theme again. An app fix can be silently undone by the app's next update, so it's worth re-checking after any app update rather than treating it as a one-time fix.
How do you check and fix it end to end?
- Paste the affected product URL into validator.schema.org and read the exact parsing error, plus which block it belongs to.
- Copy a unique fragment from that block and search for it in Online Store → Themes → Edit code to determine theme vs. app.
- If it's the theme: remove the trailing comma, switch raw interpolation to
| json, and wrap multiple objects in an array instead of concatenating them. - If it's an app: disable its structured data injection in its settings, or send its support team the validator output.
- Revalidate on validator.schema.org, cross-check with the Rich Results Test, then open the error in Search Console and click Validate Fix. Google notes validation "typically takes up to about two weeks, but in some cases can take much longer," the fix itself is live immediately, only the report is slow to catch up.
Because the symptom is invisible on the page, the useful habit isn't checking when something looks wrong, it's checking after any change that touches the theme or the app list. A theme update, a new reviews app, a bulk product import: any of those can introduce a stray character into a block that had parsed cleanly for a year.
Have you traced one of these back to a specific app before? Curious which ones are the repeat offenders in your stack.
The full version of this article, with screenshots and ongoing updates, lives on the StoreCanary blog.
Top comments (0)