ChatGPT product feed: the merchant setup guide
A ChatGPT product feed is a full-snapshot export of your catalog, pushed to OpenAI over SFTP at least daily, that becomes the source of truth for your products inside ChatGPT's commerce surfaces. The model is simple — one complete catalog file (Parquet preferred), a stable filename you overwrite in place, explicit removals, and a phased validation path from a 100-item sample to steady-state automation. This guide walks the whole pipeline, translates it for teams coming from Google Merchant Center, and covers the three failure modes that break most first ingestions.
The short version
- Model: full snapshot, treated as the source of truth. Publish at least daily.
- Delivery: push over SFTP; stable filename, overwrite in place; stable shard set if you shard.
- Format: Parquet with zstd compression preferred; gzipped JSONL, CSV, TSV supported; UTF-8 only.
- Scale: up to 500,000 items per shard; target shard files under about 500 MB.
- Removals: explicit —
is_eligible_search=falseor drop the record from the next snapshot. - Rollout: ~100-item sample → QA the first full snapshot → daily automation.
What a ChatGPT product feed is
The feed is how your catalog gets into ChatGPT's commerce experiences: a structured export of your products, with fields defined by OpenAI's products spec, delivered to OpenAI on a schedule. If ChatGPT is going to recommend, display, or transact your products, this file is where it learns what you sell, what it costs, and whether it is available. It is infrastructure, not advertising — the catalog layer that product visibility sits on.
The snapshot model — and why it changes your pipeline
OpenAI supports one feed type: the full snapshot — a complete catalog export treated as the source of truth, published on a predictable cadence of at least daily. There are no incremental deltas, no "update just these SKUs" calls. Every publish says: this is my entire catalog; anything not in here does not exist.
That single design decision drives everything downstream. It means your pipeline's job is not to track changes — it is to reliably produce a correct, complete export every day. It also means staleness is destructive: skip a week of publishes and your prices, availability, and lineup in ChatGPT are a week wrong, with no partial patch to save you. Treat the snapshot like a heartbeat.
Delivery and file rules
| Topic | Rule |
|---|---|
| Delivery | Push to OpenAI over SFTP |
| Format | Parquet preferred, ideally zstd-compressed; jsonl.gz, csv.gz, tsv.gz also supported |
| Encoding | UTF-8 |
| Filename | Stable — same name every run, overwritten in place, never a new timestamped file per publish |
| Shards | Keep the shard set stable; replace the same shard files each update |
| Shard sizing | Up to 500,000 items per shard; target files under ~500 MB |
| Multi-brand | If several brand feeds share one location, use clear brand-prefixed names |
The stable-filename rule deserves emphasis because it is the opposite of many data teams' habits. Do not publish catalog-2026-07-10.parquet today and catalog-2026-07-11.parquet tomorrow — publish catalog.parquet every day and overwrite it. Same for shards: catalog-000.parquet through catalog-007.parquet today should be exactly those eight names tomorrow, with new contents.
Coming from Google Merchant Center — the translation
If you run Merchant Center or a Meta catalog, the concept transfers; the mechanics do not. The differences that matter:
| Habit | Merchant Center world | ChatGPT product feed |
|---|---|---|
| Delivery direction | Scheduled fetch of your hosted file, or Content API pushes | You push to OpenAI over SFTP |
| Update style | Incremental API updates common | Full snapshot only — the file is the truth |
| Preferred format | TSV/XML legacy, API JSON | Parquet (zstd) — a data-engineering format, not a spreadsheet |
| Removals | Expire or delete via API | is_eligible_search=false or omit from the next snapshot |
| Freshness | Varies by method | At least daily, on a predictable cadence |
The practical read: this feed belongs to your data engineers more than your marketing team. Parquet-first, SFTP push, and snapshot semantics are warehouse-pipeline patterns — a dbt or Spark job that exports the catalog table nightly is a more natural fit than the CSV-in-a-cron-job that fed Merchant Center.
Handling removals — always explicit
There are exactly two correct ways to retire a product:
- Set
is_eligible_search=falseon the record — it stays in the file but stops being eligible; or - Omit the record from your next full snapshot — absent means removed, because the snapshot is the source of truth.
The choice is operational. Keeping records with the eligibility flag preserves an audit trail in the file and makes reinstating a product a one-field change. Omission keeps the file lean. Pick one convention and apply it consistently — the failure mode is a team that does neither and assumes discontinued products somehow age out on their own. They do not; they linger, eligible and wrong.
The three ingestion failures OpenAI warns about
- Missing required fields. Every required field, populated in every row — not just the rows where it was convenient. One systematically absent field can degrade or reject the batch.
- Outdated or non-spec field names. The spec is versioned and field names drift. A feed built from a months-old blog post or a copied competitor schema will carry names the parser no longer recognizes. Build from the current products spec, and re-check it when ingestion behavior changes.
- Malformed values. Prices with currency symbols where numbers belong, truncated URLs, non-UTF-8 characters from an old export path, nulls encoded as the string "null." Classic dirty-data problems — the spec defines the shape of each field; validate against it before shipping, not after.
The phased rollout — sample, snapshot, steady state
OpenAI's own guidance is a three-phase validation path, and it is the right one:
- Sample (~100 items). Pick representative products — simple ones, variant-heavy ones, edge cases — with every required field in every row. The sample's job is to surface schema and formatting problems while they are cheap to fix.
- First full snapshot + QA. Ship the complete catalog and audit it: row counts against your source of truth, spot-check field values, confirm the ingested result matches what you sent.
- Steady-state automation. Only after validation is clean, hand the publish to a scheduler: daily full snapshot, stable filenames, overwrite in place, monitoring on the job.
The temptation is to skip phase one because "the catalog export already works for Google." Resist it — the field names and shapes are different, and a 100-item sample fails in minutes what a five-million-row file fails in hours.
Operating the pipeline — a monitoring checklist
The spec tells you what to ship; production teaches you what to watch. A practitioner checklist for the steady state:
- Publish heartbeat: alert if the daily snapshot fails to publish or the file's modified time goes stale.
- Row-count sanity: alert on a large swing versus yesterday — a snapshot that shrinks 40% overnight is usually a broken export, and under snapshot semantics that "removes" 40% of your catalog.
- Schema pinning: validate field names and types against the spec in CI, so an upstream rename never reaches the feed.
- Shard integrity: confirm the full shard set was replaced — a partial upload of 5 of 8 shards is a silently truncated catalog.
- Encoding gate: reject non-UTF-8 at build time; it is far easier than diagnosing it post-ingestion.
Product feeds vs ChatGPT ads — foundation and accelerant
The feed and the ad account solve different problems. The feed is catalog infrastructure: it makes your products known to ChatGPT's commerce surfaces. Ads are the paid channel on top — campaigns, context hints, bids, and budgets that buy placement in relevant conversations. For an ecommerce operator the sequencing is usually feed first, ads second: get the catalog flowing and correct, then decide whether paid acceleration clears your economics — our small-business fit guide and cost breakdown cover that decision. And if your products transact through the feed, keep your customer lists flowing back into ads as suppression and bid-up audiences — the two systems compound.
Mistakes to avoid
- Timestamped filenames. A new name every run breaks the overwrite-in-place contract. One stable name, replaced daily.
- Treating the snapshot as an append log. The file is the whole truth every time — yesterday's products do not carry over.
- Skipping the 100-item sample. Schema errors found in the sample cost minutes; found in the full snapshot, they cost days of back-and-forth.
- Letting removals happen implicitly. Decide on
is_eligible_search=falseor omission, and make it a pipeline step, not an assumption. - Building from stale field names. The spec is the contract. Re-validate against it when anything starts failing.
- Publishing without monitoring. Under snapshot semantics, a silent pipeline failure is not "no update" — it is a stale catalog presented as current.
Frequently asked questions
What is a ChatGPT product feed?
A ChatGPT product feed is a structured export of your product catalog, delivered to OpenAI so your products can surface in ChatGPT's commerce experiences. OpenAI's model is a full snapshot: a complete catalog export, pushed over SFTP on a predictable cadence of at least daily, that is treated as the source of truth for your products.
What file format does a ChatGPT product feed use?
OpenAI prefers Parquet, ideally with zstd compression. Gzipped JSONL, CSV, and TSV are also supported. All files must be UTF-8 encoded, and field names and values must follow OpenAI's products spec exactly.
How do I deliver a product feed to OpenAI?
You push the feed to OpenAI over SFTP. Use a stable file name and overwrite it in place on every update rather than creating a new name each run. If you shard the catalog across multiple files, keep the shard set stable and replace the same shard files each time.
How often should I update my ChatGPT product feed?
OpenAI recommends publishing a full snapshot on a predictable cadence of at least daily. Each snapshot is a complete catalog export treated as the source of truth, so anything missing from the latest snapshot is effectively removed.
How big can a ChatGPT product feed file be?
OpenAI recommends up to 500,000 items per shard and targeting shard files under roughly 500 MB. Larger catalogs are split across a stable set of shard files that you replace in place on every update.
How do I remove a product from ChatGPT?
Remove products explicitly, one of two ways: set is_eligible_search to false on the record, or omit the record from your next full snapshot. Because the snapshot is the source of truth, an absent record is a removed record.
Why is my ChatGPT product feed failing ingestion?
The three failure modes OpenAI calls out are missing required fields, outdated or non-spec field names, and malformed field values. Validate a small sample of about 100 items with every required field populated before shipping the full catalog, and QA the first full snapshot against the products spec.
Is a ChatGPT product feed like Google Merchant Center?
Conceptually yes: a structured catalog feed that powers product visibility on the platform, like a Merchant Center or Meta catalog feed. The mechanics differ — OpenAI uses full snapshots pushed over SFTP with Parquet preferred, rather than scheduled fetches or incremental API updates, and the snapshot always wins over anything sent before.
Do product feeds cost anything, and are they the same as ChatGPT ads?
The feed is a catalog integration, not an ad buy — it is how your products become visible in ChatGPT's commerce surfaces. ChatGPT ads are the separate paid channel with bidding and campaigns. For most merchants the feed is the foundation, and ads are the accelerant layered on top.
How should I roll out a ChatGPT product feed safely?
In phases, per OpenAI's own guidance: start with a sample of around 100 items with all required fields in every row, run QA on the first full snapshot, and only then move to steady-state daily automation. Skipping the sample phase is how malformed catalogs end up half-ingested.
Sources and further reading
- OpenAI for Developers — Products spec: full schema and field definitions (the contract every feed must satisfy).
- OpenAI for Developers — Commerce documentation (feed delivery, integration guides, and updates).
- Context Hints — ChatGPT ads for small business, custom audiences, and how ChatGPT ads work.
Getting your catalog into ChatGPT?
30 minutes with Tarun. We will review your feed plan — format, cadence, removal convention, and QA gates — and map where ads and custom audiences compound on top of it.
Book a discovery call