TL;DR: ChatGPT Ads conversion tracking works through a data source in OpenAI Ads Manager that receives events from the OpenAI Measurement Pixel (in the browser), the Conversions API (from your server), or both. OpenAI describes the Conversions API as more reliable than the Pixel alone. Our recommendation for most brands is to run both, give each conversion one shared event ID so OpenAI can deduplicate it, preserve the oppref click reference end to end, and wait 24 to 48 hours before reading results.
Updated October 1, 2026. This guide summarizes OpenAI's current documentation and adds our own analysis. Sections labeled "What OpenAI's docs say" stick to the source; sections labeled "Our take" are GPTAd's opinion. Code snippets are illustrative and were not tested against a live account. GPTAd is an independent product preview and is not affiliated with or endorsed by OpenAI.
What is ChatGPT Ads conversion tracking?
Conversion tracking is how you tell OpenAI which actions matter after someone interacts with your ad in ChatGPT: a purchase, a lead, a registration, a booked demo. Three definitions carry the rest of this article:
- Measurement Pixel: a JavaScript SDK (
oaiq) that runs in the visitor's browser and sends website events to OpenAI. - Conversions API: an HTTPS endpoint your server calls to send events it has confirmed, such as a paid order or a qualified lead.
- oppref: the OpenAI click reference appended to your landing page URL. It is the main signal that connects a conversion to a specific ad click.
According to OpenAI's Conversion Measurement guide, a conversion can be reported when the event arrives from a data source connected to your ad account, matches a conversion event configured for the campaign, happens inside the applicable attribution window, and can be connected to an eligible ad click using available signals. Those signals may include oppref, advanced matching data and, where available, modeled measurement.
How does the OpenAI Measurement Pixel work?
What OpenAI's docs say
The Measurement Pixel documentation asks you to place a short snippet near the top of the <head> on every page where you want to capture conversions, then initialize it with a Pixel ID created in the Conversions tab of Ads Manager. You then call measure when something happens:
oaiq("init", { pixelId: "<YOUR-PIXEL-ID>" });
oaiq(
"measure",
"order_created",
{ type: "contents", amount: 2599, currency: "USD" },
{ event_id: "order_12345" }
);Key details from the docs:
- It handles plumbing for you. The Pixel captures
oppreffrom the landing URL, stores it in a first-party__opprefcookie, adds the page origin assource_url, timestamps events and batches closely grouped calls. - Amounts are integers in minor units.
2599withUSDmeans $25.99. - Optional user data improves matching. You can pass SHA-256 hashes of normalized email, phone, external ID and names, plus raw country, city, region and postal code. Raw identifiers must never be sent.
- Automatic advanced matching can detect supported customer information on your site and hash it in the browser before sending. OpenAI states raw customer information is not sent through this feature.
- Consent is built in. Call
oaiq("consent", false)before initializing if consent is required, thenoaiq("consent", true)once it is granted. Consent defaults to true unless you set it to false or a stored denial exists, and blocked events are not replayed. - App events are not supported.
app_installedandapp_openedmust go through the Conversions API. - Sites with a Content Security Policy need to allow
bzrcdn.openai.comandbzr.openai.comin the documented directives.
The Pixel's cookies have their own lifetimes: __oppref lasts 30 days after it is written (reset each time a new oppref is captured) and __obref lasts 365 days. OpenAI notes these are separate from attribution windows.
What does the OpenAI Conversions API do?
What OpenAI's docs say
The Conversions API documentation opens with a clear position: it is "a more reliable tracking source than the pixel alone," and OpenAI recommends using it when possible. You send events from your server only:
curl -X POST "https://bzr.openai.com/v1/events?pid=<PIXEL-ID>" \
-H "Authorization: Bearer <API-KEY>" \
-H "Content-Type: application/json" \
--data '{"validate_only": true, "events": [ ... ]}'- Authentication: a Conversions API key provisioned in the Ads Manager Conversions tab. OpenAI's conversion tracking guide notes it is separate from the Advertiser API key, and both belong on your server.
- Batches: up to 1,000 events per request. If one event fails, the whole batch fails.
- Required fields: a unique
id, the eventtype,timestamp_msand adataobject whosetypematches the event.source_urlis required for web events. - Time limits: the timestamp must be within the last 7 days and no more than 10 minutes in the future.
- action_source: web, mobile_app, offline, physical_store, phone_call, email or other.
- Click matching is on you. Unlike the Pixel, the API does not capture
oppref. You must capture it and pass the original value. - User data is per event: lists of hashed emails, phones, external IDs and names, plus raw location fields,
ip_address,user_agent, the Pixel'sobrefbrowser reference (unhashed) and Android GAID. IDFA is not supported. - Testing:
validate_only: truechecks events without saving them.
Pixel vs Conversions API vs both: which should you use?
| Question | Measurement Pixel | Conversions API | Both together |
|---|---|---|---|
| Where it runs | Visitor's browser | Your server | Browser and server |
| Captures oppref automatically | Yes, into a first-party cookie | No, you pass it | Pixel captures it; forward it to the server |
| Needs an API key | No | Yes, kept on the server | Yes, server side only |
| Affected by browser blocking or consent state | Yes | Depends on what you collect and forward | Server copy can confirm what the browser missed, within your consent rules |
| Offline, phone or store conversions | No | Yes, via action_source | Yes |
| App install and open events | No | Yes | Yes |
| Engineering effort | Lowest | Moderate | Highest, plus dedup logic |
| OpenAI's stated view | Good for website actions | "More reliable" than Pixel alone | Recommended for "more resilient measurement" |
The last row paraphrases OpenAI's docs. The rest is our summary of the documented capabilities.
Why run the Pixel and Conversions API together?
What OpenAI's docs say
OpenAI's help article recommends using both "for more resilient measurement." When the same conversion is sent twice, use the same Pixel ID, the same event name and the same ID (Pixel event_id equals API id). For custom events, keep custom_event_name identical too. OpenAI "uses the first event it receives for a matching key and ignores later duplicates."
Our take
The browser is good at catching the click context; the server is good at confirming the outcome. Together they cover each other's blind spots. Two implications of the dedup rule are easy to miss:
- The first copy wins, not the richest one. In our reading, if the browser event lands first with thin matching data and the server copy arrives later with hashed email and
oppref, the later copy is the one ignored. So do not rely on one side to carry all the matching information. Pass hashed user data to the Pixel at init when you have it, and forwardopprefandobrefto your server so both copies can stand on their own. - Your event ID should come from your system of record. An order number, lead ID or booking ID works well because both the page and the server already know it. A random ID generated in the browser only works if you also send it to the server.
For a hybrid setup, the Conversions API docs describe reading the __obref cookie in the browser, sending it to your server and including it unchanged as user.obref, subject to your consent requirements.
Which events should you track? Mapping the funnel
OpenAI's Supported Events list gives you a standard taxonomy. The mapping below is our suggestion for typical businesses:
| Funnel stage | Standard event | Data type | Best sent from |
|---|---|---|---|
| Landing or key page view | page_viewed | contents | Pixel |
| Product or plan viewed | contents_viewed | contents | Pixel |
| Add to cart | items_added | contents | Pixel |
| Checkout started | checkout_started | contents | Pixel |
| Purchase completed | order_created | contents | Both, shared order ID |
| Lead form submitted | lead_created | customer_action | Both, shared lead ID |
| Demo or consultation booked | appointment_scheduled | customer_action | Both, or server if booked by phone |
| Account created | registration_completed | customer_action | Both |
| Free trial or paid plan started | trial_started, subscription_created | plan_enrollment | Server, from billing system |
| App install or open | app_installed, app_opened | customer_action | Conversions API only |
Three documented rules should shape your choices:
- Only standard events can be optimization goals. OpenAI's help article on conversion optimization campaigns says custom events are not currently supported for that objective, and the selected event cannot be changed after the campaign is created. If a quote request is your real goal,
lead_createdmay describe it honestly; keep custom events for diagnostics. - Revenue columns only count order_created. OpenAI's Measure Results article says Order Created Sales and Order Created ROAS are calculated only from attributed
order_createdevents. - Offline outcomes have a 7-day clock. You can send a qualified lead or a closed deal with
action_sourceset to offline or phone_call, but the timestamp must fall within the last 7 days. Separately, OpenAI's event quality checks look for server events received within one hour of the action. If your sales cycle is longer than a week, the Conversions API cannot backfill the final close, so pick an earlier, verifiable milestone.
How does attribution work for ads inside conversations?
What OpenAI's docs say
Click-through attribution uses the configured click window. OpenAI's Measure Results article lists 7, 14 or 30-day click-through reporting windows and a view-through window of either 0 days (disabled) or 1 day. If a conversion qualifies for both a click and an impression, the click gets credit. OpenAI describes this as last-touch logic, not multi-touch, and says changing reporting windows does not change optimization, bidding or billing.
A documentation inconsistency worth knowing: the Pixel and Conversions API developer pages say view-through conversions are reported separately and are not included in Conversions. The more recently updated Measure Results help article says that with the 1-day view-through window selected, eligible view-through conversions are included in the Conversions total and can be split out in separate columns. Check which behavior your Ads Manager shows and note your window settings next to any number you share.
Reported totals may also include modeled conversions where available, and attributed conversions can take 24 to 48 hours to appear.
Our take
Conversations change the shape of the journey. On search, the query is a few words; on social, the ad interrupts browsing. In ChatGPT, the ad appears next to a conversation where someone may already have described their problem, budget or constraints in detail. That context is why we say brands want to "show up when buyers ask ChatGPT." It also means a person may see your ad while exploring, leave, and come back later, which is exactly the case view-through reporting and impression billing try to account for.
For measurement, that has three practical consequences:
- Expect more gaps between click and conversion. A 1-day view-through window and a last-touch model will not capture everything. Treat Ads Manager as one lens, not the full story.
- Do not compare ChatGPT Ads numbers directly with search or social. Windows, view-through rules and modeled conversions differ by platform. OpenAI itself says differences with third-party analytics do "not necessarily indicate an error."
- Record the conversation-era questions you are targeting. When results come in, you will want to know which buyer questions and ad angles you were testing, not just which campaign ID converted.
What are common implementation mistakes?
These come from our reading of OpenAI's troubleshooting and event quality guidance plus general tracking experience:
- Losing oppref in redirects. Link shorteners, geo redirects, consent walls and checkout domains can strip query parameters. OpenAI explicitly asks advertisers to preserve
opprefthrough redirects and navigation. - Sending dollars instead of cents.
amount: 25.99is wrong; the docs require integers in the currency's minor unit (2599). - Different event IDs on browser and server. Dedup fails and conversions are double counted, or the event quality check flags repeated matches.
- Retrying with a new ID or a new timestamp. OpenAI's event quality article says to keep the original event ID and time on retries, not the upload time.
- One bad event breaking a batch. Because a single invalid event fails the whole batch, validate with
validate_onlyand log rejected batches. - Hashing the wrong string. Normalize first (for example, lowercase and trim emails; strip punctuation from phones while keeping the country code), then SHA-256 and send lowercase hex.
- Forwarding your server's IP or user agent. The docs ask for the real client's values.
- Firing conversions on page reload. Thank-you pages that fire
order_createdevery time they load inflate counts. - Calling the Conversions API from the browser. The Pixel docs say not to, and it would expose your key.
What about privacy and consent?
What OpenAI's docs say
OpenAI says conversion data should only be shared when permitted and in compliance with applicable laws and OpenAI terms, after giving users clear information and obtaining necessary consents where required by law. Identifiers must be hashed. Ads Manager reporting is designed to show campaign performance rather than individual-level activity. OpenAI also states it does not currently use Pixel or Conversions API data for user-level personalization, and the opt_out flag will be respected if that changes.
Our take
- Decide your default before launch. Because the Pixel assumes consent unless told otherwise, sites that need opt-in consent should call
oaiq("consent", false)before init and wire the consent banner to flip it. - Apply the same rules server side. If a visitor declined measurement, do not forward their
obrefor hashed identifiers through the Conversions API either. OpenAI says to stop sendingobrefwhen consent is revoked. - Update your privacy notice and vendor list to name OpenAI as a measurement recipient, and involve whoever owns legal review.
Pre-launch measurement readiness checklist
Use this before you spend on your first campaign:
- Create one data source (Pixel ID) per website and reuse it for both Pixel and Conversions API.
- Install the Pixel snippet near the top of
<head>on every relevant page; update your CSP if you have one. - Configure consent behavior before
initwhere required. - Choose your primary conversion as a standard event and create the conversion event setting in Ads Manager.
- Generate event IDs from your order, lead or booking system and use them on both sides.
- Capture
opprefon landing, store it with the session and the order or lead, and pass it to the Conversions API. - Send hashed user data only where permitted, normalized exactly as documented.
- Test with
debug: truein the browser andvalidate_only: trueon the server. - Check the recent-events monitor (roughly the last 15 minutes) for both
pixel_sdkandserver_to_serverevents. - Walk the full path: ad link, redirects, landing page, checkout or form, confirmation, server event.
- Write down your click-through and view-through reporting windows and whether view-through is in your Conversions total.
- Agree how you will reconcile Ads Manager with GA4 and your CRM before the first report.
How should you judge results in the early days?
Our take
- Wait for the data to settle. OpenAI says conversions can take 24 to 48 hours to appear and spend can lag roughly 7 to 8 hours. A day-one CPA is not a CPA.
- Watch event quality first, performance second. OpenAI's event quality score refreshes daily over seven complete days. In week one, "are the right events arriving with the right matching data?" is the more answerable question.
- Use conversion time when comparing with your CRM. Ads Manager defaults to ad event time; the "Conversions (by conv. time)" column lines up better with order systems.
- Separate click-through from view-through before you calculate cost per conversion, and say which one you used.
- Keep counts next to percentages. Small numbers swing hard. We cover this reporting discipline in How to Measure Your First ChatGPT Ads Campaign.
Where GPTAd fits
GPTAd is an independent workspace in development for conversational advertising, built for founders, ecommerce brands, marketing teams and agencies. It is not affiliated with OpenAI, and it does not install pixels, connect to Ads Manager or launch ChatGPT campaigns today. What we are building focuses on the strategy that sits upstream of measurement: prompt and intent research, ad angle exploration, competitor visibility insights and conversational ad creation. Knowing which buyer questions you want to win makes it much easier to decide which conversions are worth tracking.
If you are planning your first ChatGPT Ads test and want to see where GPTAd is heading, book a 15-min early-access walkthrough at [email protected] or follow us on LinkedIn.
FAQ
Do I need both the OpenAI Pixel and the Conversions API?
No, either one can send conversions. OpenAI calls the Conversions API more reliable than the Pixel alone and recommends using both together for more resilient measurement, with a shared event ID for deduplication.
Can I track ChatGPT Ads conversions without a developer?
The Pixel snippet can be added through a tag manager, and OpenAI's help center says Google Tag Manager works if it loads the Pixel reliably without reordering calls. The Conversions API requires server-side work.
How do I stop the same purchase being counted twice?
Send it with the same Pixel ID, the same event name and the same ID on both sides (Pixel event_id and API id). OpenAI keeps the first copy it receives and ignores later duplicates.
What attribution windows does ChatGPT Ads use?
OpenAI's help center lists 7, 14 or 30-day click-through reporting windows and a 0-day or 1-day view-through window. Changing them affects reporting only, not optimization, bidding or billing.
Can I send offline or phone conversions?
Yes. The Conversions API accepts action_source values including offline, phone_call and physical_store, as long as the event timestamp is within the last 7 days.
Why don't Ads Manager and Google Analytics match?
OpenAI lists different attribution methods and windows, time zones, browser and consent conditions, deduplication, configuration and modeled conversions as common reasons. A difference does not necessarily mean an error.
Is GPTAd part of OpenAI?
No. GPTAd is an independent product and is not affiliated with, endorsed by or sponsored by OpenAI. ChatGPT is a trademark of OpenAI.
References
- OpenAI Developers: ChatGPT Ads Measurement Pixel
- OpenAI Developers: Conversions API
- OpenAI Help Center: Conversion Measurement
- OpenAI Developers: Supported Events
- OpenAI Developers: Conversion Tracking
- OpenAI Help Center: Measure Results
- OpenAI Help Center: Understand and Improve Event Quality
- OpenAI Help Center: Conversion Optimization Campaigns



