Skip to content
Cover illustration for ChatGPT Ads Conversions API: how to set up the Pixel and server events

ChatGPT Ads Conversions API: how to set up the Pixel and server events

How to track ChatGPT Ads conversions: install OpenAI’s Pixel, send server events through the Conversions API from server-side GTM or your backend, share one event ID for deduplication, and check that it works.

Jamie IsabelBy 12 min read

ChatGPT Ads measures conversions with two OpenAI tools: the Measurement Pixel in the visitor’s browser and the Conversions API, which your server calls. Use the Pixel to capture the ad click, and the Conversions API for anything your backend confirms. Send both with one shared event ID, from a server container on your own domain.

What conversion tracking does ChatGPT Ads offer?

ChatGPT Ads is a new ad platform, and its measurement tools are new too. As of October 2026, OpenAI’s conversion measurement guide says you create a data source in Ads Manager, then send conversion events with the OpenAI Pixel, the Conversions API, or both. OpenAI credits a conversion when the event matches a conversion event set on the campaign, falls inside its attribution window, and can be connected to an eligible ad click.

The pieces available today:

  • Measurement Pixel. A JavaScript tag loaded from OpenAI’s CDN. It sends browser events and captures the click reference.
  • Conversions API. A server endpoint for the same events, plus app events and events with an offline action source.
  • Image tag. OpenAI’s image tag sends one page-load event without JavaScript. It cannot send customer data or measure later clicks and form submits.
  • Partner integrations. OpenAI’s partner guide lists measurement partners such as LiveRamp, Hightouch and Northbeam, and names Stape and Datahash as tools for implementing the Pixel and Conversions API.
  • Conversion-optimized campaigns. Per OpenAI’s campaign guide, these need conversion tracking through the Conversions API and/or the Pixel, and optimize toward one standard event. Custom events are not supported as the goal.

The click reference. OpenAI appends an oppref parameter to the landing page URL. The Pixel stores it in a first-party __oppref cookie for 30 days. The Conversions API does not capture it, so your server has to read it and send it with each event. OpenAI also documents automatic advanced matching, where the Pixel hashes customer details it finds on the page, and modeled conversions where available.

Pixel vs Conversions API: what each one does

You can run either one alone. OpenAI recommends both together “for more resilient measurement.” Click through to see how they differ.

Where it runs

Pixel

In the visitor’s browser, loaded from OpenAI’s CDN

Conversions API

On your server, as a POST to bzr.openai.com

1 / 6

From OpenAI’s Measurement Pixel and Conversions API documentation, October 2026.

What you need before you start

  1. An active OpenAI Ads Manager account with access to the ad account you advertise from.
  2. A data source in the Conversions section of Ads Manager, and its Pixel ID. The Conversions API needs a Pixel ID even if you never install the browser Pixel.
  3. A Conversions API key from the same Conversions section. It is separate from the Advertiser API key under Settings, which is for setup and reporting calls. LiveRamp’s setup guide says the key is generated once, so copy it into a secret store straight away.
  4. A custom tracking domain for your server container, such as sgtm.example.com, if you send server events through server-side GTM.
  5. A consent management platform that sets the visitor’s choice before the Pixel loads, where your consent policy requires one.
  6. A short list of the events you will send, mapped to OpenAI’s standard names, such as lead_created or order_created.

How to set up ChatGPT Ads conversion tracking

The order below follows OpenAI’s developer docs. Do the browser side first, because the server side depends on what it captures.

1. Install the Pixel

OpenAI’s Pixel guide loads the script oaiq.min.js from bzrcdn.openai.com near the top of the <head>, then initializes it with your Pixel ID. Send each conversion with a measure call, and pass an event ID in the options:

Browser: OpenAI Pixel
oaiq("init", { pixelId: "<PIXEL-ID>" });

oaiq("measure", "lead_created",
  { type: "customer_action" },
  { event_id: "lead_8f2k91" });

If you use Google Tag Manager, Stape publishes a web tag for the Pixel. Where consent is required, call oaiq("consent", false) before init and set it to true once the visitor agrees. While consent is false, OpenAI says no measurement events are sent, and blocked events are not replayed later.

2. Keep the click reference

Make sure redirects and landing pages keep the oppref parameter, so the Pixel can store it. If a lead or order is saved on your backend, save the __oppref cookie value with it. OpenAI says to pass it exactly as received, and never to invent one or reuse another visitor’s.

3. Send server events

Every server event goes to the same endpoint: POST https://bzr.openai.com/v1/events?pid=<PIXEL-ID>, with the Conversions API key as a Bearer token. There are two ways to make that call.

Server-side GTM on your own domain (our default). Run a GTM server container on a subdomain of your site, such as sgtm.example.com, and add a Conversions API tag to it. Stape’s OpenAI Ads Events API tag takes the Pixel ID, the API key and an action source, and can store the click reference as an __oppref cookie from the server. Google’s custom domain guide says a server container on its default domain “can only set JavaScript cookies,” so map your own subdomain before launch. Use the host’s default URL only while you test.

A direct call from your backend. Use this for outcomes your systems confirm after the visit, such as a paid order or a qualified lead in your CRM. Your server builds the event, adds the saved click reference and hashed customer data, and posts it:

Server: Conversions API request
POST https://bzr.openai.com/v1/events?pid=<PIXEL-ID>
Authorization: Bearer <CONVERSIONS-API-KEY>
Content-Type: application/json

{
  "events": [{
    "id": "lead_8f2k91",
    "type": "lead_created",
    "timestamp_ms": 1793000000000,
    "action_source": "web",
    "source_url": "https://www.example.com/contact",
    "oppref": "<value of the __oppref cookie>",
    "user": {
      "emails_sha256": ["<SHA-256 of the normalized email>"],
      "ip_address": "203.0.113.7",
      "user_agent": "Mozilla/5.0 ..."
    },
    "data": { "type": "customer_action" }
  }]
}

What sends the event

Server-side GTM

A server tag, from the browser event your web container already tracks

Direct backend call

Your backend, once the order or lead is confirmed

1 / 6

Many setups use both: server-side GTM for website events, and a direct call for outcomes confirmed later.

The OpenAI Pixel script itself still loads from OpenAI’s CDN. OpenAI’s docs don’t describe serving it from your own domain, so the custom domain applies to your server container.

4. Attach the conversion to your campaigns

OpenAI’s conversion tracking guide connects events to campaigns through a conversion event setting: the event type, an attribution window and the data source. A campaign only reports events that match a setting attached to it. For a conversion-optimized campaign, pick one standard event when you create it, because it can’t be changed later.

Field mapping: Pixel to Conversions API

Most fields have the same meaning on both sides but a different name or place. These are the ones that matter for matching and deduplication.

WhatPixelConversions APINotes
Pixel IDpixelId in initpid query parameterMust be the same on both sides.
Event nameSecond argument of measuretypeCustom events use custom plus custom_event_name, 1–64 characters.
Event IDevent_id in optionsidThe deduplication key. Reuse it on retries.
Event timeSet by the browsertimestamp_msUnix milliseconds, within the last 7 days and no more than 10 minutes ahead.
Click referenceRead from the URL, stored in __opprefopprefForward it unchanged. The API does not capture it.
Browser referenceStored in __obrefuser.obrefSent unhashed. Stop sending it if consent is withdrawn.
Emailuser.email_sha256 in inituser.emails_sha256, a listSHA-256 of the trimmed, lowercased email. Up to 3 values per list.
Phoneuser.phone_number_sha256user.phone_numbers_sha256Country code, digits only, no leading + or zeros, then SHA-256.
IP and user agentFrom the browser requestuser.ip_address, user.user_agentRaw values, not hashed.
Page URLThe current pagesource_urlRequired when action_source is web.
Valueamount and currency in event datadata.amount and data.currencyAn integer in minor units: 4200 is $42.00. A currency is required with an amount.
Field names from OpenAI’s Measurement Pixel, Conversions API and Supported Events documentation, October 2026.

In our own integration, we send source_url as the page’s origin and path only, without the query string, so no form values or email addresses in a URL reach the platform.

How deduplication works

When the Pixel and your server both send the same conversion, OpenAI needs a way to count it once. Its Conversions API reference matches on three values: the Pixel ID, the event name and the event ID. The event ID is event_id in the Pixel and id in the API. For custom events, the custom_event_name must match too. OpenAI keeps the first copy it receives and ignores later ones.

Browser and server copies of the same purchase event are matched and counted once.
  • Generate the event ID once per conversion, for example from your lead or order ID, and use it on both sides.
  • Keep the same ID and timestamp when you retry a failed request. A new ID looks like a second conversion.
  • Use a new ID for each different action, even when the same person converts twice.
  • Check for a second sender, such as a Shopify app, a duplicate tag or a partner integration, that sends the same event with its own ID.

OpenAI’s docs don’t state a time window for deduplication. Meta, by comparison, documents 48 hours, as covered in Meta Conversions API deduplication. Send the server copy promptly and don’t rely on late matches.

How to check that it works

  1. Turn on Pixel debug mode (debug: true in init), complete one real action, and confirm the event and its event ID appear in the browser console and the network request.
  2. If you use server-side GTM, run Preview on the web and server containers together and confirm the Conversions API tag fires once, on your own tracking domain.
  3. Send a server request with validate_only: true to check its format. Validate-only events are not saved and do not appear in monitoring.
  4. Call the recent events endpoint (GET /v1/conversions/events with your pid) using the Advertiser API key. It returns a sample from roughly the last 15 minutes. Browser events show as pixel_sdk and server events as server_to_server.
  5. Repeat the action with consent declined, and confirm that neither the Pixel nor the server sends an event.
  6. Remove validate_only and debug settings before production traffic.
  7. After 24 to 48 hours, compare Conversions in Ads Manager with your own lead or order records for the same dates.

Ads Manager also shows an event quality score for a data source. OpenAI’s troubleshooting guide says a low score does not by itself mean tracking is broken, and warns against sending extra events or invented identifiers to raise it.

Common errors and fixes

SymptomLikely causeFix
The Pixel loads, but no leads or purchases arriveThe measure call never fires on the completed action, runs before init, or is blocked by consent or a content security policyCheck one completed action with debug mode. Allow bzrcdn.openai.com and bzr.openai.com in your content security policy.
The API returns an authentication errorThe Advertiser API key was used instead of the Conversions API key, or the Bearer header is missingUse the Conversions API key for the same ad account, as Authorization: Bearer <key>.
A whole batch is rejectedOne invalid event fails the batchCheck the batch with validate_only, fix the bad event, and resend with the original IDs.
Older events are rejectedtimestamp_ms is outside the last 7 days, more than 10 minutes ahead, or sent in secondsSend the original action time in milliseconds. Don’t change an old event’s time to make it pass.
HTTP 400 on customer dataA user list has more than 3 valuesSend at most 3 hashed values per list. The API does not truncate.
Revenue is 100 times too high or lowThe amount was sent in dollars rather than minor units, or the other way roundSend 4200 for $42.00, with a currency code.
One sale counts twiceThe Pixel and server use different event IDs, or another tag or partner also sends itUse the same Pixel ID, event name and event ID, and remove the extra sender.
Events are received, but the campaign shows zero conversionsThe event doesn’t match the campaign’s conversion setting, the data source isn’t connected, or the server event is missing opprefCheck the setting and the exact event name, then pass oppref on server events.
From OpenAI’s troubleshooting guide and Conversions API reference, October 2026.

How ChatGPT Ads fits with your other platforms

The pattern is the same as on other ad platforms: one browser tag, one server event, one shared ID. Only the field names change. If you already run server-side tagging, ChatGPT Ads is one more server tag in the same container, on the same tracking domain, with the same event ID you send to other platforms.

Maven sends conversions from a CRM, payment or commerce system to OpenAI Ads through its Conversion Events API, alongside Google Ads and Meta. If you want to start with the browser side, a Free Tracking Scan shows which tags load on your site today.

Get the next one before it hits.

Short emails when Meta, Google, GA4 or LinkedIn change something that moves your numbers.

Frequently asked questions

Does ChatGPT Ads have a conversion tracking pixel?

Yes. OpenAI’s Measurement Pixel is a JavaScript tag you install on your site with the Pixel ID from the Conversions section of Ads Manager. It sends standard events such as lead_created and order_created from the browser, and stores the OpenAI click reference, oppref, in a first-party cookie.

What is the OpenAI Ads Conversions API?

It is the server-side way to send conversion events to ChatGPT Ads. Your server posts events to https://bzr.openai.com/v1/events with your Pixel ID and a Conversions API key as a Bearer token. OpenAI says to send these requests from your server only and to keep the key on your server.

Do I need both the Pixel and the Conversions API?

You can use either, but OpenAI suggests using them together for more resilient measurement. The Pixel captures the click reference in the browser, and the server sends what your backend confirms. Give the same conversion the same event ID on both sides so OpenAI counts it once.

How does OpenAI deduplicate Pixel and Conversions API events?

OpenAI matches on Pixel ID, event name and event ID. The event ID is event_id in the Pixel and id in the Conversions API. Custom events also need the same custom_event_name on both sides. OpenAI keeps the first copy it receives and ignores later ones.

Can I put the Conversions API key in Google Tag Manager?

Only in a server container. The key belongs in the server-side tag’s settings, which run on your server, never in the web container or any browser code. The web container only needs the Pixel ID.

Can I send offline or CRM conversions to ChatGPT Ads?

The Conversions API accepts action_source values such as offline, physical_store and phone_call, so a backend can send events it confirms later, within the 7-day timestamp limit. LiveRamp also runs an OpenAI Conversions API program for offline conversions, which LiveRamp says is in limited availability and by invitation only.

How long do conversions take to appear in Ads Manager?

OpenAI says attributed conversions can take about 24 to 48 hours to appear, and recent totals may change while they process. To confirm that an event arrived sooner, use the recent events endpoint, which returns a sample from roughly the last 15 minutes.

Can a conversion-optimized campaign use a custom event?

No. OpenAI says the Conversion optimization objective supports one standard conversion event per campaign, and custom events are not currently supported. The event cannot be changed after the campaign is created.

Sources and references

Published October 26, 2026

Find what your tracking misses in about 10 seconds.

Run a Free Tracking Scan on your site and see every gap we find.