A step-by-step guide to OpenAI's ad platform for lenders, brokers and other regulated finance advertisers: eligibility, conversion tracking, ad groups, context hints, ads and how to judge the results. It is written to work whatever your landing pages, tag manager and CRM are. Everything here comes from OpenAI's own documentation and from setting up a live account in September 2026.
Read this before anything else. Financial services are a restricted category. OpenAI's ad policy (openai.com/policies/ad-policies) says that in the US it may allow approved financial advertisers case by case: auto loans and leasing, credit cards, credit monitoring, deposit accounts, financial planning, insurance, investment services, mortgages, personal loans and payment services. It also says: "Ads for financial services outside the US are generally prohibited." You may be asked for proof of licensure.
The ad unit has your business name, logo, a title, a description, an image and a link. Advertisers never see the conversations their ads appeared in.
What you can report on: impressions, clicks, spend, click rate, cost per click and conversions, by campaign, ad group and ad. There is no search-terms report and no conversation data. You learn by changing hints and creative and watching delivery, click rate and conversions.
Targeting is country (plus state, DMA or ZIP in the US), platform (iOS, Android, web) and custom audiences. There are no demographic, interest or keyword controls.
Why first: a Conversions campaign's objective and conversion event are locked when you create it. If tracking isn't working, the campaign learns from nothing, and fixing the event means a new campaign. Get a test conversion showing in Ads Manager before you build a Conversions campaign.
In Ads Manager → Tools → Conversions, create a web data source. You get a Pixel ID (public, goes in the browser) and can create a Conversions API key (secret, server-side only). One data source can serve every landing page you own.
Add OpenAI's setup script to the <head> of every page an ad can land on. Replace
YOUR_PIXEL_ID:
<script>!function(w,d,s,u){if(w.oaiq)return;var q=function(){q.q.push(arguments)};q.q=[];w.oaiq=q;var j=d.createElement(s);j.async=1;j.src=u;var f=d.getElementsByTagName(s)[0];f.parentNode.insertBefore(j,f)}(window,document,"script","https://bzrcdn.openai.com/sdk/oaiq.min.js");oaiq("init",{pixelId:"YOUR_PIXEL_ID",debug:false});</script>
Ads Manager gives you this with debug:true. Set it to false before going live.
The pixel must load on the first page the ad lands on. That is where it reads OpenAI's
click ID from the URL and stores it.
oaiq("measure", "lead_created", { type: "customer_action" }, { event_id: "UNIQUE-LEAD-ID" });
lead_created is OpenAI's standard lead event and the one to choose as
the campaign's conversion type. Others include appointment_scheduled,
registration_completed and order_created.event_id must be unique per lead. Use your form or CRM's lead ID.
If the same lead fires twice with the same ID, OpenAI counts it once.{ type: "customer_action", amount: 5500, currency: "USD" }.
Amounts are whole numbers in the currency's smallest unit, so 5500 is 55.00.| Tag (Custom HTML) | Trigger | Settings |
|---|---|---|
| OpenAI Pixel – Base: the setup script from 4.2 | The earliest trigger on your landing pages (All Pages / Initialization, or your form platform's "start" event) | Fire once per page |
OpenAI – lead_created: the measure call from 4.3, with your lead-ID variable as event_id | The same trigger your existing Google Ads or Meta lead tag uses | Tag sequencing: fire OpenAI Pixel – Base first. Once per event. |
If your form platform only fires its lead event for approved pages or forms, make sure the new landing page is on that list. Otherwise the tag never fires and it looks like the channel doesn't convert.
?oppref=… to your landing URL on every click. It is the click ID that ties a
conversion back to an ad.oppref to your tracking parameters. It's reserved, and Ads
Manager rejects it with "Reserved query parameters are not supported".Browsers block or lose some pixel events. Sending the same conversion from your server (the
Conversions API) makes measurement more reliable. Send it with the same event_id
as the pixel and OpenAI keeps whichever arrives first.
POST https://bzr.openai.com/v1/events?pid=YOUR_PIXEL_ID
Authorization: Bearer YOUR_CONVERSIONS_API_KEY
{
"events": [{
"id": "UNIQUE-LEAD-ID",
"type": "lead_created",
"timestamp_ms": 1790000000000,
"oppref": "value captured from the landing URL",
"source_url": "https://your-landing-page",
"action_source": "web",
"user": {
"obref": "value of the __obref cookie",
"emails_sha256": ["sha256 of trimmed, lowercased email"],
"phone_numbers_sha256": ["sha256 of digits incl. country code, no +"]
},
"data": { "type": "customer_action" }
}]
}
oppref goes on the event; obref (the pixel's browser cookie)
goes inside user. Send both unchanged, never hashed."validate_only": true to test without saving.
A good response is {"accepted_events":1}.Load your landing page with ?oppref=test123 on the end and submit a test lead. In Ads Manager →
Conversions → Event Stream you should see lead_created with your test ID, from
the browser and (if you built 4.6) from the server. In browser DevTools you should see a request to
bzr.openai.com/v1/sdk/events carrying lead_created.
OAI-AdsBot must be able to load the page. Check
robots.txt, and check your firewall or bot protection isn't blocking it with a 403 or a challenge page.| Objective | Billed by | Use it when |
|---|---|---|
| Reach | Impressions (CPM) | Brand awareness. Rarely right for lead generation. |
| Clicks | Clicks (CPC) | Your first campaign, while you prove tracking and see what a click costs. |
| Conversions | Still clicks, optimised for one conversion event | Once lead_created is arriving reliably. The event is locked at creation. |
{campaign_id}, {ad_group_id}, {ad_id},
{ad_account_id}. For example:
utm_source=chatgpt&utm_medium=cpc&utm_campaign={campaign_id}&utm_content={ad_group_id}-{ad_id}Context hints sit on the ad group. They tell OpenAI what you offer, who it suits and when it's useful, so it can judge which conversations your ad is relevant to. They are the biggest lever you have.
OpenAI's own rule (help article "Write Context Hints for ChatGPT Ads"): each hint is a clear, natural phrase about one idea, covering What (feature, service, price, availability, area), Who (the need or circumstance it suits) and When (the situation or decision). Good hints are additional (beyond the ad and page), specific, relevant and accurate.
| Don't | Do |
|---|---|
| Describe only the customer: "First-home buyers in Brisbane" | Lead with the offer and connect it: "Mortgage broker in Brisbane comparing 30+ lenders for first-home buyers with a 5–10% deposit" |
| A keyword list: "home loan, mortgage, refinance, rates" | One idea per phrase. OpenAI says natural phrases, "rather than a list of disconnected keywords". |
| A targeting instruction: "Only show to people in Sydney" | A business fact: "Car finance available to buyers across New South Wales". Use the campaign's location settings for actual targeting. |
| Claims you can't stand behind: "Guaranteed approval" | Facts that are true today, and update them when rates, fees or criteria change. |
Swap in real, accurate details. Every claim in a hint must be true of the business.
Aim for 5–10 hints per ad group, all on the same theme. If a hint needs a different page or message, it belongs in a different ad group.
| Field | Limit | Notes |
|---|---|---|
| Title | 50 characters | Ads Manager warns about truncation from about 35. Aim for 30 or fewer. |
| Description | 100 characters | Must add to the title, not repeat it. |
| Image | PNG or JPG, square, at least 256 × 256 | Simple and literal. A real person's face is worth testing against a logo. |
| Destination URL | Specific page | Never the homepage. Must match the ad. |
Set expectations before spending. OpenAI publishes no benchmark conversion rates. The only public head-to-head (Search Engine Land) measured 0.21% conversion from ChatGPT Ads against 3.71% from Google Ads for the same advertiser. One test, but it's the only direct comparison there is. Cheaper clicks that convert many times worse are more expensive leads.
| # | Check |
|---|---|
| 1 | Read the current ad policy; financial services category and licensing understood |
| 2 | Account created by the business; country, currency and time zone correct (locked) |
| 3 | Logo uploaded |
| 4 | Pixel on every landing page, debug:false |
| 5 | lead_created fires once per lead with a unique event_id |
| 6 | Test lead visible in Event Stream |
| 7 | oppref survives redirects; not in tracking parameters |
| 8 | OAI-AdsBot can load the landing page (robots.txt and firewall) |
| 9 | Tracking parameters set on each ad group |
| 10 | 5–10 offer-led context hints per ad group, all accurate |
| 11 | 3–5 ads per ad group, different angles, compliant copy |
| 12 | Objective chosen deliberately (Clicks until tracking is proven); manual max bid set |
| 13 | Kill and scale rules written down, with read dates |