The short answer
For OpenAI’s Stable native feed, update current price and stock when the offer changes. Uploaded dates do not perform that update. Compare the exact item against recent source evidence, then inspect upload processing and display separately. The checker below identifies selected-field differences and holds uncertain inputs for review.
Use the contract your feed actually follows
This guide covers OpenAI’s Stable native discovery file-upload contract, checked September 21, 2026. Confirm your integration’s format; Google-compatible, Draft, Ads, and checkout paths are outside this comparison.
The native contract uses the regular price plus any current sale_price: positive, lower, and in the same currency. Variants carry separate stock values. Sale-window, expiration, and availability dates do not schedule changes or product removal.
A newer export is not automatically a better source
Choose the system responsible for the current offer and record the exact item, market, currency, capture time, and evidence location. Separately capture the feed being checked. An export generated five minutes ago may still contain yesterday’s source data; use the time the underlying facts were observed, not merely the file’s creation time.
In this checker, source means supplied evidence for the current offer and feed means a supplied export snapshot. Neither is fetched or authenticated. A reference can identify an internal record, an export, or a saved product-page capture, but typing a reference does not establish that its facts are correct.
If the storefront, promotion system, and inventory system disagree, resolve which evidence applies before preparing the comparison. A timestamp cannot resolve an unexplained disagreement between different markets, sellers, variants, or systems.
A fictional timeline: regular price, sale, sale end, stockout
Consider MUG-350-BLUE, a fictional item with a regular price of 18.00 USD. The table records the current facts at each stated time. These are authored examples, not merchant observations or a promised processing schedule.
The sale ending changes the explicit no-sale value in our comparison record to null. The later stockout changes availability. Do not change price or stock solely because a planned date has passed; obtain evidence that the corresponding event actually occurred. These fragments cover only the fields being compared and are not complete product-upload records.
| Evidence captured (UTC) | Observed event | price | sale_price | availability |
|---|---|---|---|---|
| 2026-09-21T08:00:00Z | Regular offer | 18.00 USD | null | in_stock |
| 2026-09-21T12:00:00Z | Sale is active | 18.00 USD | 14.00 USD | in_stock |
| 2026-09-21T18:00:00Z | Sale has ended | 18.00 USD | null | in_stock |
| 2026-09-21T20:00:00Z | Item has sold out | 18.00 USD | null | out_of_stock |
Compare your own source evidence and feed snapshot
Paste a comparison document into the checker. It compares price, sale_price, and availability for exact item_id matches. It runs locally in your browser, makes no network requests for the comparison, and does not upload or edit a feed. Download the example to inspect the input before replacing it with your own bounded records.
Set asOf to the time the comparison should represent and choose maxAgeHours between 1 and 720. That threshold is your evidence policy, not an OpenAI freshness requirement or processing guarantee. Both capturedAt timestamps describe when the supplied facts were observed. The result is only as current as those observations. The tool uses your supplied asOf value rather than reading the current clock, so a frozen example stays reproducible but does not stay current.
Selected current USD fields and exact item IDs only. You designate the source; this tool does not authenticate its authority, fetch evidence, contact a provider, or check a complete upload. Age limits are your policy. The downloadable module and command-line runner use the same rules.
Prepare the small comparison format
Extract the selected fields into this tool’s format, with a maximum document size of 200,000 bytes. It is deliberately smaller than a complete product feed. Unknown fields, unsupported values, incomplete items, and ambiguous timestamps are held for review rather than silently discarded.
Every item must explicitly contain sale_price. Use JSON null when the supplied evidence confirms there is no active sale; do not use it for an unknown discount. This requirement belongs to the checker. OpenAI’s optional-field handling also permits omitted values, so a checker hold does not establish that the provider would reject the upload.
Use timestamps in YYYY-MM-DDTHH:mm:ss[.SSS]Z form or with a numeric offset such as -04:00. Seconds and a timezone are required; fractional seconds are optional. A future observation, an observation outside maxAgeHours, or differing values backed by source evidence older than the feed causes a hold. Matching fresh snapshots may pass in either capture order.
| Field | Checker requirement |
|---|---|
| schemaVersion / profile | Use 1.0 and openai-native-stable, respectively. |
| asOf / maxAgeHours | An ISO timestamp with seconds and a timezone; a chosen freshness threshold from 1 to 720 hours. |
| source / feed | Each contains capturedAt, a nonempty evidenceRef, and items. Timestamps and references are supplied assertions. |
| items / item_id | One to 100 items per snapshot. Preserve unique string IDs exactly; the same item set must appear on both sides. |
| price | A positive USD money string with two decimal places, such as 18.00 USD, up to 999999999.99 USD. Other currencies are outside this checker. |
| sale_price | JSON null for confirmed no sale, or a positive USD amount below price using the same money format. |
| availability | Use in_stock, out_of_stock, pre_order, backorder, or unknown. This checker holds unknown for review. |
| Additional fields | Held for review. Resolve the input instead of assuming a date field schedules a future change. |
Run the same comparison from a local file
Save feed-freshness.mjs, check-feed-freshness.mjs, and feed-freshness-example.json in the same directory. With Node.js 22 or later, run node check-feed-freshness.mjs feed-freshness-example.json. The wrapper needs the comparison module beside it; downloading the wrapper alone is insufficient.
The runner reads your JSON and prints a result without fetching evidence or writing either snapshot. Keep the input, result, and supporting captures together so another person or agent can reproduce the decision. A hold takes priority over a difference that could otherwise be reported as an update.
| Result | Meaning | CLI exit code |
|---|---|---|
| match | The comparable selected fields agree and the supplied input passes the local rules. This is not evidence of a live displayed offer. | 0 |
| update_needed | At least one selected field differs from the supplied current source evidence. Review the reported item and field before making a change. | 1 |
| hold | The evidence is too old under your chosen threshold, the timing is inconsistent, or the input is incomplete, ambiguous, or unsupported. | 2 |
Six fictional cases and their expected decisions
Each downloadable case includes a full input and an expected decision. Copy a case’s input object into a JSON file to run it individually. These examples exercise the local comparison rules; they are not observed customer incidents, provider acceptance tests, or a model accuracy benchmark.
A preorder transition requires explicit evidence that the item is now available. A variant change stays attached to that item. Stale or contradictory timestamps require fresh evidence before the checker can support an update.
| Case | Supplied evidence | Expected decision |
|---|---|---|
| Sale begins | The source shows an active discount; the feed still has no sale. | update_needed: sale_price |
| Sale ends | The source confirms no active sale; the feed retains the old discount. | update_needed: sale_price |
| Stockout | The source records out_of_stock; the feed still says in_stock. | update_needed: availability |
| Preorder becomes available | The source explicitly records in_stock; the feed still says pre_order. | update_needed: availability |
| Only one variant changes | Two exact item IDs are compared; a field differs on one item only. | update_needed for the changed item; preserve the other item |
| Source predates a conflicting feed | Both observations are inside the age limit, but the source is older than the disagreeing feed. | hold: resolve the chronology before replacing values |
Keep the correction and the destination checks separate
For each justified change, record item_id, field, old value, new value, source reference, source capture time, reviewer, and correction time. Preserve the original evidence when a conflict remains. Do not change an entire parent group to repair one variant.
After generating the corrected export, compare it again. Then separately check the actual upload’s processing result and inspect the offer shown for the intended item and market. A local match, a processed upload, and an observed displayed offer answer three different questions. The checker establishes only the first within its stated scope.
| Evidence | What it supports | Still unresolved |
|---|---|---|
| Local comparison result | Agreement or disagreement between supplied selected fields | Source authenticity, upload acceptance, and display |
| Upload processing record | The destination’s reported handling of that submission | The offer a shopper or agent actually receives |
| Timestamped offer inspection | What was observed for that selection at that time | Future display and changes after the inspection |
Change record and scope
September 21, 2026: first edition, with a selected-field comparison format, a browser checker, a local runner, and six fictional cases.
The checker does not validate a complete catalog, read a commerce account, schedule updates, authenticate references, infer missing facts, or measure provider ingestion latency. Recheck the official contract before adapting the method to a different integration.
Sources & scope
Primary references checked for this edition. The notes below distinguish source-backed facts from the frameworks and examples proposed in this guide.
- OpenAI: Stable file-upload product specification ↗
Stable native fields and date behavior. The comparison format and freshness threshold are editorial choices, not a provider validator or SLA.
Checked September 21, 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. ChatGPT product feeds: sale prices, stock changes, and stale-data checks iamgeorgekelly. Updated September 22, 2026. https://www.iamgeorgekelly.com/field-guide/product-feed-freshness
Keep the source notes and example labels with an excerpt. For a provider requirement, follow the original documentation in Sources & scope.