Fix guide · Webflow · advanced · about 60 min
OpenAI Pixel events have no event ID on Webflow
For the finding “OpenAI events have no event ID”. Also for: Any website, Shopify, WordPress, Framer.
What this means
Each OpenAI Pixel event 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 requests still contain an ID, because the pixel then 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), but 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 treats a browser event and a server event as the same conversion when they share the Pixel ID, the event name and the event ID. With a random browser ID they never match, so the same lead or order can be counted twice.
- No, browser pixel only: there is nothing to deduplicate yet. It matters the day you add the Conversions API.
Webflow has no built-in OpenAI integration and runs no server code of its own, unless you use Webflow Cloud or another backend. On a Webflow site, server events only exist if you or a tool added them: server-side Google Tag Manager (GTM), a webhook or automation that forwards form submissions to OpenAI, a third-party tool, or your own backend. If none of these is in place, this issue can wait.
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 instead.
-
Search Site settings > Custom code, each page’s Page settings > Custom code, your Code Embeds and your GTM tags for
oaiq("measure"(oroaiq('measure'). -
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" }); -
In GTM, open the tag. OpenAI’s own template has an Event ID field (“Leave blank unless another system will send the same conversion server-side”). In Stape’s OpenAI Ads Pixel template, the ID goes in the Server-side tracking settings section. An empty field means the pixel uses its own random value.
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, and keeps the first one it receives. The ID must be created once and shared by both sides. Never reuse a fixed value: OpenAI keeps only the first event with a given ID, so a repeated ID silently drops real conversions.
Route 1: Google Tag Manager with server-side GTM. If the pixel runs as a GTM tag:
- Create a variable that produces a unique ID per event, for example Stape’s Unique Event ID variable from the Community Template Gallery.
- Put it into the tag’s event ID field: Event ID in OpenAI’s template, or the Server-side tracking settings section in Stape’s template.
- Map the same value to the event ID of the server event, for example the Event ID parameter of Stape’s OpenAI Ads Events API tag in your server container.
Route 2: form leads sent from a webhook or automation. Webflow can send each form submission to a webhook or an App, with the submitted field values. Webflow forms submit without a page reload, so the browser event has to come from code that runs when the form succeeds.
-
Add a text input to the form, set its Name to
event_id, and hide it (for example withdisplay: none, as in Webflow’s guide to hidden honeypot fields). -
Add this to Site settings > Custom code > Footer code (or the page’s Before
</body>tag field). It fills the field with a new ID and sendslead_createdwith the same ID once the form’s Success message appears:<script> document.querySelectorAll(".w-form").forEach(function (block) { var done = block.querySelector(".w-form-done"); var field = block.querySelector('input[name="event_id"]'); if (!done || !field) return; var id = "lead-" + Date.now() + "-" + Math.random().toString(36).slice(2, 10); field.value = id; var sent = false; new MutationObserver(function () { if (sent || getComputedStyle(done).display === "none") return; sent = true; if (window.oaiq) { oaiq("measure", "lead_created", { type: "customer_action" }, { event_id: id }); } }).observe(done, { attributes: true, attributeFilter: ["style"] }); }); </script>.w-form-doneis the Success message element in Webflow’s published code. If the form is set to redirect to another page after submission (form Settings panel), Webflow redirects instead of showing that message, and this code sends nothing: switch the form to its Success message, or have a developer adapt the code. -
In your webhook receiver or automation, send
lead_createdto the OpenAI Conversions API withidset to the submittedevent_idvalue and the same Pixel ID (pid). -
Remove any other
lead_createdevent for the same form, such as a GTM tag or a thank-you page snippet, or OpenAI receives two browser leads.
Route 3: a third-party tool. A tool that sends both browser and server events can share IDs between them, but only for the browser events it sends itself. A separate copy of the pixel in Webflow’s custom code keeps sending random IDs (and usually also shows up as “Duplicate OpenAI events”). Check the tool’s documentation and remove the other copy.
Common causes
- OpenAI’s installation snippet and example
measurecalls were copied without the optional fourth argument. - A server-side setup was added later, and the browser calls in Webflow’s custom code were never updated.
- In GTM, the event ID field of the web tag is empty, or the server tag reads a different variable.
- The browser and the server each generate their own ID, so the two never match.
How to verify the fix
- Every
oaiq("measure", ...)call for your key events passes anevent_id, and the value changes from one action to the next. - Submit a test form: the
idof thelead_createdevent in the browser request (Network tab, filterbzr.openai.com) equals theevent_idyour server receives and sends. - 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_sdkfor the browser andserver_to_serverfor your server. - Re-run the check on IsPixelWorking. The issue should be gone.
Sources
- OpenAI Developers, Measurement Pixel (
measurearguments,event_idoption,customer_actiondata shape forlead_created, deduplication on Pixel ID, event name andevent_id, first event wins): https://developers.openai.com/ads/measurement-pixel - OpenAI Developers, Conversions API (event
id, deduplication): https://developers.openai.com/ads/conversions-api - OpenAI Developers, Conversion Tracking (same Pixel ID, event name and event ID through both integrations; Monitoring Events): https://developers.openai.com/ads/conversion-tracking
- OpenAI on GitHub, Ads Measurement Pixel GTM template (Event ID field): https://github.com/openai/ads-measurement-pixel-gtm-template
- Stape, OpenAI Ads Pixel tag (Server-side tracking settings): https://stape.io/helpdesk/documentation/openai-ads-pixel-tag
- Stape, OpenAI Ads Events API tag (Event ID parameter): https://stape.io/helpdesk/documentation/openai-ads-events-api-tag
- Stape, Unique Event ID variable: https://stape.io/helpdesk/documentation/unique-event-id
- Webflow Help, How do I add forms in Webflow? (Success message, redirect after submission, webhooks and Apps): https://help.webflow.com/hc/en-us/articles/33961347548563-How-do-I-add-forms-in-Webflow
- Webflow, TikTok integration page (Webflow forms submit via AJAX without a page reload, so ad pixel lead events need code on form success): https://webflow.com/integrations/tiktok
- Webflow Developers, Form submission webhook (payload includes submitted data): https://developers.webflow.com/data/reference/webhooks/events/form-submission
- Webflow Help, Use the honeypot technique to filter spam form submissions (hidden form fields): https://help.webflow.com/hc/en-us/articles/45025662151827-Use-the-honeypot-technique-to-filter-spam-form-submissions
- Webflow Help, Custom code in head and body tags: https://help.webflow.com/hc/en-us/articles/33961357265299-Custom-code-in-head-and-body-tags
- Webflow’s published
webflow.js(form module), read 2026-10-23: after a successful submission without a redirect it shows the form block’s.w-form-doneelement and hides the form; with a redirect set, it navigates to the redirect URL instead.
More OpenAI guides
- OpenAI Pixel fires before cookie consent on Webflow
- OpenAI Pixel not firing after cookie consent on Webflow
- Repeated OpenAI event IDs drop ChatGPT Ads conversions
- Duplicate OpenAI Pixel events on Webflow
- ChatGPT Ads click ID (oppref) lost on Webflow
- OpenAI Pixel tracks a button on desktop but not on mobile
- Two OpenAI Pixel IDs on one site: when it's fine, how to fix
- OpenAI Conversions API deduplication: match the pixel event_id
- OpenAI Ads Pixel setup: install the ChatGPT Measurement Pixel
- How to set up the OpenAI Conversions API for ChatGPT Ads