The feed is not a technical export: it is the ad. Every attribute is a keyword, a selling point or a filter that decides whether you show up at all. This lesson walks through the entire specification with the question "what does each field do for profitability?" in mind, not just "what does Google require?".
The required ones (without them, disapproved)
| Attribute | What it is | What actually matters |
|---|---|---|
id |
A unique and stable identifier | If it changes, the product loses its history (and PMax's learning). Use the SKU, never an export counter |
title |
Title (≤150 characters; about 70 are visible) | The attribute that moves impressions most — see below |
description |
Description (≤5,000) | Indexed for relevance; put the essentials in the first 160-500 characters; no HTML and no promotional copy |
link |
The product page URL | The same URL the user sees (with the variant selected); https; no redirects to the homepage |
image_link |
Main image | White or neutral background, product filling ≥75% of the frame, ≥800×800 px recommended, no text or watermarks |
price |
Price with currency (19.90 EUR) |
The same as the website, with VAT (Europe); the struck-through price is price, the reduced one goes in sale_price |
availability |
in_stock, out_of_stock, preorder, backorder |
It has to reflect the website at that moment; mismatches = disapproval |
condition |
new, refurbished, used |
Required; it affects the auction (used items compete separately) |
brand |
Brand | Required except for own-brand products with no GTIN (see identifiers); "brand + product" queries depend on it |
gtin |
Barcode (EAN-13 in Europe, UPC, ISBN…) | The key to Google's catalogue: with a GTIN the product is matched to its listing (reviews, comparison, better relevance) |
mpn |
Manufacturer part number | Needed when there is no GTIN |
identifier_exists |
no when the product genuinely has no identifiers (crafts, own brand, vintage) |
Only use it if it is true; declaring it for products that do have them is a policy breach |
Attributes required by vertical: google_product_category in certain
categories (apparel, media, software…), age_group, gender, color,
size in apparel and accessories, energy_efficiency_class on
household appliances (Europe), unit_pricing_measure wherever unit
pricing law applies, multipack, is_bundle…
Unique identifiers: the rule and its exception
Google requires a GTIN when the product has one (it knows because the
catalogue knows). With a valid GTIN: better matching, appearance in
comparison listings and in "popular products". Without a GTIN for a
product that has one: "incorrect/missing unique identifier" → limited
or disapproved. Own-brand products with no barcode:
identifier_exists: no + brand + optional mpn. Buying GTINs (GS1)
is worth it if you sell own-brand products in volume.
The ones that change performance
title: the most profitable attribute
Google matches the query mainly against the title (and then against the description, product type and category). Proven rules:
- The important part first (it gets cut at about 70 characters on
mobile):
Brand + Product + Key attribute (model/size/colour/dimension) + detail. Apparel:Brand Garment Gender Colour Size; electronics:Brand Model Type Feature; homeware:Product Material Dimension Brand. - Include the terms people actually search for (look at the search terms in your Shopping campaign): "men's running trainers" is worth more than "Air Zoom Pegasus 41".
- No shouty capitals, no promotional copy ("sale", "free delivery"), no symbols.
- Variants: each variant's title carries its colour/size → relevance for the query "blue t-shirt size M".
- You can rewrite them without touching the shop using Merchant Center rules or a supplemental feed (below); and you can automate it with the Suite (Shopping Ninja generates optimised titles from the spreadsheet — lesson 6).
Classification
google_product_category: Google's taxonomy (ID or full path). Correct = showing up on that category's queries; generic ("Apparel & Accessories") = poor relevance. Choose the most specific one.product_type: your own free taxonomy (Home > Kitchen > Frying pans). Google uses it for relevance and you use it to structure campaigns (product groups by product_type). In practice it is compulsory for any serious structure.
Price and promotions
sale_price(+sale_price_effective_date): the reduced price; the struck-through price and the discount are shown; it triggers the "price drop" badge.shipping(per country/region, service, price) andshipping_weight: overrides the account setting per product; it must match the checkout.unit_pricing_measure/unit_pricing_base_measure: unit price (required for certain products in the EU).cost_of_goods_sold: cost of acquisition → Merchant Center works out the gross margin in its reports (lesson 5).
Images and detail
additional_image_link(up to 10): alternative views, in use, close detail → more clicks and a better listing.product_highlight(up to 10 short bullet points) andproduct_detail(section/attribute/value): they feed the detailed listing and relevance.color,size,size_type,size_system,material,pattern,age_group,gender: Shopping filters; required in apparel.
Variants done properly
A product with sizes and colours = one row per variant, all sharing
the same item_group_id, each with its own id, title (carrying the
attribute), link (to the variant), image_link (of its colour),
price, availability, color, size. Google shows one and groups
the rest. Classic mistake: a single row for every size → "size not
available" on the website, disapproval on availability.
Custom labels: the structural lever
custom_label_0 … custom_label_4 (up to 100 values each): free values
that only you see and that you use to partition campaigns and bid
differently: margin (high/medium/low), performance (top/middle/tail),
seasonality, newness, stock (high/low), price (bands), own
brand/third-party. Fill them from the ERP or with rules. Without labels,
Shopping structure is limited to category/brand/type.
Data sources (how the feed arrives)
| Source | When | Pros / cons |
|---|---|---|
| Platform (Shopify, WooCommerce, PrestaShop, Magento) | A standard shop | It syncs itself; attributes limited to what the app exports |
| Scheduled file (XML/TSV by URL) | The most common option for bespoke shops | Total control; fetch frequency up to daily (more via API) |
| Google Sheets | Small or supplemental catalogues | Easy to edit; a practical row limit |
| Content API / Merchant API | Large catalogues, prices/stock changing by the minute | Real-time updates (the answer to price mismatches) |
| Automatic website crawl | No feed at all: Google reads the structured data (schema.org) | Convenient but with less control; good as a fallback |
| Automatic item updates | Google corrects price/availability from the page (structured data) | Switch them on: they prevent disapprovals from short-lived mismatches |
Structured data (schema.org/Product with offers) on the product
page: Google uses it to verify price and availability; getting it right
reduces disapprovals.
Supplemental feeds and rules: changing the feed without touching the shop
- Supplemental source: a file/Sheet with
id+ attributes that get added or overwritten on top of the primary feed (rewritten titles, custom labels, categories, highlights). This is the specialist's tool: the shop exports what it can; you fix the rest. - Data source rules: transformations inside Merchant Center — "set
titletobrand++title", "ifproduct_typecontains X,custom_label_0= Y", "replace withindescription", "extract the size from the title". Powerful for simple things; for complex logic, Sheets + a script. - Precedence: rules > supplemental > primary (configurable).
Common feed errors and their fixes
| Error in Diagnostics | Cause | Fix |
|---|---|---|
| Price mismatch | Website with different VAT/offer/variant | Sync it (API or frequent fetch); structured data; automatic item updates |
| Availability mismatch | Out-of-date stock | Same; daily fetch as a minimum |
| Missing/incorrect unique identifier | No valid GTIN | A real GTIN, or identifier_exists: no where appropriate |
| Generic / text-laden / small image | Images taken from the website | Specific, clean images, ≥800 px |
| Invalid category | Path spelled wrongly | Use the taxonomy's numeric ID |
| Missing size/colour value (apparel) | Not exported | Add them (via a supplemental source if need be) |
| Link to the homepage / cannot be crawled | robots.txt, 404, redirects | Allow Googlebot and AdsBot; use the direct URL |
| Title too long / in capitals | The template | Title rules |
| Product limited for "performance" | Poor data quality (few attributes) | Enrich the attributes |
💡 Ninja trick: work the feed like a campaign, not like a file: measure which products get impressions and which do not (the products report), look at the search terms that trigger each one and rewrite the titles using those words. In real accounts, rewriting the titles of the 50 highest-spending products with the "brand + product + searched attribute" structure raises impressions and CTR without touching the bid — and that is exactly what Shopping Ninja automates in its feed titles tab (lesson 6).
What to remember
- The feed is the ad: title, category, product type and images decide impressions and clicks.
- Required attributes exact and synced with the website (a stable
id, price with VAT, availability, a real GTIN or
identifier_exists: no). - The ones that move performance: title, a specific
google_product_category,product_type,sale_price, additional images, highlights/detail, variants withitem_group_idand custom labels for structure. - Sources: platform/file to start with, the API for minute-by-minute price and stock, structured data + automatic item updates as a safety net.
- Supplemental sources and rules = optimising the feed without touching the shop.