Merchant Feed Checker and Fixer for Google Merchant Center
Pricing
from $1.00 / 1,000 product checkeds
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
from $1.00 / 1,000 product checkeds
Rating
0.0
(0)
Developer
Jack Valmadre
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
15 days ago
Last modified
Categories
Security
Limited permissionsShare
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_linkorimage link, with or withoutg:). 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). Nothing is repaired unless you turn on the option below: with Repair a bare & in XML the file is read anyway, each of those&characters is read as&(so no value changes), the corrected feed writes it that way and the report says how many were changed. - Values the checker does not fix are written back exactly as they were read, including Windows line endings inside descriptions.
- Plain,
.gz, or a.zipholding one feed file. The corrected feed is written in the same format (UTF-8).
What it checks
Rule (dataset rule) | What | Fixed automatically? |
|---|---|---|
missing-required | id, title, description, link, image_link, availability, price present and non-empty (title, description, link and image_link are skipped for a supplemental feed, see supplemental-feed; id, availability and price are still required) | No |
too-long | id > 50, title > 150, description > 5,000, brand > 70, mpn > 70, additional_image_link > 2,000 characters | No (never truncated) |
duplicate-id | the same id on more than one item | No |
availability-value | must be in_stock, out_of_stock, preorder or backorder | Yes for spelling variants ("In Stock", "out of stock", schema.org InStock); others reported |
condition-value | must be new, refurbished or used | Yes for case/schema.org variants; others reported |
identifier_exists-value | yes or no | Yes for TRUE/FALSE, Y/N |
price-format | "15.00 USD" form: number, space, ISO 4217 code | Yes: currency moved after the amount, capitals, decimal comma "12,99" to "12.99", unambiguous thousands separators ("1,299.50", "1.299,00") |
price-currency | currency code present and a real ISO 4217 code | No: a symbol such as $ or a missing code is reported, never guessed |
price-zero, price-value | price of 0 (allowed only for some contract/subscription goods) or negative | No |
price-ambiguous | warning 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 separator | No |
sale-price-currency, sale-price-not-lower | sale_price in the same currency as price and lower than it | No |
missing-availability-date | availability_date required for preorder, asked for backorder | No |
date-format, date-order | ISO 8601 dates (seconds and fractions of a second allowed); sale_price_effective_date start before end | No |
gtin-format | digits 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-digit | 8, 12, 13 or 14 digits; GS1 check digit correct | No (a wrong GTIN is never "repaired") |
gtin-restricted | restricted-circulation (02, 04, 2x) and coupon (98, 99) prefixes Google rejects | No |
gtin-isbn10 | ISBN-10 given as GTIN | Converted 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-identifiers | no GTIN and not both brand and MPN (warning: depends on category) | No |
identifier-exists-conflict | identifier_exists is no but a GTIN is given | No |
brand-placeholder | brand values such as "N/A", "Generic", "No brand" | No |
url-scheme | link / image_link start with http:// or https:// | No |
url-encoding | spaces and other characters that must be percent-encoded | Yes (percent-encoded) |
image-format | image 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-format | google_product_category is a taxonomy ID or exact path (English, or one of Google's translated taxonomies); not both | Yes for "ID - path" (ID kept) and spacing/capitals of an exact path |
missing-namespace-prefix | XML attribute element without the g: prefix (Google ignores it) | Yes (moved into the g: namespace) |
whitespace | leading/trailing spaces, repeated spaces (not in description), control characters | Yes |
supplemental-feed | the feed looks like a supplemental feed: most items (80% or more) carry an id and only the attributes they update, with no title, description, link or image_link (inventory feeds do this, and are merged into your primary feed). For such a feed the missing title, description, link and image_link checks and the GTIN/brand/MPN check are skipped, with one note saying so, instead of an error on every item; id, availability and price are still checked. If your file is meant to be your main feed, check that its title, description, link and image_link columns are named correctly and filled in | No |
unknown-attribute, extra-columns, encoding, missing-namespace | whole-file problems | Encoding 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.
- Repair a bare & in XML (default off): read an XML feed that a plain
&would otherwise make unreadable, as described under Supported 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):
| Feed | Items | File size | Run time | Peak memory |
|---|---|---|---|---|
| Tab-delimited text | 50,000 | 38 MB | 21 s | 405 MB |
| RSS 2.0 XML | 50,000 | 53 MB | 20 s | 490 MB |
| Tab-delimited text | 100,000 | 76 MB | 37 s | 739 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 '1234567890129' has a wrong check digit. ...","issues": [{"attribute": "gtin", "severity": "error", "rule": "gtin-check-digit", "message": "...", "value": "1234567890129", "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. ReviewCHANGES.csvbefore 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.
Pricing
Pay per event:
- US$0.001 per product checked in the feed, whatever the result (event
product-checked). Charged once the whole feed is read and all products can be checked; if your run's maximum charge is too low for the whole feed, the run stops before checking rather than silently checking only part of it. - Our start charge, once per run: US$0.00005 per GB of run memory, minimum one GB (event
apify-actor-start). At this actor's default 1 GB that is US$0.0001 per run.
There's no extra charge for platform usage. For example, checking a feed with 500 products costs 500 × US$0.001 + US$0.0001 = about US$0.50. Apify shows the price before you run, and you can set a maximum charge per run.
Sources (accessed 2026-09-25)
- Google Merchant Center Help, Product data specification: https://support.google.com/merchants/answer/7052112 (required attributes, lengths, supported values, price/ISO 4217 format, GTIN rules, brand placeholders, image formats, google_product_category ID-or-path rule).
- Google Merchant Center Help, RSS 2.0 specification: https://support.google.com/merchants/answer/160589 (g: namespace; un-prefixed attributes are ignored).
- Google product taxonomy with IDs (version 2021-09-21 at the time of access): https://www.google.com/basepages/producttype/taxonomy-with-ids.en-US.txt (downloaded when the actor is built, not bundled).
- ISO 4217 currency codes, list one published 2026-09-17: https://www.six-group.com/dam/download/financial-information/data-center/iso-currrency/lists/list-one.xml
- GS1, How to calculate a check digit manually: https://www.gs1.org/services/how-calculate-check-digit-manually
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.