ChatGPT Ads Conversion Tracking for Lead Generation
A lead-gen advertiser has a harder tracking job than a shop. A shop sees the sale on the same page the user lands on. A lead-gen business sees a form fill, then a sales call a week later, then a closed deal a month after that. The money lives in events that happen long after the click, and often off the website entirely. If ChatGPT Ads only know about the form fill, they cannot tell a tyre-kicker apart from a buyer, and the new conversion-optimized bidding has nothing useful to learn from.
This guide shows how to wire ChatGPT Ads leads from the first click to the closed deal: which events the platform exposes, how to map them to forms, demos and calls, why you need both the pixel and the Conversions API, and how to cross-check the numbers so you trust them.
Key Takeaways
- ChatGPT Ads ship lead-gen events out of the box –
lead_created,registration_completedandappointment_scheduledmap cleanly to forms, sign-ups and booked calls - The browser pixel alone is not enough for lead gen – the events that prove value (qualified lead, booked call, closed deal) happen off-site, so you need the server-side Conversions API too
- Carry the click ID into your CRM – capture
opprefwith the lead and send it back on the server event so a deal that closes weeks later still gets credited - Conversion-optimized bidding needs history – CPA bidding activated 2026-06-05 and only works once you have been feeding it real conversion signal, so set tracking up first
For the platform basics, see our complete ChatGPT Ads guide. One honest note before we start: ChatGPT Ads are live only in the US, UK, Australia, New Zealand and Canada as of 2026-06-12, and are not bookable for EU or DACH advertisers yet. Everything here is how to build the tracking now so you are ready, or how to run it today if you advertise in a live market.
The lead-gen events ChatGPT Ads exposes
ChatGPT Ads measure conversions through a browser JavaScript pixel. The pixel is a small script that loads on your site and reports back when something worth counting happens. Per OpenAI’s measurement docs (as of 2026-06-12), it loads from bzrcdn.openai.com/sdk/oaiq.min.js and you fire events with a global oaiq() function, the same way the Meta pixel uses fbq() or Google uses gtag().
Three of the standard events are built for lead generation:
| Standard event | What it means in plain terms | Typical lead-gen trigger |
|---|---|---|
lead_created | Someone gave you their details | Contact form, quote request, gated download, newsletter with intent |
registration_completed | Someone made an account | Free trial sign-up, account creation, webinar registration |
appointment_scheduled | Someone booked a slot | Calendly booking, demo request, discovery call |
OpenAI also documents order_created, items_added, checkout_started, page_viewed, contents_viewed, subscription_created and trial_started, plus a custom event type where you set your own custom_event_name. That custom type is the one to remember for lead gen, because the most valuable moments in a lead funnel (a lead becoming “sales qualified”, a deal closing) have no named standard event. You send those as custom events.
appointment_scheduled) is usually a far stronger buy signal than a newsletter sign-up logged as lead_created, so it deserves to be your primary conversion.
Mapping events to your funnel
The mistake most advertisers make is firing one event on every form and calling it done. A lead funnel has stages, and ChatGPT Ads bid better when you tell them about the stages that actually predict money. Map the journey before you write a line of tracking code.
Here is a typical B2B lead funnel and the event that fits each step:
| Funnel step | Event to fire | Where it fires |
|---|---|---|
| Form fill / quote request | lead_created | Browser, on the thank-you page |
| Free trial or account sign-up | registration_completed | Browser, on sign-up confirmation |
| Demo or call booked (Calendly) | appointment_scheduled | Browser on confirmation, or server on booking webhook |
| Phone lead from the ad | lead_created (custom value) | Server, from call-tracking software |
| Lead marked sales-qualified in CRM | custom (e.g. sql_created) | Server, from your CRM |
| Deal closed-won | custom (e.g. deal_won) | Server, from your CRM |
Notice that everything past “demo booked” fires from a server, not the browser. That is the heart of lead-gen tracking. The browser pixel can only see what happens in the browser. A sales rep marking a lead qualified, or a deal closing in your CRM, never touches the visitor’s browser. To count those, you need the Conversions API.
If you already structure your account in stages, the lead-gen account structure playbook we use for Google Ads translates directly: the same stage thinking that keeps a Search account clean keeps your ChatGPT Ads conversion mapping honest.
Pixel plus Conversions API: why server-side matters for lead gen
The Conversions API (often shortened to CAPI) is the server-side twin of the pixel. Instead of a browser sending events, your own server sends them straight to OpenAI. Think of the pixel as a customer telling the shop “I just bought something”, and the CAPI as the shop’s own till confirming the sale. The till is more reliable, and it still knows about sales the customer never announced.
Per OpenAI’s docs (as of 2026-06-12), you send CAPI events with an HTTP POST to bzr.openai.com/v1/events?pid=<PIXEL-ID> using a Bearer token for authentication. You get the pixel ID and the API key from the conversions tab in Ads Manager. Each event needs an id, a type, a timestamp_ms (within the last 7 days, and no more than 10 minutes in the future), and a data object. You can batch up to 1,000 events per request, but be careful: if one event in the batch fails, the whole batch fails.
For lead generation, server-side is not a nice-to-have, it is the only way to count the events that prove the channel works:
- Offline conversions. A lead that closes into a deal in your CRM three weeks later. No browser is open. Only your server knows.
- Phone leads. A user sees the ad, calls instead of filling a form. Call-tracking software logs the call on a server, then sends it as a
lead_createdevent. - Qualified leads, not just raw leads. Your sales team marks 20 of 100 form fills as real prospects. Send those 20 as a custom event so bidding chases quality, not volume.
- Ad-blocker and consent gaps. Browser pixels miss some traffic to blockers and tracking-prevention. Focal reports browser pixels can lose roughly 20-30% of events to blockers (a practitioner estimate, not an OpenAI figure). The server event does not depend on the visitor’s browser.
id (the pixel calls it event_id). OpenAI deduplicates by id: if it sees two events with the same id, it discards the duplicate and typically keeps the server-side one. This lets you run both surfaces for coverage without double-counting your leads. If you want the full server-side build, our ChatGPT Ads Conversions API in server-side GTM guide walks through it tag by tag.
Running both pixel and CAPI is the standard recommendation for lead gen. The pixel catches fast on-site events with the click context attached. The CAPI catches the slow, off-site, high-value events. For the full trade-off between the two, see our pixel vs Conversions API decision guide. If you do not yet have a server-side container running, that is the foundation, and our server-side tracking service and server-side GTM guide cover how to stand one up.
Passing oppref through to the CRM and back
This is the step that makes long lead cycles measurable, and the step most people skip.
oppref is the ChatGPT Ads click identifier. It is OpenAI’s version of a click ID: the same idea as the gclid Google adds to a link, or the fbclid Meta uses, a tag on the landing-page URL that lets the platform recognise which click led to a conversion. The pixel grabs oppref from the URL automatically and stores it in a first-party cookie called __oppref (practitioner sources report a roughly 30-day lifetime) so it survives across page views.
Here is the catch the docs are explicit about (as of 2026-06-12): the Conversions API does not auto-capture oppref. Your server has no idea what the click ID was unless you carry it there yourself. For a lead-gen business, that means the click ID has to ride along with the lead from the website into your CRM, then come back out when the deal closes.
The chain looks like this:
- Capture on landing. The pixel reads
oppreffrom the URL into the__opprefcookie. In your tag manager, also read that cookie into a variable so you can use it. - Attach to the lead. When the form submits, pass the
__opprefvalue into a hidden field, so it lands in your CRM as a property on the lead record (alongside the UTM values). - Store it. The lead now carries its click ID in the CRM for the life of the deal, the same way you would store a
gclidfor Google offline conversion import. - Send it back. When the lead becomes qualified or the deal closes weeks later, your server sends the CAPI event and includes the stored
oppref. Now a deal that closed a month after the click is correctly credited to the ChatGPT Ad that started it.
oppref never reaches the CRM, your offline conversions still fire, but ChatGPT Ads cannot match them to a click, so the most valuable, slowest events become invisible. Test the full path with a real lead before you spend.
When you also store hashed contact details for matching, follow OpenAI’s rule: enhanced matching fields like email and external ID are sent as SHA-256 hashes (lowercase 64-character hex), never as raw text. Hash on your server before sending. Never put a customer’s plain email into an ad platform event.
Cross-checking the native dashboard, GA4 and CAPI
Three systems will report on the same campaign, and they will not agree to the decimal. That is normal. The point of cross-checking is to know which number to trust for which question, and to catch a broken tag early.
| System | What it is good for | What it cannot tell you |
|---|---|---|
| ChatGPT Ads native dashboard | Impressions, clicks, spend, CTR; the conversions you sent via pixel/CAPI for bidding | It reports impressions, clicks, spend and CTR only out of the box; no conversion attribution or ROAS without your pixel/CAPI (per Focal) |
| GA4 | Cross-channel context: how ChatGPT-sourced leads behave vs other channels, assisted paths | It will not see your offline CRM conversions unless you also send them in |
| Conversions API logs | The source of truth for what you actually sent OpenAI, including offline events | It is your data, not OpenAI's matched-and-attributed view |
To make GA4 useful, tag the landing URLs with UTM parameters. Practitioners standardise on utm_source=chatgpt and utm_medium=cpc (per Focal) so the channel is easy to isolate. Build a custom channel group in GA4 that matches source chatgpt and medium cpc, exactly as our attribution tracking guide describes, so ChatGPT Ads leads do not vanish into “Unassigned”. If GA4 reporting is not your strength, our GA4 reporting service sets this up cleanly.
A practical reconciliation habit: once a week, compare the lead count in your CRM (tagged utm_source=chatgpt) against the conversions in the native dashboard and the events in your CAPI log. If GA4 says 40 ChatGPT leads but the dashboard shows 12 conversions, your pixel or CAPI is likely misfiring or your consent gate is blocking events. The gap is the alarm.
Feeding conversion signal to CPA bidding
The reason to do all of this is not just reporting. It is to unlock automated bidding. Conversion-optimized bidding (CPA bidding, where you tell the platform a target cost per acquisition and it bids to hit it) activated for ChatGPT Ads on 2026-06-05 in the US self-serve beta (per PPC.land).
The important detail: a conversion-optimized campaign needs historical conversion signal before it can learn. The algorithm needs to see real conversions, attached to real clicks, before it can predict which auctions are worth bidding on. That makes your pixel and CAPI setup a hard prerequisite, not an afterthought. No signal, no smart bidding.
For lead gen, two rules make that signal useful:
- Optimize toward the event that predicts revenue, not the easiest one. If you feed only raw
lead_createdevents, bidding will happily buy cheap, low-intent form fills. Feed itappointment_scheduledor your custom “qualified lead” event, and it learns to buy people who actually book and buy. - Send enough volume to learn. A campaign optimizing toward a rare event (one closed deal a week) starves the algorithm. A common pattern is to optimize toward a mid-funnel event with decent volume (booked demos), while still tracking the rare high-value events for your own reporting.
The same logic applies across paid channels. The way you structure conversion actions and bid toward quality on Google Ads carries straight over: send the platform your best signal, and protect it from learning on junk.
A lead-gen tracking checklist before you launch
Run this list before the first euro or dollar of spend. If any box is unchecked, your data will lie to you.
- Pixel installed and firing
page_viewedon every page. opprefcaptured from the URL into the__opprefcookie and read into a tag-manager variable.- On-site lead events mapped:
lead_created,registration_completed,appointment_scheduledfiring on the right confirmation pages. - Conversions API live for at least your highest-value off-site event (qualified lead or closed deal).
opprefpassed into the CRM on form submit, stored on the lead, and sent back on the server event.- Event id reused across pixel and CAPI for the same conversion, so dedup works.
- Contact fields hashed (SHA-256, lowercase) before any enhanced-matching send; no raw PII.
- UTMs standardised (
utm_source=chatgpt,utm_medium=cpc) and a GA4 custom channel built. - Consent handled for any EU-facing traffic: events gated behind opt-in (relevant once DACH goes live).
- One real test lead pushed all the way from ad click to CRM and back out as a closed-deal event.
Frequently Asked Questions
Can I track phone leads from ChatGPT Ads?
Yes, with call-tracking software and the Conversions API. The browser pixel cannot see a phone call, because a call does not happen in the browser. Use a call-tracking tool to log the call on its server, then send it to ChatGPT Ads as a server-side event (a lead_created or a custom event). The key is to carry the oppref click ID through: capture it on the landing page, associate it with the visitor session in your call-tracking setup, and include it on the server event so the call is matched back to the ad.
Will ChatGPT Ads conversion data show in GA4?
Not automatically. GA4 and ChatGPT Ads are separate systems. To see ChatGPT Ads leads in GA4, tag your landing URLs with UTM parameters (practitioners use utm_source=chatgpt and utm_medium=cpc) and build a custom channel group that matches them. Your own conversion events in GA4 will then attribute to the ChatGPT channel. Note that GA4 only sees what happens on your site, so offline CRM conversions still need to be sent into GA4 separately if you want them in those reports.
How long until conversions appear in the dashboard?
Not instantly. Practitioners report a roughly 7-hour reporting lag (per Focal) before conversions you send via the pixel or Conversions API show up in the native ChatGPT Ads dashboard. So if you fire a test conversion and it is missing minutes later, that is expected. Wait and check again the same day before assuming your tag is broken.
Why does my CRM lead count not match the dashboard?
The three systems measure different things, so exact agreement is not the goal. Your CRM counts every lead. The native dashboard counts only conversions you successfully sent and that OpenAI matched to a click. GA4 counts site sessions and events. A small gap is normal. A large gap (CRM far higher than the dashboard) usually means a misfiring pixel or CAPI event, a missing oppref, or a consent gate blocking events. Treat the gap as a diagnostic: reconcile weekly and investigate when it widens.
Do I need conversion tracking before I can use CPA bidding?
Yes. Conversion-optimized (CPA) bidding activated for ChatGPT Ads on 2026-06-05 in the US self-serve beta (per PPC.land), and it needs historical conversion signal before it can learn. The algorithm cannot bid toward a target cost per acquisition if it has never seen conversions attached to clicks. Set up the pixel and Conversions API first, feed real conversions for a while, then switch on conversion optimization.
Build the tracking, then spend
ChatGPT Ads give lead-gen advertisers the right events out of the box, but the events that prove value, a qualified lead or a closed deal, live off your website, in your CRM, sometimes in a phone call. The advertisers who win this channel are the ones who carry the click ID into the CRM and send those off-site events back through the Conversions API. That is what turns “we got some form fills” into “we got customers at this cost”, and it is what makes automated bidding work for you instead of against you.
The practical path: map your funnel to events, run the pixel and the Conversions API together, pass oppref end to end, cross-check GA4 against the dashboard, then feed your best signal to bidding. Want it implemented correctly the first time? Explore our ChatGPT Ads services, see how we build tracking and measurement, or request a free tracking audit.
Sources & References
- OpenAI Ads: Measurement Pixel (standard events, oppref, oaiq SDK)
- OpenAI Ads: Conversions API (endpoint, fields, dedup, hashing)
- PPC.land: OpenAI's ChatGPT Ads are getting conversion optimization
- Focal: ChatGPT Ads tracking (UTM convention, reporting lag, browser pixel loss)