Google Shopping feed specification
The Google Shopping feed specification is Google's published contract for the attributes a product feed must contain to be accepted by Merchant Center and shown in Shopping ads and free listings. It defines required attributes such as id, title, description, link, image_link, availability, and price, plus conditionally required ones like gtin, mpn, brand, and item_group_id. Fail the contract and the item is disapproved, not just ranked lower.
What the specification actually requires
The spec is a field-level contract. Each attribute has a name, a format, and a rule about when it applies. Merchant Center validates on ingest, then re-checks the values against your landing page.
The base required set applies to every item you submit:
| Attribute | Format | Example value |
|---|---|---|
id | Max 50 chars, stable, unique | HB-38-16-G8-2 |
title | Max 150 chars | 3/8-16 x 2 in. Grade 8 Hex Bolt, Yellow Zinc |
description | Max 5,000 chars | SAE J429 Grade 8 hex cap screw, 150,000 psi tensile... |
link | Verified domain URL | https://example.com/p/hb-38-16-g8-2 |
image_link | 100x100 px min (250x250 apparel), no watermarks | https://cdn.example.com/hb-38-16-g8-2.jpg |
availability | Enum | in_stock |
price | Number + ISO currency | 12.40 USD |
Those seven get you accepted. They do not get you matched, and matching is what determines whether the item ever appears against a query.
The identifier rule is where most feeds break
Google treats brand, gtin, and mpn as conditionally required: they apply unless the product genuinely has no manufacturer identifier. The logic is strict.
- If the item has a manufacturer-assigned GTIN, send it. Omitting it on a branded product triggers a disapproval, and a disapproved item is gone from Shopping until you fix it.
- If there is no GTIN but there is a part number, send
brandandmpntogether. - If neither exists, meaning custom fabrication, cut-to-length wire, or your own private-label line without barcodes, set
identifier_existstono.
The failure mode in B2B is absence. A distributor listing a UL listed 600V wire connector often has the manufacturer's catalog number sitting in the ERP as a free-text string, and no GTIN anywhere. The supplier's PDF has it. Nobody extracted it.
Setting identifier_exists: no to make the error disappear is the common shortcut. It works, briefly. Then the item stops matching to the product cluster and drops out of the comparison listings that cluster feeds. It underperforms quietly, with a green checkmark in Merchant Center.
Required, recommended, and conditional are three different bars
Reading the spec as a binary pass/fail misses most of its value. Three tiers do different work:
| Tier | Examples | What happens if missing |
|---|---|---|
| Required | id, title, price, image_link | Item disapproved and never served |
| Conditionally required | gtin, mpn, brand, condition, color, size, age_group, gender, item_group_id, shipping | Disapproved only when the condition applies; silently weak otherwise |
| Recommended | google_product_category, product_type, additional_image_link, product_detail, material, pattern | Accepted, but matching and filtering degrade |
google_product_category is the clearest case. It is technically optional, but it determines tax treatment, category policy, and how Google interprets the item. Leave it blank and Google infers a category from your title and description. On a catalog of 40,000 fasteners with terse titles, that inference is a coin flip.
Variants are the other quiet trap. A 1/2 in. and a 3/8 in. chuck version of the same 20V cordless drill need a shared item_group_id plus a differentiating attribute. Without the grouping, they compete against each other.
Feed values are checked against the landing page
Format validation is only half the bar. Google crawls the landing page and compares what it finds there against what you sent. Three checks account for most of the surprises.
- Price. The
pricevalue has to match the price a buyer sees on the PDP, in the same currency, with tax handled the way the destination country expects. A feed that lags a promotional price change by a day gets flagged for price mismatch. - Availability. If
availabilitysaysin_stockwhile the PDP shows a backorder notice or a greyed-out add-to-cart button, the item is disapproved for availability mismatch. Login-gated B2B pricing makes this harder, because the crawler sees the anonymous view of the page. - Image reachability.
image_linkhas to resolve for Googlebot, with no login wall, robots.txt rule, or hotlink protection in the way. A placeholder graphic counts as a failure even when the URL returns 200.
This is why a feed can satisfy every format rule in the spec and still sit at zero impressions. The spec describes the values. The crawl decides whether they were true.
Why the spec is hard to satisfy in B2B
The spec assumes you have the values. Distributor and manufacturer catalogs usually don't, because the attributes were never captured at item setup.
What that looks like in practice:
- Titles inherited from a 40-character ERP field:
HEXBLT 3/8-16X2 G8 YZ - Descriptions that are a supplier's copy-paste, or empty
- GTINs present on the A-items, absent across the long tail
colorandsizeliving inside the title string instead of in fields- Images on a shared drive, with no URL Google can crawl
A PIM will store gtin, color, and material the moment someone fills them in, and flag the cell while it is empty. Flagging an empty cell is not the same as filling it.
That gap is a data-completion problem. Someone has to read the manufacturer's spec sheet, the UL file, and the supplier PDF, extract the thread pitch and the voltage rating and the GTIN, normalize the units, and write the values back. The PIM stores your product data; completing it is separate work.
The practical test: run a fill-rate report against the required and conditionally required fields for your top revenue categories. If gtin, color, and size come back mostly empty, the spec is not your problem. The empty cells are.
Frequently asked questions
What attributes are required in a Google Shopping feed?
Every item needs id, title, description, link, image_link, availability, and price. Beyond that, condition is required for used and refurbished goods, and identifiers (brand plus gtin or mpn) are required unless the product genuinely has none. Apparel and variant groups add color, size, age_group, gender, and item_group_id. Everything else, including google_product_category, product_type, and additional_image_link, is recommended but affects matching.
Do I need a GTIN for every product?
No, but you need a defensible reason not to. If the manufacturer assigns a GTIN, Google expects it, and omitting it on a branded item causes disapproval. For custom-made or GTIN-exempt products, send brand and mpn and set identifier_exists to no. Guessing a GTIN or reusing a supplier's number across your variants is worse than declaring the exemption honestly.
What is the difference between google_product_category and product_type?
google_product_category is Google's own fixed taxonomy. You pick an existing node like 'Hardware > Tools > Power Tools > Drills'. product_type is your internal category string, free text, and Google does not validate it. The first drives tax, category-level policy, and matching. The second is useful for campaign structure. Send both; they answer different questions.
Why do items get disapproved when the data looks fine?
Usually the value is present but wrong in a way Merchant Center checks against reality. Price mismatches your landing page, availability says in_stock when the PDP says backordered, image_link 404s or returns a placeholder, or the GTIN fails checksum. The spec's format rules are only half the bar. Google crawls the page and compares. Consistency between feed and PDP is the other half.
How does the Shopping spec differ from what a PIM stores?
A PIM stores whatever attributes you defined and enforces the rules you configured. The Shopping spec is an external contract you do not control, with its own field names, units, enums, and conditional logic. Mapping between them is mechanical. The hard part is that the PIM often has no value to map: the GTIN, the color, the size were never captured. That gap is a data-completion problem. The mapping was never the hard part.