A Shopify review app adds broken FAQ schema to product pages
Summary
Apps installed on a Shopify store can write structured data onto product pages that the owner never chose. In one Reddit report, Yotpo's review app added FAQPage markup that failed Google's checks and could not be switched off from the app.
The FAQ rich result is gone anyway, so the real risk is to Product and Review markup. Check the rendered page for app-added JSON-LD and ask the vendor to remove it at the source.
A store owner reported in r/TechSEO that the Shopify app from Yotpo, which collects and displays product reviews, was adding FAQPage structured data to their product pages without their knowledge. The pages failed validation with a “Main Entity Missing” error, and the error field pointed to dynamically generated IDs from yotpo.com. The poster tried disabling the Yotpo addon and changing its settings. Neither removed the FAQPage JSON-LD blocks.
The FAQ error matters less than what caused it. A third-party app wrote markup onto product pages that the store did not choose and could not turn off from the app’s own controls.
Why the extra block fails
Schema.org defines FAQPage as a web page presenting one or more frequently asked questions, and Google treats mainEntity as a required property on it. A FAQPage block without mainEntity fails on its own. A store with no FAQ markup of its own can therefore see validation errors purely from what Yotpo adds.
Stores that wrote their own FAQ schema get a second problem. Two FAQPage blocks now sit on one product page, and Google may flag both as invalid or ignore both.
No FAQ result was at stake
When the thread ran, FAQ rich results were already limited to well-known government and health sites. Google has since stopped showing FAQ rich results in Search as of May 2026, and Google’s Search Gallery of supported rich results no longer lists FAQ. A Shopify store was never going to win an FAQ result from these blocks.
Product and review snippet results are still in the gallery, and product pages are where review apps do their work. The Reddit post does not say Yotpo also adds Review or Product schema. A store that found one unrequested block still has reason to look for others, since duplicate markup there would compete with results that do count.
The poster’s workaround
The Reddit poster shared a script that deletes the Yotpo FAQPage blocks from the page. It goes in theme.liquid, just before the closing </body> tag:
<script>
(function() {
function removeYotpoFAQ() {
document.querySelectorAll('script[type="application/ld+json"]').forEach(function(el) {
if (el.innerHTML.includes('yotpo.com/go') && el.innerHTML.includes('FAQPage')) {
el.remove();
}
});
}
document.addEventListener("DOMContentLoaded", removeYotpoFAQ);
setTimeout(removeYotpoFAQ, 1000);
setTimeout(removeYotpoFAQ, 2000);
})();
</script>
The script runs when the HTML finishes loading and again after one and two seconds, because Yotpo may inject its schema after the first page load. The delayed runs are also the script’s weak point. Googlebot crawls and renders in separate steps, and nothing guarantees those runs fire before Googlebot captures the page. The script cleans up what a visitor’s browser holds. It may not clean up what Google indexes.
What to do
The check costs nothing and tells you whether any of this applies to your store.
- Open a product page in Chrome DevTools and inspect the rendered DOM (the page after JavaScript has run). Search its JSON-LD blocks for
FAQPage. Raw page source will not show schema that JavaScript injects. A block referencingyotpo.comis one you did not add. - Run the same pages through Google’s Rich Results Test to see whether validation errors are present.
- Search the rendered DOM for every JSON-LD block containing
yotpo.com, not only FAQPage ones. Review or Product markup from the app would compete with your own where those rich results still count. - Ask Yotpo support to disable the FAQPage injection at the source. A fix in the app or on the server is more reliable than anything done in the browser.
- Treat the script as a stopgap while you wait on Yotpo, and recheck the rendered page after adding it.