ARLing

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

<g:id>SKU-JUMPER-NAVY-M</g:id>

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

<g:title>Merino Wool Jumper, Navy, Medium</g:title>

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

<g:description>100% merino wool jumper, ribbed cuffs and hem, machine washable at 30 degrees.</g:description>

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

<g:link>https://shop.example.com/products/merino-jumper?variant=10293</g:link>

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

<g:image_link>https://cdn.example.com/products/jumper-navy-1200.jpg</g:image_link>

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

<g:price>39.90 EUR</g:price>
<g:sale_price>29.90 EUR</g:sale_price>

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

<g:availability>in_stock</g:availability>

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

<g:condition>new</g:condition>

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

<g:gtin>4006381333931</g:gtin>

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

<g:brand>Example Knitwear</g:brand>

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

<g:item_group_id>10293</g:item_group_id>
<g:color>Navy</g:color>
<g:size>M</g:size>

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

<g:shipping>
  <g:country>SK</g:country>
  <g:price>3.90 EUR</g:price>
</g:shipping>

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 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

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 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