Skip to main content
GMC Guardian GMC Guardian
EN
WARNING

How to Fix a GMC Structured Data Policy Violation

Your products were disapproved because Merchant Center found inconsistencies between your Schema.org markup and your feed or visible page data. This guide tells you exactly where to look and what to fix.

Estimated fix time
1-5 days
DSA channel
N/A
Last reviewed
2026-04-29
  • #structured-data
  • #json-ld
  • #schema-org
  • #product-markup
  • #shopify
  • #gmc-disapproval
  • #feed-consistency
  • #technical-seo

Google’s AdsBot and Search crawlers visit your product landing pages to verify that what you advertise in your feed matches what shoppers actually see. When your Schema.org/Product markup - whether JSON-LD or microdata - is missing required fields, carries stale data, or contradicts your visible page, Merchant Center logs a structured data policy violation and disapproves the affected products. On Shopify, this most often surfaces when a theme’s auto-generated JSON-LD falls out of sync with live inventory or shipping configuration, or when an SEO app injects its own markup on top of the theme’s built-in block, creating duplicate or conflicting signals.

What Google means by “structured data policy”

Google’s structured data policy for products has two distinct dimensions: technical validity (the markup is syntactically correct and includes all required Schema.org fields) and consistency (the values in the markup match the canonical product data visible to the user and submitted in the feed).

The Product structured data guide lists the required properties for a schema.org/Product entity with an associated Offer:

  • name
  • image
  • description
  • offers.price and offers.priceCurrency
  • offers.availability (using schema.org vocabulary: InStock, OutOfStock, PreOrder, etc.)

Google’s policy language is direct: markup that misrepresents “the product, price, availability, or any other characteristic” qualifies as misrepresentation and can trigger product disapproval. For persistent patterns across many products, the violation can escalate from a product-level warning to an account-level flag.

The landing page is treated as the authoritative source of truth. If your feed declares $29.99 and your JSON-LD block declares $24.99, Google does not attempt to reconcile them - it flags the discrepancy and disapproves the product.

Why it triggers a disapproval on Shopify

Shopify themes generate JSON-LD automatically using Liquid templating. Several Shopify-specific failure modes account for the majority of structured data policy flags.

Stale price after a sale ends. Sale-price apps modify the variant’s price attribute server-side. If AdsBot crawls in the window between when a sale ends and when Shopify’s theme cache refreshes, the JSON-LD may briefly reflect a price that no longer matches the live buy button - enough to trigger a discrepancy flag on that crawl.

Duplicate JSON-LD blocks. Many SEO apps (JSON-LD for SEO, Schema App, Smart SEO) inject their own <script type="application/ld+json"> block on product pages. If the theme already outputs a Product entity and the app outputs a second block with different values - or if the app’s product cache is stale - Google sees two conflicting Product entities on the same URL.

Unsupported shippingDetails claims. Some themes and SEO apps add a shippingDetails > shippingRate node claiming free shipping or a specific shipping cost. If your GMC account has a flat-rate shipping rule for the same destination, that contradiction is a direct trigger for this violation.

Missing GTIN when present in the feed. For branded products with an assigned GTIN, omitting gtin from the markup when it is present and matched in the GMC feed creates an attribute inconsistency that can surface under this violation even when price and availability are correct.

How to detect the issue on your store

Diagnose before you fix. The combination of Merchant Center Diagnostics and the Rich Results Test gives you a complete picture.

Check Merchant Center Diagnostics first. Navigate to Products → Diagnostics and filter by “Structured data policy”. Export the affected product list. Determine whether the issue is isolated to a handful of SKUs - likely a specific template variant or sale condition - or catalog-wide, which points to a theme-level or SEO app misconfiguration.

Run the Rich Results Test. Go to https://search.google.com/test/rich-results and enter the URL of an affected product page. Look for:

  • Missing required fields (price, availability)
  • Price or availability values that differ from the visible page
  • Multiple Product entities on a single URL

Inspect the page source directly. In Chrome, use View Page Source and search for application/ld+json. Count how many Product blocks exist. Verify each block’s price and availability against the displayed price and the “Add to Cart” button state.

Cross-reference your GMC feed. In Merchant Center, go to Products → All products, find an affected SKU, and note the price, availability, and shipping attributes GMC has on file. Compare these against the structured data values from the steps above.

Step-by-step fix

  1. Locate every JSON-LD source on your product pages. In Shopify admin, go to Online Store → Themes → Edit code and search for application/ld+json across all Liquid files. Note each file. Then check your installed apps for any that also inject structured data - look for toggles labeled “Product schema”, “JSON-LD”, or “Structured data” in each app’s settings panel.

  2. Eliminate duplicate sources. Choose one authoritative JSON-LD source - either the theme or the SEO app - and disable the other. If you keep the theme’s output, turn off the app’s product schema in its settings. If you prefer the app’s output, comment out the theme’s block to prevent it from rendering:

{% comment %}
<script type="application/ld+json">
  {{ product | json }}
</script>
{% endcomment %}

Frequently asked questions

Frequently asked questions

Does every Shopify product page need JSON-LD markup for GMC to approve it?
Not strictly. GMC primarily reads your product feed - via the Shopify Google & YouTube channel or a manual upload - rather than relying on on-page structured data for product approval. However, when AdsBot crawls your product landing pages to verify quality, any JSON-LD markup it finds must be consistent with the feed. If your theme already outputs JSON-LD - which most modern Shopify themes do - that markup must match the feed, or you risk a structured data policy flag. A page with no JSON-LD at all is generally not the direct cause of this specific disapproval; the trigger is markup that is present but contradicts the feed or the visible page.
My Rich Results Test shows no errors. Why is GMC still disapproving my products?
The Rich Results Test validates schema syntax and checks for missing required fields - it does not compare your markup against your live GMC feed. The most common root cause of this violation is a value in your JSON-LD (price, availability, or shipping rate) that is technically valid schema but differs from what is in your feed or displayed on the page. Pass the Rich Results Test AND then manually cross-check each price, availability, and shipping value against your GMC product data to find the real discrepancy.
Can a 'FREE SHIPPING' claim in my JSON-LD trigger a structured data violation?
Yes. If your theme or SEO app outputs a shippingDetails block claiming free shipping but your GMC shipping settings do not have a matching free-shipping rule for the same product and destination, Google's crawler flags the landing page as misrepresenting shipping conditions. The fix is either to remove the shippingDetails node from your JSON-LD entirely - it is a recommended field, not a required one - or to configure a matching free-shipping override in Merchant Center under Shipping and returns.
Does this policy apply to microdata as well as JSON-LD?
Yes. Both JSON-LD script blocks and microdata attributes (itemscope/itemprop) are subject to the same structured data policy requirements. Shopify themes predominantly use JSON-LD today, but legacy or heavily customized Liquid themes may still use microdata. The validation logic is identical: required fields must be present, and all values must be consistent with the live page and feed data.
How long does re-review take after I fix the structured data?
After you submit a re-review request in Merchant Center, Google re-crawls the affected URLs on its own schedule. In typical cases, product reinstatement happens within 3 to 7 business days. Domains with a high crawl budget may see faster turnaround; very large catalogs may take longer if many URLs need re-crawling. There is no way to expedite the crawl itself, but ensuring the fix is live before you submit the re-review avoids a second full wait cycle.
A theme update re-introduced the structured data problem. How do I prevent this?
Shopify automatic theme updates - especially for the Dawn family - can re-enable a default JSON-LD block you previously commented out, or overwrite customizations in product.liquid. After any theme update, recheck your product page source for duplicate or changed JSON-LD blocks before the next AdsBot crawl cycle. Consider adding a post-update structured data verification step to your store maintenance checklist, or pinning the theme version until you can QA the output.

Sources & references

Authoritative sources cited

  1. Google Search Central: Product structured data https://developers.google.com/search/docs/appearance/structured-data/product
  2. Google Search Central: Structured data policies https://developers.google.com/search/docs/appearance/structured-data/sd-policies
  3. Google Rich Results Test https://search.google.com/test/rich-results

Get the appeal checklist for this suspension

The step-by-step remediation from this page, sent to your inbox so you can work through it while your cool-down runs. No account needed.

Or describe your case and get a human read on it