Product feed

Get your products into ChatGPT, without silent rejections

OpenAI drops a malformed product without telling you, and the product never shows up. Convrail keeps your catalog in sync, checks every row of your product feed against the official specification before delivery, sends the accepted rows in the format OpenAI expects, and lists each rejection with its fix.

  • Checked against the official OpenAI specification
  • Created at OpenAI and delivered for you
  • Every rejection listed with its fix

Today’s feed, 9,987 products

✓ 9,974 ready for ChatGPT 13 to fix before delivery

  • Nordic Oak lamp title over 150 characters shorten
  • Loop chair price "25,99" malformed 25.99 EUR
  • Sahel rug HTML tags in description clean up

Delivered to OpenAI at 04:00, full run log available

Illustrative example, not a customer result.

What changes for your store

No product dropped in silence

A title in capital letters, HTML in a description or a price written “25,99” is caught before OpenAI sees it, with the correction to make.

A feed that stays current

Product changes in your store reach OpenAI within the hour, and your full catalog is sent again once a day.

Always know what was sent

Each delivery is logged: products read, accepted and rejected, what changed since the last one, and whether the file arrived.

Everything your feed needs, included

  • Catalog kept in sync

    Product webhooks on Shopify and batched sync on WooCommerce keep the feed current, with a full resync on demand.

  • Line-by-line validation

    The 9 required fields and their exact limits, price format, image files, identifiers and placeholder values, checked on every row.

  • Fixes, not error codes

    Each rejected product is listed with the field, the rule it broke and the correction to make.

  • Clean product data

    HTML is stripped from descriptions, prices use your store currency and variants are grouped under one product.

  • Your feed settings applied

    Store name, target countries and eligibility for ChatGPT search and ads, set once and applied to every product.

  • Invalid barcodes handled safely

    A GTIN with a wrong check digit is left out rather than sent, so the product stays in the feed.

  • Four export formats

    Compressed JSON Lines by default, or Parquet, CSV or TSV, with files split under the size limits of the specification.

  • Created and delivered for you

    Once your ChatGPT Ads account is linked, Convrail creates your feed at OpenAI and uploads every delivery, with retries and an alert if it keeps failing.

  • A journal for every run

    Accepted and rejected counts, what was added, removed or changed since the previous run, and the delivery status.

Live in three steps

  1. Install Convrail

    On Shopify or WooCommerce. Your catalog syncs on its own.

  2. Set up your feed

    Store name and target countries. Link your ChatGPT Ads account and your feed is created at OpenAI, with nothing else to enter.

  3. Fix what matters, deliver the rest

    Accepted products are delivered within the hour; rejected ones wait for the fix shown in the app.

Under the hood

For technical teams and agencies: the required fields and their limits, how a catalog becomes a delivered file, and what each run records.

The silent rejection problem

The OpenAI feed ingestion does not return an error report per row. A title in capital letters, HTML left in a description or a price written as "25,99" means the product is skipped, and nothing tells you. Merchants discover it weeks later when a product they sell every day never appears in ChatGPT. Convrail moves that check to your side of the fence: every row is validated before delivery, and every rejection is written to the run journal with the field, the rule and the correction.

✗ "25,99" as a price: the row is gone and so is the product
✓ caught before delivery: price must be "25.99 EUR"

The 9 required fields, with the exact limits

These are the rules Convrail enforces, taken from the OpenAI product feed specification. Each one is covered by an automated test.

Required fields of the OpenAI product feed and how Convrail validates them
FieldRuleTypical rejection
item_idRequired, stable, 100 characters maxVariant ID that changes on re-import
titleRequired, 150 characters max, not all capital letters"WIRELESS HEADPHONES XL"
descriptionRequired, 5,000 characters max, plain textHTML tags left from the store editor
urlRequired, valid http(s) URLRelative path
brandRequired, 70 characters maxEmpty vendor field
image_urlRequired, direct HTTP(S) link to a JPEG or PNG, HTTPS recommended.webp file, URL with credentials
price"<amount> <ISO-4217>", greater than 0"25,99", "25.99", "€25.99"
availabilityin_stock, out_of_stock, pre_order, backorder or unknown"available"
seller_nameRequired, real seller name, 70 characters maxMissing, "unknown"

Conditional and recommended fields are checked the same way when they are present, because a malformed optional field also drops the row.

Conditional and recommended fields validated by Convrail
FieldRuleTypical rejection
is_eligible_searchLowercase "true" or "false"; omitted means trueBoolean, "TRUE", "yes"
is_ads_eligibleLowercase "true" or "false"; required for ads processing"1", "yes"
target_countriesUppercase ISO 3166-1 alpha-2 codes, configured with your OpenAI setup"France", "USA"
gtin8, 12, 13 or 14 digits with a valid check digitTypo in the barcode, dashes
sale_priceSame currency, strictly less than priceSale price equal to price
group_idStable and different from item_idgroup_id copied from item_id
brand, seller_nameReal values, never placeholders"n/a", "null", "unknown"

Also checked when present: mpn (70 characters max), availability_date (ISO 8601), star_rating and popularity_score (0 to 5), review_count and return_deadline_in_days (positive integers). When neither GTIN nor MPN exists, identifier_exists is set to "no". A GTIN with a wrong check digit is omitted rather than sent, so the row stays valid.

From catalog to delivered file

  1. Your catalog stays in sync

    Product webhooks keep Convrail’s copy of your catalog current. Changes are debounced for 30 seconds so a bulk edit triggers one rebuild, not a hundred. A full sync is available on demand.

  2. Each product becomes a feed item

    HTML is stripped from descriptions, prices are formatted with the store currency, variants are grouped under group_id, and your seller name, target countries and eligibility flags are applied from the feed settings.

  3. Every row is validated

    Accepted rows go into the file. Rejected rows are journaled with the field and the rule they broke. The count of rejections is visible in the app before the file leaves.

  4. The file is exported and sharded

    Formats: jsonl.gz by default, or parquet, csv.gz or tsv.gz. Files are split at 500,000 items or roughly 450 MB, under the limits of the specification, with stable names (feed-organic-000.jsonl.gz) so each delivery overwrites the previous snapshot.

  5. Delivered to OpenAI for you

    Convrail creates your feed at OpenAI, with its own upload access, and delivers the files there: product changes within the hour, at most one delivery per hour so OpenAI can finish processing the previous one, and the full catalog once a day. Failed deliveries retry, then open a health alert.

A journal for every run

Each run records the number of items read, accepted and rejected, the diff against the previous run (added, removed, changed) and the delivery status. The per-row errors are kept with the run, so you can trace when a product disappeared from the feed and why.

Run fieldMeaning
itemsTotal, itemsValid, itemsRejectedHow many rows were built, kept and dropped
added, removed, changedDiff against the previous run, computed from a hash of each row
errorsOne entry per rejected item: item_id, field, message
deliveryStatuspending, delivered or failed, with the attempt count

If you already have a Google Shopping feed

Most fields transfer, some do not. OpenAI expects is_eligible_search, is_ads_eligible and target_countries that Google never asked for, uses seller_name instead of a merchant account, and formats booleans as lowercase strings. Convrail keeps a Google-compatible projection of your feed as well, so the same catalog serves both channels without maintaining two exports.

Frequently asked questions

Which formats does OpenAI accept for the product feed?

Parquet (recommended for large catalogs), gzipped JSON Lines, CSV and TSV. Convrail exports all four: gzipped JSON Lines (jsonl.gz) is the default, and another format can be chosen in the advanced feed settings.

How often is the feed delivered?

Changes to your products go out within the hour, with at most one delivery per hour so OpenAI can finish processing the previous one, and your full catalog is sent again once a day. Filenames stay stable, so each delivery replaces the previous one.

What happens to a product with an invalid row?

It is excluded from that delivery and listed in the run journal with the field and the rule it broke. Fix the product in your store and the next run picks it up.

Do I need a separate feed for ChatGPT Ads?

No. OpenAI uses one product feed for organic results and ads: each row says whether it can be used in ads with the is_ads_eligible flag. Convrail sets it from your feed settings.

How large can my catalog be?

Files are sharded at 500,000 items or about 450 MB each, within the limits of the specification. In our automated test, a 10,000-product catalog is validated, exported and delivered to SFTP in under a minute.

Where are the feed upload credentials stored?

The upload access created at OpenAI for your feed is encrypted at rest with AES-256-GCM, like every secret Convrail stores, and decrypted only at delivery time.

Measure the ChatGPT channel this week

Convrail starts with a Free plan, and paid plans begin with a free trial. Leave your email and we send the install link when your spot opens.

No newsletter. One email with the install link, nothing else.