Fix guide · Any website · advanced · about 60 min

OpenAI Pixel event_id missing: fix ChatGPT Ads deduplication

For the finding “OpenAI events have no event ID”. Also for: Shopify, WordPress, Webflow, Framer.

What this means

Each event the OpenAI Pixel sends can carry an event ID that your site sets: the event_id option in the fourth argument of oaiq("measure", ...). Your site calls measure without one.

The tricky part: the requests still contain an ID. When your code passes no event_id, the pixel puts a random value in the event’s id field by itself (OpenAI does not document this, but you can see it in the request payload). That value exists only in the visitor’s browser. Your server never learns it, so it cannot send the same ID with its copy of the event.

Whether this costs you money depends on one question: does your site also send these events to OpenAI from a server, through the OpenAI Conversions API?

  • Yes, or you are not sure: OpenAI recognizes a browser event and a server event as the same conversion when they share the Pixel ID, the event name and the event ID (event_id in the pixel, id in the Conversions API). With a random browser ID, the two never match, so the same purchase or lead can be counted twice and conversion-optimized campaigns learn from inflated numbers.
  • No, you only use the browser pixel: there is nothing to deduplicate yet, so this has little effect today. It matters the day you add the Conversions API, and it helps to have the IDs in place before then.

We cannot see server-to-server traffic from a browser, so we cannot tell whether your Conversions API works. We only see whether your site passes its own event IDs to the pixel.

How to confirm it yourself

Because the pixel fills in an ID on its own, the Network tab cannot tell you whether your site sets one. Look at the calls your site makes instead.

  1. Search your site code, theme, tag manager tags and plugins for oaiq("measure" (or oaiq('measure').

  2. For each call, look for a fourth argument with event_id:

    // No event ID: the pixel makes one up
    oaiq("measure", "lead_created", { type: "customer_action" });
    
    // Your own event ID
    oaiq("measure", "lead_created", { type: "customer_action" }, { event_id: "lead-8f3a2c" });
  3. If you use a tag manager template, open the tag and check its event ID field. In Stape’s OpenAI Ads Pixel template, the ID goes in the Server-side tracking settings section; if that field is empty, the pixel uses its own random value.

  4. To see the effect, trigger the event and compare the id in the request payload (Network tab, filter bzr.openai.com) with the ID your server sends for the same action. If they differ, deduplication fails. On a test copy of your site, debug: true in the init call also logs each measure call in the console.

How to fix

OpenAI deduplicates a browser event and a server event when both use the same Pixel ID, the same event name (for custom events, the same custom_event_name) and the same event ID. OpenAI keeps the first event it receives with that combination and ignores later duplicates. So the fix has two halves: give the browser event your own ID, and send exactly the same ID from the server.

  1. Generate one unique ID per action. Order numbers work well for purchases (order_12345), form submission IDs for leads, and a random string for page views and clicks. Never reuse a fixed value: OpenAI keeps only the first event with a given ID, so a repeated ID silently drops real conversions.

  2. Pass it to the pixel as event_id in the fourth argument:

    oaiq(
      "measure",
      "order_created",
      { type: "contents", amount: 2599, currency: "USD" },
      { event_id: "order_12345" }
    );
  3. Send the same value as id from your server, with the same event type (order_created here) and the same Pixel ID in the request address (pid). For custom events, the server event also needs the same custom_event_name.

  4. Make both sides read the ID from one place. Typical patterns: the order confirmation page renders the order number into the page, and the server uses the same order number; or the browser generates the ID, sends it with the form submission, and the server reuses it.

  5. If you use Google Tag Manager with a server container: generate the ID with a variable such as Stape’s Unique Event ID variable, put it into the event ID field of the web tag, and map the same value to the event ID in the server tag (Stape’s OpenAI Ads Events API tag has an Event ID parameter for this).

  6. If a tool sends your server events: check its documentation for how it sets event IDs. It can only match browser events that it sends itself. A second, manually installed pixel will keep sending events with random IDs (and usually also shows up as “Duplicate OpenAI events”).

  7. Publish your changes.

Common causes

  • The installation snippet and the example measure calls were copied without the optional fourth argument.
  • The Conversions API was added later, and the browser calls were never updated.
  • Both sides generate their own random ID, so each event has an ID, but they never match.
  • In a tag manager, the event ID field of the web tag is empty, or the server tag reads a different variable.

How to verify the fix

  1. Every oaiq("measure", ...) call for your key events passes an event_id, and the value changes from one action to the next.
  2. For one test conversion, the id in the browser request equals the id your server sends.
  3. With access to the Advertiser API, OpenAI’s recent-events endpoint (GET /v1/conversions/events?pid=<PIXEL-ID>) lists a sample of events from roughly the last 15 minutes with their channel: pixel_sdk for the browser and server_to_server for your server.
  4. Re-run the check on IsPixelWorking. The issue should be gone.

Sources

More OpenAI guides