---
title: "ChatGPT Ads click ID (oppref) lost on Framer: how to fix"
description: "On your Framer site the oppref from ChatGPT ad clicks does not end up in the __oppref cookie. Check redirects, the consent setup and your form's server events."
updated: "2026-10-23"
url: "https://ispixelworking.com/guides/openai.click_id_not_set/framer"
---

# ChatGPT Ads click ID (oppref) lost on Framer: how to fix

Fix guide · Framer · medium · about 30 min · updated 2026-10-23

For the finding “Click ID from OpenAI ads is not stored” (`openai.click_id_not_set`).
Also for: [Any website](https://ispixelworking.com/guides/openai.click_id_not_set/generic), [Shopify](https://ispixelworking.com/guides/openai.click_id_not_set/shopify), [WordPress](https://ispixelworking.com/guides/openai.click_id_not_set/wordpress), [Webflow](https://ispixelworking.com/guides/openai.click_id_not_set/webflow).

## What this means

When someone clicks an ad in ChatGPT, the link to your site carries an attribution identifier in the `oppref` URL parameter. The OpenAI Pixel on your Framer site should pick it up on the landing page, store it in the first-party cookie **`__oppref`**, and send it with later events, so that a form submission on another page can still be tied to the ad click.

On your site, the click ID did not make it: it was not stored, or not sent with the pixel's events.

Why it costs you money:

- Conversions lose their link to the ChatGPT ad click, so ChatGPT Ads reports fewer conversions than your ads really brought.
- Conversion-optimized campaigns learn from fewer attributed conversions.
- If you send server events through the OpenAI Conversions API, OpenAI notes that the API does not capture `oppref` by itself; your server has to pass it on.

## How to confirm it yourself

Our check opens your page in a browser in the EU as if arriving from a ChatGPT ad, with a test click ID in the URL, accepts the cookie banner, and then looks for the click ID. If our report shows a **redirect chain**, start there: it often shows exactly where the parameter was dropped.

1. Open a **private (incognito) window**, open developer tools (F12) on the **Network** tab and tick *Preserve log*.
2. Open the exact address your ads use on the **published** site, with a made-up click ID added: `https://yourdomain.com/landing?oppref=test123`. (This sends a normal page view to your own pixel. It does not create an ad click.)
3. If the first request is a redirect (`301`, `302`, `307`, `308`), check its **Location** header. Does the new address still contain `oppref=test123`?
4. Accept the cookie banner and wait a few seconds.
5. Go to **Application > Cookies** (Chrome) or **Storage > Cookies** (Firefox) and find `__oppref`. It should hold `test123`. You should also see `__obref`, the pixel's browser reference.
6. Filter the Network tab by `bzr.openai.com` and open a request: the payload should carry `oppref` with your test value.

## How to fix

Work through the chain: the link must arrive with `oppref`, the pixel must run on that page once the visitor accepts, and nothing may delete the cookie afterwards.

1. **Point your ads at the final address.** A Framer site with a custom domain has one primary domain, and the other version (with or without `www`) redirects to it. Framer also redirects `http` to `https` and removes a trailing slash from page addresses. In our test on Framer-hosted sites on 2026-10-23, all of these redirects kept the query string, `oppref` included. Still use the exact final address (primary domain, `https`, no trailing slash) in every ad, so the visitor lands without a redirect.
2. **Check your Framer redirects.** Redirects you set up yourself are under **Site Settings > Hosting > Redirects** (they used to live in the Domains dashboard). In the same test, a redirect set up on a Framer site also kept `oppref`. Test each redirect your ads go through with `?oppref=test123` as above; if one drops it, link the ad to the destination page directly.
3. **Check redirects outside Framer.** Framer only redirects paths within the domain connected to it; moving visitors from an old domain happens at that domain's own host. Registrar forwarding, link shorteners and campaign link tools in front of your site commonly drop the query string. Test each one.
4. **Make sure the pixel runs on the landing page right after consent.** The pixel reads `oppref` from the address of the page it runs on, and OpenAI says it uses its cookies only when measurement consent is granted. With Framer's Cookie Banner and Google Tag Manager (GTM), the OpenAI tag must fire on the `cookie_consent_update` event on the same page. Framer changes pages without a full reload, and the next page's address no longer has `oppref`, so a tag that only starts later never sees it. See "OpenAI Pixel does not fire after consent".
5. **Do not withdraw consent for visitors who already agreed.** OpenAI documents that `oaiq("consent", false)` removes both pixel cookies, `__oppref` included. Check **Site Settings > Code** and each page's own custom code for this command, especially in entries set to run on every page visit: there it deletes the stored click ID after the landing page. With the pixel in GTM behind the Cookie Banner, the command is not needed at all.
6. **If the pixel is in custom code, load it early.** OpenAI recommends placing the snippet near the top of the `<head>`; in Framer, that is the **Start of `<head>`** placement on all pages.
7. **Pass the click ID to your server events.** If a Framer form sends its submissions to a webhook that forwards conversions to the Conversions API:
   - Framer's **Campaign tracking** (Site Settings > Forms, Enterprise plan) adds UTM parameters and `gclid` to native form submissions, not `oppref`.
   - Add a hidden field to the form (turn on **Hidden**, name it `oppref`) and fill it with a code override, as Framer suggests for values hidden fields do not pick up by themselves. Read the value from the `__oppref` cookie after consent: the form is often on another page than the one the ad pointed to, where the address no longer has `oppref`.
   - On the server, send the original string unchanged as `oppref`. For setups that send both browser and server events, OpenAI also asks for the `__obref` cookie value as `user.obref`.
8. **Publish** the site after any change.

## Common causes

- Ads link to an old domain whose host forwards to the Framer site without the query string.
- A registrar forwarding rule, link shortener or campaign link tool drops `oppref`.
- The OpenAI tag in GTM fires only after a later page change, not right after consent.
- A custom code entry calls `oaiq("consent", false)` on every page visit, so the cookie is removed again and again.
- The form webhook sends Conversions API events without `oppref`.

## How to verify the fix

1. Repeat the test above using the exact ad address: no redirect drops `?oppref=test123`, and after accepting cookies `__oppref` holds `test123`.
2. Open another page on the site: `__oppref` is still there, and the pixel's requests still carry `oppref`.
3. Re-run the check on IsPixelWorking. The issue should be gone, and the redirect chain in the report (if any) should keep the click ID.

## Sources

- OpenAI Developers, Measurement Pixel (captures `oppref` from the landing page URL into the first-party `__oppref` cookie, `__obref`, cookies used when consent is granted, `oaiq("consent", false)` removes both cookies, place the script near the top of the `<head>`): https://developers.openai.com/ads/measurement-pixel
- OpenAI Developers, Conversions API (`oppref` is not captured by the API, pass the original string; `user.obref` from the `__obref` cookie): https://developers.openai.com/ads/conversions-api
- Framer Help, How to setup redirects to maintain SEO ranking (Site Settings > Hosting > Redirects, sub-paths within the current domain only): https://www.framer.com/help/articles/how-to-setup-redirects-to-maintain-seo-ranking/
- Framer Help, Add Google Tag Manager to your site (placement "Start of `<head>`"): https://www.framer.com/help/articles/how-to-add-google-tag-manager-to-your-site/
- Framer Help, Track UTM parameters and Google Ads IDs in forms (Campaign tracking: UTM parameters and `gclid`, Enterprise plan): https://www.framer.com/help/articles/track-utm-and-google-ads-ids/
- Framer Help, How to add hidden fields to forms for tracking (Hidden property, code override): https://www.framer.com/help/articles/hidden-fields-form-tracking/
- Framer Help, Connect Framer forms to a webhook: https://www.framer.com/help/articles/framer-form-webhook-setup/
- Framer Academy, Add a Cookie Banner to your site in Framer: https://www.framer.com/academy/lessons/cookie-banner-component
- IsPixelWorking live test, 2026-10-23 (responses served by Framer hosting): `https://superlist.com/?oppref=test123` redirected (308) to `https://www.superlist.com/?oppref=test123`; `http://www.superlist.com/?oppref=test123` to `https://` and `framer.com/updates/?oppref=test123` to `/updates?oppref=test123` kept the parameter; a custom redirect on framer.com (`/features?oppref=test123` to `/?oppref=test123`) kept it too. Framer's page changes through the History API were observed in the 2026-10-01 test.
