Notes
Google Merchant Center feed errors explained: the 12 rejections that block most products and how to fix each in the feed
Andrej Lauko, ARLing · 5 September 2026
Google Merchant Center and Meta Commerce Manager both work the same way underneath. A scheduled fetch pulls your feed file (XML, TXT or CSV) from a URL or an upload, a parser reads it row by row against a fixed attribute list, and any item that fails a required-attribute check or a format rule gets an item-level disapproval instead of blocking the whole upload. The rest of the feed still goes live, so a batch of bad rows can sit disapproved in Diagnostics for weeks without anyone opening that tab. The twelve causes below follow Google's product data specification and Meta's catalog fields reference, in the order they most often show up on a Shopify or WooCommerce export.
01
Missing or invalid id
`Missing value: id`
Google's spec says to "use a unique value for each product. Use the product's SKU where possible," capped at 50 characters. Meta requires the same content id, unique within the catalog, up to 100 characters, and it must differ from any item_group_id. A feed that reuses the parent product id for every size and colour does not raise an error, it just overwrites the earlier rows in Diagnostics.
Fix
SKU-JUMPER-NAVY-M
In Shopify, map id to the variant id or SKU, not the product id. In WooCommerce, export the variation SKU for every row, not the parent post ID.
02
Missing or invalid title
`Missing value: title`
Google caps title at 150 characters and warns: "don't include promotional text like 'free shipping', all capital letters, or gimmicky foreign characters." Meta caps title at 200 characters, recommends under 65 to avoid truncation, and expects it "written in title case."
Fix
Merino Wool Jumper, Navy, Medium
Strip any ALL-CAPS badge text or "FREE SHIPPING" string a theme or plugin appends to the title field before export.
03
Missing or invalid description
`Missing value: description`
Google allows up to 5000 characters and says to "include only information about the product," no promotional text or all caps. Meta caps description at 9999 characters, plain text only, no HTML and no links, and it must differ from the title.
Fix
100% merino wool jumper, ribbed cuffs and hem, machine washable at 30 degrees.
Run the description through a strip-tags step (WooCommerce's `wp_strip_all_tags()` or Shopify's `strip_html` filter) so leftover `<p>` and `<br>` tags from a WYSIWYG editor do not reach the feed.
04
Missing or invalid link
`Invalid value: link`
Google requires the link to sit "on your verified domain name," start with http or https, and use "an encoded URL that complies with RFC 2396 or RFC 1738." Meta requires it to "begin with http:// or https://" and point to the business's own domain, not a marketplace or aggregator page.
Fix
https://shop.example.com/products/merino-jumper?variant=10293
Replace any staging or preview domain left over from a template export, and URL-encode spaces and ampersands rather than leaving them raw.
05
Missing or invalid image_link
`Invalid value: image_link`
Google raised the minimum to 500 by 500 pixels, enforced from 31 January 2027, and rejects "a placeholder or a generic image," scaled-up thumbnails, watermarks or borders. Meta requires images "at least 500 x 500 pixels" in JPEG or PNG, under 8 MB.
Fix
https://cdn.example.com/products/jumper-navy-1200.jpg
Point image_link at the CDN URL of the real product photo, not the lazy-load placeholder GIF that some Shopify and WooCommerce themes render before the actual image loads.
06
Invalid price, currency, or a price that does not match checkout
`Price mismatch`
Google's rule covers both problems at once: "accurately submit the product's price and currency, and match with the price from your landing page," using ISO 4217 currency codes. Meta wants the price "as a number, followed by a space and then the 3-letter ISO 4217 currency code," no currency symbols, one currency per file.
Fix
39.90 EUR
29.90 EUR
Send price as a plain number plus a space plus the code, not "€39,90". When the store shows a discount at checkout, feed `sale_price` as well, so the feed and the cart always agree.
07
Invalid availability values
`Invalid value: availability`
Google accepts exactly four values, in_stock, out_of_stock, preorder, backorder, and must "match the availability from your landing page." Meta accepts only two, in stock and out of stock, "must be written in U.S. English," lowercase, separated by a space rather than an underscore.
Fix
in_stock
Map the plugin's raw stock boolean or a translated word explicitly to the exact enum for each destination, since Google and Meta do not share the same spelling.
08
Missing or invalid condition
`Invalid value: condition`
Google's condition attribute takes new, refurbished or used, required whenever a product is not new. Meta accepts the same three values and lists condition as required for every item.
Fix
new
Default the column to "new" in the export template instead of leaving it blank when the store never sells used stock.
09
GTIN checksum errors and duplicate GTINs
`Value doesn't meet requirements: gtin`
Google caps gtin at 50 numeric characters, 14 per value, and warns plainly: "if you submit a product with an incorrect GTIN value, your product will be disapproved." Meta accepts UPC (12-digit), EAN (13-digit), JAN or ISBN-13, "no dashes or spaces."
Fix
4006381333931
Strip spaces and dashes before export, check the trailing digit is a valid checksum rather than a transposed copy from a spreadsheet barcode column, and never reuse one GTIN across colour or size variants, since each is a physically different product with its own code.
10
Missing or invalid brand
`Missing value: brand`
Google requires brand on new products outside a short list of exempt categories, and it rejects placeholder text outright: "don't submit values such as 'N/A', 'Generic', 'No brand', or 'Does not exist'," capped at 70 characters. Meta caps brand at 100 characters.
Fix
Example Knitwear
For a private-label store, feed the store's own registered brand name consistently, not the word a plugin inserts by default when the field is left empty.
11
item_group_id and mismatched variant attributes
`Inconsistent variant attributes`
Google requires item_group_id to be "a unique value for each group of variants," kept the same across updates, alongside consistent colour, size or material per row. Meta requires the same field to be "unique and differ from all content IDs," so it can never equal any variant's own id.
Fix
10293
Navy
M
In Shopify, the product id (not the variant id) is a safe item_group_id. In WooCommerce, use the parent product ID for every variation row, and spell the colour and size attributes identically across all variants of the same product.
12
Shipping and tax setup errors
`Missing value: shipping`
Google leaves shipping cost to either the feed's shipping attribute or the account's Shipping settings, and it is explicit about tax: "for the US and Canada, don't include any taxes" in the price, while "for all other countries, include value added tax (VAT) or Goods and Services Tax (GST) in the price." Meta reads shipping cost from the feed's shipping attribute or the catalog's shipping profile; leaving both empty leaves checkout cost unknown to either platform.
Fix
SK
3.90 EUR
EU stores keep VAT inside price and leave the tax attribute empty. US stores strip tax out of price and set it in either the tax attribute or Merchant Center's account-level tax settings, not both.
13
Check the feed before you submit it
Fixing twelve attributes one export at a time does not scale past a few dozen products. [Feed Doctor](https://arling.sk/feed-doctor/) runs 31 rules against the same checks above, entirely in your browser, for Google Shopping XML or TXT, Meta catalog CSV, Shopify's products.json, WooCommerce exports and generic XML or CSV. Nothing is uploaded anywhere; it flags exactly which id, price, GTIN or availability rows would fail before Google or Meta ever see them.
[Open Feed Doctor](https://arling.sk/feed-doctor/)
14
A clean feed also feeds an AI shopping assistant
An AI shopping assistant answers customer questions from the same feed used for Shopping ads. A missing GTIN, a stale price, or a product still marked in_stock after it sold out gives the assistant the same wrong answer a shopper would get from a broken listing page. [ARLing Asistent](https://arling.sk/asistent/) is grounded in a store's own feed for that reason: the checks that keep a feed out of Merchant Center's disapproval queue are the same ones that keep an assistant from confidently repeating an outdated price or stock level.
Frequently asked questions
Why does Merchant Center disapprove a product that looks fine on the website?
Merchant Center reads only the feed row, not the live page. A stale export, a cached price, or a plugin that has not re-synced after a sale still shows the old value to Google, even though checkout charges the correct amount.
Do Google Shopping and Meta need two separate feeds?
They read overlapping but not identical rules: availability uses in_stock versus in stock, price formatting and GTIN length differ. One feed can pass Google and fail Meta, so check each destination against its own rules rather than assuming one export satisfies both.
How often does a feed need to be re-checked?
Any time price, stock, or product attributes change. Google and Meta re-fetch a scheduled feed on their own interval, commonly daily, so an error introduced today can sit disapproved for a full day or more before it shows up in Diagnostics.
Does fixing these 12 issues guarantee approval?
No. These are the attribute-level rejections that block most products, but Merchant Center and Meta also run account-level and policy reviews, misrepresentation, prohibited content, destination restrictions, that a correctly formatted feed does not resolve by itself.
Sources
- Google Merchant Center Help: Product data specification
- Meta Business Help Center: Product data specifications for catalogs in Commerce Manager
Originally published at arling.sk. Written by Andrej Lauko with AI assistance; every rule links to the official documentation it comes from.
Top comments (0)