> ## Documentation Index
> Fetch the complete documentation index at: /docs/llms.txt
> Use this file to discover all available pages before exploring further.

# ChatGPT Ads Click & Conversion Tracking Setup

> Set up ChatGPT Ads conversion tracking in ClickFlare: capture OpenAI's oppref click ID and Ads Manager's ID macros, then report via OpenAI Pixel or CAPI.

![ChatGPT Ads traffic source template](https://mintcdn.com/clickflare/JnEca3lx3v_LxcNj/images/integrations/covers/templates/chatgpt-ads.png?fit=max\&auto=format\&n=JnEca3lx3v_LxcNj\&q=85\&s=90362dd419608aabe93b4baf4555e89a)

ChatGPT Ads is OpenAI's ad platform for ChatGPT. Ads appear below ChatGPT's answers, matched to the context of the conversation, and you buy them in OpenAI's self-serve **Ads Manager**, on CPM or CPC. This guide sets up ChatGPT Ads as a traffic source in ClickFlare. It covers capturing OpenAI's click reference and campaign IDs in your reports, and the ways you can report conversions back to OpenAI.

You do everything from the **campaign editor**. The ChatGPT Ads traffic source is created inline, without leaving the campaign.

> [!WARNING]
>
> The ChatGPT Ads template has **no postback URL**. OpenAI doesn't accept conversions by S2S postback URL, and ClickFlare has no integration with OpenAI's Conversions API. OpenAI receives conversions only through the OpenAI Pixel on your pages or through a Conversions API connection you run yourself. See Step 2 below.

> [!NOTE]
>
> ChatGPT Ads is new. As of October 2026 the self-serve tool is **Ads Manager Beta**, and access depends on where the advertiser's legal entity is based: the US, the UK, Canada, Australia, most of the EU and many countries in Latin America, the Middle East, Africa and Asia. Ads are not shown to ChatGPT Plus, Pro or Business users, or to accounts identified as under 18. Check OpenAI's [Ads Manager Availability](https://help.openai.com/en/articles/20001245-ads-manager-availability) page before you launch. Menus may change during the beta.

## At a glance

| | |
| - | - |
| **Ad formats** | Single-image and multi-image ads below ChatGPT answers. Multi-image is an open beta since October 26, 2026. |
| **Click ID** | `oppref`, OpenAI's click reference. ChatGPT adds it to the landing page URL on the click. |
| **Conversion tracking** | Not from ClickFlare. OpenAI Pixel on your pages, or OpenAI's Conversions API. |
| **Payout passed back** | No. Values reach OpenAI only through the pixel or the Conversions API. |
| **Multiple events** | In OpenAI, through standard events such as `lead_created` and `order_created`, or custom events |
| **Cost** | Not passed in the URL. Use **CPC**, or upload costs. |
| **Conversion API** | OpenAI has one. ClickFlare has no integration with it. |

## How it works

**1. ChatGPT sends the click**

A user clicks your ad. ChatGPT opens your ClickFlare campaign URL with the campaign, ad group, ad and account IDs filled in, and adds its click reference as `oppref`.

**2. ClickFlare stores the click reference**

ClickFlare saves the value of `oppref` as the visit's **External ID**, stores the IDs in tracking fields, and redirects the visitor to your lander or offer.

**3. The conversion reaches ClickFlare**

Your affiliate network or store posts the conversion back to ClickFlare, matched on the ClickFlare click ID.

**4. OpenAI learns about it separately**

ClickFlare does not post the conversion to OpenAI. If the OpenAI Pixel fires on your conversion page, or you send the event through OpenAI's Conversions API with the stored `oppref`, OpenAI attributes it to the ad.

> [!NOTE]
>
> With most networks there is a mirror: the network's macro in the campaign URL, ClickFlare's token in the postback. With ChatGPT Ads only the first half exists. The template writes ClickFlare's parameters (`campaign_id`, `ad_group_id`...) with OpenAI's macros (`{campaign_id}`, `{ad_group_id}`...), and reads the `oppref` that ChatGPT adds itself. There is no postback to send it back in.

## Before you start

* **Set up your own tracking domain.** Run the campaign on your own custom domain. Shared domains get flagged by networks and blocked by browsers. See [Custom Domains](/docs/en/settings/custom-domains.md).
* **Have an offer ready in ClickFlare**, and its affiliate network set up to post conversions back to ClickFlare. See [Creating an Offer](/docs/en/tracking/creating-an-offer-1.md) and [Adding an Affiliate Network](/docs/en/tracking/adding-an-affiliate-network.md).
* **Check OpenAI's Ads Policies.** OpenAI reviews the ad, the image and the landing page. Its review crawlers (`OAI-AdsBot`) must be able to reach the landing page, so don't block them in your bot filters.
* **Decide how OpenAI will see conversions.** If you own the conversion page, you can install the OpenAI Pixel there. If you send traffic to an affiliate offer you don't control, OpenAI only sees what the pixel catches on your lander, unless you build a Conversions API connection. Plan this before you launch. See Step 2 below.

***

## Step 1 – Create the campaign and the ChatGPT Ads traffic source

1. Go to **Campaigns** and click **New**.
2. In **Traffic Source**, open the dropdown and click **+ New Traffic Source**.
3. Type `chatgpt` in the search box and select the **ChatGPT Ads** template.
4. Enter a **Name**, for example `ChatGPT Ads`.
5. Leave **Cost currency** on **USD** unless your Ads Manager account is billed in another currency.

The template fills in the **Parameters** table for you:

| Name | TS Parameter | TS Token (OpenAI macro) | ClickFlare Token | What it carries |
| - | - | - | - | - |
| External ID | `oppref` | (empty) | `{external_id}` | OpenAI's click reference, read from the `oppref` that ChatGPT adds to the click |
| Cost | (empty) | (empty) | `{cost}` | Nothing. No cost is passed. See [Cost](#cost). |
| Campaign ID | `campaign_id` | `{campaign_id}` | `{trackingField1}` | The Ads Manager campaign |
| Ad Group ID | `ad_group_id` | `{ad_group_id}` | `{trackingField2}` | The ad group, where you set bids and context hints |
| Ad ID | `ad_id` | `{ad_id}` | `{trackingField3}` | The ad |
| Ad Account ID | `ad_account_id` | `{ad_account_id}` | `{trackingField4}` | Your Ads Manager ad account. Useful if you run several accounts. |

![The ChatGPT Ads template's Parameters table in ClickFlare, with ChatGPT Ads' macros pre-filled](https://mintcdn.com/clickflare/JnEca3lx3v_LxcNj/images/integrations/templates/chatgpt-ads/parameters.png?fit=max\&auto=format\&n=JnEca3lx3v_LxcNj\&q=85\&s=da8e45a4730c5dc730245e0ddd436866)

The **External ID** row has no TS Token on purpose. OpenAI has no macro for its click reference. ChatGPT adds `oppref` to the end of the landing page URL by itself, in the form `?oppref=gAAAAAb123`, the same way Facebook adds `fbclid`. ClickFlare reads it from the incoming click.

The four macros are the ones OpenAI documents. Ads Manager fills them in only when they are set in its **Landing page query parameters** field. See Step 4. Use `ad_group_id` and `ad_id` to find the ad groups and ads that convert.

> [!WARNING]
>
> Don't remove the **External ID** row. It is the only place ClickFlare stores OpenAI's `oppref`. You need it to pass `oppref` on to your lander for the pixel, and to send conversions through OpenAI's Conversions API.

To pass more data, click **Add Parameter**, give it a name and parameter, and enter a value as the **TS Token**. ClickFlare assigns the next free tracking field. Use only macros OpenAI documents.

## Step 2 – Decide how OpenAI learns about conversions

There is no postback to configure for OpenAI itself. In the **New Traffic Source** form, leave **Traffic source postback URL** off and click **Save**, unless you use the relay in Option C. You are back in the campaign editor with the ChatGPT Ads traffic source selected.

OpenAI still needs conversion data, to report results and to run **Conversions** campaigns. In Ads Manager, conversion events go into a **data source**, which has a Pixel ID. Create it first. RedTrack's guide places it under **Tools → Conversions → Create → Data Source**. Then pick one of the options below.

### Option A – The OpenAI Pixel on your conversion page

Use this when you own the page where the conversion happens, for example your own store or lead form.

1. Install the OpenAI Pixel snippet near the top of the `<head>` on every page you want to track, with your Pixel ID. Google Tag Manager works too, as long as it loads the pixel before the event calls.
2. On the conversion page, fire the matching standard event, for example `order_created` for a purchase or `lead_created` for a lead.
3. In Ads Manager, attach that conversion event to the campaign before traffic starts.

The pixel reads `oppref` from the landing page URL and stores it in a first-party cookie, `__oppref`, for 30 days. Later conversion events on the same site are linked to the click through that cookie.

That only works if `oppref` reaches the page where the pixel runs. With **Redirect** tracking, ChatGPT adds `oppref` to the ClickFlare campaign URL, not to your lander. Pass it on yourself: add `oppref={external_id}` to your lander's URL in ClickFlare, for example `https://yourlander.com/page?oppref={external_id}`. With **Direct** tracking, ChatGPT adds `oppref` straight to your lander URL, and the pixel sees it without any change.

### Option B – The pixel on your lander only

Use this when you send traffic to an affiliate offer you don't control. Install the pixel on your lander, pass `oppref` to it as in Option A, and fire an event on the action you can see, for example a `custom` event when the visitor clicks through to the offer.

OpenAI then reports lander engagement, not the sale. Custom events can't be the goal of a **Conversions** campaign, so this helps reporting, not conversion optimization. Your real conversions stay in ClickFlare. Judge campaigns there.

### Option C – OpenAI's Conversions API, from your own system

OpenAI's Conversions API takes events from your server: a `POST` to `https://bzr.openai.com/v1/events?pid=PIXEL_ID`, with a Conversions API key in the `Authorization` header and a JSON body. Each event carries an `id`, a `type` such as `order_created`, a `timestamp_ms` and, when you have it, the original `oppref`. Events must be no older than 7 days. Web events also need a `source_url`.

ClickFlare can't make that request: its postback is a plain URL call. But it stores what the API needs, the `oppref`, as the External ID. If you or your developer run a small relay, ClickFlare's postback can feed it:

1. Host an endpoint that accepts a URL like `https://relay.yourdomain.com/openai?oppref={external_id}&value={payout}&id={cf_click_id}` and sends the event to the Conversions API.
2. On the ChatGPT Ads traffic source, turn on **Traffic source postback URL** and enter that URL.
3. In the dropdown on the left, keep **Conversions**, or choose the custom conversion that should count.
4. Click **Save**.

The relay is your own code, not part of ClickFlare. Send `oppref` exactly as received. If the pixel also sends the same conversion, use the same event ID on both sides so OpenAI deduplicates it. See OpenAI's [Conversions API](https://developers.openai.com/ads/conversions-api) documentation for the full request format.

> [!NOTE]
>
> Whichever option you use, ClickFlare remains your source of truth for revenue. OpenAI's conversion numbers will differ from ClickFlare's. They come from a different data path, take 24 to 48 hours to appear in Ads Manager, may include modeled conversions, and follow the click-through (7, 14 or 30 days) and view-through (0 or 1 day) windows you choose for reporting.

## Step 3 – Finish the campaign and copy its URL

1. Name the campaign.
2. Set the **Cost Model** to **CPC** and enter your expected cost per click. See [Cost](#cost).
3. Choose **Redirect** or **Direct** tracking. If the OpenAI Pixel sits on your lander, **Direct** keeps `oppref` on the lander without extra setup. See [Direct Campaign Tracking](/docs/en/campaigns/direct-campaign-tracking.md).
4. Click **Next** and, on **Destination**, add your lander (optional) and your offer.
5. Save, open **Tracking**, select your own tracking domain and copy the **campaign URL**.

The campaign URL contains the template's parameters, for example `campaign_id={campaign_id}&ad_group_id={ad_group_id}`. Check it for an empty `oppref=`. Because the External ID row has no TS Token, the URL may contain `oppref=` with nothing after it. If it does, delete that part, so the only `oppref` in the click is the one ChatGPT adds.

If you use a lander, its call-to-action must link to the ClickFlare **click URL**, not to the offer directly. Otherwise the visit reaches the offer without a ClickFlare click ID, and the conversion cannot be traced back to the ChatGPT click.

See [Creating a Campaign in ClickFlare](/docs/en/campaigns/creating-a-campaign-in-click-flare.md).

## Step 4 – Create the campaign in Ads Manager

Ads Manager fills in its macros only when they are in the **Landing page query parameters** field. Macros left in the ad's destination URL are not replaced. Split the ClickFlare URL in two:

1. Create the campaign, ad group and ad in Ads Manager as usual. Choose the objective: **Reach** (CPM), **Clicks** (CPC) or **Conversions**.
2. In the ad's destination URL, paste the ClickFlare campaign URL **without** the template's parameters. Keep the part up to the `?`, plus any fixed parameters.
3. Open the three-dot menu on the **Campaigns**, **Ad groups** or **Ads** page and choose **Edit campaign**, **Edit ad group** or **Edit ad**.
4. In **Landing page query parameters**, add the four parameters with their macros: `campaign_id={campaign_id}`, `ad_group_id={ad_group_id}`, `ad_id={ad_id}` and `ad_account_id={ad_account_id}`.
5. Save, and submit the ad for review.

Setting the parameters at the campaign level covers every ad in it. A more specific level wins: the ad URL, then the ad, the ad group and the campaign. A parameter already in the ad's URL is never overwritten, so if the template's parameters stay there, they arrive as raw text.

Don't add `oppref` to the query parameters. ChatGPT adds it on every click.

## Step 5 – Test the integration

1. Click your live ad in ChatGPT, so the visit comes from ChatGPT Ads. In ChatGPT's iOS in-app browser, use **Share** to copy the full link and see its parameters.
2. In ClickFlare, open the campaign's report and check that the visit has an **External ID**. That is the `oppref`.
3. Check the tracking-field columns. They should show IDs, not `{campaign_id}` or other raw macros.
4. Complete the offer the way a real visitor would and check that the conversion appears in ClickFlare.
5. If you use the OpenAI Pixel, turn on its debug mode, or open your browser's developer tools (F12), and check that the pixel and your conversion event fire on the right page. If you passed `oppref` to the lander, check that the lander URL contains it.

If you use the relay from Option C, go to **Logs → Postback Status** to see whether ClickFlare called it. On the OpenAI side, the Conversions API's `validate_only` option checks events without saving them. Otherwise there is nothing to check under **Logs → Postback Status**.

***

## Cost

The template doesn't pass cost. Its **Cost** row is empty, OpenAI publishes no cost macro, and ClickFlare has no cost integration for ChatGPT Ads.

Set the campaign's **Cost Model** to **CPC** and enter your expected cost per click. For **Clicks** campaigns, use your average CPC from Ads Manager. OpenAI suggests starting bids at 3 to 5 USD, and its auction is second-price, so your average is usually below your bid. For **Reach** campaigns, bought on CPM, don't enter your CPM divided by 1,000: an impression below a ChatGPT answer is not a click, so that would understate your cost many times over. Enter your effective CPC instead, the spend divided by the clicks, both from Ads Manager. **CPA** with your target is an alternative for **Conversions** campaigns.

> [!NOTE]
>
> Don't use **Not Tracked** with this template. It records cost only when the URL or a cost integration provides it, and neither does here, so your cost would show as zero.

Ads Manager's spend data lags 7 to 8 hours behind clicks. Export daily spend from Ads Manager (**Export → Export daily values**) and correct ClickFlare with a [manual cost upload](/docs/en/settings/manual-cost-upload.md). See [Cost Models](/docs/en/core-platform-concepts/cost-models.md).

***

## Troubleshooting

> **The External ID is empty**
>
> * The click didn't come from ChatGPT, for example a direct visit or an OpenAI review crawler (`OAI-AdsBot`). Crawler visits arrive with your tracking parameters but no `oppref`. They are not billed.
> * The campaign URL in Ads Manager contains an empty `oppref=` as well as ChatGPT's own. Delete the empty one.
> * The **External ID** row was removed or renamed. Its TS Parameter must be `oppref`.

> **Columns show raw macros**
>
> The macros were left in the ad's destination URL. Ads Manager only replaces macros set in **Landing page query parameters**. Remove them from the URL and add them there. See [Traffic Source Tokens Arriving Empty](/docs/en/troubleshooting/tokens-arriving-empty.md).

> **Ads Manager shows no conversions**
>
> * ClickFlare sends nothing to OpenAI. Conversions come only from the pixel or the Conversions API.
> * With the pixel and **Redirect** tracking, check that `oppref={external_id}` is on your lander URL in ClickFlare.
> * The event you send doesn't match the conversion event attached to the campaign. For custom events, the event name must match exactly.
> * Attributed conversions take 24 to 48 hours to appear.

> **Cost is zero in ClickFlare**
>
> The Cost Model is **Not Tracked**. The template passes no cost, so switch to **CPC**, or upload costs.

> **ClickFlare and Ads Manager conversion counts don't match**
>
> Expected. The two counts come from different data paths and attribution rules. See the note at the end of Step 2. Optimize on ClickFlare's numbers.

For the general checklist, see [Conversions not showing](/docs/en/troubleshooting/conversions-not-showing.md).

***

**FREQUENTLY ASKED QUESTIONS**

> **Q1:** Why is there no postback in the ChatGPT Ads template?

**A1:** OpenAI doesn't take conversions by postback URL. It takes them from its pixel or through its Conversions API, which needs an authenticated server request with a JSON body. ClickFlare's traffic source postback can't make that request on its own.

> **Q2:** Does ClickFlare integrate with OpenAI's Conversions API?

**A2:** No. ClickFlare stores OpenAI's `oppref` as the External ID, so you can send it to the Conversions API from your own system, or through a relay that ClickFlare's postback calls.

> **Q3:** Should I use Redirect or Direct tracking?

**A3:** Both capture the click. Direct is the simpler fit if the OpenAI Pixel sits on your lander, because ChatGPT then adds `oppref` to the lander URL itself. With Redirect, pass `oppref={external_id}` to the lander. See [Direct Campaign Tracking](/docs/en/campaigns/direct-campaign-tracking.md).

## Related

> **[Direct campaign tracking](/docs/en/campaigns/direct-campaign-tracking.md)**
>
> Track without a redirect, with your lander as the destination.

> **[Traffic source postbacks](/docs/en/tracking/how-to-configure-a-traffic-source-s2s-postback-url.md)**
>
> Every token you can use in a postback, including for a relay.

> **[Manual cost upload](/docs/en/settings/manual-cost-upload.md)**
>
> Correct your ChatGPT Ads spend in ClickFlare.

> **[Conversions not showing](/docs/en/troubleshooting/conversions-not-showing.md)**
>
> The general checklist when conversions don't arrive.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.