# How to sell on ChatGPT with WooCommerce: product feed, pixel, consent and attribution

> What a WooCommerce store needs to sell on ChatGPT: crawlable products, an OpenAI product feed, the pixel and Conversions API with consent, and per-order attribution.

Canonical: https://convrail.com/blog/sell-on-chatgpt-woocommerce/

A WooCommerce store sells on ChatGPT in three ways: ChatGPT search reads its public product pages when OpenAI's crawler is allowed, a product feed delivers the catalog to OpenAI, and ChatGPT Ads buys extra reach. To know what each one earns, the store needs the pixel and Conversions API, consent handled through the WP Consent API, and attribution on every paid order.

## How a WooCommerce store reaches ChatGPT

Shopify merchants get an organic ChatGPT channel through Shopify Catalog. WooCommerce has no equivalent built into the platform, so a WooCommerce store assembles the same result from three pieces.

| Piece | What it does | Who runs it | What you need |
| --- | --- | --- | --- |
| ChatGPT search | Surfaces public web pages, including product pages, in ChatGPT answers | OpenAI | Allow OAI-SearchBot in robots.txt, clear product pages |
| Product feed | Gives ChatGPT structured catalog data: titles, prices, availability, images | You, a plugin or a connector | A feed that matches OpenAI's spec, delivered daily |
| ChatGPT Ads | Paid placement in ChatGPT, optimized on your conversions | OpenAI, through Ads Manager | An ad account, a pixel, ideally the Conversions API |

Purchases happen on your WooCommerce checkout in every case: the buyer clicks through to your store. That keeps your payment methods and your order data, and it means every ChatGPT sale is a WooCommerce order you can attribute.

## Piece 1: let ChatGPT search read your products

OpenAI documents that "OAI-SearchBot is used to surface websites in search results in ChatGPT's search features", recommends "allowing OAI-SearchBot in your site's robots.txt file", and warns that "sites that are opted out of OAI-SearchBot will not be shown in ChatGPT search answers, though can still appear as navigational links" ([OpenAI](https://developers.openai.com/api/docs/bots)).

On WordPress, robots.txt is often generated by an SEO plugin or a security plugin. Open `https://your-store.com/robots.txt` and check that nothing disallows `OAI-SearchBot`, either by name or through a blanket rule against unknown bots. Then make your product pages readable: a clear title, a description that says what the product is and for whom, a visible price and availability, and product structured data, which most WooCommerce SEO plugins already output.

## Piece 2: the product feed

### What OpenAI expects

OpenAI's [onboarding guide](https://developers.openai.com/commerce/product-feeds/onboarding) sets the shape of the feed:

| Rule | OpenAI's specification |
| --- | --- |
| Feed type | Full snapshot: "a complete catalog export treated as the source of truth" |
| Cadence | At least daily |
| Delivery | Push to OpenAI via SFTP |
| Formats | Parquet preferred (ideally zstd compression); `jsonl.gz`, `csv.gz` and `tsv.gz` also supported |
| Encoding | UTF-8 |
| Size | Up to 500,000 items per shard recommended, shard files under about 500 MB |
| Removal | A product removed from the snapshot can remain for up to 14 days |

Access is gated: OpenAI states that onboarding product feeds "is currently available to approved partners", with an application form ([get started](https://developers.openai.com/commerce/guides/get-started)). The same guide recommends providing "the entire feed once a day via file upload, and then send updates throughout the day via the API".

For ChatGPT Ads, your catalog also has to reach Ads Manager so that product ads can be built from it.

### What breaks a WooCommerce feed

The OpenAI spec is strict, and a malformed line is dropped without a visible error on your store. The usual WooCommerce causes:

- **Variable products exported as one line.** Each variation is a separate item with its own price, stock and attributes, linked to its parent by a group identifier.
- **Prices with the wrong format or currency**, especially with multi-currency plugins.
- **Missing identifiers.** WooCommerce has no GTIN field by default; it lives in a plugin or a custom field, and many stores never fill it.
- **Relative or non-HTTPS image URLs** produced by CDN or media plugins.
- **Brand missing**, because WooCommerce has no native brand field on older versions.

The field-by-field rules are in [the OpenAI product feed spec explained](/blog/openai-product-feed-spec-explained/), the format trade-offs in [parquet vs JSONL vs CSV for the OpenAI feed](/blog/parquet-vs-jsonl-vs-csv-openai-feed/), and the differences with what you already send to Google in [Google Shopping feed vs OpenAI feed](/blog/google-shopping-feed-vs-openai-feed/).

## Piece 3: ChatGPT Ads tracking on WooCommerce

### The pixel and the Conversions API

ChatGPT Ads learns from the conversions you send. OpenAI provides two channels:

- **The Measurement Pixel**, a script at `https://bzrcdn.openai.com/sdk/oaiq.min.js`, initialized with `oaiq("init", { pixelId })` and fired with `oaiq("measure", eventName, eventData)`. It captures the `oppref` attribution identifier from the landing URL ([pixel reference](https://developers.openai.com/ads/measurement-pixel)).
- **The Conversions API**, `POST https://bzr.openai.com/v1/events?pid=<PIXEL-ID>`, called from your server. Batches hold up to 1,000 events, timestamps must be "within the last 7 days and no more than 10 minutes in the future", and `validate_only` lets you test without saving ([Conversions API reference](https://developers.openai.com/ads/conversions-api)).

Send each order from both, with the same identifier: OpenAI's rule is to "reuse the same value as the API `id` and pixel `event_id`", and it keeps one copy. Emails, phones and names go out only as SHA-256 hashes. The reasoning is in [OAIQ pixel vs Conversions API](/blog/oaiq-pixel-vs-conversions-api/) and the privacy side in [server-side tracking without leaking personal data](/blog/server-side-tracking-without-leaking-pii/).

### Which WooCommerce hook to use

Send the server copy when the order is paid, not when it is created. A WooCommerce order created with a deferred payment method (bank transfer, cash on delivery) may never be paid; counting it at creation inflates conversions and teaches campaigns the wrong thing. Use the payment completion and status change hooks, and send the order once it reaches a paid status.

Cancellations and refunds matter too. OpenAI's Conversions API cannot retract a conversion already sent, but your own revenue reporting should drop a refunded order. Convrail rectifies refunded and cancelled orders in your dashboard for that reason.

## Consent on WooCommerce: the WP Consent API

### What it standardizes

On WordPress, cookie banners and tracking plugins come from different vendors. The [WP Consent API](https://wordpress.org/plugins/wp-consent-api/) standardizes how plugins tell each other which kinds of consent a visitor has accepted. It defines five consent types (functional, preferences, statistics-anonymous, statistics, marketing) and a function, `wp_has_consent('marketing')`, that any plugin can call.

Advertising measurement belongs to the **marketing** category, defined as storage "required to create user profiles to send advertising or to track the user".

### What a well-behaved tracking plugin does

- **Before consent**: no cookie is written and nothing is sent to OpenAI from the browser. Events wait in memory.
- **Consent given**: the waiting events are sent, and tracking continues normally.
- **Consent refused**: nothing goes to OpenAI from the browser. The order still exists, so your own reporting should count it, without personal data.
- **No consent plugin installed**: WordPress exposes no consent state. The plugin behaves as configured, and your cookie policy applies.

This is how the Convrail plugin works. On refusal, the order is reported to your Convrail dashboard without any customer detail (no email, no phone, no city, no postcode), so your revenue figures stay right while the visitor's choice is respected.

## Attribution: which orders ChatGPT really brought

A ChatGPT sale on WooCommerce is attributed from evidence the order carries:

| Evidence | Channel | How it reaches the order |
| --- | --- | --- |
| `oppref` in the landing URL | ChatGPT Ads | Captured on landing, kept in a first-party cookie, attached to the order |
| ChatGPT referrer or `utm_source` | Organic ChatGPT | Landing URL and referrer stored in first-party cookies, attached to the order |
| Neither | Another channel | Not counted as ChatGPT |

The split matters for money: an organic sale has no ad cost, an ad sale does. Mixing them inflates your return on ad spend. The method and its limits are in [ChatGPT organic vs ChatGPT Ads attribution](/blog/chatgpt-organic-vs-ads-attribution/).

## What a ChatGPT plugin for WooCommerce must do

Whether you build it or install one, use this list to judge it:

1. **Build a feed that matches OpenAI's spec**, variations included, and show which products are refused and why.
2. **Install the pixel without theme edits**, and wait for marketing consent through the WP Consent API.
3. **Send paid orders server-side** with the same event ID as the pixel, amounts in minor units, identifiers hashed.
4. **Keep the click context** (landing URL, referrer, `oppref`) until checkout, in first-party storage.
5. **Never block the sale on tracking**: a refusal, an ad blocker or an OpenAI outage must not break the checkout.
6. **Retry failed sends** with the same IDs, and alert you when retries are exhausted.
7. **Keep the WordPress side light**: heavy work (validation, batching, retries) belongs on a server, not in a PHP request on your store.

## Step by step with Convrail

1. **Install and activate the Convrail plugin**, which requires WordPress 6.0 or later and PHP 7.4 or later.
2. **Open WooCommerce > Convrail and click "Connect this store".** The platform verifies that your site controls its domain, then stores a scoped token.
3. **In Settings, paste your Ads Manager key.** Convrail creates your pixel and Conversions key, or you enter your Pixel ID and Conversions key by hand if automatic setup is not open on your ad account yet.
4. **Products sync automatically.** Each one is checked against the OpenAI spec before it is sent, with the exact fix for every refusal and optional AI rewrites that apply to the feed only, never to your store.
5. **Orders are tracked from the next checkout**: browser and server copies counted once, consent respected.
6. **Read your numbers**: revenue from ChatGPT with ads and organic apart, return on ad spend, and net margin per product once your product costs and ad spend are in.
7. **Let the alerts watch for you**: tracking, sending and feed delivery are checked continuously, with an email when something breaks and a weekly ChatGPT sales report.

The WooCommerce details are on the [WooCommerce page](/platforms/woocommerce/), and plans on the [pricing page](/pricing/).

## Common mistakes

- **Blocking OAI-SearchBot by accident** through a security plugin's bot rules.
- **Sending orders at creation** instead of payment, so unpaid orders become conversions.
- **Loading the pixel before consent** in regions that require it.
- **Exporting variable products as a single item**, so the buyer's size or color never matches.
- **Trusting Ads Manager as your revenue figure.** It reports what OpenAI attributes to ads, not your organic ChatGPT sales, and not your margins.

## Where Convrail fits

The Convrail plugin is a thin connector to the Convrail platform: your catalog, your paid orders and your settings go through an authenticated bridge, and validation, batching, retries and feeds run on the platform. It covers [conversion tracking](/tracking/), the [product feed](/product-feed/), [attribution](/attribution/), profit per product, alerts and AI search visibility for WooCommerce stores.