Available for projects & agency overflow · Quick reply, from the person who does the work

ChatGPT Ads conversion tracking: OpenAI pixel, Conversions API and consent

ChatGPT ads have been running in France and 30 other European countries since late August 2026. To know which ads actually sell, and to let conversion-optimised campaigns do their job, the shop’s real sales have to be sent back to OpenAI. That is what the measurement pixel and the Conversions API are for, provided they are wired together, gated on consent, and the click identifier is not lost along the way.

Describe my issue Send a message

A conversation panel linked to a single purchase and a measurement dashboard by two glowing paths.

Want it done, and done properly?

What changed for advertisers in 2026

OpenAI opened conversion measurement in May 2026, with two building blocks released together: a measurement pixel running in the browser, and a Conversions API receiving events from your server. June 2026 brought conversion-optimised campaigns (oCPC, described as an open beta in the documentation): you still pay per click, but delivery is steered towards people likely to complete the chosen conversion event.

On 18 August 2026, OpenAI announced that ChatGPT ads would expand to 31 European countries, France included. Delivery started on 24 August, first through partners (OpenAI’s sales team, agencies, technology partners), followed by self-serve access in Ads Manager. Ads are only shown to users on the Free and Go plans; Plus, Pro and Enterprise subscribers do not see them.

The practical consequence for a PrestaShop or WooCommerce shop: an oCPC campaign requires conversion tracking already in place and one active conversion event, chosen at creation and not editable afterwards. Without reliable measurement, you buy clicks without knowing which ones sell, and the algorithm has nothing to learn from.

The OpenAI measurement pixel: what it does in the browser

The pixel is a JavaScript SDK, oaiq.min.js, initialised with your Pixel ID. It sends events through oaiq("measure", name, data, options). When a visitor arrives from an ad, the landing page URL carries an oppref parameter: the pixel reads it and stores it in a first-party __oppref cookie, valid for 30 days from the last write. It also sets an __obref cookie, a random browser identifier kept for 365 days.

The documentation also covers advanced matching: email, phone, customer ID, first and last name can be sent as SHA-256 hashes after precise normalisation (lower-case email without spaces, phone reduced to digits, and so on). An automatic mode detects this information on the page without raw data ever reaching OpenAI.

Finally, there is a JavaScript-free image tag, useful as a noscript fallback or for a page-load conversion. It is limited: one event per request, no user object, and it does not capture oppref by itself. For a shop, it is a complement, never the main setup.

OpenAI pixel: consent first, measurement second
// Until the visitor accepts, the pixel measures nothing
oaiq("consent", false);
oaiq("init", { pixelId: "<PIXEL-ID>" });

// Called by the consent banner, once accepted
oaiq("consent", true);

// On the order confirmation page
oaiq("measure", "order_created", {
  type: "contents",
  currency: "EUR",
  contents: [{ id: "SKU-123", quantity: 1 }]
}, { event_id: "<ID-SHARED-WITH-THE-SERVER>" });

The Conversions API: the same sale, sent from the server

The Conversions API accepts POST requests on the /v1/events?pid=<PIXEL-ID> endpoint of OpenAI’s collection domain, authenticated with a separate API key, also obtained from the conversions tab in Ads Manager. One request can batch up to 1,000 events; if a single event is invalid, the whole batch is rejected. Each event carries an id, a type (order_created, items_added…), a timestamp_ms that must reflect when the conversion actually happened and be no more than seven days old, the source URL and, inside a data object, the order amount, currency and contents.

Two details matter a lot. The amount is an integer in the currency’s minor unit: €59.90 is sent as 5990. And the validate_only field lets you test a call without saving anything: this is validation mode, to be used before going live.

Why double up on the pixel? Because some browser events never arrive: blockers, private browsing, a confirmation page closed too early, a payment completed at the provider without returning to the shop. The server, on the other hand, knows an order was confirmed. OpenAI explicitly recommends using both together.

Conversions API: one purchase, shortened
{
  "validate_only": true,
  "events": [{
    "id": "<ID-SHARED-WITH-THE-PIXEL>",
    "type": "order_created",
    "timestamp_ms": <ORDER-TIMESTAMP-IN-MS>,
    "oppref": "<__oppref-COOKIE-VALUE>",
    "source_url": "<CONFIRMATION-PAGE-URL>",
    "action_source": "web",
    "user": {
      "obref": "<__obref-COOKIE-VALUE>",
      "emails_sha256": ["<SHA256-HASH>"]
    },
    "data": {
      "type": "contents",
      "amount": 5990,
      "currency": "EUR",
      "contents": [{ "id": "SKU-123", "quantity": 1 }]
    }
  }]
}

Deduplication: one sale, not two

When the same order is sent from both the browser and the server, OpenAI treats it as a single event if three things match: the same Pixel ID, the same event name and the same identifier, called event_id in the pixel options and id in the Conversions API. The first one received wins; later ones are ignored.

The difficulty is practical: the identifier must be known on both sides. I generate it when the order is created, store it with the order, and inject it into the confirmation page for the pixel as well as into the server call. I avoid using the plain order number: an opaque identifier is enough and exposes nothing.

Setting up ChatGPT Ads conversion tracking

  1. Create the data source

    In OpenAI’s Ads Manager, conversions tab: create the Pixel ID and the Conversions API key. The key stays on the server, never in the theme code.

  2. Choose the events to measure

    For a shop: contents_viewed (product page), items_added (add to cart), checkout_started, order_created (purchase), and where relevant registration_completed or lead_created.

  3. Wire up consent

    The pixel only loads once accepted in the banner (tarteaucitron.js, Axeptio, Cookiebot, Didomi, CookieYes, Complianz). No consent: no cookie, no request.

  4. Keep oppref and obref

    Read on arrival, stored with the cart and then the order, so the server call can send them several pages or several days later.

  5. Send the order from the server

    When the shop confirms the order, not when a page loads: the event is sent even if the customer never comes back to the confirmation page.

  6. Validate before going live

    Calls in validate_only, then a check of recent events in Ads Manager: both the browser and the server channel should appear, with no duplicates.

Consent and GDPR: what to settle before the first sale

The OpenAI pixel sets advertising cookies and sends browsing data to a third party: in France and the rest of the EU, that requires the visitor’s prior consent, just like the Meta pixel or Google Ads. One point specific to this pixel: according to the documentation, its consent defaults to true until you set it to false. So you must either call oaiq("consent", false) before initialisation, or only load the script after acceptance. I do both: the script is not loaded before consent, and the state is set to false as a safeguard.

With tarteaucitron.js, the pixel is declared as a custom service that only runs once accepted. With Axeptio, Cookiebot, Didomi, CookieYes or Complianz, loading is tied to the marketing purpose or to a vendor declared in the tool. When the banner publishes Google Consent Mode signals, the ad storage state can be used as the trigger.

The same rule applies on the server: I store the consent state with the order, and the Conversions API sends nothing for a visitor who refused. Emails and phone numbers never leave in clear text, only as SHA-256 hashes. The documentation also provides an opt_out field per event, and states that OpenAI does not currently use pixel data for individual personalisation. Finally, the processing must appear in your privacy policy and records: choosing the legal basis is up to you or your DPO; I provide the exact technical description of what is sent.

ChatGPT Ads tracking ready to install on your platform

The mistakes I see most often

  • The Conversions API does not capture oppref for you. Send it when available, together with matching signals allowed by consent. Its absence can reduce click attribution; it does not mean that every form of attribution is impossible.
  • Different identifier or different event name between pixel and server: every purchase is counted twice
  • Pixel loaded before consent because its default state is “accepted”
  • Amount sent in euros with decimals instead of an integer in cents
  • Server event fired when the confirmation page loads, so it is lost when the customer does not come back from the payment page
  • Conversions API key pasted into the theme JavaScript, readable by any visitor
  • A batch of a thousand events rejected because of a single timestamp older than seven days
  • Pixel installed twice: once in the theme, once through a module or a tag manager

What about a tag manager?

Going through Google Tag Manager in the browser or a server-side container is possible, and sometimes the right choice when a shop already centralises all its measurement there. But on PrestaShop and WooCommerce, the reliable information, the confirmed order with its amount and consent state, lives in the shop itself. Sending the server conversion from the order confirmation hook removes a layer, and therefore a source of mismatch. I decide based on what is already in place: the goal is a single source of truth, not a pile of tools.

For principles shared by every ad platform, the pages on the ecommerce events that matter and on the Meta pixel and Conversions API explain the same pixel-plus-server logic. The official sources used here are the measurement pixel documentation, the Conversions API documentation, the list of supported events and the image tag documentation.

Request the module or a tracking audit

Frequently asked questions

What is ChatGPT Ads?
The ads OpenAI shows inside ChatGPT to users on the Free and Go plans. They have been available in France since 24 August 2026, first through partners and then self-serve in Ads Manager.
Is the OpenAI pixel enough to track ChatGPT Ads conversions?
It works on its own, but it loses some events: blockers, cookie refusals, a confirmation page never shown after payment. OpenAI recommends pairing it with the Conversions API and deduplicating with the same event identifier.
What is oppref?
The click identifier OpenAI appends to the landing page URL, the equivalent of Google’s gclid or Meta’s fbclid. The pixel keeps it for 30 days in the __oppref cookie. The Conversions API does not read it: you have to send it with each server event.
Which events should an online shop send?
At the very least order_created for purchases. Then contents_viewed, items_added and checkout_started to follow the journey, and registration_completed or lead_created if account creation or quote requests matter to you. A conversion-optimised campaign relies on a single active event.
Is visitor consent required?
Yes in France and the EU: the pixel sets advertising cookies and sends data to a third party. The pixel must not load before acceptance, and the server call must follow the same choice. Deciding the legal basis is the data controller’s responsibility.
Is my consent tool compatible?
The module I install hooks into tarteaucitron.js through a custom service, and into Axeptio, Cookiebot, Didomi, CookieYes or Complianz through the marketing purpose. Google Consent Mode signals can also act as the trigger. I check your configuration during installation.
How long does the setup take?
It mainly depends on the state of the shop: theme, tracking modules already present, consent tool, access to Ads Manager. Describe your setup through the contact form and I will give you a precise timeframe before starting.

Describe your need in one minute

A few targeted questions so I can reply with an estimate rather than another questionnaire.

outil
api
sens
frequence (facultatif)
Please provide an email or a phone number so I can get back to you.

Please provide an email or a phone number so I can get back to you.