Audit your product feed before you push it
May 6, 2026
Most GMC disapprovals are preventable if you audit the feed before you push it. Here is the eight-check list I use on real catalogs.
The first time I connected a 50,000-product Shopify store to Google Merchant Center, the dashboard turned red within an hour. Hundreds of disapprovals. Some were missing GTINs. Some had image URLs that 404’d. Some had categories that didn’t exist in Google’s taxonomy. The fix loop was awful: push the feed, wait for review, read the rejection, fix the source, push again. Each cycle was hours.
The lesson I learned that week is the only feed-ops lesson that matters: GMC is not your validator. By the time GMC tells you a product is broken, you have already burned the slow async loop. Validate the feed locally before you push, and the disapproval count drops by 80% before Google even sees it.
The eight checks that catch almost everything
These are the checks I run on every feed before I let it out the door. Most are five lines of code or one Google Sheet formula. None of them require GMC.
- Required field presence. Every row needs id, title, description, link, image_link, availability, and price. Zero empty cells in those columns. If 414 titles are empty in a 51,000-row feed, you have a transformation bug, not a content gap.
- GTIN check-digit math. The last digit is a checksum. Compute it, compare to what is on file, reject the mismatches. Half the GTINs I see hand-typed from supplier sheets fail this check.
- identifier_exists consistency. If a row has no GTIN and no MPN but the brand is set, you need identifier_exists set to no. Otherwise GMC treats it as a missing identifier and disapproves.
- Image URL reachability. HEAD-request every unique image_link. Flag anything that is not a 200 with a real content-length. Resolve redirect chains to the canonical URL in the feed itself.
- google_product_category coverage.Every row needs a category, and the category must exist in Google’s current taxonomy. Download the taxonomy text file and check against it. The catch-all categories (like “Apparel and Accessories” with no subcategory) will not get disapproved, but they will underperform.
- Price and availability sanity. Look at the joint distribution. A thousand $0 in-stock rows is a bug. A hundred negative-inventory in-stock rows is a bug. Surface the surprising buckets.
- Title and description quality. Length checks, all-caps ratio, HTML tag stripping. Shopify descriptions are HTML by default, so the flatten step needs to remove tags or GMC will reject them.
- Variant uniqueness.Distinct ID count should match row count. If it doesn’t, your flatten step has a join bug, usually an inventory-location join that fans out one row per location per variant.
The audit is a habit, not an event
Catalogs drift. Suppliers change SKUs. Photographers re-upload images at lower resolution. Whoever controls the source data will, at some point, make a change that breaks the feed. The audit needs to run on every push, not just the first one.
I packaged the eight checks (and 120 more) into a Google Sheets add-on called Feed Audit Tool. It runs the full set in 30 seconds on a 50K-row feed, produces a color-coded report with cell-level clickable hyperlinks, and sells for $29 because it saves me an hour every time I run it. If you would rather run the checks yourself, the list above is the starting point.
And if you are tired of running the audit by hand, that is what SnowPipe is for: a Shopify-to-GMC sync tool with the audit logic baked in, so the feed is validated automatically on every push and the only pending statuses you see in GMC are the legitimate Google review windows, not the stuck states from a sync that quietly broke.