# How to write product titles and descriptions for ChatGPT

> OpenAI's feed rules for product titles and descriptions, how to write for an assistant that reads meaning, before and after examples, and mistakes to avoid.

Canonical: https://convrail.com/blog/write-product-descriptions-for-chatgpt/

To write product titles and descriptions for ChatGPT, state facts in plain text. A title of 150 characters at most names the product and its variant; a description of 5,000 characters at most says what it is, what it is made of, who it is for and what limits it. OpenAI asks for concise, factual copy without promotional language, so drop slogans and capitals.

This guide sets out the rules OpenAI publishes, explains how to write for an assistant that reads meaning rather than keywords, shows before and after examples, and lists the mistakes that cost the most.

## What the OpenAI specification requires

The [OpenAI product feed specification](https://developers.openai.com/commerce/product-feeds/spec) defines every field ChatGPT reads. The ones that shape your copy are below.

| Field | Rule in the specification | What it means for your writing |
| --- | --- | --- |
| `title` | Required, plain text, 150 characters at most. "Product name, including the selected variant when relevant." | One line that names the product, its type and the variant (color, size) |
| `description` | Required, plain text, 5,000 characters at most. "Factual product description for this item." | Facts about this item, no HTML |
| `brand` | Required | Do not rely on the title alone to carry the brand |
| `gtin` / `mpn` | Product identifiers; a GTIN has 8, 12, 13 or 14 digits and a valid check digit | Lets the product be matched to known catalogs |
| `product_category` | A path separated by `>`, such as `Apparel & Accessories > Shoes` | Says where the product belongs |
| `material`, `color`, `size` | Attribute fields | Facts that answer buyer questions directly |
| `group_id`, `listing_has_variations`, `variant_dict` | Group variants and describe what differs between them | Each variant gets accurate copy |

Two rules matter more than they look:

- **Plain text means plain text.** A description pasted from a theme often carries `<p>`, `<br>` and `<strong>` tags. The specification asks for plain text, so HTML has to be cleaned out before delivery. Convrail strips tags from titles and descriptions when it builds the feed, and its validator flags any description that still contains them.
- **The variant belongs in the title when it matters.** If a jacket comes in navy and olive, the specification describes the title as the product name "including the selected variant when relevant". A shopper who asks for an olive jacket should see "olive" in the line ChatGPT shows.

## What OpenAI's best practices add

OpenAI's [product feed best practices](https://developers.openai.com/commerce/guides/best-practices) go further than the specification. Three points shape the copy:

1. **Factual, not promotional.** "Use concise, factual copy that helps users understand products. Plain text and bullet-style text are both acceptable." The guide also asks merchants to avoid promotional language.
2. **Variant-specific when variants differ.** Keep the title, URL, description, media, availability and price specific to each variant when they differ between variants.
3. **Richer is better, but not mandatory.** OpenAI notes that descriptions and taxonomies can improve answer quality but are not required for a product to be ingested. A thin description will not block your feed; it will just give ChatGPT less to work with.

There is also a reason not to over-polish. OpenAI's help center article on [shopping with ChatGPT Search](https://help.openai.com/en/articles/11128490-shopping-with-chatgpt-search) explains that product results draw on structured metadata from merchants and third parties, such as price and description, and that ChatGPT may generate simplified titles and descriptions for display. Your copy is raw material for an answer, not a finished advert. The facts in it are what survive.

## Writing for an assistant that reads meaning

A search engine built on keywords rewards repeating the words people type. An assistant does something different: it reads a question in plain language ("a quiet desk fan for a small bedroom, under 40 dB") and looks for products whose description lets it answer that question with confidence.

That changes what a good description contains. Instead of keywords, it needs the facts an assistant would have to quote to recommend the product:

- **What it is**, in the words a buyer would use, not only your internal name.
- **What it is made of** or its main specifications: materials, dimensions, capacity, power, weight.
- **Who it is for**, and for what situation: small spaces, beginners, sensitive skin, outdoor use.
- **Its main uses**, stated plainly.
- **Its constraints**: sizes available, compatibility, care instructions, what it does not do.

The last point is the one most stores skip. An assistant comparing three products for a shopper needs to know which one does not fit a 30 cm shelf or does not work with a given phone. A description that states its limits is easier to recommend accurately, and less likely to produce a return.

A practical test: read your description and ask, "Could someone answer a buyer's question from this text alone, without seeing the photos?" If the answer depends on an image, a size chart in a picture, or a badge on the product page, the information is missing from what ChatGPT reads.

## Before and after: worked examples

The two products below are **fictional examples**, written for this guide. They show the shape of a good rewrite, not real catalog data.

### Example 1: a desk lamp (fictional)

**Before**

- Title: `NORDIC OAK LAMP !!! BEST SELLER, FREE SHIPPING`
- Description: `<p><strong>The lamp everyone is talking about!</strong></p><p>Elevate your space with our iconic design. Order now!</p>`

**After**

- Title: `Nordic Oak LED desk lamp, walnut base, dimmable, warm white`
- Description: `LED desk lamp with a solid walnut base and an adjustable aluminum arm. Three brightness levels and a warm white light suited to reading and evening work. Fits a small desk: the base is 15 cm wide. Powered by USB-C, cable included, adapter not included. The LED module is built in and cannot be replaced.`

What changed:

| Before | After | Why it helps |
| --- | --- | --- |
| All capitals, exclamation marks | Sentence case | Reads as a product name, not a banner |
| "Best seller, free shipping" | Type, material, feature, light color | Facts a shopper can ask about |
| HTML tags | Plain text | Meets the specification |
| "Elevate your space" | Dimensions, power, what is included | An assistant can answer "will it fit?" and "what do I need?" |
| No limits stated | "Adapter not included", "cannot be replaced" | Honest limits reduce wrong recommendations and returns |

### Example 2: a running jacket with variants (fictional)

**Before**

- Title for every variant: `Storm Runner Jacket`
- Description: `Our best jacket yet. Perfect for any weather!`

**After**

- Title, olive, size M: `Storm Runner waterproof running jacket, olive, men's M`
- Description: `Lightweight waterproof running jacket with taped seams and a packable hood. Recycled polyester shell, mesh lining on the back for ventilation. Reflective details on the chest and back for running at dusk. Packs into its own chest pocket. Machine wash at 30 °C, do not tumble dry. Regular fit: size up if you wear layers underneath.`

Each variant shares a `group_id`, the listing sets `listing_has_variations`, and `variant_dict` records what differs (color and size). The title carries the variant because the specification asks for it when relevant, and a shopper who asks for "an olive running jacket in medium" can be matched to exactly this line.

## The mistakes that cost the most

| Mistake | Why it hurts | Fix |
| --- | --- | --- |
| HTML left in descriptions | The specification requires plain text | Strip the tags before delivery |
| Titles over 150 characters | Over the specification's limit | Keep the name, type and variant; drop the rest |
| Titles in capital letters or full of symbols | Reads as promotion, not as a name | Sentence case, no emoji, no "!!!" |
| Promotional claims ("best", "number one") | OpenAI asks for factual copy without promotional language | Replace each claim with a checkable fact |
| The same title and description for every variant | Best practices ask for variant-specific copy when variants differ | Put color, size or material in each variant's title |
| Information only in images | An assistant reads the text fields | Write sizes, materials and limits into the description |
| A one-line description | Descriptions can improve answer quality | State what it is, materials, audience, uses and constraints |
| Missing brand, identifiers or category | Fewer signals to match and place the product | Fill `brand`, `gtin` or `mpn`, and `product_category` |
| Prices or promotions written into the copy | Text goes stale while the price field changes | Keep prices in `price` and `sale_price`, never in the description |

That last point is easy to miss. The specification has a `sale_price` field, which must be strictly lower than `price`. A description that says "now 20% off" stays in the feed after the sale ends, and contradicts the price ChatGPT shows next to it.

## How Convrail helps

Writing hundreds of descriptions by hand is the bottleneck. Convrail's [feed optimization](/feed-optimization/) covers three parts of the job.

**A completeness score from 0 to 100 for every product.** A valid row earns 50 points, and each recommended field adds a fixed bonus: a GTIN or MPN (10), a product category (8), a description of 200 characters or more (6), a sale price when the product is on promotion (6), additional images (5), a rating and review count (5), described variants (5) and a return window in days (5). The actions are sorted by the points they would gain, so you start with what matters most.

**AI drafts written for the feed.** The rewriting assistant drafts a title under 150 characters, never in capital letters, and a plain-text description within the 5,000-character limit of the feed: what the product is, every feature and specification your listing states, who it is for, its main uses and its constraints. It reads the title, description, brand, category, variant options and main image, and only states facts it finds there, so the draft does not invent attributes the product does not have. If the AI provider is unavailable, nothing changes and the app says so.

**Applied to the feed, never to your store.** Rewrites go to the feed sent to ChatGPT only. Your product pages are never edited, and a catalog resync does not erase the rewrites. On WooCommerce, you read the suggestion before applying it. On Shopify, one click drafts and applies it, and the result is shown right away. For each variant, "See what is sent" shows the exact fields OpenAI receives.

The [product feed](/product-feed/) then validates every row against the OpenAI specification before delivery, so a rewrite that breaks a rule is caught before it reaches OpenAI.

## Where to go next

Good copy is one lever among several. The full list, from availability to reviews, is in [how to get your products recommended by ChatGPT](/blog/get-products-recommended-by-chatgpt/). Every field mentioned here is explained in [the OpenAI product feed specification, explained](/blog/openai-product-feed-spec-explained/). If products are missing from ChatGPT altogether, start with [why your products are not showing in ChatGPT Shopping](/blog/products-not-showing-chatgpt-shopping/). To see whether better copy changes how often your store is named, [AI search visibility](/ai-visibility/) tracks the buying questions you choose every week.

## Checklist

- [ ] Titles under 150 characters, plain text, in sentence case
- [ ] Each variant's title names its color, size or material when they differ
- [ ] Descriptions in plain text, with no HTML tags
- [ ] Each description states what the product is, its materials, its audience, its uses and its limits
- [ ] No promotional claims, no prices or discounts written into the copy
- [ ] `brand`, `gtin` or `mpn`, and `product_category` filled in
- [ ] Information shown only in images is written into the text