← The field guide

Can you copy a product feed unchanged? A 12-case test

Inspect twelve synthetic product records or check your own JSON locally. Review explicit mappings, unresolved fields, and supplied evidence; download reproducible results.

The short answer

In this controlled local test, explicit mapping cleared four representation problems. Six evidence or identity problems remained held. The result describes twelve deliberately authored records under a small review profile; it does not measure vendor acceptance, model accuracy, or typical merchant error rates.

What the experiment actually tests

On September 13, 2026, we executed a deterministic local comparison of two methods against the same twelve synthetic records: copy the record unchanged, or apply a small explicit transformation. There were two valid controls and ten deliberately selected edge cases.

The target is a canonical-field editorial review subset informed by OpenAI’s Stable native discovery format. It is not a simulation of its ingestion service. In particular, native providers may accept aliases that this local canonical-field profile reports for mapping. OpenAI’s separately confirmed Google-compatible upload path is outside the experiment.

All URLs, products, sellers, and page-price evidence are fictional. No external page was fetched, no product was uploaded, and no model was called. The same author designed the cases and checks; this is a reproducible worked experiment, not independent validation.

Source: OpenAI: Stable product file-upload specification

Observed results: four repairs, six holds

The original September 13 experiment and the shared-core rerun at 2026-09-22T01:51:11.141Z produced the same case observations and counts below. The unchanged method cleared the two controls and held all ten edge cases. Mapping cleared those controls plus four edge cases; six records still needed review. The fixture bytes are unchanged.

Clear means no issue was found in the named local checks. It does not mean upload-ready, factually correct in the world, approved by a provider, or visible in shopping results. We report counts because this constructed set is not a sample from a real catalog.

MethodRecordsNo issue in these checksNeeds review
copy12210
mapped1266
Download the complete observed results (JSON)

Explore the saved cases or check your record

Choose a fixture to inspect the original record, explicit changes, and resulting issues from the recorded run. Below it, paste your own product JSON to execute the same deterministic review rules in your browser and download the result.

The custom check accepts one JSON object plus optional supplied evidence, up to 64 KiB combined. Choose an unchanged review or explicit mapping. Input stays in your browser; there is no model call, provider upload, live-source lookup, or saved input. Supplied page-price and measurement-basis evidence is not independently verified.

Recorded portability experiment

12 synthetic records
Failure case · F01No issue in these checks

Map source keys to the selected native representation.

Changes applied

  • id → item_id
  • link → url
  • image_link → image_url

Issues still present

No issue found in this review subset. Provider acceptance and live product truth were not tested.

Original record and supplied evidence
{
  "record": {
    "title": "Demo ceramic mug — blue",
    "description": "Synthetic blue ceramic mug for a local feed experiment.",
    "brand": "Example Workshop",
    "seller_name": "Example Retailer",
    "availability": "in_stock",
    "price": "18.00 USD",
    "id": "DEMO-MUG-BLUE",
    "link": "https://example.com/mug?color=blue",
    "image_link": "https://example.com/images/mug-blue.jpg"
  },
  "evidence": {}
}
Resulting record
{
  "title": "Demo ceramic mug — blue",
  "description": "Synthetic blue ceramic mug for a local feed experiment.",
  "brand": "Example Workshop",
  "seller_name": "Example Retailer",
  "availability": "in_stock",
  "price": "18.00 USD",
  "item_id": "DEMO-MUG-BLUE",
  "url": "https://example.com/mug?color=blue",
  "image_url": "https://example.com/images/mug-blue.jpg"
}

The case explorer displays the saved experiment. The custom checker below uses the same review rules. Neither makes input network requests, runs an AI model, or validates a live merchant feed.

Check your record

Paste one product record as JSON. These checks run in your browser; your input is not uploaded or saved. The review covers a small canonical-field subset and positive USD prices.

One object, up to 64 KiB including optional evidence. Arrays and whole feeds are not supported.
Optional supplied evidence

For the local comparison, supply pagePrice and/or dimensionBasis. These are your assertions; no source page is fetched or verified.

Mapping can rename supplied fields, translate preorder, construct explicit variant options, and normalize supplied product units. Missing or conflicting facts remain for review.

The complete case register

The first two rows are controls. F01–F10 are the ten failure cases. The mapped decisions were written into the fixture file before execution; the observed result is recorded separately.

CaseUnchangedAfter mappingWhat the case establishes
C01 · Native nonvariant controlNo issue in these checksNo issue in these checksThe selected local checks find no issue.
C02 · Native variant controlNo issue in these checksNo issue in these checksThe selected local checks find no issue in the declared variant.
F01 · Destination field namesNeeds reviewNo issue in these checksMap source keys to the selected native representation.
F02 · Preorder spellingNeeds reviewNo issue in these checksTranslate the explicit Google stock value to native pre_order.
F03 · Variant representationNeeds reviewNo issue in these checksPreserve the parent and selected options while constructing native grouping fields.
F04 · Mixed explicit product unitsNeeds reviewNo issue in these checksConvert two evidenced product axes to one unit.
F05 · Missing seller identityNeeds reviewNeeds reviewA required seller identity cannot be derived from the product brand.
F06 · Numeric item identifierNeeds reviewNeeds reviewThe local profile refuses numeric IDs because prior string information may be lost.
F07 · Parent reused as item IDNeeds reviewNeeds reviewThe parent and selected item must remain distinct.
F08 · Conflicting selected colorNeeds reviewNeeds reviewA mapping must not silently choose between contradictory selected colors.
F09 · Price disagrees with pageNeeds reviewNeeds reviewThe supplied fictional page evidence disagrees with the offer price.
F10 · Package dimensions relabeledNeeds reviewNeeds reviewPackage measurements do not establish the item dimensions.
Download the frozen cases and protocol (JSON)

Why four cases can be transformed

F01 renames explicitly identified fields. F02 translates the known preorder spelling. F03 constructs a declared parent-and-option representation. F04 converts two supplied product dimensions to centimeters: 30 inches becomes 76.2 centimeters, while 50.8 centimeters remains unchanged.

These repairs use information already present in the record. They do not choose a seller, recover a lost leading zero, establish which color is correct, or substitute package measurements for product measurements. Numeric conversions in the runner are bounded demonstration arithmetic, not a general measurement library.

Source: OpenAI: Stable product file-upload specification; Google Merchant Center: Item group ID; Google Merchant Center: Product dimensions and weight

Why six cases still need evidence

The held records lack a seller, contain a numeric item identifier, reuse a parent as the selected item, contradict their selected color, disagree with supplied page-price evidence, or label package dimensions as product dimensions. Returning to the authoritative source is part of the work.

The page-price and measurement-basis checks are additional editorial checks. They illustrate why satisfying field syntax alone cannot establish offer truth. The supplied evidence may itself be wrong; live-source verification remains outside this run.

Source: Google Merchant Center: Price; Google Merchant Center: Product dimensions and weight

Reproduce the recorded comparison

Download the runner below, the shared review core in the next section, and the frozen fixture JSON into the same folder. With Node.js 22 or later, run: node product-feed-portability.mjs --fixtures product-feed-portability-cases.json. It writes a JSON report to standard output and makes no network requests.

The report records a run timestamp, rule version, and SHA-256 hashes of the fixture bytes, runner, and shared review core. A rerun has a different timestamp; identical source files should reproduce the same case observations and counts. The browser and downloaded runner use the same mapping and review functions.

Changing the cases creates a different experiment. Preserve the original denominator and edition, document the new conditions, and report new results separately.

Download the local runner (.mjs; requires the core below)

Check your own record from a local file

Save a single product object as product.json, then download the shared core below beside the runner. Run: node product-feed-portability.mjs --record product.json. The unchanged review is the default. The original JSON file is not modified.

To apply the explicit transformations with optional evidence, run: node product-feed-portability.mjs --record product.json --evidence evidence.json --method mapped. The evidence file should be an object such as {"pagePrice":"18.00 USD","dimensionBasis":"product"}. Omit --evidence evidence.json when no evidence is supplied.

The combined record and evidence limit is 64 KiB. Arrays, scalars, excessive nesting, and invalid JSON are rejected. The report includes the input, supplied evidence, resulting record, applied changes, field issues, rule version, and limits.

These are the same small canonical-field and positive-USD checks used in the experiment. A result with no issue does not establish provider acceptance or that the product facts are true.

Download the shared browser-safe review core (.mjs)

What remains untested

The local review does not cover the full destination schema, merchant eligibility, network accessibility, live imagery, GTIN assignment, real stock, checkout, every currency, or cross-row catalog consistency. Its monetary checks deliberately use positive USD amounts with two decimal places.

To estimate operational performance, use a separately selected real catalog sample, authorized source evidence, predeclared criteria, and a reviewer who did not author the transformations. To compare AI models, run and retain actual model outputs under a specified protocol. Neither measurement has been performed here.

Use these cases as a starting regression set for a mapping project. The useful result is knowing which decisions still need evidence, not maximizing a pass count.

Sources & scope

Primary references checked for this edition. The notes below distinguish source-backed facts from the frameworks and examples proposed in this guide.

  1. OpenAI: Stable product file-upload specification ↗

    Native discovery fields and the distinct Google-compatible path. This edition is a selected comparison, not the complete upload contract.

    Checked September 13, 2026
  2. Google Merchant Center: Item group ID ↗

    Variant groups, identifying attributes, and matching landing-page values.

    Checked September 13, 2026
  3. Google Merchant Center: Price ↗

    Amount and currency, plus agreement with landing page and checkout.

    Checked September 13, 2026
  4. Google Merchant Center: Product dimensions and weight ↗

    Product measures, accepted units, and agreement between repeated measurements. Packaging has a different meaning.

    Checked September 13, 2026

AI-assisted research and drafting. Provider-specific claims link to primary sources. Frameworks are editorial proposals; worked examples are illustrative and are not employer performance results.

Editorial policy & corrections ↗

Cite this guide

George Kelly. Can you copy a product feed unchanged? A 12-case test iamgeorgekelly. Updated September 22, 2026. https://www.iamgeorgekelly.com/field-guide/product-feed-portability-experiment

Keep the source notes and example labels with an excerpt. For a provider requirement, follow the original documentation in Sources & scope.

Choose your next task ↗ · Browse the source directory ↗

Keep going

Why a product feed check can pass while the records disagreeProduct feed specification: Shopify, Google, and ChatGPTSKU vs GTIN: differences, barcodes, and variant IDsDoes the product page match the variant you submitted?