The free feed check reads your feed or your Shopify store’s public product list, runs 29 checks on every product it read (12 on every variant, for a store address), opens a sample of your images to measure them and a sample of your product pages to compare prices, and scores the result out of 100. It shows, before and after, 9 kinds of change a FeedRobin feed makes and 4 the check suggests you make (fewer of each for a store address).
What it reads
A Google-format XML feed (RSS or Atom shape), a Heureka or Compari XML feed, or a CSV/TSV export, by URL, up to 100 MB; larger files are cut at the last whole product and the report says so. A Shopify store address is also accepted: the check then reads up to 25,000 products of the store’s public product list, and the report says when the store has more. From that list it takes no barcodes, MPN, identifier_exists, Google product category or condition, and for stock only whether each variant is available. It gives every variant its product’s id as group id and one currency for the whole store, when the store states one, and does not look for repeated ids. These 17 checks are left out of the report on a store address:
- Products with an id that is already used by another item
- Products with no valid barcode (GTIN)
- Products with nothing to identify them by
- Products with a variant with no group id
- Products with a different currency from the rest of the feed
- Products that have a price with three digits after its only separator
- Products that have a price read with its separator as thousands
- Products with “used” or “refurbished” in the title but condition new
- Products with no condition, or one other than new, used or refurbished
- Products with no availability
- Products with an availability value no channel recognises
- Products with the spaced "in stock" spelling
- Products with preorder or backorder availability and no availability_date
- Products with no Google product category
- Products with a category that is not in Google's taxonomy
- Products with identifier_exists set to false
- Products with identifier_exists set to false and a GTIN
In a feed file, rows without an id, title, link or price are dropped. Rows sharing an id with an earlier row are counted as duplicates and dropped too; the report gives that count. Google’s product data specification is the reference for what each field must contain, and our attribute reference explains each field in plain English.
The 20 checks that score
The weight is the deduction when every product is affected; a defect on a tenth of the catalogue costs a tenth of it. “File only” marks checks that mean something about a raw file and cannot occur in the catalogue we serve, because the pipeline drops or normalises those rows on the way in.
| Check | Weight | Severity | Merchant Center |
|---|---|---|---|
| Products with no image Google and Meta list an image as required. Add a product photo in your store. | −25 | Critical | Missing value [image_link] |
| Products with an id that is already used by another item · file only Google asks for a unique id for each product, and Meta ignores every item whose id appears more than once. Give every variant its own id — we keep only the first of each and never serve a duplicate. | −20 | Critical | Reused value [id] |
| Products with no usable price Google reports a price of 0 as invalid. Check the price of these products in your store. | −20 | Critical | Missing value [price] |
| Products with no valid barcode (GTIN) Google states that products with a missing or incorrect GTIN may have limited visibility. Add barcodes in your store. A feed built in the FeedRobin app leaves out a barcode from your store or feed file that has the wrong length or check digit, is a placeholder such as all zeros, or falls in Google’s restricted or coupon ranges when read as 13 digits; the ranges are checked on 12- and 13-digit barcodes and on 14-digit ones that start with 0. | −18 | Critical | Limited performance due to missing identifiers [gtin] |
| Products with no description Google and Meta list description as required, and Meta asks that it differ from the title. Write a sentence or two in your store; we clean the formatting for each channel. | −12 | Critical | Missing value [description] |
| Products with nothing to identify them by For products without a GTIN, Google asks for the brand and the manufacturer's part number (MPN) instead. These have no GTIN and are missing the brand, the MPN or both. | −10 | Warning | Limited performance due to missing value [brand] |
| Products with no brand Add the brand to each product in your store, and check that the feed sends it in the brand attribute. Google requires brand for each product with a clearly associated brand or manufacturer. | −8 | Warning | Limited performance due to missing value [brand] |
| Products with a title over 150 characters Google cuts the title at 150 characters. Put brand, product and the key attribute first. | −6 | Warning | Title truncated |
| Products with promotional text in the title A title with prices, "SALE", "free shipping" or ALL CAPS does not meet Google’s title requirements, and Google disapproves products that don’t follow them. Move the offer out of the title. | −6 | Warning | Additional or promotional info |
| Products with an image smaller than 500×500 · not scored in the free check From 31 January 2027 Google requires product images of at least 500×500 pixels and recommends around 1500×1500. Google states it will optimize some smaller images; those show a warning in Merchant Center. To replace an image, upload a larger photo to the product in your store. | −10 | Warning | Image too small |
| Products with an image on http:// Check whether the image host serves these images over https. | −6 | Warning | Invalid image [image_link] |
| Products with a variant with no group id These share a product page with other items and have no item_group_id. Google requires item_group_id for variants in Shopping ads targeting Brazil, France, Germany, Japan, the UK or the US, and for all variants in free listings. | −5 | Warning | Missing value [item_group_id] |
| Products with a different currency from the rest of the feed If you sell in several currencies, each needs its own feed — we build one per channel and country. | −5 | Warning | Missing value [price] |
| Products with a product link on http:// Check whether these product pages open over https. | −4 | Warning | Unavailable desktop landing page |
| Products with a description under 50 characters Add a longer description to these products in your store. | −4 | Warning | Missing value [description] |
| Products with an id over 50 characters Google and Microsoft allow up to 50 characters in id. Use a shorter id that never changes, such as the variant id or the SKU. FeedRobin’s Google, Microsoft and Custom XML feeds do not cut the id to 50 characters. | −4 | Warning | Product ID too long |
| Products with no availability · file only Google lists availability as required for all products, Meta and TikTok as required for each product, and OpenAI rejects a row without it. Add in_stock, out_of_stock, preorder or backorder to these products in your export. A feed FeedRobin builds from this file sends them as in stock. A file in Heureka's or Compari's format gives a delivery time instead (DELIVERY_DATE, DeliveryTime), which this check does not read as availability. DeliveryTime NO, Compari's value for a product that cannot be ordered, is read as out of stock and not counted here. | −14 | Critical | Missing value [availability] |
| Products with an availability value no channel recognises · file only Google lists in_stock, out_of_stock, preorder and backorder; Meta lists in stock and out of stock. A translated word, a yes/no or a typo is not one of these values. A feed FeedRobin builds from this file translates the stock words, yes/no values and stock quantities it knows, and treats any other value as out of stock. | −14 | Critical | Invalid value [availability] |
| Products with identifier_exists set to false and a GTIN · file only These products send a GTIN with a valid check digit and set identifier_exists to false. Google's identifier_exists page says that products with identifier_exists incorrectly set to false, where there is evidence that a product identifier exists, “will receive a warning.” Remove identifier_exists from these products, or set it to true. | −5 | Warning | Incorrect value [identifier_exists] |
| Products that are out of stock They are marked out of stock in the feed. Meta does not show out-of-stock products in ads. No action needed. | −7 | Informational | — |
The 10 checks that are reported but never scored
These cost nothing in the score.
| Products that have a price with three digits after its only separator The other values in the price and sale price fields of this file do not settle whether the separator in these is the decimal or the thousands one, so these are read as decimals: a feed FeedRobin builds from this file sends 1.249 as 1.25. Google rounds past two digits after the decimal point, and Heureka.sk does not allow the dot as a thousands separator. If 1.249 means 1249, write all of them with no thousands separator, such as 1249.00. | Warning | — |
| Products that have a price read with its separator as thousands These have three digits after a dot or comma, such as 1.234, and other prices in the same file show that separator is not the decimal one (1.234,56 or 89,90). So 1.234 is read as 1234.00. | Informational | — |
| Products that have no recognised size or no recognised colour, and look like clothing For apparel in Shopping ads targeting Brazil, France, Germany, Japan, the UK or the US, and for all apparel in free listings, Google requires colour and, for clothing and shoes, size. If these products are not apparel, this does not apply: it doesn't count against the score either way. | Warning | Missing value [color] / [size] / [gender] / [age_group] |
| Products with “used” or “refurbished” in the title but condition new With automatic item updates off, Google disapproves a product whose condition disagrees with its other attributes. Set condition to used or refurbished on these. If they are new, ignore this: it doesn't count against the score. | Warning | Condition mismatch detected: condition [condition] |
| Products with no condition, or one other than new, used or refurbished Meta and TikTok list condition as required for each product, with the values new, refurbished and used; Google requires it for used and refurbished products. Add one of the three to these products in your export. A feed FeedRobin builds from this file sends them as new; the Heureka, Compari and idealo feeds carry no condition. It doesn't count against the score. | Warning | — |
| Products with the spaced "in stock" spelling Meta lists the spaced form. Google's current spec lists in_stock with an underscore. | Warning | Invalid value [availability] |
| Products with preorder or backorder availability and no availability_date Google's availability page requires availability_date for products set to preorder or backorder, and the expected shipping date on the product page. Add availability_date to these products in your export, in the form YYYY-MM-DDThh:mm±hhmm, or in Google Merchant Center with a supplemental data source (Advanced data source management add-on). It doesn't count against the score. | Warning | — |
| Products with no Google product category Without it, Google assigns a category itself. Pick the closest value from Google's product taxonomy and set it in your export. Or map your own categories to Google's once, on the Categories page, and every product in them gets it. A feed is valid without it, so this doesn't count against the score. | Warning | Invalid value [google_product_category] |
| Products with a category that is not in Google's taxonomy Google accepts only the numeric id or the full path from the root. Anything else is reported as “Invalid value (Google product category)”; Google assigns a category itself. No effect on the score. | Warning | Invalid value [google_product_category] |
| Products with identifier_exists set to false These products send no GTIN and set identifier_exists to false. Google lists custom and handmade goods, vintage products, antiques and books published before 1970 among products that might not have unique product identifiers. It does not count against the score. | Informational | Incorrect value [identifier_exists] |
Beyond the file: images and product pages
Two things a feed cannot tell you, so the check goes and looks. It downloads the first few kilobytes of up to 20 images spread across the feed and reads their pixel size from the file header, because Google requires at least 500×500 from 31 January 2027; see Google’s image_link specification. And it opens up to 8 product pages, reads the price from their structured data or visible markup, and compares it with the feed’s, because the price specification asks that the landing page price matches the price in the product data; see the price mismatch guide. Both are samples, and the report says how many it looked at. Neither number is extrapolated into a total.
What the feeds rewrite, and what the check suggests
The report shows up to two examples of each change, before and after, taken from your own rows. Nothing here invents data: every value shown is made from one that is already in the feed. A FeedRobin feed makes these:
- Read an element name inside a product written in other capital letters, such as g:Availability, as the same element (
element name) - Translate stock words the channels don't know (
availability) - Read a number on its own as a stock quantity: in stock or out of stock (
availability) - Treat an availability value in your file that it does not recognise as out of stock (
availability) - Read DeliveryTime NO, Compari's value for a product that cannot be ordered, as out of stock where the file gives no availability (
availability) - Titles over 150 characters shortened to 150 or fewer, in the Google, Microsoft, OpenAI and Custom XML feeds (
title) - Leave out a category Google does not have (
google_product_category) - In a feed built in the FeedRobin app, leave out a GTIN with a wrong length, check digit or character, in a restricted or coupon range when read as 13 digits, or a placeholder such as all zeros (
gtin) - Write availability the way Google's spec spells it (
availability)
These the check suggests. A FeedRobin feed does not make them:
- Image links on https (
image_link) Where: your store or export, or the image_link column of a corrections sheet in FeedRobin. - Product links on https (
link) Where: your store or export. FeedRobin does not switch product links to https. - Titles without promotional text or all capitals (
title) Where: your store or export, a rule on the title in FeedRobin for a phrase, or the title column of a corrections sheet in FeedRobin. - A shared group id for variants on the same product page (
item_group_id) Where: your export. FeedRobin does not group variants your file leaves ungrouped.
What stays a person’s job, and why
The check reports these and does not rewrite them. The reason is given for each.
- Missing barcodes. A GTIN is assigned by the manufacturer, and the check found no valid one in your feed. Google asks not to make up or guess identifiers, and products with incorrect identifiers may be disapproved — the barcode guide covers where to add a GTIN in Shopify and WooCommerce.
- No identifier at all. With no barcode and no brand + part number, the options are to supply the real values or to declare identifier_exists = FALSE, and only you know which is true. For a store connected by feed URL, FeedRobin’s Google, Meta, Microsoft and Custom XML feeds send identifier_exists = no for these products; for a Shopify store, they send none.
- Missing brand. The first word of a title is not always the brand, and your own shop name isn't the brand unless you make the product or it is a private-label product. FeedRobin’s OpenAI feed sends your Shopify store’s name in its place (its myshopify.com handle when the store has no name) or, for a store connected by feed URL, the host name of that URL.
- Missing descriptions. Google asks that the description be consistent with the other details in the data source and on your landing pages, so a description written here and not on your page might not be consistent with it. When the field is empty, FeedRobin’s OpenAI, TikTok and Pinterest feeds send the title in its place.
- Descriptions under 50 characters. Same reason: Google asks that the description be consistent with your landing pages.
- Missing images. There is no photo in the file to repair. The product needs one uploaded.
- Images under 500×500. FeedRobin does not change image files. A larger photo has to be uploaded to the product in your store.
- No price. We never rewrite a price. Google’s price specification asks that the landing page price matches the price in the product data, so the number has to come from your shop.
- Mixed currencies. Converting prices would invent numbers your product pages don't show. Split the feed per market instead.
- Duplicate ids. Which of two rows sharing an id is the real product is a question only your catalogue can answer.
- Missing size or colour. These are facts about the garment. We map them across on connect from options and attributes whose name is one we read, such as Size, Taille, US Size, Colour or Couleur: a Shopify store's variant options and, through our plugin, a WooCommerce store's attributes (a variation's own, else the product's when it holds one value). A correction sheet can set them. A size or colour written only in a title or a tag is not read.
- No availability date on preorder or backorder. These products have no availability_date in the file, and FeedRobin does not write one.
- No product category. A feed file gives us your own words for the category, and guessing Google's branch from them can put products in the wrong category. Connect a Shopify store and we fill this in from the store's product category: Shopify publishes mapping rules from its product taxonomy to Google's, and a product with no category in Shopify saves as uncategorized. From a file, FeedRobin does not guess it; you can map your own categories to Google's on the Categories page.
The same checks, one value at a time
Three of the checks are also available as small tools that run in your browser, for a single value: the GTIN check digit validator, the title length and policy checker and the availability value translator.
What it does not check
Anything Google decides by looking at pixels or at your website as a whole: promotional overlays and generic images, landing page availability and functionality, policy questions such as misrepresentation, tax and shipping settings, and whether your Merchant Center account is verified. The Merchant Center error library covers those issues and says on each page whether the check can see it.
Questions merchants ask
Does the check read my whole feed?
Up to 100 MB of it. A larger file is cut at the last whole product and the report says how many products it covers. Connecting a Shopify store reads every active product; a store connected by its feed URL syncs a file of up to 100 MB that downloads within 2 minutes.
Why does my Shopify store URL give a report without barcode checks?
Pasting a store address reads the store's public product list. The check takes no barcodes, MPN, identifier_exists, Google product category or condition from it, and for stock only whether each variant is available. The report on a store address leaves out 17 checks, listed on this page under “What it reads”. Paste a feed URL for the full set, or connect the store and the barcode and category checks run too.
How is the score calculated?
Each check has a weight; the deduction is the weight times the share of products affected, summed across checks. 100 minus that is the score, floored at 5. 85 and above is Good, 60 to 84 is Fair, below 60 Needs work. Checks with weight 0 are reported and never scored.
Is the check the same one a paid account gets?
Mostly. In the app, each feed's quality report (Health, on the feed's page) runs the same checks on the feed's products after its country and rules, as of the last sync. It leaves out the checks for missing availability and missing condition, and the two checks on a price's separator; outside the Google and Custom XML feeds, the check for a missing availability date; outside the Google, Microsoft and Custom XML feeds, the check for an id over 50 characters; and outside the Google, Microsoft, OpenAI and Custom XML feeds, the check for a title over 150 characters. Only the free check opens a sample of product pages to compare prices and a sample of images to measure them, and only the free check shows, before and after, up to two examples of each rewrite and suggestion listed on this page under “What the feeds rewrite, and what the check suggests”. It runs on the feed URL or Shopify store address you paste, once, or every week if you start a watch.
Do you keep my feed?
The file is read, scored and shown to you, not stored. The finished report, with the sample of products it shows, stays in the server’s memory for up to 30 minutes; emailing it or starting a watch on the feed while it is there does not fetch the URL again. We keep an anonymous usage record of each check you run (the feed’s domain name, whether it could be read and, if not, why, the score, the number of products and how many failed each check, and how you found the tool), and we receive a copy of the report by email, with the feed’s full URL. If you start a watch, we keep the email address you typed, the feed’s full URL and the result of its last check. If you ask for the report by email, we keep the address you typed, with the feed’s domain name, the score, whether you agreed to hear from us again and, if you did, the issue the first follow-up email is about.
Sources
- Product data specification — Google Merchant Center Help
- Image link [image_link] — Google Merchant Center Help
- Price [price] — Google Merchant Center Help
- Availability [availability] — Google Merchant Center Help
- Availability date [availability_date] — Google Merchant Center Help
- Condition [condition] — Google Merchant Center Help
- ID [id] — Google Merchant Center Help
- How to fix: Invalid product price — Google Merchant Center Help
- GTIN [gtin] — Google Merchant Center Help
- Description [description] and structured description [structured_description] — Google Merchant Center Help
- About unique product identifiers — Google Merchant Center Help
- Brand [brand] — Google Merchant Center Help
- Title [title] and structured title [structured_title] — Google Merchant Center Help
- Merchant Center product data specification update 2026 — Google Merchant Center Help
- Item group ID [item_group_id] — Google Merchant Center Help
- Identifier exists [identifier_exists] — Google Merchant Center Help
- Color [color] — Google Merchant Center Help
- Size [size] — Google Merchant Center Help
- How to fix: Condition mismatch detected: condition [condition] — Google Merchant Center Help
- Google product category [google_product_category] — Google Merchant Center Help
- Fixing Merchant Center disapprovals for product data quality violations — Google Merchant Center Help
- Catalog fields reference — Meta for Developers
- Product attributes — Microsoft Advertising
- Catalog Product Parameters — TikTok Ads Manager Help
- Products feed specification — OpenAI
- Heureka Offer Feed XML Documentation — Heureka
- Informaţii privind formatul fişierului cu datele produselor (the product data file format) — Compari.ro
- Heureka.sk XML specification — Heureka.sk
- Create a product data source — Google Merchant Center Help
- Shopify’s Standard Product Taxonomy — Shopify Help Center
- Integrations (product-taxonomy/data/integrations/README.md) — Shopify on GitHub