Take a product you can order before it ships. Google Merchant Center wants its availability written as preorder. The OpenAI product feed, the one ChatGPT shopping reads, wants pre_order, and its spec is blunt about anything else: "Omitted, empty, or unrecognized values reject the row."
Same product, same store, one underscore. One feed is accepted and the other silently loses the row.
That is the new chore in e-commerce. AI shopping assistants read your catalog through product feeds, and each one has its own format:
- the OpenAI product feed: nine required fields in basic product data, plus
target_countriesandstore_country; - the Agentic Commerce Protocol (ACP) feed schema, version 2026-04-17, still in beta;
- Google Merchant Center product data, including its conversational attributes.
They mostly agree, which is exactly why the differences slip through.
Small differences, real rejections
A few we ran into while reading the specs:
- Availability spelling.
preorderfor Google,pre_orderfor OpenAI. - Barcodes. OpenAI asks for a GTIN with "no spaces or dashes". Google accepts a barcode written with spaces and reads it without them.
- Required fields.
target_countriesis required for the OpenAI feed. Lists that say "nine required fields" leave it out, along withstore_country. - Check digits. A GTIN with a wrong final digit fails everywhere, and nobody notices until a channel rejects it.
None of this is hard. It is just a lot of small rules spread over several spec pages, all changing at their own pace.
So we built a checker
shelfcheck is a free, open-source command-line tool written in Rust. You point it at your feed and it checks every product against all three formats, plus GS1 barcode rules, in one run:
$ shelfcheck check fixtures/store-a/products.csv shelfcheck 0.1.0 · rules OpenAI 2026-11-14 · ACP 2026-04-17 · Google 2026-11-14 · GS1 26.0 read OpenAI CSV · 1,400 products, 3,912 variants 0.30 s ready errors warnings OpenAI 1,228 87.7% 172 27 ACP 1,310 93.6% 90 0 Google 1,293 92.4% 107 0 ✗ 82 Barcodes with a wrong check digit OpenAI, ACP, Google · e.g. PHO0071-3, line 157 ✗ 61 target_countries is missing OpenAI · e.g. LAM0015-3, line 36 ✗ 23 availability values the format rejects OpenAI · e.g. MUG0033-1, line 79 + 4 more fixes, 43 products. All of them are in the report. 182 of 1,400 products need fixes before every format accepts them. That run is on the synthetic 1,400-product demo store that ships with the repo, so the numbers show what the tool does, not how real stores score.
The fixes come ranked by how many products each one affects, so the first fix you make is the one that clears the most rows. Every problem names the product, the line and the column, and cites the rule it broke.
The second problem: feeds change
A feed that passed last month can break this month without a single error. So shelfcheck also compares two feeds and flags risky changes:
- an id reused for a different product (in the demo,
PHN-X2-BLKwas a phone and is now a phone case); - the same product under a new id;
- a variant whose storage, size, colour, material or pack quantity changed under the same id and barcode;
- store titles that still describe the old variant, like a tablet that is now 256 GB while the title still says 128 GB.
You record a decision for each change once (shelfcheck decide), and it stays quiet after that.
How it works
- Rules are code, not a language model. The same feed always gets the same result.
- Every rule cites its source and the date it was last checked against that page, because these specs change often.
- It reads CSV, TSV, JSONL, Google XML, ACP feeds and Shopify product exports.
- It fits into CI. Each run writes an offline
report.html,results.json, SARIF 2.1.0 for GitHub code scanning,junit.xmland afailing-products.csv. - It never touches your store and never connects to the internet. Links in a feed are checked for form, never fetched.
- It is fast. On a Windows laptop (Intel Core i7-1280P), one million generated rows were checked against all four rule packs in about 8.3 seconds (warm runs; the first, cold run took 12.3).
One honest limit: passing shelfcheck means your feed matches the formats it checks. It does not mean an AI assistant will show your products.
Try it
npx shelfcheck check products.csv # no install brew install logitsolutionsai/tap/shelfcheck # Homebrew cargo install shelfcheck # crates.io The code, the rule packs and their sources are on GitHub under Apache-2.0: github.com/logitsolutionsai/shelfcheck. If a rule is out of date, open an issue with the rule id and a link to the page that changed.
Sources
- OpenAI product feed spec (file upload): https://developers.openai.com/commerce/specs/file-upload/products
- Agentic Commerce Protocol: https://github.com/agentic-commerce-protocol/agentic-commerce-protocol
- Google Merchant Center product data specification: https://support.google.com/merchants/answer/7052112
- Google Merchant Center, availability attribute: https://support.google.com/merchants/answer/6324448
- GS1 General Specifications: https://www.gs1.org/standards/barcodes-epcrfid-id-keys/gs1-general-specifications
Logit Solutions AI is an AI product studio. We design, build and support production-ready AI products for startups and growing businesses.


