I run a small Shopify store. One afternoon I split my shipping policy in two — separate rules for domestic vs. international, nothing exotic — and by the next morning 621 of 739 active products had been disapproved in Google Merchant Center. A 21% drop became an 84% drop overnight, and the actual error Google returned was missing_shipping, which made no sense: the products had shipping info, I'd just moved it.
This is the write-up of what actually went wrong and how I built a small diagnostic tool to catch it faster next time, because the failure mode is common and the fix is a five-minute mistake to make.
Why "missing_shipping" was lying to me
Google's Merchant Center UI reports the symptom, not the cause. missing_shipping reads like "this product has no shipping rate," but what had actually happened was a sync-order race: I split delivery into two policies (domestic / international) in Shopify admin, and Google's feed re-sync started reading the new policy structure before both new policies had propagated rates for every product. For a window of time, some products resolved to a policy that had no rate defined yet for their destination — which Google reports identically to "no shipping info at all."
The fix, once I understood it, was almost insultingly simple: collapse both policies back into one — "All products + Free delivery" — so there's only one rate resolution path, no race, no partial-propagation window. Approved count went 582 → 739 within a day of the resync.
The part that actually cost time wasn't the fix. It was figuring out that a shipping settings change was the cause of a content-status disapproval. Nothing in the Merchant Center UI connects those two. You have to already suspect account settings, not the feed itself.
The tool I built afterward
I didn't want to diagnose this by memory next time, so I built a small script-based toolkit against the Merchant Center API (Content API v2 / Merchant API) that does the diagnosis Google's own dashboard doesn't:
- Groups every disapproval by root cause, not by product — so instead of scrolling 621 individually-flagged products, you see "1 root cause, 621 symptoms"
- Separates NOT_IMPACTED warnings (Google's own "this doesn't hurt you yet" flag) from actual SHOPPING_ADS/FREE_LISTINGS disapprovals, because a lot of noise in a typical feed dashboard is cosmetic
- Distinguishes surface-specific disapprovals (YouTube/Demand-Gen only vs. core Shopping) so you don't burn an afternoon fixing something with zero current revenue impact because the ad campaign using that surface is paused anyway
- Checks account-level settings (shipping, tax, business info) as a first-class diagnosis step, not an afterthought, specifically because of incidents like this one
On a later, smaller incident on the same store — 49 flagged products in one week — the tool traced the whole thing down to exactly one real revenue-impacting product (a category-classifier false positive reading "tea tree" + no product category as a pharma/medical listing). The other 48 were self-clearing pending-review states or YouTube-only warnings with paused campaigns behind them. Knowing which 1 out of 49 actually mattered was the entire value of the exercise.
The general lesson
If you sell on Shopify + Google Shopping and you ever touch shipping policies, tax settings, or return policies at the account level, treat it as a feed-risk change, not a settings change — even if nothing in the UI warns you it's connected to disapprovals. Merchant Center's error messages describe symptoms at the offer level; the actual root causes are disproportionately often account-level settings, classifier false positives on ambiguous wording, or a stale supplemental data source nobody remembers is still live.
I packaged the diagnostic + fix-module toolkit as GMC Feed Doctor if you want the agentic version of this — it's the same root-cause-first approach, proven on the exact 621-product incident above, plus 8 fix modules for the common repeat offenders (identity/GTIN, shipping labels, unit pricing, category coverage, sale-price display, image/content policy).
Top comments (0)