ChatGPT Ads account setup: from nothing to a campaign that measures correctly
The ChatGPT Ads interface is genuinely simple, and a competent operator can have a campaign running in an afternoon. That is not the problem. The problem is that three account settings can never be changed once made, the campaign objective is locked at creation, and conversion-event corrections do not backfill — so the cost of building it in the wrong order is paid later, quietly, and cannot be refunded. This page is the entire build sequence, in the order it has to happen, including the version you can run yourself.
The short version
- What it is: a one-off build of your OpenAI Ads Manager account — verification, measurement, campaign architecture, the first hint sets and creative, launch, and a documented handover.
- Why it is not trivial: three account settings can never be changed, the campaign objective is locked at creation, and conversion-event corrections do not backfill. The easy part is the interface; the expensive part is the order you do things in.
- What it costs: from $3,999, fixed before we start. You own the account, the pixel, the conversion history and everything we build.
- Who should not buy it: anyone whose buyers are on ChatGPT Plus, Pro, Business, Enterprise or Education — ads never serve to those tiers. We would rather tell you that now than after launch.
- The honest part: the full build sequence is published on this page. Plenty of readers should run it themselves, and it is written so they can.
What is ChatGPT Ads account setup?
ChatGPT Ads account setup is the one-off build project that takes a business from no OpenAI advertiser account to a live campaign that measures correctly — creating and verifying the advertiser account in Ads Manager Beta at ads.openai.com, making the three permanent country, currency and time-zone decisions, installing and validating conversion tracking before any spend, configuring the conversion event the campaign will optimize toward, choosing the objective that locks permanently at campaign creation, writing the first context-hint set, building the ads, and launching on a bid and budget that can actually deliver. It is a build, not a retainer: it ends at handover with a working account you own outright. Ours is from $3,999 as a one-off engagement. Self-serve ChatGPT Ads opened on 5 May 2026, roughly four months ago, so nearly every account being built today is a first account — built by someone who has never built one before, against a platform that shipped six significant changes between June and August 2026.
The word “setup” covers four different purchases in this category, and buying the wrong one is the most common way to spend $3,999 and still not have what you needed. A build creates objects that did not exist. An audit examines objects that already do. A tracking implementation builds one layer and touches nothing else. A retainer operates the account every week after all three are done.
What does a build-and-launch project actually produce?
A build-and-launch project produces a verified advertiser account, a validated measurement layer, a campaign and ad group structure, a context-hint set, a creative set, and a live campaign spending against a budget. Concretely that is: an account through Persona identity verification with Settings → Account info completed — account name and logo, without which ads do not serve at all; a billing profile and payment method, both required before delivery; a pixel or Conversions API implementation reporting to a Pixel ID from Tools → Conversions, with a live test conversion proving the path end to end; one standard conversion event configured and attached to the campaign; a campaign whose objective matches what you are actually buying; ad groups carrying five to fifteen context hints each on a single intent; ads with landing-page query parameters set through the three-dot menu; and the whole thing switched on with the delivery checklist cleared. The mechanical walkthrough of the interface is free in our Ads Manager setup guide.
What it does not produce is performance. A build that launches on Monday has a conversion column worth reading somewhere in the following week, not on Tuesday — attributed conversions take 24 to 48 hours to appear, and day-one reporting is noise. Anyone selling you a setup project on the promise of a result in week one is selling you something the platform cannot deliver.
How is setup different from ongoing management?
Setup ends with a working account; management is what happens to that account every week afterwards. The two engagements answer different questions. Setup answers “does this account exist, is it configured irreversibly correctly, and can it report the truth about what it produces?” Our White-Glove ChatGPT Ads retainer answers “who rewrites the hints on Monday, and the Monday after that?” — $1,499/month flat, covering up to $10,000 in managed monthly ad spend, with Tarun personally operating the account. A build is one-off at $3,999. If you already have an operator with genuine spare capacity, buy the build and keep the operating in-house; that is a legitimate and common outcome.
How is setup different from a tracking-only implementation?
A tracking implementation builds the measurement layer and stops there; a setup project builds the measurement layer and then everything that sits on top of it. If you already have a verified advertiser account, a billing profile and a campaign structure you are happy with, and the only thing wrong is that the Conversions column has never recorded anything, you do not need an account built — you need Conversion Tracking Implementation, also from $3,999, covering the pixel, the Conversions API, deduplication, identity hashing and the oppref path. The ground it covers is described in our conversion tracking guide. Buying a full build to fix a measurement problem is paying for objects you already own.
How is setup different from an audit?
An audit requires a live account with spend history to examine; a setup project requires that no such account exists yet, or that the existing one has never run. A ChatGPT Ads audit is a diagnostic — it tells you which of eleven things explains a number you are unhappy with. A build has no number to be unhappy with yet. The dividing line is simple: if you can export a CSV of your own spend, you want the audit. If you cannot, you want the build.
| If this describes you | The right purchase | Why |
|---|---|---|
| No OpenAI advertiser account exists, or one exists and has never spent | Account setup and launch, from $3,999 one-off | The permanent settings and the objective are still open decisions. After launch, several of them stop being decisions and become rebuilds. |
| The account runs, spends, and the result is somewhere between disappointing and unreadable | Audit, from $3,999 one-off | You have history to diagnose. A build would recreate objects that already work. |
| The account is fine; the Conversions column has read zero since launch | Conversion Tracking Implementation, from $3,999 one-off | One layer is broken. The rest of the build is not the problem and does not need paying for twice. |
| The account is built and correct; nobody has time to operate it weekly | White-Glove management, $1,499/month | A retainer is only worth what it does in the weeks nobody is watching. |
| Media budget is under roughly $1,500/month | None of the above — run it yourself | Any fee dominates the media at that level. Use the free playbook for running ads on ChatGPT. |
Can you not just do this yourself?
Yes — and if you are putting under roughly $1,500 a month behind media, you almost certainly should. The self-serve interface is genuinely simple. Ads Manager Beta has four sidebar sections — Campaigns, Tools, Billing, Settings — and that is the entire product. There is no keyword research, because there are no keywords. There is no match-type decision, no negative-keyword list to maintain, no audience builder to learn, no asset library, no bid-strategy dropdown at campaign level, and no minimum spend commitment. Context hints are typed into a bare multi-line text box. A competent operator who has run Google Ads can create an account, build a campaign and launch it in an afternoon, and the platform will not stop them or trick them. We publish the whole mechanical walkthrough free at Ads Manager setup and the operating method at how to run ads on ChatGPT precisely because most readers should use them rather than hire us.
You should do this yourself if: your media budget is under roughly $1,500/month; you sell one product into one country; one person will own the account permanently and no second brand is coming; you already have a working analytics and tag setup you understand; and you are willing to read for two hours before you touch anything. That describes a large share of the businesses reading this page, and for every one of them the honest answer is that a $3,999 build is worse value than an afternoon and a checklist. What follows is not an argument against that. It is a list of the five things that go wrong, so that whichever way you decide, you decide knowing what the mistakes cost.
What are the three settings you can never change?
Country/region, billing currency and time zone are set once at account creation and cannot be changed afterwards. There is no support ticket for this. The remedy is a new advertiser account, and that remedy is expensive for a reason most people do not anticipate: conversion events belong to the ad account that created them and do not travel between accounts, so a migration rebuilds the measurement layer from scratch and abandons the conversion history attached to the old one.
Each of the three has a downstream consequence that is invisible on the signup screen. Time zone drives reporting boundaries, which is what you are reconciling against when your ad clicks disagree with your analytics sessions — and they will disagree, because clicks measure ad interactions while sessions depend on page load, redirects, consent and UTM handling. Billing currency drives the minimum daily budget, which is published per billing currency — $25 USD, £15 GBP, 2,500 JPY and so on. Pick a currency whose minimum sits above the budget you intended to test with and you have quietly committed to a larger test. Country drives eligibility — which markets you can buy, and whether you can buy at all.
Why does the campaign objective have to be right the first time?
The objective is locked permanently at campaign creation, and there is no conversion path from a CPM or CPC campaign to oCPC. There is no separate bid-strategy dropdown at campaign level, because the objective is the bidding model: Reach bills CPM per 1,000 impressions, Clicks bills CPC per valid click, and Conversions bills oCPC — also per valid click, not per conversion. Choosing Clicks because Conversions looked complicated on the day is not a setting you revisit later. It is a campaign you rebuild.
The August 2026 cloning feature is routinely misread as the fix. It is not. Cloning takes an existing CPC campaign and creates a new oCPC campaign from it; the original keeps running until you pause it, and nothing about the original changes. Cloning also relaxes none of oCPC’s four gates: conversion tracking has to be live; at least one standard event must exist, because custom is not supported as an oCPC goal; the event must belong to this ad account with an active conversion source; and the account must be enabled for conversion bidding, or the platform returns 403 Conversion bidding is not enabled. Three of those four fail quietly. The fourth fails with a string most operators never see, because it appears at the moment they were expecting a campaign to launch.
Why does measurement have to exist before the first dollar of spend?
Measurement has to be live and validated before spend because corrections do not backfill. A conversion event that is firing, accepted and forwarded will still report zero if it does not match the event configured for the campaign — and correcting the configuration recovers nothing. The conversions that happened while it was wrong are gone from the platform’s record permanently, and oCPC never received the training signal it needed at exactly the moment you most wanted it learning.
Every failure in this layer is silent. The pixel needs three Content Security Policy directives — script-src https://bzrcdn.openai.com, connect-src https://bzr.openai.com and img-src https://bzr.openai.com — and a missing connect-src is the classic cause of “the pixel is installed but no conversions appear”: the script loads, the page looks perfect, the events never leave the browser. Strip oppref at your edge with a redirect, a consent wall or a CDN rule and tracking breaks entirely. Server-side, oppref is never captured for you — the Conversions API requires you to pass it, as obref inside the user object. None of these produce an error. They produce a zero, which is indistinguishable from a demand problem, and which most operators respond to by raising the budget.
Why does one email per advertiser account trap agencies?
An email address that has already created an advertiser account cannot create another one, and there is no parent-child agency structure in Ads Manager today. Every advertiser needs its own account, its own billing, and its own Persona verification. An agency that signs up its first client on hello@youragency.com has burned that address for creation permanently and will discover it on the day the second client arrives.
The workaround is an alias scheme — ads+client@youragency.com — decided before the first account rather than after the second. The restriction applies only to creation: an existing user can be invited into as many accounts as you like through Settings → Users → Invite and switch between them from a single login. So the structure works, but only if the creation addresses were planned. It is the most common irreversible mistake we see from multi-brand operators, and the cheapest one to avoid.
Why do fully configured campaigns serve nothing?
A campaign can be complete, enabled, funded and correct and still deliver zero impressions, because delivery depends on a chain of account-level conditions that the campaign screen does not report on. Work the non-delivery checklist in order: account verification and billing complete, then campaign and ads active rather than paused, then campaign dates include today, then ads have completed review. For an ad to serve, the ad and both of its parents — ad group and campaign — must be enabled.
The one that catches most new accounts sits outside that chain entirely. Ads will not serve unless Settings → Account info is complete with an account name and a logo. Nothing in the campaign interface says so. Verification and account review are also separate steps, both handled in a rolling queue with no published SLA — same-day in some cases, a couple of weeks in others — and OpenAI is unable to expedite account or ad review. Below that sit two economic non-delivery causes: bidding much below $3 wins little or no delivery, and a daily budget under your currency’s minimum is not a valid budget. An account can be sitting on four of these at once and present exactly the same symptom for all four.
| What is genuinely easy | What is genuinely not | What it costs if you get it wrong |
|---|---|---|
| Signing up and creating the advertiser account | Clearing Persona identity verification first time, with a business name consistent with the website and an industry classification present | Back into a rolling queue with no published SLA — same-day to a couple of weeks, and OpenAI is unable to expedite. |
| Entering a country, currency and time zone | Knowing all three are permanent | A new advertiser account. Events do not travel between accounts, so measurement is rebuilt from zero. |
| Picking an objective from three options | Picking the one you will still want in six weeks | A rebuild. CPM and CPC campaigns cannot be converted to oCPC; cloning creates a new campaign and leaves the old one running. |
| Installing a pixel snippet | Proving the three CSP directives are present, that oppref survives your redirect and consent chain, and that the event string matches the campaign’s configured event exactly | A conversion column reading zero with no error anywhere, and corrections that do not backfill. |
| Setting a daily budget | Reading its pacing — since 27 July 2026 daily budgets are seven-day averages, up to 2× in one day and 7× across seven | Normal pacing read as a runaway, and a budget cut on a Tuesday that was always going to be a $140 day on a $100 budget. |
| Typing context hints into a text box | Writing five to fifteen per ad group, one intent per ad group, describing the conversation rather than the product | Ad groups nobody can tell apart and delivery that never concentrates — with no search-term report to diagnose it with. |
| Inviting colleagues into the account | Deciding who creates it, because that email can never create another advertiser account | A multi-brand operator locked out of creating their next account, with no parent-child structure to fall back on. |
| Switching a campaign on | Getting it to actually serve | Silence. A missing account name or logo under Settings → Account info alone prevents serving, and the campaign screen never mentions it. |
The honest rule for DIY versus hiring
Below roughly $1,500/month in media, build it yourself. Any build fee dominates the media at that level, the reversible mistakes are cheap, and our free guides cover the whole mechanical path. Above that, hire only if at least one irreversible decision is genuinely live for you: a country, currency or time zone you cannot revisit; the Conversions objective from day one, with its four gates cleared before launch rather than after; measurement running through a Conversions API, a CRM or a consent layer rather than one pixel on one domain; or a multi-brand estate whose account-creation emails have to be planned before the first signup. If none of those four apply, you are buying convenience rather than risk reduction — and we would rather say so now than invoice you for it.
Who will actually see your ads, and who never will
ChatGPT ads serve only to users on the Free and Go plans — never to Plus, Pro, Business, Enterprise or Education subscribers. That single sentence disqualifies more businesses from this channel than every other constraint on this page combined, and it is the fact a buyer most deserves to know before a build rather than after a launch. Everything below is the rest of the eligibility picture: who is excluded before targeting starts, which targeting levers do not exist at all, and what custom audiences can and cannot repair.
Which ChatGPT users can see your ads?
Ads reach the free tier and the $8/month Go tier, and nothing above them. There is no setting that changes this and no spend level that unlocks it — it is how the inventory is defined. For a consumer brand selling something a free-tier user plausibly buys, that is a large and perfectly serviceable audience. For a B2B or high-income audience it is a genuine reach limitation, and it works in exactly the wrong direction: the buyer senior enough to expense a Plus seat, the developer whose company pays for Business, the enterprise team on an Enterprise agreement and the university on Education are all structurally unreachable. The people most likely to be paying for ChatGPT are the people your ads cannot appear in front of.
You also cannot measure your way around it. Ads Manager gives you no plan-level breakdown — Segment controls Device and Country only, there is no placement or “where ads showed” report, and reporting is aggregated by design. You cannot spend for a month and then work out what share of your addressable market was reachable; you have to reason about it beforehand. Some businesses should read this paragraph and not buy this channel, and a page that lets them discover it in month two has failed them.
Who else is excluded before targeting even starts?
Two platform-level exclusions apply to every advertiser regardless of configuration. Users declared or predicted to be under 18 are excluded, so any product whose buyer skews young loses part of its audience before a single hint is written — and there is no override, because there is no age targeting to override with. Conversations about politics, health and mental health carry no ads at all.
That second rule deserves more attention than it usually gets, because it removes the conversation rather than the person. A supplements brand, a telehealth service, a therapy marketplace, a fitness app with a medical angle, an advocacy organisation: for each of these the single highest-intent moment — the conversation where someone is describing the exact problem the product solves — is the conversation that carries no advertising. The user is still reachable elsewhere in ChatGPT. The moment you most wanted is not. If your entire value proposition lives inside one of those three topics, the reachable version of your audience is the adjacent conversation, not the core one, and your context hints and your economics both have to be built on that basis.
Which targeting levers simply do not exist?
There is no cross-device identity, no retargeting audience, and no age or gender targeting. Each absence removes a tactic that transfers automatically from every other paid channel, and it is worth being blunt about what that costs.
- No retargeting. The warm middle of a normal funnel has no ChatGPT Ads equivalent. You cannot build an audience of people who visited a page, watched a video or abandoned a cart. Every impression is effectively a first impression, which pushes the burden of qualification onto the context hints, the ad copy and the landing page.
- No cross-device identity. A person who sees an ad on their phone and converts on a laptop is not stitched together for you. This is one reason platform-reported conversions and your own analytics will never fully agree, and why self-reported attribution at the point of purchase is worth more here than in channels with better identity.
- No age or gender targeting. Demographic qualification happens in the copy and on the landing page, not in a targeting panel. If your product is only right for one demographic, the ad has to say so, and you will pay for some clicks from people it was never right for.
- No negative-hint list. You cannot subtract traffic. You can only describe the traffic you want more precisely, or exclude a known list with a campaign-level custom audience.
What you do get is geography and platform. Targeting is country-level everywhere, with state, DMA and ZIP available in the United States — OpenAI publishes the location catalog as a downloadable CSV. Platforms are multi-select: iOS App, Android App or Web, where Web covers both desktop and mobile web. Targeting is more granular than reporting here, because reporting groups device into Mobile and Desktop only with mobile web counted under Mobile, so you can target a distinction you cannot read back.
Do custom audiences fix any of this?
Custom audiences repair one narrow part of the problem — using a list you already own — and they carry a size floor that rules most businesses out. The minimum is 25,000 matched users, and OpenAI recommends 100,000 or more. Matched, not uploaded: the threshold is applied after matching, so a list has to be materially larger than 25,000 rows to clear it. Uploads take CSV or TXT, up to 500 MB and up to 5,000,000 identifiers, one identifier type per upload, with an optional header that must read exactly email, phone_number, email_sha256 or phone_number_sha256. Processing runs 20 to 30 minutes, and an audience cannot be edited after creation — a refreshed list is a new audience.
The part that most often gets designed wrong is the bid multiplier. Audiences have three uses: campaign-level inclusion, campaign-level exclusion, and an ad-group bid multiplier from 0.1x to 10x. Multipliers never gate eligibility. A 10x multiplier includes nobody who was not already eligible, and a 0.1x multiplier excludes nobody — they change what you bid, not who you reach. And where several multipliers match the same user, the highest one wins; they do not stack. An account that has built a layered multiplier scheme expecting compounding is not getting the audience it drew on the whiteboard. The full mechanics, including the normalize-then-hash rules and the status list, are in our guide to ChatGPT Ads custom audiences.
| Audience characteristic | Reachable on ChatGPT Ads? | What to do instead if not |
|---|---|---|
| ChatGPT users on the free plan, in a live market | Yes — this is the core inventory | — |
| Subscribers on the $8/month Go plan | Yes | — |
| Plus, Pro, Business, Enterprise or Education subscribers | No — the entire paid base above Go is excluded | Reach them elsewhere. Treat ChatGPT Ads as a channel against the free base and size the opportunity accordingly, or do not buy it. |
| Users declared or predicted to be under 18 | No — excluded platform-wide | No workaround exists. Size your audience with this removed before committing budget. |
| People in conversations about politics | No — those conversations carry no ads | Target adjacent, non-excluded conversations and accept that the intent is lower. |
| People in conversations about health or mental health | No — those conversations carry no ads | Build hints around the adjacent moment — logistics, cost, comparison, aftercare — not the symptom conversation. |
| A specific age bracket or gender | No targeting lever exists | Qualify in the copy and on the landing page, and expect to pay for some traffic the product was never right for. |
| People who visited your site last week | No — there is no retargeting audience | Push qualification upstream into hints and copy. A CRM custom audience works only above 25,000 matched users. |
| Your existing customers, suppressed | Yes, as a campaign-level custom audience exclusion | The same 25,000 matched-user floor applies. Below it, suppression is not available to you. |
| A user across phone and laptop | No — no cross-device identity | Ask a self-reported attribution question at the point of purchase and reconcile against CRM outcomes. |
| Buyers in a specific US state, DMA or ZIP | Yes — sub-country targeting is US-only | Elsewhere, plan at country level and split into separate campaigns if you need the separation. |
| Buyers in the UK, Canada, Australia, New Zealand, Japan, South Korea, Brazil or Mexico | Yes — nine markets are live including the US | — |
| Buyers in Germany, France, Spain or the rest of Europe | Not yet — 31 European countries are announced, and the UK went live on 6 June 2026 | Wait for the market to open rather than buying a build against inventory that does not exist. |
| Buyers in India | No — India appears in the published minimum-spend table at 725 INR but is not yet listed as available | Treat the published minimum as a signal of intent, not as availability. Do not build against it. |
The one-minute qualification test
Take your five best customers from last quarter and answer four questions about them. One: would each of them plausibly have been on the free or $8/month Go plan at the moment they were researching your product, or are they the kind of buyer whose company pays for a Plus, Pro, Business or Enterprise seat? If four of five are on paid plans above Go, this channel cannot reach your best customers today. Two: does the conversation where your product is most obviously the answer sit inside politics, health or mental health? If yes, your highest-intent moment carries no ads and you are buying the adjacent moment instead. Three: is the market they buy from one of the nine that are live? Four: does any part of your plan depend on retargeting, demographic targeting, or a customer list that clears 25,000 matched users? If your answers are “free or Go”, “no”, “yes” and “no”, you qualify and the rest of this page is about building it properly. If not, you have just saved yourself a build fee and a quarter.
What you need before you start
Nine items have to exist before you open the signup flow, and every one of them blocks something specific further down the build. Gather them first, because account verification and ad review both run in a rolling queue with no published SLA — same-day in some cases, a couple of weeks in others — and OpenAI is unable to expedite account or ad review. A missing field does not cost you five minutes. It costs you another trip through a queue you cannot hurry. The common rejection causes are all preventable at this stage: a missing industry classification, a business name inconsistent with the website, and incomplete Persona verification.
- Your legal business name, exactly as it appears on the website. The onboarding flow runs identity verification through Persona, and a business name that does not match what a reviewer finds on your site is one of the three most common rejection causes. Decide now whether you are “Northgate Supply Co.” or “Northgate Supply Company Limited”, make the website agree, and use one string everywhere. This blocks verification, and verification blocks everything.
- The website URL you will actually advertise to. It is checked against the business name during review, and it is also one of the four inputs OpenAI’s relevance-weighted auction uses to rank your ads — alongside context hints, ad title and ad copy. The image is explicitly not an input. A site that does not obviously belong to the named business slows review; a landing page that does not agree with the hints depresses relevance for as long as it stays live.
- A square logo file. This blocks delivery, not review, which is why it catches so many first accounts. Settings → Account info holds the account name and the logo, and ads will not serve until that step is complete. A campaign can be built, funded, approved and enabled and still deliver nothing because a logo was never uploaded, and no message anywhere in the campaign interface will tell you that is the reason.
- Your industry classification. A missing industry classification is a documented rejection cause on its own. Choose the category that genuinely describes what you sell rather than the one that sounds most premium — a mismatch between the classification, the business name and the website is exactly the pattern a reviewer is looking for.
- Country or region — permanent. This drives eligibility: which markets you can buy, and whether you can buy at all. Nine markets are live — the US, UK, Canada, Australia, New Zealand, Japan, South Korea, Brazil and Mexico — with 31 European countries announced. Get this wrong and the remedy is a new advertiser account, not a settings change.
- Billing currency — permanent, and it sets your floor. The minimum daily budget is defined per billing currency: $25 USD, £15 GBP, 25 CAD, 25 AUD, 25 NZD, 40 BRL, 150 MXN, 2,500 JPY, 25,000 KRW. There is no platform-wide minimum spend commitment, but there is a minimum daily budget, and the two get confused constantly. Choose the currency you actually want to be billed and reported in, because you will be living with it for the life of the account.
- Time zone — permanent, and it defines every date you will ever argue about. Time zone drives reporting boundaries. Every reconciliation between Ads Manager and your own analytics has to be run on the same date range and the same time zone to mean anything, and an account whose time zone does not match the one your analytics reports in adds a permanent manual correction to every comparison. Pick the zone your finance and analytics teams already use.
- A billing address including state and postal code, plus an invoice delivery email. The billing profile has to be complete before delivery, and an address missing a state or postal code will not save. The invoice email matters more than it looks for anyone running multiple brands: billing is per-client, each account carries its own billing profile, and there is no consolidated agency invoice to reconcile against.
- A payment method, and an OpenAI account to create the whole thing from. Billing profile and payment method are both required before delivery — complete one and not the other and the account still will not serve. The advertiser account is created from an OpenAI account, which is where the constraint in the next paragraph bites.
Once those nine exist, the build order is fixed and worth stating: create the account, complete onboarding and Persona verification, set account name and logo under Settings → Account info, add the billing profile and payment method, then invite the rest of the team through Settings → Users → Invite. The step-by-step version of that path, with every screen, is free in our Ads Manager setup guide, and the operating sequence that follows it is in how to run ads on ChatGPT.
What can you do while you are waiting to be verified?
Build the measurement layer, because it is the only part of the project that does not depend on the account being approved and it is the part that must be finished before the first dollar of spend. Verification and account review are separate steps, and neither has a published SLA, so the waiting period is unpredictable in length but entirely predictable in what it lets you get on with. Install the pixel, confirm the three Content Security Policy directives are present in your headers, check that oppref survives every redirect, consent screen and CDN rule between the ad click and your landing page, and decide which standard conversion event genuinely describes your outcome. None of that needs an approved account, and every day of it is a day removed from the critical path.
Doing it in that order also protects the decision you cannot take back. The Conversions objective has four gates, one of which is that at least one standard event exists with an active conversion source on this ad account. An operator who waits until approval to start thinking about measurement discovers those gates on the day they wanted to launch, chooses Clicks because it is the objective available that afternoon, and inherits a campaign that can never be converted to oCPC. The waiting period is not dead time. It is the window in which the irreversible choice stays cheap.
Only one person per business should create the advertiser account
An email address that has already created an advertiser account cannot create another one. Decide before signup whose address that will be, and if you are an agency or a multi-brand operator, decide the alias scheme too — ads+client@youragency.com — because the restriction applies to creation and creation only. Everything after that is flexible: an existing user can be invited into any number of accounts and switch between them from one login, so nobody needs a second signup to gain access.
The reason this is hard to reverse is that three separate things ride on the account the creating address produces. The permanent country, currency and time-zone settings belong to it. The billing profile and Persona verification belong to it. And conversion events belong to it — events do not travel between ad accounts, so abandoning an account for a correctly-created one means rebuilding the measurement layer and leaving the conversion history behind. There is no parent-child agency structure to migrate into either; every advertiser needs its own account, its own billing and its own verification. Ten minutes of thinking here removes the most expensive irreversible mistake available on this platform.
Creating the advertiser account and getting verified
Creating a ChatGPT Ads advertiser account is a five-step sequence at ads.openai.com: create the account against an OpenAI login, complete onboarding and Persona identity verification, set the Account name and Logo under Settings → Account info, add a billing profile and a payment method, and invite the people who will operate the account under Settings → Users. Each step is short. The sequence is not reversible in the places that matter, and three of the choices made inside it can never be edited afterwards.
The clicking is genuinely easy and we are not going to pretend otherwise. What costs money here is not difficulty, it is order and permanence: which email address you burn on the account, which country, currency and time zone you commit to, and how long you have told your leadership team the account will take to go live when the queue in front of you is one you cannot influence. Our Ads Manager setup guide walks the interface screen by screen if you want to do this part yourself.
- Create the advertiser account. You need an OpenAI account to start. Only one person per business should create the advertiser account, and that person should be chosen deliberately rather than by whoever happens to be at a laptop — the email address used at creation is consumed permanently, for reasons covered below. A shared operations address controlled by the business survives staff changes; a contractor’s personal address does not.
- Complete onboarding and Persona identity verification. Onboarding runs in three parts — business details, account details, then Persona for identity verification. This is where legal entity name, website and industry classification are captured, and where most rejections originate. Submissions enter a review queue rather than clearing instantly.
- Set Account name and Logo under Settings → Account info. Ads will not serve unless this step is complete. It reads like cosmetic profile-filling, it is buried one level away from the campaign builder, and it is a hard delivery gate. Accounts stall here silently: everything else is configured, the campaign is enabled, and impressions never begin.
- Add a billing profile and a payment method. Both are required before delivery, and both are separate objects — a billing profile with no payment method attached is a half-finished step that reads as done. Billing is per advertiser account, so an agency running several clients is establishing several independent billing relationships rather than one consolidated one.
- Invite your operators under Settings → Users. Invite people rather than sharing a login. This is also the step that resolves the one-email problem for everyone except the person who created the account, because invitation has no restriction attached to it.
How long does verification take?
Verification runs in a rolling queue with no published SLA, and the observed range runs from same-day to a couple of weeks. OpenAI is unable to expedite account or ad review. There is no priority lane, no partner escalation path, and no agency relationship that shortens it. Any agency that quotes you a verification turnaround is quoting you a number they do not control.
The practical consequence is that verification must not sit on the critical path of anything with a date attached to it. Do not book a launch against a product release, a funding announcement, a seasonal peak or a board meeting until the account has cleared. Where a date is genuinely fixed, start the account first and everything else second, because every other part of the build can be compressed and this one cannot.
The correct response to an indeterminate queue is to make the wait productive rather than idle. Measurement is the obvious candidate — the pixel install, the Conversions API path, the CSP directives and the event configuration all happen on your own infrastructure and need no advertiser account at all, and they are the longest-lead engineering dependency in the whole project. Context-hint research, landing-page work and creative production sit in the same category. A build sequenced properly finishes verification and launch on the same week; a build sequenced badly discovers on day one of an approved account that engineering has a two-sprint backlog.
Verification and account review are separate steps
Verification and account review are separate steps, and clearing the first does not mean you have cleared the second. Persona verifies that a real identity stands behind the application. Account review is a distinct assessment of the advertiser. Ad review is distinct again — OpenAI’s own non-delivery checklist ends with “ads have completed review”, after account verification and billing, after campaigns and ads are active rather than paused, and after the campaign date range includes today.
Treat that checklist as the order in which to diagnose an account that is serving nothing: verification and billing complete, campaign and ads enabled rather than paused, campaign dates including today, ads through review. Working it in order matters, because each stage produces the same visible symptom — zero impressions — and the interface does not volunteer which one you are sitting behind.
Why advertiser accounts get rejected
Three causes account for most rejections, and all three are avoidable before submission rather than after. They share a structure: something the reviewer can see does not match something else the reviewer can see, or a step that looked optional was mandatory.
| Rejection cause | What it looks like | How to avoid it |
|---|---|---|
| Missing industry classification | Onboarding submitted with the industry field skipped or left on a placeholder. The form accepts it, the application enters the queue, and it comes back rejected days later with the queue time already spent. | Complete every classification field before submitting, and pick the category that genuinely describes the revenue-generating activity rather than the one that sounds most flattering. Re-read the business details screen once before you submit — the cost of a missed field is a second trip through a queue with no SLA. |
| Business name inconsistent with the website | The legal entity submitted is “Northgate Holdings Ltd” and the website trades as “Northgate”, or the site’s footer, terms page and company registration disagree with each other. Illustrative names, not a client. | Make the submitted name, the name on your website’s legal pages and your registered entity name reconcile before you apply. Where a trading name legitimately differs from the registered entity, make sure the website itself states the relationship somewhere a reviewer will find it. |
| Incomplete Persona verification | The Persona flow was opened and abandoned — a document upload that timed out, a liveness check taken on a phone and never finished, a session closed mid-flow. The account looks submitted from the advertiser’s side and is incomplete from OpenAI’s. | Run Persona in one sitting, on a device with a working camera, with the identity document physically present. Confirm the flow reports completion rather than assuming a closed tab meant success. |
Account name and Logo are a delivery gate, not a profile
Ads will not serve unless Settings → Account info is complete with an Account name and a Logo. This is the single most common way a fully verified, fully funded, fully built account produces zero impressions and no error message. Nothing in the campaign builder warns you, nothing in the campaign row explains it, and the natural instinct on seeing zero impressions is to go and look at bids and context hints — which is where an operator can lose a week.
Set both during setup, before you build anything. If an account is live, enabled, in date and still serving nothing, check this screen before you touch a single bid.
The one-email constraint, and who it traps
An email address already used to create a ChatGPT Ads advertiser account cannot be used to create another one. The restriction applies only to creation. An existing user can be invited into as many advertiser accounts as needed and can switch between all of them from a single login, which means the constraint is far narrower than it first sounds — but it is absolute at the point where it applies, and it is discovered at exactly the wrong moment, when somebody sits down to create a second account and finds they cannot.
The structural fact underneath it is that there is no parent-child agency structure today. There is no manager account, no MCC equivalent, no hierarchy that owns a set of client accounts. Each advertiser needs its own account, with its own billing, and each client runs its own Persona verification. Access is granted horizontally through invitations rather than vertically through ownership.
Every advertiser account you will ever create needs a creation email nobody has used before. Plan the addresses before you need them, not after.
The working pattern is a plus-alias scheme on a domain you control: ads+client@youragency.com, one alias per advertiser account, all delivering to the same inbox. Most mail providers route plus-addressed mail to the base mailbox without any configuration, so the aliases cost nothing to operate and remain the agency’s property rather than an individual’s. A dedicated subaddress per account also gives you a clean audit trail of which mailbox created which account, which matters two years later when nobody remembers.
Four groups get trapped by this, and the trap is always the same shape — a first account created casually with a personal or default address, and a second one needed later:
- Agencies and consultants. The first client’s account gets created with the founder’s own work address because it was to hand. The second client arrives and that address is spent. Every subsequent account needs a new one, and the addresses were never designed as a system.
- Multi-brand and holding companies. One marketer sets up the group’s first brand, then needs a second account for a second brand — and, because country, currency and time zone are permanent, often needs separate accounts anyway for structural reasons rather than administrative ones.
- In-house teams who used a departing employee’s address. The address is consumed and the person has left. Access can be preserved by inviting others before the departure, but the creation credential itself is not recoverable by inviting anybody.
- Franchise and multi-location groups. Each location that needs its own billing needs its own account, and therefore its own creation address, its own Persona run and its own place in the queue.
Note what the constraint does not stop. It does not stop one person operating twenty accounts from one login. It does not stop a client owning their account outright while an agency operates it under invitation — which is the arrangement we use, because the account, the conversion history and the campaign learnings stay with the client whatever happens to the relationship. It only stops the same address creating twice.
What this means for your account
Decide three things before anyone opens ads.openai.com: which mailbox creates the account, who gets invited into it, and what happens to it if that person leaves. Then submit onboarding with every classification field populated and Persona finished in one sitting, and set Account name and Logo the same day rather than after the campaign is built. Verification will take whatever it takes, and the only thing you control is whether the rest of the project is finished when it clears.
The three settings you can never change
Country/region, billing currency and time zone are set once at ChatGPT Ads account creation and cannot be changed afterwards. There is no settings screen for them, no support ticket that reverses them and no migration tool. The remedy for getting one wrong is opening a new advertiser account and rebuilding on it — which means a new creation email, a fresh Persona verification, a fresh place in a queue with no SLA, and conversion configuration built again from nothing, because conversion events belong to the ad account that created them and do not travel between accounts.
Every other decision on this page is reversible at some price. These three are reversible only at the price of starting again. Ten minutes of deliberation at creation is the highest-return ten minutes in the entire build, and it is routinely spent clicking through defaults.
Time zone: the boundary every future reconciliation is drawn against
The account time zone defines what a day is, for the rest of the account’s life. Reporting boundaries are drawn in it, so “yesterday” in Ads Manager is a specific 24-hour block that may or may not correspond to yesterday in your analytics property, your order table or your finance system. Every date-range comparison you ever run against another system is a comparison across that boundary.
This matters more here than on channels where you can fix it later, because ad clicks and analytics sessions never reconcile perfectly anyway. Clicks measure ad interactions; sessions depend on page load, redirects, consent, browser blocking, UTM handling and attribution behaviour. The only way to make that reconciliation tractable is to remove every variable you can, and the date boundary is the one variable that is fully within your control at exactly one moment — account creation. Reconcile on the same date range and the same time zone, or do not bother reconciling.
Budget pacing is drawn on the same boundary. Since 27 July 2026 a daily budget is a seven-day average rather than a hard daily cap: spend can reach 2× the daily budget on a single day and 7× across seven days. Those are date-bounded rules, so a business whose finance team closes the day at a different hour than the ad account does will see spend land on either side of its own month-end in ways that look like errors and are not.
Choose the time zone your reporting stack already uses — the one your analytics property, your backend order table and your management reporting run on — rather than the one where the person creating the account happens to be sitting. A UK company with a US-based contractor setting up the account should be on the UK zone. Where those systems already disagree with each other, fix that first and then match the ad account to whichever wins.
Billing currency: the setting that sets your minimum daily budget
Billing currency determines the minimum daily budget you are permitted to set. There is no platform-wide minimum spend commitment — that went away with the self-serve launch on 5 May 2026 — but there is a per-currency floor on every daily budget, and budgets are set at campaign level.
| Billing currency | Minimum daily budget | Associated market |
|---|---|---|
| USD | $25 | United States |
| GBP | £15 | United Kingdom |
| CAD | 25 | Canada |
| AUD | 25 | Australia |
| NZD | 25 | New Zealand |
| BRL | 40 | Brazil |
| MXN | 150 | Mexico |
| JPY | 2,500 | Japan |
| KRW | 25,000 | South Korea |
| INR | 725 | India — published in the minimum-spend table but not yet listed as available |
The floor constrains structure, not just spend. Illustrative arithmetic: a USD account that wants six concurrent campaigns cannot run them for less than $150 a day, or roughly $4,500 a month, however small each individual test was meant to be. The same six campaigns on a GBP account floor at £90 a day. That is a real architectural constraint on how granular your campaign structure can be at low budgets, and it is a good argument for fewer, better-populated campaigns early on. Our guide to what ChatGPT Ads actually cost covers bid levels and budget sizing in detail.
Country/region: eligibility, and what you can target
The account’s country drives eligibility — whether you can advertise at all — and which markets you can target. As of September 2026 media can be bought in nine markets: the United States, United Kingdom, Canada, Australia, New Zealand, Japan, South Korea, Brazil and Mexico. A further 31 European countries have been announced. India appears in the published minimum-spend table at 725 INR but is not yet listed as available, which is a useful reminder that a currency appearing in a table is not the same thing as a market being open.
Country is also the setting most likely to be chosen by accident, because it is frequently pre-filled from wherever the browser is and looks like a formality. It is not a formality. It is the setting that determines whether the account you just spent two weeks getting verified is the right account at all.
Choosing correctly the first time
The table below is the one we work through with a client before anybody opens the account. It matters most for businesses operating across several markets, because that is the case where the defaults are almost always wrong and the cost of the mistake is a second account rather than an edit.
| Your situation | What to set | The failure this avoids |
|---|---|---|
| Single market, single entity, one reporting stack | Country and currency of the operating entity; the time zone your analytics and order data already use | The default case, and the one that goes wrong only when the person clicking through onboarding is in a different country from the business |
| Head office in one market, the audience you actually want in another | Decide from the market you intend to advertise into, and confirm eligibility for that market before creating anything | An account registered around the convenience of the finance team rather than around the media plan |
| Separate legal entities per market, each with its own P&L | One advertiser account per entity, each with its own creation email, billing profile and Persona run | A single account whose spend cannot be cleanly attributed to the entity that has to book it |
| One entity selling into several markets, reporting consolidated | The currency your management reporting is denominated in, so ad spend needs no FX translation before it reaches a report | Every performance figure arriving in a currency that has to be converted at a rate that moves, making month-on-month comparisons partly an FX artefact |
| Distributed team across several time zones | The time zone of the data, not of the people — match your analytics property and backend order table | Permanent low-grade disagreement between the platform’s day and everyone else’s, in an account where reconciliation is already hard |
| Agency or consultant setting up on a client’s behalf | The client’s country, the client’s currency, the client’s time zone — created on an alias you control, with the client invited as a user | An account permanently configured around the agency’s convenience, which the client is stuck with long after the agency is gone |
| Testing before committing, expecting to “set it up properly later” | There is no throwaway account — set it up properly now | Building conversion history on an account you intend to abandon, then discovering that events do not travel to the replacement |
If you have already got one of these wrong
You cannot change it, and no support ticket will change it either, so the only real question is whether the mistake is expensive enough to justify migrating. Migration means a new advertiser account: a fresh creation email, a fresh Persona verification, a fresh wait in the queue, a rebuilt billing profile, and conversion events configured again from scratch because events belong to the ad account that created them and do not move between accounts. Campaign history and accumulated learning do not come with you.
Weigh it honestly. A time zone one hour off from a business that reports in the same region is usually cheaper to document and live with than to migrate. A billing currency whose minimum daily budget prices you out of the campaign structure you need, or a country that is wrong outright, is not survivable and the migration should happen immediately — the longer you wait, the more conversion history you are choosing to abandon later rather than now.
Measurement before media
Measurement is built, tested and proven before a single campaign is enabled, because a ChatGPT Ads account that spends against broken measurement does not produce recoverable data — it produces a permanent hole. Correcting a conversion event configuration does not backfill. Conversions that were fired, accepted and forwarded while the configuration was wrong are never credited retrospectively, the platform record for that period stays empty, and the oCPC training signal that period should have generated never existed. Every day of spend ahead of working measurement is a day you buy twice: once in media and once in the decisions you make later on data you do not have.
Nothing launches until measurement passes. That is the rule the rest of this build is arranged around.
This is also the part of setup that most justifies paying somebody: the campaign builder is self-explanatory, the signal path is not, and its errors surface as a conversion column reading zero with no message anywhere in the interface. Our ChatGPT Ads conversion tracking guide covers the whole path end to end if you would rather implement it yourself, and conversion tracking implementation is a standalone project where the account already exists and only the measurement is missing.
Installing the pixel so it can be proven rather than assumed
The OpenAI Pixel is a single SDK loaded from https://bzrcdn.openai.com/sdk/oaiq.min.js, exposing one global function, oaiq. Initialization is oaiq("init", { pixelId: "<ID>" }) and every event is oaiq("measure", "<event>", <data>, <options>). Passing debug: true writes confirmation to the browser console, which is the only ground truth available at install time and the check most implementations skip.
The pixel does a useful amount automatically once running: it captures oppref from the landing URL, stores it in the first-party __oppref cookie, adds source_url, and timestamps and batches what it sends. What it cannot do is compensate for being absent from a converting template, initialized after the first measure call, or pointed at the wrong Pixel ID. Installation is therefore verified template by template — every page on which a conversion can complete, including post-payment redirects and thank-you pages behind a form — with a live test conversion fired on each and confirmed in the console rather than inferred from the page source. Where consent management is in play the sequence is oaiq("consent", false), then init, then oaiq("consent", true); an implementation that never reaches the third call measures only the visitors who were easiest to measure anyway.
The three CSP directives — miss one and the pixel transmits nothing
If your site sends a Content-Security-Policy header, the pixel needs all three of these, and a missing directive produces no visible error on the page and no warning inside Ads Manager:
script-src https://bzrcdn.openai.com— permits the SDK file to load. Miss this one andoaiqis simply undefined, which at least announces itself loudly in the console.connect-src https://bzr.openai.com— permits the browser to transmit the measured event.img-src https://bzr.openai.com— permits the image-tag transmission path.
A missing connect-src produces a pixel that is genuinely installed and transmits nothing. The SDK loads, init succeeds, measure appears to run, the console looks healthy, and no event ever reaches OpenAI. This is the classic cause of “the pixel is installed but no conversions appear”, and it is worth checking twice because security teams tighten CSP headers on their own schedule — it is a regression that arrives months after a working install, not only a launch-day risk. Confirm it with DevTools open on Console and Network: the violation appears as a blocked request to https://bzr.openai.com.
What about the tag manager?
There is no official OpenAI tag manager template. Community-built templates exist and some of them work, but they are maintained by their authors rather than by OpenAI, and their behaviour on a version bump is nobody’s contractual responsibility. That is the honest state of the tooling as of September 2026.
The pattern practitioners have converged on — and this is practitioner consensus, not an OpenAI rule — is to hardcode the SDK loader and the init call in the page head, and use the tag manager only for measure calls. The reasoning is failure isolation rather than purity. A container can be blocked, deferred behind consent, or bound to a trigger that misses a converting path, and tag managers do not guarantee execution order between tags unless you force them to — a container firing measure before init does not report the event. Hardcoding the two things that must always run first removes both risks and leaves the tag manager doing what it is genuinely good at: letting a marketer change event calls without a deployment. Whatever you choose, check for duplication, because a hard-coded snippet left from an earlier implementation running alongside a container-managed one rarely passes the same identifier — nothing deduplicates them, the count inflates, and the apparent cost per conversion deflates.
The Conversions API, and the five constraints that break integrations
The Conversions API is the server-side path: POST https://bzr.openai.com/v1/events?pid=<PIXEL-ID> with Bearer authentication. It is not an optional refinement. Ad blockers do not touch it, it is the only way to record a conversion that does not happen in a browser — a CRM-qualified lead, a phone-booked appointment, a subscription that activates after a trial — and it is more reliable than the pixel alone, which matters directly if you intend to run the Conversions objective.
- Use
validate_only: truewhile implementing. It exercises the endpoint without writing data. Left switched on in production it becomes its own silent failure: every call returns success, engineering signs it off, and nothing is ever recorded. - Up to 1,000 events per batch, and the entire batch fails if one event fails. One malformed record takes the other 999 with it. An integration that logs a batch-level result and moves on reports a clean run while losing a day of conversions, and the resulting gap has a hard edge at both ends rather than a taper — which is how you recognise it in a chart.
timestamp_msmust be within the last 7 days and no more than 10 minutes in the future. That rules out backfilling old history on a first sync, and it rules out any pipeline whose clock drifts ahead. A weekly CRM export sits on the boundary and drops events every week it runs late.- Money is in ISO 4217 minor units. $129.99 is sent as
12999— not129.99, not130. The platform reads whatever integer arrives as minor units, so an integration sending major units does not error. Illustrative arithmetic: a $129.99 order sent as130is recorded as $1.30, and a month of those produces revenue and ROAS figures that are internally consistent, plausibly formatted and about a hundredfold wrong. - You must pass
opprefyourself. It is not captured automatically server-side; it travels asobrefinside theuserobject, which means the server has to have received it from the browser in the first place — usually by reading the__opprefcookie at checkout and storing it against the order.
oppref: the identifier everything else depends on
oppref is OpenAI’s privacy-preserving click identifier. It is appended to your landing-page URL when someone interacts with your ad, the pixel captures it into a first-party cookie named __oppref, and it identifies an individual ad interaction. It is the mechanism by which a conversion is credited to an ad at all.
Stripping oppref at your edge — a redirect, a consent wall, a CDN rule — breaks conversion tracking entirely. Nothing about this looks like a tracking failure from the inside: the pixel loads, events fire, the debug console is clean, and analytics reports the traffic cheerfully. The conversions are recorded and simply cannot be attributed to any ad interaction, so Ads Manager stays at zero. The culprits are ordinary infrastructure decisions taken by people who have never heard of the parameter — a marketing redirect that rebuilds the destination without the query string, a link shortener or affiliate hop, a consent platform that bounces the visitor through its own domain, a CDN or WAF rule dropping unrecognised query parameters, or canonical-URL enforcement redirecting ?-bearing URLs to a clean version.
We test this before launch by appending a test parameter to the landing-page URL and loading it through the exact path a real click takes, consent interstitial included, watching the address bar after every redirect settles and then checking for __oppref under Application → Cookies. Present on the first request and absent on the last means the whole measurement build is decorative until the edge is fixed.
Deduplication: one identifier, chosen correctly
Running the pixel and the Conversions API together only works if the same conversion carries the same identifier in the pixel’s event_id and the API’s id; for custom events, custom_event_name must match on both sides as well. Get it right and the two paths reinforce each other, the API filling in what ad blocking ate. Get it wrong and you count everything twice.
- Right: the order or transaction ID. Generated once, identical on client and server, stable if the customer refreshes the confirmation page.
- Wrong: a timestamp. Browser and server will not agree to the millisecond, so no two events ever match.
- Wrong: a random value. Generated independently on each side, it guarantees a miss on every single event.
- Wrong: a session ID. Not unique per conversion, unavailable to a server processing an offline event, and it changes when the session does.
Double-counting is the more dangerous failure because nobody investigates a number that looks better than expected. Reconcile platform conversions against your own backend order count on the same date range and time zone in the first week; a persistent ratio near 2:1 is diagnostic on its own.
Automatic Advanced Matching is on unless you turn it off
Automatic Advanced Matching lives at Tools → Conversions → Data Source → Edit pixel, hashes supported form-entered customer information client-side in the browser with SHA-256, and is opt-out — taking no action means it is on. It is the default for new Web pixels, and OpenAI enabled it on existing Web pixels on 17 August 2026. Four properties of it matter at setup.
- The setting is per-pixel. A business with several properties, several regions or a separate app funnel has several pixels, each configured independently. Drift between them is normal and invisible.
- It is Web-pixel only. It does nothing for Conversions API events and nothing for the image tag, so an account assuming it provides server-side coverage has a gap it does not know about.
- Running manual advanced matching alongside it is the strongest configuration, because automatic matching only ever sees what a visitor types into a form on the page.
- Annotate 17 August 2026 in whatever you treat as a system of record, because an existing account whose reported conversions stepped up in the second half of that month has a measurement event in its history rather than a performance improvement.
There is a consent decision here that belongs to the client rather than to us, and we raise it at setup rather than leaving it for a privacy review to discover. A feature that hashes customer-entered information in the browser and transmits it to an advertising platform is a processing activity, it is on by default, and it is the client’s own privacy policy and consent model that have to account for it — not their agency’s. We document the per-pixel state, tell you it is on, and hand the question to the people qualified to answer it. The advanced matching guide covers the configuration and the traps in full.
Hashing discipline
Identity fields split into two categories and confusing them is the most common integration defect we see. Hash email addresses and external IDs with SHA-256, normalizing before you hash and outputting lowercase 64-character hex. Send country, city, ZIP, IP address and user-agent raw. Never send raw email addresses, raw phone numbers or raw customer IDs under any circumstance.
Two errors account for most degraded match rates, and both produce a payload that passes schema validation while matching nobody. Double-hashing: a value arriving already hashed from a warehouse, a CDP or a partner integration gets hashed again by the sending code, producing a valid 64-character string that corresponds to nothing. Uppercase hex: several standard library and database implementations emit uppercase by default, so the value is arithmetically correct and still does not match. Both are found by inspecting one real outgoing payload, which is worth more than reading the integration code, because the code frequently does not describe what the code does.
Then wait 24 to 48 hours before believing anything
Conversions are not reflected in Ads Manager immediately — allow 24 to 48 hours for attributed conversions to appear. Day-one reporting is noise. On a new account this is the single most common reason an operator concludes a correctly configured build is broken, pauses a campaign that was working, and destroys the delivery it had accumulated. Judge conversions on ranges ending at least two days back, mark the date whenever you change something and read the effect from two days after, and check whether a range you are comparing crosses the settle boundary before you explain any movement in it.
What gets installed, and what breaks without each piece
| What we install | Why it exists | What breaks without it |
|---|---|---|
The JS pixel, hardcoded loader and init in the page head |
Records in-browser conversions and captures oppref into the __oppref cookie automatically |
No browser-side measurement at all, and no automatic capture of the identifier the server-side path later needs |
| All three CSP directives | Permits the SDK to load and the event to transmit | With connect-src missing, a pixel that installs perfectly and transmits nothing, with no error anywhere |
| The Conversions API path | Records conversions that ad blockers eat or that never happen in a browser, and feeds oCPC a denser signal | Structural under-counting concentrated in technical audiences, and no way to record CRM or offline outcomes at all |
obref passed inside the API user object |
Server-side events cannot be tied to an ad interaction without it, because CAPI does not capture oppref automatically |
A well-engineered integration sending OpenAI events it cannot attribute to any ad |
oppref preserved across every redirect, consent wall and CDN rule |
It is how OpenAI credits a conversion to an ad | Attribution fails entirely while every other signal looks healthy — Ads Manager reads zero, analytics reports the traffic |
A shared deduplication identifier — order or transaction ID on both event_id and id |
Lets the pixel and the API describe the same conversion once | Double-counted conversions, deflated cost per conversion, and oCPC bidding toward an outcome happening half as often as reported |
| Correct hashing — SHA-256 lowercase hex, normalize then hash, raw geo and user-agent | Lets OpenAI match identity without ever receiving raw personal data | Payloads that validate cleanly and match nobody, usually from double-hashing or uppercase hex |
| A documented Automatic Advanced Matching state per pixel | The setting is opt-out and per-pixel, and it changed on existing Web pixels on 17 August 2026 | Unexplained step changes in reported volume, silent drift between pixels, and a privacy question nobody has been asked |
A live test conversion on every converting template, fired with debug: true |
Turns “it should work” into evidence, per template, before spend | Partial coverage discovered weeks later, with the missing period unrecoverable because corrections do not backfill |
What this means for your account
Build measurement first and prove each hop rather than assuming it, because every defect in this section is invisible from inside Ads Manager and none of them are retroactively fixable. If a launch date is pressing, the honest sequence is still measurement first — a campaign launched on unproven tracking is not an earlier launch, it is the same launch with its first weeks of data thrown away. The one exception worth naming: if your measurement genuinely cannot be built for months because engineering has no capacity, say so now and delay the account rather than spending against a signal path nobody has tested.
Choosing and configuring the conversion event
The conversion event is the one genuinely commercial decision inside an otherwise technical setup: it is the outcome you are instructing OpenAI to spend your money producing, and it has to satisfy two conditions at the same time. It must correlate with revenue, and it must occur often enough that a bid strategy can learn anything from it. Those two conditions pull in opposite directions in almost every account, and the event you end up choosing is the highest point on the curve where both still hold.
At setup this choice is free. You make it once, before any spend, and the only cost is the hour it takes to work through the logic honestly. In a live account the same decision costs a rebuild, because the conversion event on a Conversions campaign is bound to a campaign whose objective was locked the moment it was created. This is the section of the build where the sequencing matters most: choose the event, configure it to match character for character, verify it with a live test, and only then create the campaign that points at it.
How do you choose the right conversion event?
Apply two tests in order, and refuse to skip the first one. The revenue test: if this event doubled next month and nothing else changed, would the business be meaningfully better off? The volume test: will this event occur at least fifteen to twenty times a week at your intended budget? An event that fails the revenue test optimizes you toward cheap noise. An event that fails the volume test gives an automated bid strategy nothing to fit against, so it will not beat a hand-set bid and will convince you the channel does not work.
Most accounts fail the volume test rather than the revenue test. The honest response is not to invent a softer event and call it the outcome, but to pick the nearest upstream event that genuinely predicts it, run on Manual: Max bid until volume supports something better, and keep measuring the real outcome in your own backend. The table below is the selection logic we apply during a build.
| Business model | Event that tracks revenue | Higher-volume substitute when the revenue event is thin | The trap in this category |
|---|---|---|---|
| Ecommerce and retail | order_created — the completed purchase, with the order value attached |
checkout_started, which typically runs several times the volume of purchases and sits close enough to intent to be a defensible goal |
Dropping all the way to items_added or contents_viewed because it produces a bigger number. Cart adds are abundant and weakly related to revenue, and optimizing toward them buys browsing. |
| Lead generation and services | lead_created for form-completed enquiries; appointment_scheduled where the funnel runs on a calendar |
There usually is not one. If enquiries are below the volume floor, the answer is Manual: Max bid rather than a softer event. | Optimizing toward raw form fills when only a minority of them are qualified. You will get more of exactly the leads your sales team already ignores, faster and at scale. |
| Subscription and SaaS | subscription_created — the paid conversion, which is the only event tied to money |
trial_started or registration_completed, both of which run at multiples of paid volume and arrive within the same session far more often |
Optimizing toward trials when trial-to-paid varies sharply by acquisition source. The channel will find you cheap trials from the cohort that converts worst. |
| Mobile apps | app_installed for acquisition, app_opened for activation |
A web-side registration_completed where the funnel starts on the site |
Counting installs as the outcome when the business runs on retained users. Installs are the cheapest thing any channel can find you. |
Whatever the model, the event you optimize toward and the events you measure need not be the same set: configure several, report on all of them, point the campaign at one. And if you launch on the substitute rather than the revenue event, write the volume threshold at which you intend to switch into the handover document, so the move is a plan rather than something everyone forgets.
The 13 standard events and their four data shapes
OpenAI supports 13 standard events across four data shapes, and the shape determines what payload the event is expected to carry. Getting the shape right at implementation time is what makes the value, currency and contents fields land where reporting can read them, so choose the event that honestly describes the action rather than the one that reads best in a slide.
| Event | Data shape | What it should represent |
|---|---|---|
order_created | contents | A completed purchase, carrying the order value |
checkout_started | contents | Checkout entered |
items_added | contents | Items added to a cart or basket |
contents_viewed | contents | A product or content detail view |
page_viewed | contents | A page view. Useful as a diagnostic, almost never a serious optimization goal |
lead_created | customer_action | A form-completed enquiry |
registration_completed | customer_action | An account or profile created |
appointment_scheduled | customer_action | A booking, demo or call scheduled |
app_installed | customer_action | An app install |
app_opened | customer_action | An app open |
trial_started | plan_enrollment | A trial begun |
subscription_created | plan_enrollment | A paid subscription started |
custom | custom | Anything the twelve above do not describe. Not eligible as an oCPC goal. |
Why custom cannot be the goal, and what to do instead
custom is not eligible as an oCPC goal. Plenty of real business outcomes are not on the standard list — an enquiry that clears a lead-scoring threshold, a configurator completed, a sample requested, a quote accepted — and you should absolutely measure those as custom events. You simply cannot point a Conversions campaign at one, and discovering that at campaign-creation time, after the tracking work is finished, is the most common sequencing mistake in a self-serve build.
The fix is to fire a standard event alongside the custom one, at the same moment in the same code path, choosing whichever standard event most honestly describes what happened — usually lead_created for enquiry-shaped outcomes and appointment_scheduled for booking-shaped ones. The custom event carries the reporting nuance you actually care about; the standard event carries the bidding signal the auction needs. Both must deduplicate correctly against their server-side counterparts, and for the custom event that means custom_event_name matching on both sides as well as the shared identifier.
What does exact match mean, and why does it have to be right before launch?
A conversion event can fire correctly, be accepted by OpenAI, be forwarded successfully and still report zero, because reporting matches on the underlying type and name rather than on anything a human reads. For standard events the event type configured in Ads Manager must match the event type you send. A site sending checkout_started to a campaign counting order_created returns zero, not an approximation. For custom events Ads Manager must be set to Event type: Custom and the name must match exactly — character for character, including case and separator style, so that quote_requested and Quote-Requested are two unrelated events.
A matching display name is not enough. Ads Manager lets you attach a human-readable label to a conversion event, and a label reading “Quote Requested” sitting on a mismatched type or an off-by-one name string looks correct to everyone who reviews the account and matches nothing at all. Screenshots of the conversion setup prove nothing. The type and the name string are the only evidence.
Corrections do not backfill. Every conversion recorded while the configuration was wrong is gone from the platform permanently, and so is the oCPC learning it would have contributed.
That asymmetry is the whole argument for doing this work before spend. A misconfigured event in a live account costs you the platform’s record of a period you have already paid for, and costs the bid strategy its training signal at the moment it should be learning fastest. Caught during setup, the same fault costs a five-minute edit. Verification is cheap: fire one live test conversion with debug: true, confirm it arrives, then read the configured event in Ads Manager against the string in your own code rather than against your memory of it.
Custom event naming rules
Custom event names take 1 to 64 characters, alphanumerics plus underscore and dash, starting and ending on an alphanumeric. Pick one separator convention and one case convention for the whole account before you write the first event, because the platform will accept quote_requested, quote-requested and quoteRequested as three distinct events and only tell you they were different when the numbers come back split.
The four gates an account must clear before oCPC will run
The Conversions objective has four prerequisites, and all four are worth clearing before you build the campaign rather than while you are building it. Three of them fail quietly. The fourth fails with an error string most advertisers never see because it is returned to the API rather than surfaced in the interface.
- Conversion tracking is live. Pixel, Conversions API, or both. The API is more reliable than the pixel alone, and where the outcome completes off-site or in a CRM it is the only way to close the loop at all.
- At least one standard event exists. Custom events are not supported as an oCPC goal, so an account whose only configured event is custom cannot run a Conversions campaign, no matter how well that event is implemented.
- The event belongs to this ad account, with an active conversion source. Events do not travel between accounts. If a migration is in your future for any reason, the event configuration has to be rebuilt on the far side, and it is worth knowing that before you invest in the near side.
- The account is enabled for conversion bidding. Otherwise you get 403
Conversion bidding is not enabled. That string is the whole diagnosis — it is an account-level entitlement, not a configuration mistake, and no amount of re-checking your pixel will move it.
None of the four is relaxed by cloning. An existing Clicks campaign can be cloned into a new Conversions campaign, and the clone prefills the conversion event when exactly one eligible event is available, but a clone into an account that fails gate four produces a 403 rather than a campaign. The mechanics are covered in full in our guide to running ChatGPT Ads conversion campaigns on oCPC.
How much conversion volume does the event actually need?
Below roughly 15 to 20 conversions a week, an ad group should stay on Manual: Max bid. That threshold is what turns event selection and bid strategy into a single decision rather than two: the event you choose sets the weekly conversion count, the weekly conversion count decides whether automated bidding has anything to fit against, and there is no configuration that lets a bid strategy learn from four conversions a week.
Illustrative arithmetic — these figures are invented to show the shape of the problem, not drawn from any account. Suppose a $4.00 average CPC and a 3% landing-page conversion rate. Fifteen conversions a week requires about 500 clicks, which is roughly $2,000 a week or about $8,700 a month in media against a single ad group. At a 6% landing-page conversion rate the same threshold costs about $4,350 a month. Switching from a purchase event to a checkout-start event lowers it again, because the event is more frequent at the same traffic.
Run that calculation with your own assumptions before committing to an event. It tells you whether your budget can support automated bidding at all, how many ad groups that budget can be divided into — the arithmetic in the architecture section below — and whether the honest recommendation for month one is Manual: Max bid on a single ad group. It frequently is, and saying so is not pessimism; it is the difference between a launch that produces readable evidence and one that produces a scatter.
What this means for your build
Pick the event that tracks revenue if your volume supports it and the nearest honest upstream event if it does not, configure it so the type and name match your code character for character, verify it with a live test before the first campaign exists, and confirm all four oCPC gates rather than assuming them. This is the only point in the build where getting the conversion event right costs nothing, because corrections never backfill and the objective that consumes the event is locked the moment the campaign is created.
URL parameters, macros and analytics continuity
URL parameters are how a click inside Ads Manager becomes a row you can recognise in your own analytics, and ChatGPT Ads supports exactly four macros for the purpose: {campaign_id}, {ad_group_id}, {ad_id} and {ad_account_id}. They are substituted at delivery time, so what leaves the platform is a literal identifier appended to your landing-page URL, and what arrives in your analytics is a value you can group and filter on. There are four macros and only four — there is no keyword macro, no placement macro, no creative-name macro, and no way to pass a value the platform does not already hold.
oppref is how OpenAI credits a conversion to an ad; macros are how you credit a customer to an ad group.
That distinction decides how much of this work you can safely skip, which is none of it. oppref is appended by OpenAI and consumed by OpenAI — it makes the platform’s own conversion column work and it tells you nothing inside your analytics stack. Macros are appended by you and consumed by you. If you never set them, Ads Manager will still report perfectly well and your analytics will show a lump of traffic it cannot break down, which is exactly the situation in which a finance team asks which ad group produced a customer and nobody can answer.
| Macro | Resolves to | Suggested parameter key | What it lets you answer |
|---|---|---|---|
{campaign_id} | The campaign’s numeric identifier | ch_campaign | Which campaign a session, signup or order came from |
{ad_group_id} | The ad group’s numeric identifier | ch_adgroup | Which intent and which hint set produced the outcome — the most valuable of the four |
{ad_id} | The ad’s numeric identifier | ch_ad | Which creative produced the outcome, in the absence of an A/B testing primitive |
{ad_account_id} | The advertiser account’s numeric identifier | ch_account | Which account the traffic came from, where one property is served by several accounts |
Where are landing-page query parameters actually set?
The control is in the three-dot menu, not the creation flow
Landing-page query parameters are set from the three-dot menu on a campaign, ad group or ad, not from the campaign creation flow. This is genuinely hard to find, and it is the single most common reason an otherwise careful self-serve build launches with no macros on it at all: the operator walks the creation wizard end to end, never sees a field for parameters, and reasonably concludes the platform does not support them. Create the campaign first, then go back through the three-dot menu on each level and set the parameters. Our Ads Manager setup walkthrough shows where the menu sits at each level.
Parameters can be set at four points, and precedence runs most specific first: Ad URL → Ad → Ad Group → Campaign. A parameter string written directly into the ad’s landing page URL beats one set at ad level, which beats one set at ad group level, which beats one set at campaign level. The practical consequence at setup is that you should write the full template once at campaign level and let it inherit downward, then override only where a specific ad genuinely needs different values. Setting the same string at all four levels is not belt and braces — it is four places to forget to update when the scheme changes, and only one of them will win.
The rules that decide whether a macro resolves
- Namespace your keys. Use a short prefix such as
ch_on every key you add, so your parameters never collide with a key your CMS, consent tool, affiliate platform or A/B testing script already uses. - Do not URL-encode the braces.
%7Bcampaign_id%7Dis not a macro. It arrives at your landing page as the literal string%7Bcampaign_id%7D, which is a value, not an identifier. Tag managers and URL builders that helpfully encode everything are the usual culprit, which is why you paste macros into the field by hand and read the result back. - Macros go in values, never in keys.
ch_adgroup={ad_group_id}works.{ad_group_id}=1does not. - Append with
&. Your landing page URL frequently already carries a query string. Joining with a second?produces a URL where everything after the second question mark is part of a value. - Never put a macro in the path or the fragment. Macros are substituted into query-string values. A macro in
/landing/{campaign_id}/or after a#does not resolve, and a path-based one usually produces a 404 that looks like a landing-page fault rather than a parameter fault.
Why you build the ID-to-name mapping table at setup, not later
Macros return IDs, not names. Your analytics will show ch_adgroup=48213907, never ch_adgroup=ready-to-act-demo-us, and no amount of configuration changes that. Every account therefore needs a mapping table from each identifier back to something a human recognises, and building it during setup takes a few minutes because you are creating the entities as you go.
Reconstructing it later is materially harder. Names are not unique across the account — ad group names are only unique within a campaign, and ad names only within an ad group — so the name alone is not a key, and a scheme that reuses labels across campaigns produces a mapping table with genuine ambiguity in it. Renamed entities keep their old IDs while your historical records keep the old names. Deleted entities leave IDs in your analytics that resolve to nothing at all. Build the table on day one, keep it in the same document as the account credentials and the pixel ID, and refresh it from the three-dot menu → Export whenever the structure changes.
A template you can paste
The scheme below carries a stable analytics label in the UTM fields and machine-readable identifiers in the namespaced fields. The UTMs are what your analytics tool groups on by default; the IDs are what you join on when the two systems disagree.
?utm_source=chatgpt&utm_medium=cpc&utm_campaign=YOUR-CAMPAIGN-LABEL&ch_campaign={campaign_id}&ch_adgroup={ad_group_id}&ch_ad={ad_id}&ch_account={ad_account_id}
Keep utm_source=chatgpt and utm_medium=cpc fixed for the life of the account, because changing either mid-flight splits your historical reporting in two. Vary utm_campaign only when the campaign genuinely changes. Our free UTM builder for paid ads assembles the string and encodes the human-readable parts without touching the braces, and the full guide to ChatGPT Ads URL parameters and macros covers the edge cases — existing query strings, consent-gated redirects and single-page-app routing among them.
Why your click count will never match your session count
Ad clicks and analytics sessions measure different things and will not reconcile exactly, and setting the expectation before launch prevents a week of wasted investigation in month one. A click is an ad interaction. A session requires a page to load and be counted, which depends on redirects, consent screens, browser blocking, how your analytics tool handles UTM parameters, and the time zone each system reports in. When the two disagree, compare them on the same date range in the same time zone and check campaign- and ad-level activity in the CSV export before assuming anything is broken.
Do not strip parameters at the edge
A redirect, a consent wall or a CDN rule that rewrites incoming URLs will drop your macros, and the same rule will usually drop oppref with them. Stripping oppref breaks conversion tracking entirely — not partially. Test the live click path through every redirect and consent screen that a real user meets, and confirm both your ch_ parameters and the __oppref cookie survive it.
Campaign and ad group architecture
ChatGPT Ads has a three-level hierarchy — campaign, ad group, ad — and each level owns a different set of controls, so architecture is not an organizational preference but a decision about which settings you will be able to change later. Budget, geography, platforms and the conversion event live at campaign level. Context hints and bid strategy live at ad group level. Creative and the landing page live at ad level. Building the wrong shape means the settings you most want to iterate on are trapped inside containers you cannot edit.
| Level | What is set here | Notes for the build |
|---|---|---|
| Campaign | Title, objective, conversion event (Conversions campaigns), budget, start and end dates, countries, platforms, custom-audience inclusions and exclusions | The objective is permanent. Platforms are a multi-select across iOS App, Android App and Web, where Web covers desktop and mobile web. Geography is country-level everywhere, with state, DMA and ZIP additionally available in the US. |
| Ad group | Context hints, bid strategy (Maximize results or Manual: Max bid), and the ads themselves | This is the only unit at which the channel can actually be steered, which is why ad group count is the most consequential structural choice after the objective. |
| Ad | Title, copy, image, landing page URL, ad-level landing-page query parameters | Three of the four auction relevance inputs sit here or at ad group level — context hints, landing page, ad title and ad copy. The image is explicitly not a relevance input. |
Why the objective is the highest-stakes decision in the entire build
The campaign objective is locked permanently at creation, and an existing Reach (CPM) or Clicks (CPC) campaign cannot be converted to Conversions (oCPC). There is no separate bid-strategy dropdown at campaign level, because in ChatGPT Ads the objective is the bidding model: it decides what the auction optimizes toward, what you are billed for, and what every number in the reporting table means. It is a dropdown you touch once, in the first two minutes of building a campaign, and cannot touch again.
Building on the wrong objective is therefore not a mistake you correct; it is a campaign you rebuild, losing whatever the original had accumulated. Since August 2026 there is a supported path — an existing CPC campaign can be cloned into a new oCPC campaign, with the original left running until you pause it — but a clone is still a new campaign, and it relaxes none of the four oCPC gates covered in the conversion event section above. This is the argument for finishing measurement before you create anything: the objective you can afford to choose depends entirely on whether your conversion event is live, standard, attached to this ad account, and enabled for conversion bidding. Choose the objective on the day you have all four, not before. The trade-offs between the three objectives are covered under objective, bid strategy and budget at launch.
One ad group, one intent
An ad group holds exactly one intent, because the ad group is where context hints live and hints are a description of the conversations where your offer is relevant. Two intents inside one ad group produce a hint set that describes neither of them well, and the auction scores relevance from the hints, landing page, title and copy together — so a blurred ad group is a directly weaker bid, not merely an untidy one.
The legitimate reason to split is a genuine difference in intent, not a difference in vocabulary. The four-stage architecture we build against is problem-aware, researching options, comparing a shortlist and ready to act. A person at each of those stages needs a different landing page and a different ad, which is what earns a separate ad group. Two ad groups that would send a buyer to the same page with the same offer are not two intents; they are one intent written twice, and they will divide your budget without dividing your audience.
How many ad groups should you launch with?
Launch with the largest number of ad groups your budget can keep above the learning threshold, and in most first builds that number is two or three. Every split is free to make in the interface and none of them creates additional demand: the same campaign budget simply arrives in thinner slices, and thin slices are what starve a bid strategy of the conversion density it needs.
Illustrative arithmetic. The figures below are invented to show the shape of the problem and are not drawn from any client account. Take a campaign on an $8,000 monthly budget — roughly $1,850 a week — at a $4.00 average CPC and a 3.5% landing-page conversion rate. That is about 462 clicks and roughly 16 conversions a week for the whole campaign. Now divide it.
| Ad groups sharing the budget | Weekly spend each | Clicks each per week | Conversions each per week | What a bid strategy can read from that |
|---|---|---|---|---|
| 1 | $1,850 | 462 | ~16.2 | Just inside the 15–20 weekly conversions where automated bidding becomes viable |
| 2 | $925 | 231 | ~8.1 | Below the threshold. Weekly totals swing on two or three conversions |
| 3 | $617 | 154 | ~5.4 | Below the threshold. One good day looks like a trend |
| 4 | $463 | 116 | ~4.1 | Below the threshold. Week-on-week comparisons are noise |
| 6 | $308 | 77 | ~2.7 | Roughly one conversion every two to three days per ad group |
| 8 | $231 | 58 | ~2.0 | Most ad groups post zero conversions in most weeks |
Read the first row carefully, because it is the one that changes what you should build. At $8,000 a month on those assumptions, the campaign undivided sits at the density floor rather than comfortably above it. Segmentation at that spend is not free organization; it is a decision to give up ad-group-level learning in exchange for tidier reporting. Two honest structures follow from that. Either launch two or three ad groups and accept Manual: Max bid on all of them, reading results at campaign level for the first month — or launch one ad group on the strongest intent, let it reach the threshold, and add the second only once the first is producing readable weekly numbers. Both are defensible. Launching eight ad groups because you have eight ideas is not.
A naming scheme that survives the macro mapping table
Ad group names must be unique within a campaign, and ad names must be unique within an ad group. That is the platform’s only constraint, and it is weaker than it looks: the same ad group name can legitimately exist in three different campaigns, which means the name by itself is not a key. Your ID-to-name mapping table from the URL parameters section is only as reliable as the names you put in it, so the scheme has to be unique account-wide even though the platform does not require it.
The scheme we build to encodes the things you will actually want to filter on, in a fixed order, with a single separator:
- Campaign:
objective-offer-market-YYYY-MM— for exampleocpc-demo-us-2026-09. Putting the objective in the name means nobody ever has to open a campaign to find out whether it can be optimized toward conversions. - Ad group:
stage-offer-market— for exampleready-demo-us,comparing-demo-us. The stage is one of the four intent stages, so the name states the intent the hint set is meant to describe. - Ad:
format-angle-vN— for examplecard-price-anchor-v1. The version suffix increments rather than being reused, so a retired ad’s ID never maps onto a live ad’s name.
Two habits keep the table honest for years. Never reuse a name after deleting the entity that held it, because the old ID persists in your analytics history and will collide. Never rename an entity mid-flight without recording the date, because the ID stays constant while your reporting label changes underneath it, and a year-on-year comparison built on names will silently mix two things.
The structural details that decide whether anything serves
For an ad to serve, the ad and both of its parents must be enabled. A paused ad group full of enabled ads shows enabled ads in the ad view and delivers nothing, and because the ad-level status column reads correctly, the fault is easy to look straight past on launch day. Walk the full three-level status chain rather than trusting any single view, and walk it again after any bulk change.
Two launch mechanics catch people building at scale. Campaigns created through the API launch paused, which is a safety feature rather than a fault — but it means an API-built account that looks complete is not live until somebody enables it, and the sequence of enabling campaign, ad group and ad has to be completed in full. Separately, bulk upload exists and is the fastest way to create a large account, but if validation fails on a single row the platform usually rejects the entire upload. One malformed context-hint cell or one ad row pointing at a parent_ad_group whose spelling drifted takes the whole file down with it. Build the file, upload a two-row version first to confirm the column shape is accepted, then upload the rest.
What this means for your build
Two architecture decisions cannot be undone: the campaign objective, which is locked permanently at creation, and the number of ad groups you can afford to keep above the learning threshold, which is set by your budget rather than by your ambition. Everything else at this level — names, statuses, hint sets, creative — is editable, and the correct instinct at launch is fewer ad groups than feels natural. You can always split a working ad group. You cannot recut a campaign’s objective, and you cannot manufacture the conversion volume that segmentation gave away.
The first context-hint set
The first context-hint set is written from customer language rather than from keyword research, because ChatGPT Ads gives you no research surface to work from. Context hints are set at ad group level in a bare multi-line text box: there is no autocomplete, no suggestion engine, no volume estimator and no competitor research view. There is no keyword planner because there are no keywords. Everything that would normally happen in a planning tool before a Google Ads launch has to happen instead in your own sales calls, support tickets and reviews, and that is the substitution most first-time advertisers do not make.
OpenAI’s own definition sets the ceiling on what hints can do, and it is more modest than most advertisers assume. At the ad group level, advertisers can provide context hints that describe the conversations, topics, or keywords where their products or services may be relevant; these hints help guide ad matching, but they are not exact-match keywords and do not guarantee delivery in specific conversations. The in-product string says the same thing in fewer words — hints “guide matching but aren’t exact-match targeting rules.” Build the launch plan on that sentence and you will not be surprised in week one. Our cornerstone guide to context hints covers the mechanism in full.
Hold onto the second half of that quote in particular, because it changes what a launch is for. A hint set is not an instruction the platform executes. It is a description the matcher weighs, and delivery against any specific conversation is never promised. That is why the first hint set is written to be readable and revisable rather than complete, and why we treat the launch set as the first draft of a control rather than as a configuration to be finished and left alone.
Where do the hints come from when the account has no data?
At setup you have no impressions, no clicks and no conversions, so the raw material for hints is the language your customers already use about their problem. The rule that does most of the work: write the words the customer uses, not the words the company uses. Companies describe categories, features and market segments. Customers describe a situation they are stuck in. The matcher is reading conversations, and conversations sound like the second thing.
- Recorded sales calls. Take the last twenty and write down, verbatim, the sentence each prospect used in the first two minutes to explain why they got in touch. Those sentences are the closest thing to a conversation transcript you will ever own, and they are frequently the first draft of five hints.
- Support tickets and pre-sales email. Pre-purchase questions are the objections that block the decision, and objections are intents. A recurring “does this work with…” question describes a comparing-shortlist moment more precisely than any persona document.
- Reviews, including the bad ones. Reviews say what the customer was trying to achieve and what they were worried about beforehand. Three-star reviews are the most useful, because they name the constraint the product only partly solved.
- Your own search console and on-site search. Not for keywords — for the framing. The phrasing people use when they are typing to a machine is thinner than the phrasing they use in a conversation, but it tells you which problem they lead with.
- The people who answer the phone. Ask whoever handles inbound what the three most common opening lines are. They will know, and nobody has ever written it down.
This is a research task, not a copywriting task, and it is the part of setup that most reliably separates an account that delivers in week one from one that does not. Our guide to writing context hints that actually match conversations works through the drafting itself line by line, and the context hint generator will turn a description of your business into a first draft set you can then cut down against the material above. Use the generator for coverage and the transcripts for wording; a generated hint that does not sound like something a customer said should be rewritten before it launches.
What does a launch-ready hint actually look like?
A launch-ready hint is a described scenario: a person, the decision they are in the middle of, and the constraint they are deciding under. The framework we write against is Audience — Intent — Topic, and a good hint carries all three inside one sentence. It is not a keyword, because a keyword has no person in it. It is not a persona, because a persona has no decision in it. A persona is permanently true of somebody and therefore never distinguishes one moment from another; a hint has to describe a moment.
The rewrites below are the pattern to copy. Each weak version is a category of first draft we see constantly at setup; the wording is illustrative rather than lifted from any account.
| Business | Weak first draft | Stronger version | What changed |
|---|---|---|---|
| Wedding photographer | wedding photography | A couple who have booked a venue for next autumn and are working out how much of the budget a photographer should take, after quotes that ranged from $1,200 to $6,000. | A two-word noun phrase is a keyword: no person, no decision, no constraint. The rewrite supplies a timeline and the specific confusion — price spread — that the conversation is actually about. |
| Commercial cleaning | office cleaning services near me | An office manager whose cleaning contractor has been skipping evenings, deciding whether to raise it formally or replace them before the lease renewal. | Strips search syntax — the “near me” construction is written for a search box, not a conversation — and replaces it with the trigger event and the choice in play. |
| HVAC contractor | Our technicians are certified, available 24/7, and every install carries a five-year parts warranty. | A homeowner whose air conditioning stopped cooling during a heatwave, working out whether a fourteen-year-old unit is worth repairing or should be replaced. | The original describes the seller. It is good ad copy and a bad hint. Hints describe the moment the product gets considered, and nobody considers a warranty until they have decided to buy something. |
| Language-learning app | Adults aged 25–45 interested in learning Spanish. | Someone relocating to Madrid in four months who reads Spanish reasonably well and freezes in live conversation. | Converts a demographic into a situation. There is no age or gender targeting on this platform anyway, so a demographic sentence spends a hint slot on a control that does not exist. |
| Recruitment agency | recruitment, staffing, talent acquisition, headhunting, executive search | A founder who has had a senior engineering role open for three months and is deciding whether to keep interviewing directly or hand it to an external recruiter. | A comma-separated synonym list is a keyword list in a sentence’s clothing. With no match types, stacking near-synonyms buys nothing and burns slots that could hold distinct scenarios. |
| Pet insurance | People who love their pets. | Someone who has just paid a $2,300 emergency vet bill for a four-year-old dog and is finding out what insurance would and would not have covered. | A permanent preference is always true and therefore never distinguishing. The rewrite attaches a trigger event, which is what turns a preference into a conversation that is happening now. |
| Ergonomic furniture store | Remote software engineers in Austin with back pain wanting a bamboo standing desk under $600 delivered within two weeks. | Someone setting up a home office properly for the first time, weighing a standing desk against a better chair on a fixed budget. | The original stacks five qualifiers and describes a person who exists about twice a month. Loosening geography, material, price band and deadline keeps the decision intact and leaves a population to match against. |
| Third-party fulfilment | third-party logistics provider for e-commerce brands | An e-commerce operator shipping roughly 800 orders a month out of a garage who has just missed a peak-season deadline and is pricing up outsourced fulfilment. | A category label describes the seller’s market. The rewrite names the scale, the failure that prompted the search, and the stage of the decision — three things a matcher can recognize in a conversation. |
How many hints should a new ad group launch with?
Five to fifteen hints per ad group is the working range, and a new ad group should launch at the bottom of it. Write about five, publish, and watch impressions for five to seven days before adding more. The reason is diagnostic rather than cautious: if you launch fifteen hints at once and the ad group underdelivers, you have no way to tell which direction to move in, and no per-hint data exists anywhere in the platform to tell you. Starting at five and adding in small batches means every subsequent change has a before and an after.
The count matters less than the discipline behind it. Fifteen hints describing one intent is a well-covered ad group; five hints describing five intents is a broken one that will compete with itself for the rest of its life. This is why the hint set and the ad group architecture are decided in the same sitting rather than one after the other — one ad group, one intent, and the hint set is what enforces it.
There are no match types and no negative-keyword list
Nothing in ChatGPT Ads corresponds to broad, phrase or exact match, and there is no negative-keyword list to exclude conversations you do not want. Negative hints are expected to arrive later; they do not exist today. When an ad group starts drawing the wrong traffic, the two available remedies are a tighter hint or a campaign-level custom-audience exclusion — and the second is rarely available at launch, because a custom audience needs a minimum of 25,000 matched users to build, with OpenAI recommending 100,000 or more. For a first ChatGPT Ads campaign, the tighter hint is usually the only lever you actually have. Write the launch set assuming that.
Why hint quality is a price lever, not just a reach lever
The ChatGPT Ads auction is a relevance-weighted second price: entries are ranked on bid multiplied by relevance and the winner pays one increment above the second-place effective bid. Relevance is computed from four inputs — context hints, the landing page, the ad title and the ad copy. The image is explicitly not an input. OpenAI’s own worked example shows the size of the effect: a $2.50 bid at 0.9 relevance beats a $4.00 bid at 0.4.
Read that back with a setup hat on. One quarter of the relevance calculation is a text box you can rewrite in ninety seconds without touching a page, re-running ad review, or asking a developer for anything. Nothing else in the account returns as much for as little work. A weak launch hint set is not a slow start you catch up on later — it is a surcharge applied to every click the account buys until somebody rewrites it, and the mechanics of that surcharge are set out in our breakdown of what ChatGPT Ads actually cost.
What this means for your launch
Write five hints per ad group from recorded customer language, publish, and read impressions over five to seven days before touching anything. Each hint should name a person, a decision and a constraint. Expect to rewrite the set twice in the first month — that is the intended workflow, not a sign the launch went wrong, because hint sets are the only steering control this channel gives you and they cannot be researched into correctness in advance.
The first creative set
A ChatGPT ad is a single sponsored card carrying a title, roughly 150 characters of total copy, an image and a landing page URL, which makes launch creative a compression exercise rather than a design exercise. The whole unit is shorter than the paragraph you are reading. Field-by-field limits belong in one place rather than repeated across pages, because the published numbers currently disagree with each other; our guide to ChatGPT Ads creative carries the field breakdown and what the composer actually shows. Write to the total and you will not build a set that has to be rewritten at upload.
The single most counter-intuitive fact about creative on this platform deserves stating plainly at setup, because it changes what you commission before launch: the ad title and the ad copy are two of the four auction relevance inputs, and the image is explicitly not one of them. Two of the four levers that determine your effective bid are the sixty or so words a copywriter can produce in an afternoon. None of them is the asset that takes a week to shoot. Accounts that arrive at launch with a beautiful image library and three placeholder headlines have spent their pre-launch budget on the one element the auction does not read.
This does not make the image worthless. It makes the image a click-through-rate instrument and nothing else. Test it on those grounds, read it through CTR, and never expect an image change to move what the ad matches or what it clears at.
How many ads should launch in each ad group?
Launch three to five ads per ad group, and never fewer than three. Each one should carry a distinct angle — a different reason to act or a different objection answered — not a different phrasing of the same claim. Because the architecture rule is one ad group, one intent, every angle inside an ad group is aimed at the same moment; their job is to find out which objection is actually load-bearing at that moment.
The test for whether you have written angles or synonyms takes two minutes and should be run before anything is uploaded. For each ad, write the one sentence a sceptical reader would say back to it. If two ads produce the same sentence, they are the same angle and one of them is spending delivery for nothing. The illustrative set below is for a single ad group targeting one moment — a practice manager deciding how to cut patient no-shows — and shows what five genuinely separable angles look like.
| Angle | The objection it answers | The sentence a sceptic says back |
|---|---|---|
| Outcome | Will this actually change the number? | “Reminders never worked for us before.” |
| Switching cost | How much work is this to put in? | “We do not have time to migrate anything.” |
| Fit | Is this built for a business my size? | “That looks like it is for hospital groups.” |
| Price transparency | What will this cost me, really? | “They will not show pricing without a call.” |
| Risk | What happens if it does not work? | “I will be locked into a year of this.” |
Five different sentences, so five different angles. Compare that with the set most accounts launch: “Reduce no-shows,” “Cut missed appointments,” “Fewer empty chairs” and “Stop losing revenue to no-shows,” all of which produce the same sceptic’s sentence and therefore constitute one angle written four times. That account looks like it is testing heavily and will learn nothing in three months.
Writing to a conversation instead of to a query
The ad arrives inside a conversation that has already established some of the criteria, which is the structural difference between this channel and paid search. A search headline has to restate the query to prove it is relevant. A ChatGPT ad does not, because the context is already on screen — so restating the category wastes the scarcest resource in the unit. The launch discipline is to print each ad group’s hints beside its draft ads and, for every ad, write down the question the copy answers. If that question is not one the hints describe, the ad is mismatched before it has served an impression, and no bid adjustment will fix it.
In practice this means a launch headline earns its place by taking a position on the thing being weighed, naming the constraint the hint describes, or removing the friction that is blocking the next step. Rank claims, unattached superlatives and category labels do none of those. They are also the three things a brand team will send you when asked for headlines with no hint set attached, which is why we write the hints first and the ads second, in that order, every time.
How do you test creative when there is no A/B testing primitive?
Ads Manager has no ad-level A/B testing primitive, so every creative test in this channel is structural and read from aggregate outcomes. You are not splitting traffic and being handed a verdict; you are arranging the account so that the numbers can be interpreted afterwards. Three rules make the first test readable, and all three are decisions taken at build time rather than later.
- Change one variable at a time. Headline, or copy, or image — never two together. With no split control, a two-variable change produces a result you cannot attribute, and that ambiguity gets carried forward into every decision after it.
- Expect delivery to be uneven, and size the test for it. Illustrative arithmetic: an ad group delivers 5,000 impressions across two ads in a fortnight, and the platform allocates 3,100 to one and 1,900 to the other. At an illustrative 2% click-through rate that is 62 clicks against 38. Nothing survives a comparison at that size and that imbalance, and calling it a result is how accounts kill the better ad in week three.
- Hold the rest of the ad group still. If you change hints and ads in the same week, you have learned nothing about either. Sequential tests — one set for a fortnight, the next for a matched fortnight — are frequently cleaner than concurrent ones, provided nothing else in the account moves across the boundary. Attributed conversions need 24 to 48 hours to appear, so drop the opening days of each period before reading.
Carousel, as of September 2026. The standard unit remains a single-product sponsored card. A multi-product carousel test began in August 2026 for feed advertisers. Treat it as a test rather than as general availability: do not build a launch creative strategy that depends on it, and be sceptical of anyone who promises it as a feature of your build.
Build the whole creative set before you need it
Every ad has to complete review before it can serve, and OpenAI is unable to expedite ad review. Plan around that rather than discovering it, because it changes the shape of the launch: an ad group that goes live with three ads and a plan to add two more next week is an ad group whose second test starts whenever review happens to finish. Write and upload the full set during the build and pause the ones you are holding back, so that starting the next test is a toggle rather than a queue.
The same logic applies to the landing pages. The landing page is the third of the four relevance inputs, so an ad pointing at a page that is still being written is an ad whose relevance is being scored against a placeholder. If a page will not exist on launch day, the ad that points at it does not belong in the launch set. Ship fewer complete units rather than more incomplete ones — three ads against a finished page will teach you more in a fortnight than six against a page that changes twice in the same period.
What this means for your launch
Commission copy before imagery. Three to five separable angles per ad group, each answering a different objection at the same moment, each written to the conversation the hints describe rather than to a search query. Build the first set so that the first read is possible — one variable, matched periods, everything else held still — because the platform will not run the test for you.
Objective, bid strategy and budget at launch
The campaign objective is the bidding model in ChatGPT Ads, and it is locked permanently at campaign creation. There are three: Reach, billed CPM per 1,000 impressions; Clicks, billed CPC per valid click; and Conversions, billed oCPC — which still charges per valid click, not per conversion. There is no separate campaign-level bid-strategy dropdown to choose after the fact. Choosing the objective is therefore the single most consequential irreversible decision in the build after the three permanent account settings, and existing CPM or CPC campaigns cannot be converted to oCPC.
| Objective | How you are billed | What it optimizes for | Sensible at launch when |
|---|---|---|---|
| Reach | CPM, per 1,000 impressions | Broad delivery at scale | The goal is genuinely awareness and you have a measurement plan that does not run through clicks. Rare for a first campaign. |
| Clicks | CPC, per valid click | Clicks from users likely to engage | The default first campaign. Delivers immediately, imposes no measurement prerequisites, and produces the traffic that makes everything downstream readable. |
| Conversions | oCPC — billed per valid click, not per conversion | Clicks likelier to drive your conversion goal | All four eligibility gates are already met on the day you build. If any one is not, this objective is not available to you and cannot be retrofitted to the campaign later. |
Which objective should a first campaign launch on?
Most first campaigns should launch on Clicks, because the four gates on oCPC usually cannot all be cleared on day one. The gates are: conversion tracking live through the pixel, the Conversions API, or both; at least one standard event, since custom events are not supported as an oCPC goal; that event belonging to the current ad account with an active conversion source, because events do not travel between accounts; and the account itself being enabled for conversion bidding, otherwise the API returns 403 Conversion bidding is not enabled.
Gates one to three are exactly what the measurement-before-media work exists to satisfy, so a build that has done that work properly may well clear them. The fourth is not in your control and is not something an agency can accelerate. That asymmetry is the whole argument for the Clicks-first route: launching on Clicks costs you nothing you cannot recover, whereas launching on Conversions with an unenabled account costs you a campaign you have to rebuild, because the objective is permanent.
The upgrade path exists and is worth building toward from day one. Since August 2026 an existing CPC campaign can be cloned into a new oCPC campaign, with the original left running until you pause it; cloning prefills the conversion event when exactly one eligible event is available, and oCPC campaigns can be created in bulk. Cloning relaxes none of the four gates — it just removes the rebuild. Structure the first campaign so it will clone cleanly, and the objective decision stops being a one-way door and becomes a sequence.
Maximize results or Manual: Max bid?
Bid strategy is set at ad group level, one level below the objective, and there are two options. Maximize results is the automated strategy that shipped in August 2026 and is default-on for eligible new ad groups — which means a new build inherits it unless somebody actively changes it. Manual: Max bid is the alternative, and it is the one to choose deliberately if your business has a ceiling it cannot exceed.
The deciding sentence is OpenAI’s own: Maximize results prioritizes result volume and does not guarantee delivery against a specific CPA, CPC or ROAS target at this time. If there is a cost per acquisition above which a customer is unprofitable, or a return on ad spend floor a board has signed off on, automated bidding is not the instrument for enforcing it. Set those ad groups to Manual: Max bid at build, where the ceiling is a number you control rather than an outcome you hope for. There is a second reason at launch specifically: automated bidding needs conversion density to work from, and a brand-new ad group has none.
A Bid Cap is a ceiling, not a target
A Bid Cap is the maximum you can pay for a click in an auction. Your actual CPC is set by the auction and may be lower. It is not a target CPA, not an average, and not a promise about what a conversion will cost. For oCPC specifically, OpenAI states that there is no recommended bid amount at this time — so any number you enter is your own commercial judgement, which is why the break-even arithmetic below has to be done before the campaign is built rather than after it underperforms.
What should the opening bid be?
OpenAI’s published starting guidance is a $3–$5 maximum CPC bid. The bid field carries a $3.00 placeholder and accepts anything from $0.01 to $100.00, and the bottom of that range is the trap that catches most careful first-time advertisers: bidding much below $3 wins little or no delivery. An account that opens at $1.50 to keep costs down has not kept costs down. It has stopped buying, and the low spend line is not discipline, it is silence. If the plan for controlling cost is a low bid, the plan is to have no campaign.
Can you afford to bid at all? The arithmetic to do before you build
Break-even CPC = target CPA × landing-page conversion rate. That one line decides whether the channel can work for you before any bid, budget or objective is chosen, and it is arithmetic that almost nobody does before opening the campaign builder.
Illustrative example — the figures below are invented to demonstrate the method and are not results from any client. Suppose a services business sells an engagement worth $1,800 at a 40% gross margin and closes one in five of the leads it generates. Maximum allowable CPA is approximately average order value × gross margin × close rate: $1,800 × 0.40 × 0.20 = $144. Take $120 as the target CPA to leave headroom. If the landing page converts visitors to leads at 3.5%, break-even CPC is $120 × 0.035 = $4.20. That sits inside the recommended $3–$5 band, so this business can launch and has roughly 20% of room between break-even and the delivery floor.
Now run the same method for a business with a smaller transaction. A $60 target CPA against a 3% landing-page conversion rate gives a break-even CPC of $1.80, which is well below the point at which delivery happens at all. Be honest about what that means, because it is the more common outcome: for a great many businesses this arithmetic lands under the floor, and no bid strategy, objective or hint set on the platform rescues it. The fix is the landing page or the offer, not the bid. Telling a business in that position to launch anyway and optimize later is selling them a worse outcome, and it is the most common way money gets wasted on this channel in its first quarter.
How does the daily budget actually pace?
Since 27 July 2026 the daily budget is a seven-day average rather than a hard daily cap. Maximum spend on any single day is 2× the daily budget, and maximum spend across seven days is 7× the daily budget. OpenAI’s own worked example: over seven days at $100 a day the campaign will spend up to $700 in total, and it may spend $140 on Tuesday and $60 on Wednesday.
Say this out loud to whoever will be watching the account in week one, because the damage from not knowing it is real. Somebody checks spend on Tuesday, sees 140% of the daily budget, cuts the budget in alarm, then cuts it again the following week — and the campaign has now been reset twice and has never been allowed to accumulate a readable seven days. The correct read is the seven-day total against 7× the daily budget. Anything inside that is the system behaving exactly as documented.
Campaign-total budget is a spending limit, not a pacing control
A campaign-total budget caps what the campaign can spend in total. It is not distributed evenly across the campaign’s dates and spend can accumulate quickly against it. Two consequences at build time: use a daily budget unless you have a genuinely fixed pot with a hard end date, and understand that switching a campaign-total budget to a daily budget is one-way. You cannot switch back, and the only route back is a new campaign. Add it to the short list of decisions this platform will not let you undo.
Is your budget above the minimum for your billing currency?
There is no platform-wide minimum spend commitment, and there is a minimum daily budget per billing currency. Both halves of that sentence have to travel together, because “no minimum spend” on its own is misleading. Billing currency is fixed at account creation and cannot be changed, so the minimum that applies to your account is not negotiable and not switchable later.
| Billing currency | Minimum daily budget |
|---|---|
| USD | $25 |
| GBP | £15 |
| CAD | 25 CAD |
| AUD | 25 AUD |
| NZD | 25 NZD |
| BRL | 40 BRL |
| MXN | 150 MXN |
| JPY | 2,500 JPY |
| KRW | 25,000 KRW |
| INR | 725 INR is published, but India is not yet listed as an available market |
Put the minimum next to the delivery floor before you commit to a launch budget. A $25 daily budget against a $3–$5 CPC band buys five to eight clicks a day for the entire campaign — roughly 35 to 58 clicks a week. At a 3% landing-page conversion rate that is one or two conversions a week, which is below any threshold at which a decision can be made. The platform will accept the budget without complaint. It will not produce a dataset anybody can optimize against, and a build that launches at the minimum should be planned as a delivery test rather than a performance test, with that stated in writing before anyone starts reading the numbers as results.
How fast should anything change after launch?
Move bids in 15–25% increments and budgets in 20–30% increments, and wait for attribution to settle before reading the result — attributed conversions take 24 to 48 hours to appear, so day-one numbers are noise. Larger steps produce a great deal of activity and no information, because the weekly conversion counts on a newly launched account are far too small to survive that kind of handling. An account that swings a bid from $3 to $7 and back in a fortnight has run two experiments, invalidated both, and still does not know what a click is worth to it.
What this means for your launch
Do the break-even arithmetic first: if target CPA × landing-page conversion rate lands below roughly $3, fix the page before funding the channel. Launch on Clicks unless all four oCPC gates are already cleared, since the objective is permanent and cloning is available later. Set new ad groups to Manual: Max bid if you have a hard efficiency ceiling, open in the $3–$5 band, and read spend as a seven-day total against 7× the daily budget rather than day by day.
Product feed setup, if you run a catalog
This section applies only to advertisers running a product feed campaign; if you do not have a catalog to connect, skip ahead — nothing here affects your build. For catalog advertisers, the feed is the longest-lead-time item in the whole setup and the one most likely to push a launch date, because it involves an engineering handoff, a file format decision and a data-quality pass that no ads platform can do for you. Start it first, not last.
There are two separate product-feed systems at OpenAI and they get confused constantly. The commerce feed is the organic one and is application-gated. The Ads Manager feed is the paid one, self-serve, and created at Tools → Feeds → Create Feed. It is the only one this build concerns. Acceptance into one is not acceptance into the other. The Ads Manager feed supports up to 2 million products, with one feed connection per ad account, and the specification runs to 79 fields, 19 of them required. Full mechanics are in our ChatGPT product feed guide; what follows is what a build has to settle.
One connection per ad account is a structural constraint to think through before anything is written. If you sell across brands or regions that need genuinely different catalogs, that separation has to happen inside the single feed rather than across several connections — or across separate ad accounts, each with its own billing, its own verification and its own permanent country, currency and time zone settings.
What the delivery pipeline has to do
| Requirement | What it means for the build |
|---|---|
| Transport is SFTP | A scheduled job, credentials, and a named owner who will still be at the company in a year. Feeds routinely outlive the engineer who built them. |
Parquet preferred; jsonl.gz, csv.gz and tsv.gz supported | Choose Parquet unless there is a reason not to. If you use a gzipped format, confirm the file is actually compressed rather than renamed. |
| XML is not supported | The fastest way to build a feed that never ingests at all is to port one from a channel that uses XML. Decide the format before anyone writes the exporter. |
| UTF-8 encoding | Matters most for catalogs with accented product names or non-Latin scripts. Check the written file, not the source database. |
| Stable filename, overwritten in place | Do not write products-2026-09-01.parquet and rotate the name. A date-stamped filename means nothing ingests after the first run, and the failure is silent. |
| Full snapshot at least daily | A delta file is not a snapshot. Build the exporter to emit the complete catalog every run and schedule it at least once a day. |
| Removals are explicit only | Discontinued and out-of-stock products must be actively removed. Dropping a row from the file is not a removal and the omitted product does not disappear on its own. |
Two decisions that are locked once you make them
The campaign type Product feed is locked at creation and cannot be changed afterwards, and so is the objective. A feed campaign therefore carries both decisions for its entire life, and an advertiser who builds a standard campaign and later wants feed delivery is building a new campaign rather than changing a setting. That makes campaign type an architecture decision taken in the planning conversation, not a checkbox ticked in the builder by whoever happens to be doing the build.
The second locked-in consequence is about copy. The ad template for a feed campaign currently lets you select only the image field. Titles and descriptions come from the feed. Put that next to the auction and the implication is sharp: the one creative field you can choose is the one field relevance does not read, and the two fields that are relevance inputs are whatever your merchandising team typed into the product record, possibly years ago, for a different channel. In a feed campaign, feed copy quality is ad copy quality. There is no ad-level override to rescue a bad title.
Practically, that means the creative work in this build happens in your product information system rather than in Ads Manager. Titles inherited from a shopping channel that rewards keyword density — brand, model, colour, size and three synonyms stacked into one string — read as noise in a conversational placement, and that string is the text being scored. Descriptions written for a product detail page assume the shopper is already looking at the product; here they are the first thing said to somebody who has not seen it. Rewriting them is a merchandising project with its own owner and its own timeline, and it has to be sequenced into the launch plan rather than discovered during it.
The Products tab is a reporting view, not a feed inventory
The Products tab is insights-backed reporting: products appear there only once an active campaign has delivered against them. At launch it will therefore be empty, and that emptiness is not evidence of a broken feed. To confirm feed readiness before you spend anything, use the product count shown during ad-group setup — that number is what tells you the connection is live and how much of the catalog is addressable. Almost everyone diagnosing a “missing” product opens the tab that looks like an inventory, finds nothing, and goes off to rebuild a feed that was working.
How to roll a feed out without a silent failure
- Ship a small sample first. A few hundred representative products, deliberately including your awkward cases: long titles, accented characters, variant-heavy items, products at the price extremes. The goal is to make format and encoding problems appear while they are cheap to fix.
- QA the first full snapshot before automating anything. Check all 19 required fields on every row rather than on the row you spot-checked — long-tail SKUs are where required fields go missing. Check field names against the current specification, not against the version the integration was written to. Then check values: prices, currency, availability and URLs, because malformed data is worse than missing data, since it delivers.
- Automate the schedule and add an alarm on the job, not on the campaign. A feed that stops updating produces no error in the campaign view. It produces silence, and silence in this channel is indistinguishable from a bidding problem until somebody goes and looks at the file. Monitor the SFTP job itself.
What cannot go in the feed, and what cannot go over SFTP
Four categories are excluded from product feed advertising: adult content, age-restricted products, weapons, and prescription medications. Work out what share of your catalog falls into them before the launch budget is set, because an excluded share is not underperformance — it is a catalog smaller than the advertiser thinks it is, and any conversion forecast built on the full SKU count is wrong by that margin from the first day.
Promotions data can only be delivered via the API. There is no SFTP path for it. Advertisers who build the entire pipeline around a file drop discover this at the point they want to run a sale, which is the worst possible moment. If promotional pricing matters to your trading calendar — and for most catalogs it does — the API integration is a build item now rather than a later one, and it needs its own key from Settings → API Keys, scoped to this single ad account.
What this means for your launch
Start the feed before anything else in the build, because it is the only item with an engineering dependency. Decide the format and the filename convention before a line of the exporter is written, sample first and automate second, and treat your product titles and descriptions as ad copy — they are the only copy a feed campaign has, and the one field you can choose in the ad template is the one field the auction does not read.
The pre-launch QA pass
The pre-launch QA pass is a fixed sequence of twenty-one checks, run in one sitting before the first dollar of spend, that confirms an account can serve, can measure, and can be reconciled against your own analytics. It is not a review of whether the campaign is good — that question needs delivery data. It is a verification that every silent failure mode has been eliminated first, because almost none of them announce themselves: a campaign that cannot serve and a campaign that cannot measure report the same thing, zeroes, with no error anywhere in the interface.
Work the gates in order. They are sequenced by dependency, not importance — a targeting check run on an account whose events do not match tells you less than nothing, because it will look like it passed. Everything here is verifiable by you, in your own account, in an afternoon, which is why we publish the whole gate rather than a teaser of it, exactly as we publish the audit checklist.
Group 1 — Can the account physically deliver?
Five gates decide whether a single impression is possible. Each is binary, each takes under a minute, and nothing in the campaign builder blocks you from finishing a campaign with any of them unmet.
- Verification and billing are both complete. Persona identity verification finished, a billing profile created, a payment method attached. Verification and ad review are separate steps in a rolling queue with no published SLA — same-day to a couple of weeks — and OpenAI is unable to expedite either. Submit early enough that the queue is not on the critical path of your launch date.
- Settings → Account info has both Account name and Logo set. Ads will not serve unless this step is complete. It is step three of the five-step onboarding sequence and it is the single most-skipped gate on the platform, because a campaign can be built, funded and enabled without it and every campaign-level indicator will read green. If the account has never delivered an impression, check this before you check anything else.
- Campaign, ad group and ad are all active, not paused. The hierarchy is campaign → ad group → ad, and an ad serves only when the ad and both of its parents are enabled. Check all three levels rather than the one on your screen. Campaigns created through the API launch paused by default, so an account built by an integration needs an explicit enable step after creation.
- Campaign dates include today. Dates are evaluated in the account time zone, which is fixed permanently at account creation. A start date set in the future or an end date already passed stops delivery with no error state that draws attention to itself.
- Ads have completed review. An enabled ad, inside an enabled ad group, inside an enabled campaign with current dates, still does not serve until review clears. There is no expedite path. The only useful response is to have submitted early.
Group 2 — Will the conversion actually arrive?
Eight gates protect the measurement layer, and this is the block worth spending real time on: a measurement fault is the only category of setup error that destroys data you can never recover. The mechanics behind each check are worked through in our ChatGPT Ads conversion tracking guide. The list below is the verification pass, not the implementation.
- The pixel fires on every page that matters. Not the homepage — the pages where money is recorded. That means the post-payment redirect, which on many stacks is a page nobody tests because reaching it costs a real transaction, and any thank-you page sitting behind a form. Load each one and confirm the event in the console with
debug: true. A pixel that fires everywhere except the confirmation page produces a perfectly healthy-looking install and zero conversions. - The pixel ID is the right one. Confirm the ID in
oaiq("init", { pixelId: "<ID>" })matches the data source in Tools → Conversions for this ad account. Events fired to a pixel belonging to another account do not travel back, and multi-property setups are where the wrong ID gets pasted. - All three CSP directives are present.
script-src https://bzrcdn.openai.com,connect-src https://bzr.openai.com, andimg-src https://bzr.openai.com. Miss any one and the pixel fails silently. A missingconnect-srcis the classic cause of “the pixel is installed but no conversions appear” — the script loads, the events queue, and nothing is ever allowed to leave the browser. opprefsurvives every redirect, consent path and CDN rule. Click a real ad URL through your actual edge — link shortener, geo redirect, consent wall, CDN rewrite, trailing-slash rule, the lot — and confirmopprefis still on the URL at the landing page and has been written to the__opprefcookie. Stripping it anywhere in that chain breaks conversion attribution entirely, and the break is invisible from inside Ads Manager.- The deduplication key is identical on both sides. If you run the pixel and the Conversions API together, the pixel’s
event_idand the API’sidmust carry the same value, and for custom eventscustom_event_namemust match on both. Use the order or transaction ID. Timestamps, random values and session IDs do not work, and the failure they produce is double-counted conversions that flatter the account until someone reconciles against the CRM. - The configured conversion event matches exactly what you send. A conversion event can be firing correctly, accepted and forwarded, and still report zero if it does not match the event configured on the campaign. For standard events the event type must match what you send. For custom events, Ads Manager must be set to
Event type: Customand the name must match character for character — a matching display name is not enough. Note also thatcustomis not eligible as an oCPC goal, so if a custom event is your real outcome you need a standard event firing alongside it. - Advanced matching output is lowercase 64-character hex. Automatic advanced matching is opt-out, hashes client-side in the browser, is already on for new Web pixels, and was enabled on existing Web pixels on 17 August 2026. Inspect a real outgoing payload and confirm the hashed fields are lowercase 64-character hex. The two errors that reach production are uppercase hex output and hashing a value that was already hashed. Confirm it per pixel — it is a per-pixel control, so multi-property accounts drift.
- The diagnostics panel is clean. Tools → Conversions, right-hand panel, shows events dropped before being sent, the affected field, the error type and a recommended fix. Fire a test transaction, wait, then read it. Launching with unread diagnostics is launching with a report you already own and have chosen not to open.
Group 3 — Is the campaign pointed at a reachable, fundable audience?
Five gates confirm the campaign is not structurally prevented from spending, and that the spend it does make is aimed somewhere it can land.
- The daily budget clears the minimum for your billing currency. There is no platform-wide minimum spend commitment; what applies is a minimum daily budget per billing currency. The published minimums are $25 USD, £15 GBP, 25 CAD, 25 AUD, 25 NZD, 40 BRL, 150 MXN, 2,500 JPY and 25,000 KRW. Billing currency is fixed permanently at account creation, so an account in the wrong currency has a floor it cannot renegotiate.
- The market is one where Ads Manager is live to buy. Nine markets: the United States, the United Kingdom, Canada, Australia, New Zealand, Japan, South Korea, Brazil and Mexico. A further 31 European countries have been announced. India appears in the published minimum-spend table at 725 INR but is not yet listed as available — a currency in a pricing table is not a market you can buy.
- The platform selection is deliberate, not default. Platforms are a multi-select of iOS App, Android App and Web, where Web covers both desktop and mobile web. Reporting does not mirror this: device breakdowns group into Mobile and Desktop only, with mobile web counted under Mobile. Targeting is more granular than reporting, so decide before launch whether app and web need separating structurally — you will not be able to separate them in the report afterwards.
- Hints are five to fifteen per ad group, and one ad group carries one intent. Count them. Below five, the ad group has too little to match against; above fifteen, you have merged intents that should have been separate ad groups — the structural mistake that makes week-two reading impossible. Launch at the lower end and watch impressions for five to seven days before adding.
- Every ad group has an approved ad and a live landing page. Load each landing page as an ordinary visitor, from the country you are targeting, and confirm it returns 200 rather than a redirect chain, a geo block or a stale staging URL. Landing page is one of the four relevance inputs in the auction, alongside context hints, ad title and ad copy — the image is explicitly not an input — so a broken page costs you auction position as well as conversions.
Group 4 — Will the data reconcile with your own analytics?
The reconciliation gate is the only one on this list that cannot be fully closed before launch, because URL macros are substituted at delivery time rather than at save time. What you can do before spend is verify the syntax and the placement; what you must do in the first hours of delivery is confirm the substituted values actually landed.
- Macro syntax and placement are correct. There are four macros and only four:
{campaign_id},{ad_group_id},{ad_id}and{ad_account_id}. Do not URL-encode the braces —%7Bcampaign_id%7Darrives literally. Put macros in values, never in keys, never in the path or fragment, and namespace your keys so they do not collide with your analytics platform’s reserved parameters. Landing-page query parameters are set in the three-dot menu → Edit rather than in the creation flow, and precedence runs most specific first: Ad URL, Ad, Ad Group, Campaign. - The resolved parameters land in analytics as expected. Within the first day of delivery, open your analytics landing-page report and confirm real substituted IDs are arriving rather than literal
{campaign_id}strings, encoded braces, or nothing. This is the check that catches a CDN rule stripping query strings — which also stripsoppref, which also breaks conversion attribution. One root cause, three symptoms, and only this gate finds it. - The ID-to-name mapping table exists. Macros return IDs, not names. Export campaign, ad group and ad IDs alongside their names on day one and keep the file. Nobody remembers what an ad group ID meant in month four, and rebuilding the mapping after a rename is not always possible.
The five-minute verification table
Every gate has a fast confirmation. Use this when you are checking somebody else’s build, or re-checking your own after any change.
| Gate | How to verify it in under five minutes | What a pass looks like |
|---|---|---|
| Account name and Logo | Settings → Account info. Two fields. | Both populated. Empty here means zero impressions, permanently. |
| All three levels enabled | Open the campaign, the ad group and the ad; read the status on each. | Three active statuses, not two active and one paused. |
| Campaign dates | Compare start and end against today in the account time zone. | Today falls inside the range, read in the account’s time zone rather than yours. |
| Ad review | Ad-level status column. | Review complete. “In review” is a wait, not a fault, and cannot be expedited. |
| Pixel on money pages | Load the confirmation page with debug: true and watch the console. | The event logs on the post-payment redirect and on the thank-you page behind the form, not only on the homepage. |
| Pixel ID | Compare the ID in the oaiq init call to the data source in Tools → Conversions. | Character-for-character identical, and belonging to this ad account. |
| CSP directives | Search the response headers or meta CSP for all three OpenAI hosts. | script-src, connect-src and img-src all present. Two of three is a silent failure. |
oppref survival | Click a live ad URL through your real edge; read the final address bar and the cookie jar. | oppref still on the URL and written to __oppref after every redirect and the consent gate. |
| Deduplication key | Compare one pixel payload and one API payload for the same order. | The pixel’s event_id and the API’s id hold the same order ID. |
| Event-name match | Read the campaign’s configured event, then the event name in the outgoing payload. | Exact match, including Event type: Custom and the literal name for custom events. |
| Advanced matching format | Inspect one hashed field in a live payload. | Lowercase, 64 characters, hexadecimal, hashed exactly once. |
| Diagnostics panel | Tools → Conversions, right-hand panel, after a test event. | No dropped-event errors outstanding, or each one read and explained. |
| Budget above the currency floor | Compare the daily budget to the published minimum for your billing currency. | At or above the floor, in the currency the account was permanently created in. |
| Market and platform | Check targeted countries against the nine live markets; open the platform multi-select. | Every market live to buy rather than announced, and a deliberate choice among iOS App, Android App and Web. |
| Hint count and intent | Count the lines in each ad group’s hint box and read them aloud. | Five to fifteen lines, all describing one intent, in an ad group whose ad matches that intent. |
| Macro syntax | Read the landing-page parameter string in the three-dot menu → Edit. | Unencoded braces, macros in values, set at the level whose precedence you intended. |
| Parameters in analytics | Analytics landing-page report, first day of delivery. | Real numeric IDs arriving — not literal macro text, and not nothing. |
This pass is worth more than the first week of optimization
Corrections to event configuration do not backfill. If the conversion event configured on the campaign does not match the event you are actually sending, the account reports zero — and fixing the configuration on day nine starts counting from day nine. The eight days of conversions that were fired, accepted and forwarded during the mismatch are not restored, recalculated or made available later. They are history you never get back, and every decision built on that period — which ad group to pause, which hint set to expand, whether the channel works at all — was made against a number that described nothing. The first week of bid tuning on a correctly instrumented account is worth a few percent. The first week on a miscounted account is worth less than nothing, because it teaches the system and the operator the wrong lesson at the same time. An afternoon here buys back a month of readable data later.
The first thirty days, week by week
The first thirty days of a new ChatGPT Ads account produce a delivery verdict, a first read on ad-group-level outcomes, and one honest conversation about whether to keep buying — not a performance verdict. This is a channel that under-reports by design and moves slowly at small budgets, and the most expensive mistake in month one is treating early numbers as a signal and reacting to them. Most accounts that fail in the first quarter were not out-competed in the auction. They were changed too often, too early, on evidence that had not finished arriving.
Two mechanics set the pace of everything below. Attributed conversions take 24 to 48 hours to appear, so any conversion figure covering the last two days is incomplete by definition and a day-one readout is pure noise. And daily spend varies around a seven-day average: since 27 July 2026 the daily budget is a pacing target rather than a cap, with maximum daily spend at 2× the daily budget and maximum seven-day spend at 7×. OpenAI’s own example is seven days at $100/day totalling $700, spending $140 on Tuesday and $60 on Wednesday. A single expensive day is the system working as designed and is not a problem to react to. Read spend on a rolling seven-day basis or you will spend month one chasing a pacing artifact.
Week 1: is it serving, pacing and recording?
Week one is a delivery confirmation exercise and nothing else. The only questions worth asking are whether impressions are accruing, whether spend is tracking toward the seven-day total rather than the daily figure, and whether conversion events are arriving in Tools → Conversions at all. Everything about cost and efficiency is unreadable this week, because the conversions that will eventually be credited to these clicks have not finished landing.
Concretely: on day two, confirm impressions exist against every ad group, not just the account total — an account can look alive while three of five ad groups have never served. On day three, fire a real conversion through the live site and confirm it appears, then check the diagnostics panel for dropped events. By day five, compare cumulative spend against the seven-day expectation rather than day five times the daily budget. If an ad group has spent nothing by day five, that is a delivery problem to investigate, not a bidding problem to solve: bidding much below $3 wins little or no delivery, and OpenAI’s own starting guidance is a $3–$5 maximum CPC bid. Change nothing else. There is nothing you can learn in week one that a bid change would improve, and a bid change resets the read.
Week 2: the first read on hint sets — and its hard ceiling
Week two is the first point at which ad-group-level outcomes carry any information, and it is also where most operators discover the structural limit of this channel’s reporting. There is no search-term report and no per-hint performance data. Ads Manager will not tell you which of your twelve context hints produced the impression, the click or the conversion. You read outcomes at ad group level, and you cannot attribute a result to an individual hint — not with a workaround, not with an export, not with a partner tool.
That constraint is the entire reason for the one-ad-group-one-intent rule enforced at build time. The ad group is your unit of measurement, so it has to be the unit of meaning: if an ad group carries two intents, its result is an average of two things you cannot separate. If you want to compare a hint set against an alternative, the comparison has to be structural — two ad groups, one intent each, differing in the hints — and even then it is a sequential observation rather than a controlled test, because there is no ad-level A/B testing primitive and no traffic split.
What is legitimate in week two: read impressions, clicks, CTR and average CPC per ad group; note which ad groups are not serving; add hints to a starved ad group toward the fifteen ceiling; and pause an ad group only if it has spent meaningfully with no engagement at all. What is not legitimate: pausing an ad group on conversion counts. At realistic week-two volumes those counts are single digits, and a difference between two and five conversions is not a difference. If you change bids, move in the 15–25% increments the channel responds to rather than halving or doubling, and change one thing per ad group.
Week 3: the first creative iteration, one variable at a time
Week three is when creative changes earn their place, and the sequencing matters because the auction does not read creative the way most advertisers assume. Relevance is computed from four inputs — context hints, landing page, ad title and ad copy. The image is explicitly not an auction input. Changing the image can move click-through rate, because a person still has to notice the card, but it cannot move your auction position. Changing the title, the copy or the landing page can move both.
So iterate in that order of leverage, and change one variable at a time. Rewrite the title, or rewrite the copy, or change the landing page — not two of them in the same week, because there is no experiment primitive to separate them afterwards and no report that will tell you which one moved. Keep total copy to roughly 150 characters and check the current limits in our ChatGPT Ads creative guide before you write to a number. Give each change at least a week before you read it, and remember the trailing 48 hours are still incomplete when you do.
The most common week-three error is changing creative and bids in the same session. Both will move the numbers, neither can be isolated afterwards, and the account arrives at day 30 with four changes and no attribution for any of them. If you only take one discipline from this section: one variable, one week, one read.
Week 4: the honest verdict conversation
Week four is a conversation about what the evidence can and cannot support, held against your own economics rather than against anyone else’s screenshot. What is genuinely available by day 30 is a delivery verdict, a stable CTR and average CPC per ad group, a directional ranking of ad groups by cost per outcome, whatever your self-reported attribution field has collected, and a first comparison of your actual CPC against your break-even CPC. That last number is the one that matters: break-even CPC equals target CPA multiplied by landing-page conversion rate. Illustrative arithmetic: a $50 target CPA at a 4% landing-page conversion rate gives a $2.00 break-even CPC, which sits below OpenAI’s own $3–$5 starting guidance and tells you the problem is the landing page or the offer, not the bid. The full working is in our guide to measuring ChatGPT Ads ROI, and the bidding and budget context is in the ChatGPT Ads cost guide.
What is not available at day 30 is anything with statistical authority. A month at a first-test budget of $1,000–$3,000 does not produce enough conversions to distinguish between two ad groups with confidence, and a pilot sized to yield 50–100 conversions generally needs $10,000–$30,000. Day 30 is a decision point, not a proof point, and the correct output is a direction rather than a verdict.
| Week | What to change | What to ignore | What a healthy signal looks like |
|---|---|---|---|
| Week 1 Delivery confirmation |
Nothing, unless an ad group has served zero impressions — then fix delivery, not bids. Raise a bid only if it sits below the $3 delivery floor. | Every cost and efficiency metric. Day-one and day-two conversion counts. Any single day’s spend figure. | Impressions accruing against every ad group, cumulative spend tracking toward the seven-day total, at least one conversion event visible in Tools → Conversions, diagnostics panel clear. |
| Week 2 First ad-group read |
Hint counts, toward the five-to-fifteen range, on ad groups that are under-delivering. Bids in 15–25% increments. One change per ad group. | Per-hint performance — it does not exist. Conversion-count comparisons between ad groups at single-digit volumes. Anything you read in the last 48 hours. | CTR and average CPC stabilising per ad group, spend distributing across ad groups rather than concentrating in one, conversions arriving consistently rather than in one burst. |
| Week 3 First creative iteration |
One creative variable per ad group: title, or copy, or landing page. Image changes for CTR only. | The assumption that a new image will improve auction position — the image is not a relevance input. Reading a change before it has run a full week. | A measurable CTR or CPC movement on the ad group you changed and no movement on the ones you did not, which is the closest thing to a clean read this platform offers. |
| Week 4 Verdict conversation |
Budget in 20–30% increments if the economics clear break-even. Structure, if week two showed two intents fused in one ad group. | Comparisons against published industry benchmarks, and any conclusion about incrementality. | Actual average CPC at or below your calculated break-even CPC, a consistent ad-group ranking that has not reshuffled week to week, and your brand appearing in self-reported attribution answers. |
What thirty days cannot tell you
Two questions are simply out of reach at day 30, and being explicit about them is the difference between a decision and a guess.
Incrementality cannot be established at small spend. Whether these conversions would have happened without the ads requires a holdout or a full-channel pause, and both need roughly $10,000/month and a stable baseline to produce a result anyone should defend. At a first-test budget the sample is the sample: no methodology rescues ten conversions split into two cells. Compounding this, the channel structurally under-reports. AdVenture Media’s analysis of ChatGPT-ad-attributable conversions found that roughly 40% land in the immediate post-click session and roughly 60% arrive later, through paths that cannot be traced. Your reported CPA is therefore an upper bound on true cost per acquisition rather than an estimate of it, and a channel that looks marginal at day 30 may be comfortably profitable in reality — which is an argument for a required “how did you hear about us” field on your order form, not an argument for optimism.
Per-hint attribution will not become available later. It is not a reporting delay or a beta gap you can wait out with more data; there is no search-term report and no per-hint metric to accumulate. Any plan that depends on knowing which hint worked needs redesigning around ad groups instead.
There is also nothing external to measure yourself against. OpenAI publishes no performance benchmarks across advertisers or industries, so the only honest comparison is against your own margins and your own history. Third-party figures exist and they disagree violently: First Page Sage’s 12 June 2026 analysis put conversion rates between 0.2% and 5.8% across 19 industries, and published CTR figures range from 0.91% to 1.5–6% depending on whose data you read. A range that wide is not a benchmark — it is a reminder that somebody else’s number cannot tell you whether yours is good. Your break-even CPC can.
The day-30 decision rule
Continue if the account delivers reliably across most ad groups, measurement is clean, and your actual average CPC sits at or below your break-even CPC — even if total conversion volume is still too small to be conclusive. That is the normal outcome and it earns another 30 to 60 days. Expand, in 20–30% budget increments rather than steps, only when the economics clear break-even with margin, the ad-group ranking has held steady for at least two consecutive weeks, and you have a specific structural reason to add spend — a starved ad group, a second intent, a new market. Stop if delivery never established despite the gates passing, if reported CPA is a multiple of your maximum allowable CPA rather than a near miss, or if week one revealed that the reachable audience is structurally too small for your business. Write the rule down before day 30 arrives, because the version you write in advance is more honest than the version you will write while looking at the numbers. If the answer is “continue” and you do not want to run it yourself, that is what White-Glove management is for; if the answer is “the numbers do not make sense”, a ChatGPT Ads audit is the cheaper next step.
What you receive at handover
A setup engagement ends with a live account you own outright and a written record of every decision inside it. The handover matters more on this platform than on most, because several of the choices made during setup are permanent, and the person who inherits the account in six months needs to know which ones they are.
A live, verified advertiser account in your name. Created under your business identity, verified through Persona, billed by OpenAI directly to your payment method. Not our account with your campaigns in it — yours, from the first day, with us as an invited user you can remove at any time.
Measurement installed and verified before any spend. Pixel, Conversions API where the business needs server-side coverage, deduplication keys, advanced matching, and click-reference preservation checked through every redirect and consent path on your site. Verified by watching the network, not by looking at the tag manager and assuming.
Campaign architecture built and documented. Campaigns, ad groups and ads, with the objective chosen deliberately and the reasoning written down — because the objective cannot be changed later and the next person to touch the account deserves to know why it is what it is.
The first context-hint sets and creative. Five to fifteen hints per ad group, one intent per ad group, written from your customers’ language rather than your marketing copy, with the sourcing documented so you can extend them yourself.
A configuration record. The three permanent settings and why each was chosen, the pixel ID, the conversion event names exactly as configured, the URL parameter template, and the ad-group-ID to label mapping the macros will need. This document is short, boring, and the single most valuable thing in the handover a year from now.
A recorded walkthrough and a 30-day operating plan. Thirty to forty-five minutes going through the built account, plus a week-by-week plan for the first month written so your own team can execute it without us.
You own everything, including if you leave immediately
Media runs through your own OpenAI Ads account on your own billing, with no markup and no percentage of spend. If you never speak to us again after handover, you keep the account, the pixel, the conversion history, the audience data and every campaign we built. There is nothing to transfer back because none of it was ever ours.
Price and scope
ChatGPT Ads Account Setup & Launch
Account creation and verification support, measurement installation and validation, campaign architecture, first hint sets and creative, pre-launch QA, launch, and a documented handover with a 30-day operating plan.
| Included | Not included |
|---|---|
| Account creation, verification support and billing setup | Ad spend — billed by OpenAI directly to you, never through us |
| Pixel and Conversions API installation and validation | Website development beyond the measurement snippets |
| Conversion event selection and exact-match configuration | Rebuilding your analytics stack |
| Campaign, ad group and ad build | Ongoing optimization after handover — that is managed service |
| First context-hint sets and creative | Photography, video or design production |
| Product-feed connection where a catalog exists | Catalog data cleanup at source |
| Pre-launch QA pass and documented handover | Any guarantee of performance |
What moves the price above the floor is the same short list as everywhere else on this site: more than one ad account, more than one market or currency, a connected product feed, or server-side measurement running through a warehouse or a measurement partner. Each of those is real additional work rather than a packaging exercise, and each is quoted before anything starts.
There is no setup fee on top of the setup fee, no percentage of spend, and no requirement to continue into a retainer. If you want the account built and then want to run it yourself, that is a completely normal outcome and the handover is written for exactly that case.
When setup is the wrong purchase
Buy a setup engagement when you have decided to test the channel, have a real budget to test it with, and want the permanent decisions made correctly the first time. Several common situations fail that test, and each one routes somewhere better.
Your buyers are on paid ChatGPT tiers
This is the disqualifier nobody wants to lead with, so we will. Ads serve only to Free and Go tier users. They never appear for Plus, Pro, Business, Enterprise or Education accounts. If you sell to senior engineers, to enterprise IT, to agencies, or to any audience that skews heavily toward paid AI subscriptions, a meaningful share of your buyers is structurally unreachable here. That does not make the channel worthless — it makes the addressable slice smaller than your market, and you should size a test accordingly rather than discovering it in month two.
You are spending under about $1,500 a month
At that level the setup fee dominates the media and the arithmetic does not work. Follow the build sequence on this page yourself. It is the same sequence we run, in the same order, with the same gates. We will decline the engagement if you ask for it at that budget.
You already have an account and it is underperforming
Then you need a diagnosis, not a build. Buy the ChatGPT Ads audit, which will tell you whether the problem is measurement, structure, hints, bidding or the offer — and whose fee credits in full against managed service if you go that way afterwards.
You only need the tracking installed
Plenty of teams can build campaigns competently and simply do not want to touch the pixel, the Conversions API, the deduplication keys and the click-reference path. That is a conversion tracking implementation, and buying it alone is cheaper and faster than buying a full build you do not need.
You want it built and run
Managed service includes the build. Buying setup separately and then moving to a retainer means paying for the same onboarding twice, and we will point that out rather than sell you both.
Your market is not live yet
Ads Manager is available in the United States, United Kingdom, Canada, Australia, New Zealand, Japan, South Korea, Brazil and Mexico, with 31 European countries announced. If you are outside those, there is nothing to build yet. India appears in OpenAI’s published minimum-spend table at 725 INR without yet appearing as available, which is usually the shape of a market about to open — but “about to” is not a launch date, and we will not take a fee against one.
The one-minute qualification test
Ask two questions. Would a meaningful share of your buyers be using ChatGPT on a free or Go account rather than a paid tier? And can you sustain at least $1,500 a month in media for sixty days without needing the channel to work in week one? If both answers are yes, a test is reasonable. If either is no, the honest advice is to wait, and we will give it.
Sources and further reading
Every platform claim on this page traces to one of the following, with third-party figures attributed inline at the point of use. Where sources disagree — and on a platform this young they frequently do — we have said so rather than picking the tidier number.
- OpenAI Help Center — Ads in ChatGPT: The Basics, Create Ad Groups for ChatGPT Ads, and the Ads Manager onboarding, billing and measurement articles.
- OpenAI Ads Manager, observed directly. Menu paths, verification flow, permanent settings, delivery states and the pre-launch gates are described from the product as it stands in September 2026.
- Our own guide library: Ads Manager setup, how to run ads on ChatGPT, conversion tracking, advanced matching, URL parameters, context hints, writing context hints, costs and budgets, custom audiences, product feeds, and the platform change timeline.
- AdVenture Media — the analysis behind the roughly 40/60 split between immediate post-click conversions and conversions arriving later through untraceable paths.
- First Page Sage, June 2026 — conversion-rate ranges of 0.2% to 5.8% across nineteen industries. Directional by category, not a benchmark for any one account.
- Our free tools: the reach calculator, context hint generator and UTM builder.
One standing caveat about all of it. OpenAI publishes no performance benchmarks across advertisers, industries or campaign types, so anyone quoting you an industry-standard ChatGPT Ads CPC or conversion rate is extrapolating from their own book of business. The only honest comparisons available at setup are the arithmetic of your own margins and, once you have run for a while, your own history. Everything on this page is written to get you to that second comparison as quickly and as cleanly as possible.
ChatGPT Ads setup FAQ
How do I get a ChatGPT Ads account?
You create an advertiser account at OpenAI's Ads Manager using an existing OpenAI account, then complete onboarding and Persona identity verification, set your Account name and Logo under Settings → Account info, add a billing profile and payment method, and invite any other users. Only one person per business should create the advertiser account, because an email address already used to create one cannot create another.
How long does ChatGPT Ads account verification take?
There is no published SLA. Verification runs in a rolling queue and takes anywhere from the same day to a couple of weeks, and OpenAI is unable to expedite account or ad review. Anyone promising you a verification date is promising something they do not control. What you can control is not being rejected: the common causes are a missing industry classification, a business name inconsistent with your website, and incomplete Persona verification.
What is the minimum spend for ChatGPT Ads?
There is no platform-wide minimum commitment. What applies is a minimum daily budget set by your billing currency: $25 USD, £15 GBP, 25 CAD, 25 AUD, 25 NZD, 40 BRL, 150 MXN, 2,500 JPY or 25,000 KRW. Both halves of that answer matter — you are not locked into a contract, but a campaign below the daily minimum will not run.
How long until my first campaign is live?
The build work takes about two weeks, but the binding constraint is account verification, which is outside anyone's control and can take from a day to a couple of weeks. We sequence around it: prerequisites and measurement work happen while verification is pending, so that the day approval lands, the account is ready to launch rather than starting from zero.
Which countries can run ChatGPT Ads?
Ads Manager is live in the United States, United Kingdom, Canada, Australia, New Zealand, Japan, South Korea, Brazil and Mexico, with 31 European countries announced. India appears in OpenAI's published minimum campaign spend table at 725 INR but is not yet listed as available, which is usually the shape of a market about to open. Note that where ads are shown and where you can buy are different lists, so confirm in Ads Manager rather than assuming.
Who actually sees ChatGPT ads?
Ads serve only to Free and Go tier users. They never appear for Plus, Pro, Business, Enterprise or Education accounts, and users declared or predicted to be under 18 are excluded. Conversations about politics, health and mental health carry no ads at all. If your buyers skew heavily toward paid ChatGPT subscriptions, a meaningful share of your market is structurally unreachable on this channel, and you should size a test with that in mind.
Do I own the ad account, or do you?
You do, from the moment it is created. The account is registered to your business, verified under your identity, and billed by OpenAI directly to your payment method. We operate as an invited user you can remove at any time. If you walk away the day after handover you keep the account, the pixel, the conversion history, the audience data and every campaign we built — there is nothing to transfer back because none of it was ever ours.
What does ChatGPT Ads setup actually include?
Account creation and verification support, the three permanent account settings, OpenAI Pixel and Conversions API installation validated before any spend, conversion event selection and exact-match configuration, URL parameter and macro setup, campaign and ad group architecture, the first context-hint sets and creative, product feed connection where a catalog exists, a pre-launch QA pass, launch, and a documented handover with a 30-day operating plan.
Can I just do this myself?
Often, yes, and the full build sequence is published on this page so you can. The interface is genuinely straightforward. What is not straightforward is the order: measurement has to exist before spend because event-name corrections do not backfill, three account settings can never be changed, and the campaign objective is locked at creation. If you are spending under about $1,500 a month we will tell you to run it yourself rather than take the engagement.
Do you charge a percentage of ad spend?
No. The setup fee is a flat amount agreed in writing before the build starts, and there is no markup on media of any kind. Ad spend is billed by OpenAI directly to you and never passes through us. That is true of every engagement on this site, not just this one.
What do you need from me to launch?
Your legal business name, website URL, a square logo, an industry classification, decisions on country, currency and time zone, a billing address including state and postal code, an invoice delivery email, a payment method, and an OpenAI account. On the technical side we need to be able to add the measurement snippet to your site and, where server-side coverage is needed, someone who can deploy a server-side integration.
Do I need to provide creative, or do you make it?
We write the ad copy and the context hints. The unit is a single sponsored card with roughly 150 characters of total copy, so this is a copywriting job rather than a design project. You provide a square image asset, usually a logo or an existing product image — and worth knowing, the image is explicitly not one of the four inputs the auction uses to compute relevance, so it does not affect what you pay per click.
How much should I budget for a first test?
Enough to reach a readable number of conversions rather than a round number that feels comfortable. For most businesses that means $1,500 to $3,000 a month sustained for at least sixty days. Budget below the per-currency daily minimum and the campaign will not run at all; budget just above it and you will spend two months collecting a sample too small to draw a conclusion from.
Do I need a product feed?
Only if you sell a catalog of products and want feed-driven campaigns. If you do, note that the ad template currently lets you select only the image field — titles and descriptions come from the feed itself, which means your feed copy is your ad copy. Feed connection adds to the price above the floor because it is a genuine engineering review rather than a settings change.
What happens after launch? Do I run it myself?
That is entirely your choice and both outcomes are normal. The handover includes a configuration record, a recorded walkthrough and a 30-day operating plan written so your own team can execute it without us. If you would rather it were run for you, managed service picks up from there — but buying setup and then a retainer means paying for onboarding twice, so if you already know you want it run, start there instead.
What is the difference between setup and managed service?
Setup is a one-off project that ends with a live account and a documented handover. Managed service is an ongoing retainer where the account is operated week by week — hint iteration every Monday, a fortnightly creative cycle, a monthly optimization sprint. Managed service includes the build, so the two are alternatives rather than a sequence.
Is there a contract or minimum term?
Not for setup — it is a one-off engagement with a fixed price and no ongoing commitment of any kind. If you later move to managed service, that is month-to-month with 14 days' notice, no minimum term and no lock-in.
Can you set up multiple accounts for my agency or brand portfolio?
Yes, with one constraint worth planning around: there is no parent-child agency structure, and an email address already used to create an advertiser account cannot create another one. The usual approach is an alias scheme such as ads+clientname@youragency.com. The restriction applies only at creation — once accounts exist, one user can be invited into all of them and switch between them from a single login.
What if my market is not available yet?
Then there is nothing to build and we will say so rather than take a fee against an announcement. Advertisers outside available markets can register interest through OpenAI's advertiser interest form. Be careful about the country setting in the meantime: country is one of the three account settings that can never be changed, so creating an account in the wrong country to get ahead is a decision you cannot undo.
What if ChatGPT Ads does not work for my business?
It is a real possibility and the honest answer is that some businesses should not buy this channel. The clearest disqualifier is an audience that lives on paid ChatGPT tiers, because ads never serve there. We would rather establish that on a scoping call than after your launch, and we turn down engagements on that basis. If the answer is genuinely uncertain, a sixty-day test at a budget you can afford to lose is the only way to find out, and we will size it honestly.
Want it built right the first time?
Thirty minutes with Tarun to size the build and fix the price. He will also run the qualification honestly — if your buyers live on ChatGPT Plus and Pro, or your budget cannot sustain a sixty-day test, he will tell you on that call rather than after your launch.
Book a scoping call