Merchant Feed Checker and Fixer for Google Merchant Center avatar

Merchant Feed Checker and Fixer for Google Merchant Center

Pricing

Pay per usage

Go to Apify Store
Merchant Feed Checker and Fixer for Google Merchant Center

Merchant Feed Checker and Fixer for Google Merchant Center

Checks a Google Merchant Center product feed (TSV, CSV, RSS 2.0 or Atom XML) against Google's published product data specification. One row per item with its problems, plus a corrected feed with only safe mechanical fixes and a change log. Never invents product data.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Madrasco

Madrasco

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Share

Check a Google Merchant Center product feed before you upload it. Give the actor a feed link, upload the file, or paste it; it returns one row per item listing each problem found against Google's published product data specification, plus a corrected copy of your feed with only safe, mechanical fixes applied and a change log of every value it changed.

It never invents product data: titles, GTINs, brands, prices, currencies and categories are never made up or guessed. Anything that needs your own product information is reported, not changed.

Supported feeds

  • Tab-delimited text (.txt / .tsv) and comma-delimited CSV with a header row of attribute names (id, title, image_link or image link, with or without g:). Header names wrapped in single quotes ('id') are rejected with an explanation, because Google would not recognise them.
  • XML: RSS 2.0 or Atom 1.0 with the Google namespace xmlns:g="http://base.google.com/ns/1.0". An Atom feed that leaves out the Atom namespace is still checked, with a warning. XML that is not well-formed is rejected with the line and column of the error (for a bare &, which must be written &, the message says so); it is not repaired.
  • Values the checker does not fix are written back exactly as they were read, including Windows line endings inside descriptions.
  • Plain, .gz, or a .zip holding one feed file. The corrected feed is written in the same format (UTF-8).

What it checks

Rule (dataset rule)WhatFixed automatically?
missing-requiredid, title, description, link, image_link, availability, price present and non-emptyNo
too-longid > 50, title > 150, description > 5,000, brand > 70, mpn > 70, additional_image_link > 2,000 charactersNo (never truncated)
duplicate-idthe same id on more than one itemNo
availability-valuemust be in_stock, out_of_stock, preorder or backorderYes for spelling variants ("In Stock", "out of stock", schema.org InStock); others reported
condition-valuemust be new, refurbished or usedYes for case/schema.org variants; others reported
identifier_exists-valueyes or noYes for TRUE/FALSE, Y/N
price-format"15.00 USD" form: number, space, ISO 4217 codeYes: currency moved after the amount, capitals, decimal comma "12,99" to "12.99", unambiguous thousands separators ("1,299.50", "1.299,00")
price-currencycurrency code present and a real ISO 4217 codeNo: a symbol such as $ or a missing code is reported, never guessed
price-zero, price-valueprice of 0 (allowed only for some contract/subscription goods) or negativeNo
price-ambiguouswarning for an amount with three digits after the point, like "1.299 EUR": Google keeps 2 decimal places and rounds the rest (1.299 becomes 1.30), and the point may be meant as a thousands separatorNo
sale-price-currency, sale-price-not-lowersale_price in the same currency as price and lower than itNo
missing-availability-dateavailability_date required for preorder, asked for backorderNo
date-format, date-orderISO 8601 dates (seconds and fractions of a second allowed); sale_price_effective_date start before endNo
gtin-formatdigits only, no spaces or dashes; spreadsheet scientific notation (4.00638E+12)Spaces/dashes removed only when the result is a valid 12-, 13- or 14-digit GTIN (length and check digit); anything else, such as an SKU or a web address in the GTIN column, is reported unchanged; scientific notation reported
gtin-length, gtin-check-digit8, 12, 13 or 14 digits; GS1 check digit correctNo (a wrong GTIN is never "repaired")
gtin-restrictedrestricted-circulation (02, 04, 2x) and coupon (98, 99) prefixes Google rejectsNo
gtin-isbn10ISBN-10 given as GTINConverted to ISBN-13 only when the item's google_product_category is Media > Books (784) or below and the ISBN-10 check digit is valid; any other 10-digit value is reported as gtin-length, not changed
missing-identifiersno GTIN and not both brand and MPN (warning: depends on category)No
identifier-exists-conflictidentifier_exists is no but a GTIN is givenNo
brand-placeholderbrand values such as "N/A", "Generic", "No brand"No
url-schemelink / image_link start with http:// or https://No
url-encodingspaces and other characters that must be percent-encodedYes (percent-encoded)
image-formatimage URL ending in a non-accepted format (.svg, .avif, .heic, .pdf, ...); a URL ending in .html or .htm is a warning (some image services serve images from such addresses)No
category-unknown, category-formatgoogle_product_category is a taxonomy ID or exact path (English, or one of Google's translated taxonomies); not bothYes for "ID - path" (ID kept) and spacing/capitals of an exact path
missing-namespace-prefixXML attribute element without the g: prefix (Google ignores it)Yes (moved into the g: namespace)
whitespaceleading/trailing spaces, repeated spaces (not in description), control charactersYes
unknown-attribute, extra-columns, encoding, missing-namespacewhole-file problemsEncoding written as UTF-8; others reported

What it does not check

  • It does not guarantee approval. Google also reviews landing pages, images (size, watermarks, placeholders), policies, shipping and tax settings and your account; none of that is checked here.
  • It does not visit your links or images, compare the feed with your website, or check category-specific rules (apparel size/colour/gender, energy labels, alcohol, and so on).
  • It does not check shipping, tax, installment or other group attributes (left unchanged in the corrected feed).
  • Google Sheets and Content API sources are not read; export them as a file first.

Input

  • Feed URL or file: a direct link to the feed, or upload the file in the input form.
  • Or paste the feed: for small feeds.
  • Include items with no problems (default off), Maximum file size (default 100 MB) and Maximum dataset rows (default 1,000; 0 = no limit).

Large feeds

The whole feed is read into memory. Our measurements on generated test feeds with defects seeded at known positions (every seeded problem reported, exact counts per rule, nothing else; run on our own machine, 2026-09-25):

FeedItemsFile sizeRun timePeak memory
Tab-delimited text50,00038 MB21 s405 MB
RSS 2.0 XML50,00053 MB20 s490 MB
Tab-delimited text100,00076 MB37 s739 MB

Apify bills dataset writes per row (US$0.005 per 1,000 rows on its published pricing), which dominates the cost of a big feed with many problems: in our private test run on Apify of the 50,000-item text feed with every problem row written to the dataset (27,498 rows) the platform usage was US$0.14, of which US$0.137 was dataset writes and US$0.001 compute. That is why the dataset is capped at 1,000 rows by default; the complete lists are in ISSUES.csv and CHANGES.csv. The same feed with the default cap: 20 s, US$0.0086 platform usage (private run, 2026-09-25).

As a rule of thumb give the run about 10 to 12 times the file size in memory. The default run memory (1 GB) suits feeds up to about 80 MB; raise the run memory for bigger files. Run time on Apify can differ from these figures.

Output

Dataset, one row per item (items with no problem are left out unless you turn them on; at most Maximum dataset rows rows, default 1,000):

{"itemNumber": 3, "id": "SKU-003", "title": "Cast Iron Skillet 26 cm", "status": "error", "errors": 1, "warnings": 0, "fixed": 3,
"problems": "FIXED availability: Normalised 'out of stock' to 'out_of_stock'.\nFIXED price: Reformatted price to '1299.00 EUR' (converted decimal comma).\nERROR gtin: GTIN '4006381333932' has a wrong check digit. ...",
"issues": [{"attribute": "gtin", "severity": "error", "rule": "gtin-check-digit", "message": "...", "value": "4006381333932", "fixed": false, "source": "..."}]}

status is error (open errors left), warning, fixed (only safe fixes, now clean) or ok. Whole-file problems appear as item 0.

Key-value store

  • CORRECTED_FEED.txt / .csv / .xml: your feed with only the fixes marked FIXED applied. Review CHANGES.csv before uploading it.
  • CHANGES.csv: item number, id, attribute, rule, old value, new value for every change.
  • ISSUES.csv: every open problem (item number, id, attribute, severity, rule, message, value), never capped.
  • REPORT.md: summary, counts by rule and the items with problems.
  • OUTPUT: JSON totals.

Sources (accessed 2026-09-25)

Google can change its specification at any time; each dataset issue names its source so you can check it.

Privacy

Your feed is read inside the run and the results are written to your own Apify storage. Nothing is sent anywhere else, and no links or images in the feed are visited.

Support

Open an issue on the actor's Issues tab. This actor is built and maintained with AI assistance by Madrasco; a human owner can be reached on request through the Issues tab.

Disclaimer

Independent tool, not affiliated with or endorsed by Google. Google, Google Merchant Center and Google Shopping are trademarks of Google LLC, named here only to describe the feeds this tool checks. Passing these checks does not guarantee that Google will approve your products or account.