ChatGPT Delta Feeds: Accepted Does Not Mean Your Product Is Serving
An accepted Delta Feed update has entered processing; indexing, eligibility and serving remain separate states to reconcile.
Direct answer: accepted: true from the ChatGPT Ads Delta Feeds endpoint means an update was accepted for processing. It does not prove the change was indexed, the product stayed eligible, or an ad served. Delta Feeds update the availability and titles of existing variants; they do not create a catalog, feed, product or variant.
Treat the response as the first checkpoint in an asynchronous pipeline, not as the final merchandising state.
The four states you need to record
| State | Evidence | Safe conclusion |
|---|---|---|
| Submitted | Your system formed and sent the request | A delivery attempt happened |
| Accepted | Endpoint returned accepted: true | OpenAI accepted it for processing |
| Reconciled | Later feed/product state matches the source of truth | The update appears to have propagated |
| Serving | Eligible campaign/ad evidence exists | The product can or did participate in delivery |
Indexing and eligibility sit between acknowledgement and delivery. A title can be accepted but later fail a policy or data rule. Availability can be stale if a later update overtakes an earlier one. A product can be correct and eligible but never receive an impression.
What Delta Feeds can change
OpenAI documents Delta Feeds as an account-enabled feature for changing variant availability and titles through PATCH /feeds/{feed_id}/products. It is deliberately narrower than a full feed:
- Use a full feed or product workflow to create the catalog and new products.
- Use Delta Feeds for time-sensitive corrections to existing variants.
- Do not send a complete catalog as if the endpoint were a replacement feed.
- Do not infer creation when an unknown identifier is acknowledged at the request layer.
The operating benefit is freshness. The operating risk is silent divergence between your commerce database, the last accepted patch and the downstream ad state.
Build a reconciliation ledger
Store one row per attempted change with the feed ID, product and variant identifiers, old value, new value, source timestamp, request timestamp, response, retry count and reconciliation result. Make the source timestamp monotonic so a delayed worker cannot overwrite a newer availability value.
Useful alerts are about state gaps, not raw request counts:
- accepted updates not reconciled within the normal window;
- repeated failures for one identifier or field;
- inventory marked unavailable in commerce but still eligible downstream;
- out-of-order updates;
- a sudden drop in product eligibility after a title release.
For bulk runs, canary a small set before sending the full queue. Preserve exact request and response bodies with sensitive fields redacted. Replaying from logs should be possible without inventing the prior source state.
A practical runbook
- Confirm the account is enabled and the base feed already contains the target variants.
- Validate identifiers and allowed title/availability values locally.
- Send a canary patch and record the acknowledgement.
- Poll or export the relevant downstream state when the product provides it.
- Check eligibility separately from data propagation.
- Check serving separately from eligibility.
- Retry only idempotent changes, with backoff and an age limit.
For the broader commerce context, read ChatGPT product feeds, organic shopping and ads. For measurement, use the Ads Pixel vs Conversions API comparison.
Primary source and limit
Limit: This is a documentation-led operational guide, not a live feed experiment. Downstream status surfaces and enablement can vary by account. The word “accepted” should be interpreted exactly as documented: accepted for processing.
Ask a question or join the discussion