← Back to blog
9 min readBy Feedyio

Why Google Merchant Center disapproved your products (and how to fix the 10 most common errors)

You open Google Merchant Center, and half your catalog is flagged "Disapproved." Your Shopping campaigns are running on a fraction of your products, or they have stopped entirely. The good news: almost every disapproval comes down to one of about ten causes, and each has a concrete fix. This is a troubleshooting reference - find the message you are seeing, read the cause, apply the fix.

How to read a disapproval in Merchant Center

Start in Products → All products, or open Diagnostics under the Products menu. Google shows you three things for every issue: the affected attribute (for example image_link or price), the severity, and how many items are hit.

Severity is what tells you how urgent this is:

  • Disapproved (item-level): that product is removed from free listings and ads until you fix it. The rest of your catalog keeps running.
  • Warning: the item still shows, but something is wrong (a missing recommended attribute, a soon-to-be-enforced rule). Treat warnings as a to-do list before they become disapprovals.
  • Account-level issue: this affects your whole account and can lead to suspension. More on that below.

Click an issue to see the example items and the linked policy. Fix the data at the source - in Shopify and in your feed - then let the feed re-fetch. Items move back to "Active" on the next successful crawl and review.

The 10 most common reasons (and how to fix each)

1. Price mismatch between your feed and your landing page

This is the single most common disapproval. Google crawls the product page and compares the price it finds there with the price in your feed. If they differ - even by a rounding cent, a tax display difference, or a sale that updated on-site but not in the feed - the item is disapproved for an inconsistency between the feed and the landing page. The usual causes are unsynced data, prices that change faster than the feed refreshes, structured data on the page that does not match the visible price, or IP- and device-based pricing that shows the crawler a different number. (Source: support.google.com.)

Fix: keep the feed and the site in sync, refresh the feed often enough to catch price changes, make sure the price your customer sees is the price in the feed, and enable automatic item updates (covered below) so Google can read the live price from the page. Confirm that any schema.org markup on the page reports the same price as the feed.

2. Availability mismatch (in stock vs. out of stock)

The same crawl that checks price checks availability. If your feed says in stock but the landing page shows the product sold out (or vice versa), the item is disapproved for the same feed-versus-page inconsistency. (Source: support.google.com.)

Fix: sync stock levels frequently so the feed reflects reality, and make sure the on-page availability (and its structured data) matches the feed value.

❌ Wrong

<g:availability>in_stock</g:availability>
<!-- but the product page says "Sold out" -->

✅ Fixed

<g:availability>out_of_stock</g:availability>
<!-- feed updated to match the live page on the next sync -->

3. Image too small

Google enforces minimum image sizes. Non-apparel images smaller than 100 × 100 px and apparel images smaller than 250 × 250 px are rejected, and Google will not upscale a small image to meet the requirement. A higher floor is coming: a 500 × 500 px minimum begins enforcement on January 31, 2027, so it is worth getting ahead of that now. (Sources: support.google.com, support.google.com.)

Fix: upload larger source images. Aim well above the minimums - square images of at least 800 px on the long side give you headroom and look better in listings.

4. Generic or placeholder image

An image_link that points to a "coming soon" graphic, a logo, a blank silhouette, or a stock placeholder is not an acceptable product image and gets disapproved. (Source: support.google.com.)

Fix: use a real photo of the actual product against a plain background. Every active item needs a genuine image - placeholders are never acceptable, not even temporarily.

5. Promotional overlay or watermark on the image

Product images must show the product, not your marketing. Promotional text ("Sale", "Free shipping", "-30%"), watermarks, call-to-action badges, and borders on the main image all cause disapproval. (Source: support.google.com.)

Fix: use clean product photography with no overlaid text or graphics. If you want to advertise a sale, use the dedicated promotions and sale-price features instead of baking it into the image.

6. Missing or invalid GTIN

If a product has a manufacturer-assigned GTIN (the barcode number - EAN, UPC, JAN, ISBN all belong to the GTIN family) and you omit it or send an invalid one, the product can fail to sync or be disapproved, and it loses the visibility that a correct identifier brings. (Source: support.google.com.)

Fix: send the correct GTIN for each product and each variant. In Shopify this is the variant's Barcode field - map it to gtin in the feed. For items that genuinely have no assigned GTIN (handmade, private-label, OEM parts), set identifier_exists to no rather than inventing a value. We cover the identifier rules in depth in GTIN, EAN and identifier_exists.

❌ Wrong

<g:gtin>12345</g:gtin> <!-- not a valid GTIN -->

✅ Fixed

<g:gtin>0036000291452</g:gtin> <!-- the real barcode from Shopify -->

7. Missing brand

Brand is required for all new products except a few categories such as movies, books, and music recordings, where the format implies the publisher. A missing brand on a branded product triggers a disapproval. (Source: support.google.com.)

Fix: populate brand for every applicable product. In Shopify, the Vendor field is the natural source to map to brand - just make sure it holds the actual brand name and not a supplier or distributor code.

8. Missing apparel attributes (gender, size, color, age_group)

Products in the Apparel & Accessories category have extra required attributes. If you sell clothing and omit gender, size, color, or age_group, those items are disapproved until the attributes are present. (Source: support.google.com.)

Fix: supply all four. color and size usually come from your Shopify variant options; gender and age_group often need to be set per product or per collection. Mapping them once at the collection level is the fastest way to fix a whole apparel catalog.

❌ Wrong

<g:google_product_category>Apparel &amp; Accessories > Clothing</g:google_product_category>
<g:color>Blue</g:color>
<!-- gender, size and age_group missing -->

✅ Fixed

<g:google_product_category>Apparel &amp; Accessories > Clothing</g:google_product_category>
<g:gender>female</g:gender>
<g:age_group>adult</g:age_group>
<g:color>Blue</g:color>
<g:size>M</g:size>

9. Gimmicky capitalization in titles

Titles written in ALL CAPS or with attention-grabbing capitalization ("BEST DEAL", "Buy NOW") are disapproved as gimmicky. (Source: support.google.com.)

Fix: use normal sentence or title case. Acronyms and brand names that are genuinely capitalized (USB, BMW) are fine; capitalizing for emphasis is not.

❌ Wrong

<title>HUGE SALE!!! Cotton T-Shirt BUY NOW</title>

✅ Fixed

<title>Men's Cotton Crew-Neck T-Shirt, Navy</title>

10. Landing-page access issues

If Google's crawler cannot reach the product page - the URL 404s, redirects to a different product or the homepage, is blocked by robots.txt, sits behind a login or age gate, or times out because the page is too slow - the item is disapproved. The price-mismatch problem also shows up here: a page that loads its price slowly via JavaScript can be crawled before the price renders. (Sources: support.google.com, support.google.com.)

Fix: make sure every link resolves to a live, crawlable product page that returns the right product, isn't blocked in robots.txt, and loads its price and availability quickly. On Shopify the product URL is generated for you, so this usually comes down to deleted or unpublished products still sitting in the feed, or interstitials blocking the crawler.

Account-level vs. item-level problems (and the suspension risk)

Item-level disapprovals are isolated: one bad product, one fix, the rest of your catalog keeps selling. Account-level issues are the serious ones. Policy problems such as misrepresentation, a missing return and refund policy, or insufficient contact information apply to your whole account and can escalate to a full suspension - at which point nothing runs. (Source: support.google.com.)

Google generally gives you a warning period with a deadline to fix the problem before the account is suspended, and after a failed re-review there is a cool-down before you can request another. Google does not publish exact day counts for these grace periods, so don't gamble on a specific number - treat any account-level warning as urgent and fix it the day you see it. Make sure your store has clear, accessible return and refund policies, real contact details, and product information that honestly matches what you sell.

The fix that prevents most of these: structured data, automatic item updates, and frequent sync

Most disapprovals on this list - especially the price and availability ones - are prevented by the same three habits working together.

  1. Frequent feed sync. The more often your feed reflects the live state of your store, the smaller the window in which the feed and the page can disagree. A daily export is not enough for a store that runs flash sales or sells fast-moving stock; hourly is the safe default.
  2. Correct structured data on the page. Google can read schema.org markup - price, priceCurrency, availability, condition - directly from your landing page. It has to match what the customer sees and what the feed sends. Structured data is not a replacement for keeping the feed updated; it is a second source that must agree with the first. (Sources: support.google.com, support.google.com.)
  3. Automatic item updates. Turn this on in Merchant Center so Google can read those structured-data values from the page and update your items automatically when the feed lags slightly behind. This reduces the risk of price and availability disapprovals - and of the repeated mismatches that push an account toward suspension. (Source: support.google.com.)

If you sell in more than one country or currency, there is a related trap worth knowing about - the crawler can see a different currency than your feed. We cover it in multi-currency, multi-country Google feeds with Shopify Markets, and the broader case for keeping data fresh in price and stock accuracy.

How Feedyio keeps your Google feed clean

Most of the fixes above are data-and-timing problems, which is exactly what a feed app is for. Feedyio builds a correctly formatted Google Merchant Center feed from your Shopify catalog - mapping Barcode to gtin, Vendor to brand, variant options to color and size, and letting you set apparel attributes and Google categories at the collection level so a whole catalog gets fixed at once. It validates the required fields per channel, and it syncs price and stock every hour so the feed stays in step with your store and the live page - which is what stops the price and availability disapprovals that cause most of the trouble here. The same setup powers feeds for 130+ other channels from one source of truth.

Tired of chasing disapprovals one product at a time? Try Feedyio free on the Shopify App Store.