OpenAI Ads (Pixel)
13 min
openai ads pixel is openai's browser measurement pixel for chatgpt ads this destination loads the openai measurement sdk ( oaiq ) in the browser and forwards ecommerce and engagement events to openai ads pair it with the openai ads conversions api destination the two are complementary rather than redundant, and the pixel does one thing the server side api cannot it captures and persists openai's oppref click identifier, which is what links a conversion back to the ad that produced it getting started this is a device mode destination the openai sdk is loaded automatically — no manual script installation is required you will need pixel id — created in openai ads manager under tools > conversions use the same value in the openai ads conversions api destination, so openai can deduplicate a conversion reported by both this destination needs no key of its own the conversion key shown alongside the pixel id is only for the server side conversions api destination, and the key under settings is a third credential that chord never uses optionally enable advanced matching — sends the visitor's email, phone, customer id and name to openai as sha 256 hashes to raise the match rate nothing is sent in plaintext custom event mapping — routes a chord event that openai has no standard equivalent for onto a custom event you have registered in ads manager debug logging — turns on the openai sdk's own browser console logging useful while verifying an installation; leave off in production important if you are also using the openai ads conversions api destination, both must be configured with the same pixel id and the same custom event mapping openai deduplicates on the combination of pixel id, event name and event id — with a different pixel id, one purchase is counted twice connecting to the openai ads pixel cdp destination warning before connecting destinations in the chord cdp, please verify with all destination owners that all non chord cdp configured destinations are disabled running external destinations alongside configured chord cdp destinations can result in duplicate events downstream log into the chord data platform navigate to the cdp click the "add" button next to destinations select openai ads pixel from the destination catalog enter the destination name and your pixel id optionally enable advanced matching and configure custom event mapping click "create" to connect deduplication every event carries event id , set to the chord messageid openai deduplicates on the combination of pixel id , event name and event id , keeping the first event it receives for a matching key and ignoring later duplicates the conversions api destination sends the same messageid as its event id, so a conversion reported by both the browser and your server is recorded once this also protects you if you are sending your own events to openai alongside chord reuse the chord messageid as your event id and openai will merge them rather than double counting event mapping openai accepts a fixed set of event names a chord event with no equivalent is skipped and logged — it is not forwarded under a made up name, because openai silently discards an unregistered event name, which is indistinguishable from a successful send chord event openai event data type page page viewed contents product viewed contents viewed contents product added items added contents checkout started checkout started contents order completed order created contents signed up registration completed customer action email captured lead created customer action subscription created subscription created plan enrollment to forward anything else, first create a custom event in chatgpt ads manager, then add a custom event mapping entry pointing your chord event name at it names are lowercased and spaces become dashes, so wishlist added becomes wishlist added ; the result must be 1–64 characters of lowercase letters, numbers, underscores or dashes event attributes every event sends an eventdata object whose type matches the table above openai attribute chord source (priority order) notes type — set from the event mapping table required by openai amount properties total → properties revenue → properties value minor currency units see below currency properties currency defaults to usd required whenever amount is present contents properties products\[] omitted for customer action events, which do not accept it plan id properties subscription id → properties plan id subscription created only each entry in contents is built from a product openai attribute chord source (priority order) id properties products\[] product id → sku → id name properties products\[] name content type properties products\[] category quantity properties products\[] quantity (defaults to 1 ) amount properties products\[] price , in minor units currency the order currency amounts are sent in minor units openai expects every monetary amount as an integer in the currency's minor unit , so $129 99 is sent as 12999 chord converts this for you zero decimal currencies are handled correctly 1000 jpy is sent as 1000 , not 100000 this matters because openai accepts either value without complaint — a mistake here would silently report every conversion 100 times too high advanced matching when enable advanced matching is on, visitor identifiers are sha 256 hashed in the browser before being sent plaintext pii is never transmitted openai attribute chord source (priority order) normalization email sha256 context traits email → properties email trimmed and lowercased, then hashed phone number sha256 context traits phone → properties phone country code kept; whitespace, punctuation, a leading + and leading zeroes removed must be 8–15 digits external id sha256 userid trimmed, case preserved , then hashed first name sha256 context traits first name → properties first name lowercased, whitespace and ascii punctuation removed, accents preserved last name sha256 context traits last name → properties last name same as first name city context traits address city sent unhashed region context traits address state sent unhashed postal code context traits address zipcode sent unhashed country context traits address country sent unhashed a value that cannot be used is omitted rather than hashed — placeholders such as n/a or unknown , and phone numbers too short to be real, are dropped, since hashing them would send a digest that matches nobody a value that is already a sha 256 hash is passed through rather than hashed twice these normalization rules match the openai ads conversions api destination exactly, so the same person produces the same digest on both surfaces note that the pixel's field names are singular ( email sha256 ) while the conversions api's are plural lists ( emails sha256 ) — both are correct for their own surface advanced matching is supplied at initialization, which is the only point at which the pixel accepts user data an identify call re initializes the pixel with the newly known identifiers, raising the match rate for the rest of the session; identify itself is not reported as a conversion attribution openai appends an oppref query parameter to ad click through urls the pixel captures it on the landing page and persists it in a first party oppref cookie, along with its own obref browser reference, so later events in the session remain attributable chord also captures both values onto the event, which is what allows the openai ads conversions api destination to attribute server side conversions — openai's documentation is explicit that the conversions api does not collect oppref on its own custom properties are not forwarded openai validates each event against a closed schema the conversion data accepts only type , amount , currency , contents and plan id , and there is no custom data field on the event either — unlike most ad platforms, which provide one an unrecognized field is not ignored openai rejects the whole event, and the pixel logs validation failed; event dropped in the browser console so chord deliberately sends no custom properties to this destination; forwarding them would discard the conversion entirely custom property mappings that target a field openai does accept still work normally remapping the source of the order total or currency, for example, reaches openai as usual — it is only destination fields with no openai equivalent that cannot be delivered the same applies to the openai ads conversions api destination if you need to segment on a property openai has no field for, register a custom event in ads manager and route the event to it with custom event mapping instead empty cart protection an order completed event with no products is skipped with a warning rather than sent an empty purchase is a data quality problem upstream, not a conversion, and forwarding it would corrupt your conversion counts and revenue reporting initialization the plugin loads https //bzrcdn openai com/sdk/oaiq min js and calls oaiq("init", { pixelid }) before the script loads, a queue buffers any calls to oaiq so nothing is lost during load the plugin manages sdk loading state ( fresh → loading → loaded / failed ) to prevent duplicate script loads if the script fails to load, subsequent events are silently dropped the openai sdk does not fire a page view on initialization chord sends page viewed explicitly for each page call, so page views are neither missed nor doubled csp requirements if your site uses a content security policy, allow the following domains directive domain script src https //bzrcdn openai com connect src https //bzr openai com troubleshooting no events appear in ads manager confirm the pixel id matches the pixel id returned when the pixel was created enable debug logging and check the browser console for the sdk's own output check the chord cdp live events stream to confirm the event reached the cdp at all events appear but conversions are attributed to no campaign confirm oppref is present in the landing page url when arriving from an ad check that the oppref cookie is being set and is not blocked by a consent tool a conversion is counted twice confirm the openai ads conversions api destination uses the same pixel id confirm any events you send to openai outside chord reuse the chord messageid as their event id an event is missing entirely check the browser console for a "skipping unsupported event" warning openai accepts only the fixed event set above; anything else needs a registered custom event and a custom event mapping entry updated 31 august 2026