ChatGPT Ads audit: what we check, what we find, and what it costs you to ignore it
Most underperforming ChatGPT Ads accounts are not creative problems. They are measurement problems nobody caught, structure problems nobody questioned, and hint sets nobody has rewritten since launch — and every one of those failures is silent. The conversion column simply reads zero, or reads low, and no error appears anywhere in the interface. This page is the entire eleven-check audit we run, published in full, including the version you can run yourself this afternoon for nothing.
The short version
- What it is: a fixed-scope diagnostic of a live ChatGPT Ads account — eleven checks across measurement, structure, context hints, bidding, creative, feed, delivery and incrementality.
- What you get: a written findings document, every issue ranked by cost and effort, a recorded walkthrough, a 30-day remediation plan, and an hour with Tarun to argue with it.
- What it costs: from $3,999, fixed before we start. Ten business days from access to findings call.
- The credit: if you move to managed service within 60 days, the full audit fee comes off your retainer invoices until it is used up.
- The honest part: the entire checklist is published further down this page. Most readers should run it themselves first, and we would rather they did.
What is a ChatGPT Ads audit?
A ChatGPT Ads audit is a fixed-scope diagnostic review of a live OpenAI Ads Manager account that tests measurement integrity, conversion event configuration, campaign and ad group architecture, context-hint quality, bid and budget setup, creative, product feed, post-click experience, delivery eligibility, reporting hygiene and incrementality against how OpenAI’s relevance-weighted auction actually allocates impressions. The deliverable is a written findings document and a prioritized fix list — a diagnosis, not a change made on your behalf. Ours is eleven checks, run in a fixed order, from $3,999 as a one-off engagement. Self-serve ChatGPT Ads only opened on 5 May 2026, roughly four months ago, so most accounts have never been examined against the version of the platform they are currently running on.
That definition is deliberately mechanical, because the word “audit” has been stretched to cover four different things in this category and only one of them is a diagnostic. Below is what each of the other three actually is, so you can tell which one you are being sold.
How is a ChatGPT Ads audit different from a Google Ads audit?
A ChatGPT Ads audit examines a different set of objects because Ads Manager exposes a different set of controls. There are four sidebar sections — Campaigns, Tools, Billing, Settings — and no reports tab, no audience manager and no asset library. There is no keyword layer, so there are no match types, no negative keyword list and no Quality Score to read. Roughly half of a competent Google Ads audit is the search-terms export: pull ninety days of queries, sort by cost, find the spend that bought nothing, add negatives, move on. None of that is available. The nearest equivalent in ChatGPT Ads is reading your own context hints back to yourself and asking whether a real person would type that sentence into a chat window.
What replaces the keyword layer is relevance. OpenAI runs a relevance-weighted second-price auction: ads are ranked by bid multiplied by relevance, and relevance is computed from four inputs — context hints, landing page, ad title and ad copy. The image is explicitly not an input. So a Google Ads audit that finds “your ad relevance is weak” is describing a score you can look up; a ChatGPT Ads audit that finds the same thing is describing four assets that have to be rewritten to agree with each other. If you want the fuller structural comparison, we keep one at ChatGPT Ads vs Google Ads, and the targeting-model difference is unpacked in context hints vs keywords.
What is actually being sold as a “free audit”?
A free audit is a sales call with a slide deck attached, and the deck is written before the account is opened. The economics force this: nobody spends eight unpaid hours reconciling a pixel implementation against a CSV export on the chance a prospect converts. What fits inside an unpaid hour is a look at the front screen of Ads Manager and three findings that are true of almost every account in a four-month-old channel — your bids are too low, your hints are too broad, your conversion tracking is incomplete. All three are usually correct. None of them are diagnoses.
The test is whether the deliverable names things. Does it name the pixel ID that is firing and the one configured on the campaign? Does it list which of the three required Content Security Policy directives are present? Does it say whether oppref survives your redirect chain and your consent banner? Does it state which standard event is attached to the campaign and whether the event you fire matches it exactly? A free audit that has not opened Tools → Conversions has not audited measurement, and measurement is where most of this channel’s money goes missing. Take the free call — it is a reasonable way to decide whether to buy a real audit. Just do not mistake it for one. We give the entire checklist away further down this page for exactly this reason: the list is not the product, the labor and the judgement are.
Is an audit the same thing as management?
No — an audit ends with a document, and management ends with changes made every week whether or not anyone is watching. The audit answers “what is wrong and in what order should it be fixed?” Our White-Glove ChatGPT Ads retainer answers “who is going to do it, on Monday, and the Monday after that?” at $1,499/month covering up to $10,000 in managed monthly ad spend, with Tarun personally operating the account.
The two are connected on purpose. The audit is from $3,999 as a one-off, and the fee is credited in full against your White-Glove invoices until it is used up, provided management starts within 60 days of the findings call. At $1,499/month that is roughly your first two and a half months. We state it that precisely rather than calling it “a free month”, because it is not a free month, it is more than one.
Is an audit the same thing as a tracking implementation?
No — an audit tells you the measurement is wrong and how; a tracking implementation is the engineering work that makes it right. If you already know you have no conversion tracking — nobody installed the pixel, the Conversions column has read zero since launch, and there is no Conversions API in the stack — you do not need a diagnosis, you need the build. That is Conversion Tracking Implementation, from $3,999, and the ground it covers is described in our guide to ChatGPT Ads conversion tracking.
An audit earns its fee when you cannot tell which of eleven things is wrong — when the account spends, the CTR looks acceptable, and the outcome is somewhere between disappointing and unreadable. That is the common case, and it is the case this page is written for.
Why ChatGPT Ads accounts fail differently from Google and Meta accounts
ChatGPT Ads accounts fail differently from Google and Meta accounts because the surfaces you would normally use to find the failure do not exist, and because the measurement layer reports its own breakage as a zero rather than as an error. There is no search-term report, no placement or “where ads showed” report, no auction insights and no ad-level A/B testing primitive. Reporting is aggregated by design; advertisers do not get access to chats, chat history, memories or personal details. That is a privacy decision rather than a gap OpenAI forgot to fill, and no feature request is going to close it. Six specific differences account for most of what then goes wrong.
Why does measurement fail silently?
Measurement fails silently on ChatGPT Ads because every layer that can break produces a zero in the conversion column rather than a warning anywhere in the interface. Four independent routes lead to that zero, and none of them raise an alarm.
- A missing CSP directive. The pixel needs
script-src https://bzrcdn.openai.com,connect-src https://bzr.openai.comandimg-src https://bzr.openai.com. A missingconnect-srcis the classic cause of “the pixel is installed but no conversions appear”: the script loads, the page looks fine, the events never leave the browser. - An event-name mismatch. An event can fire, be accepted and be forwarded and still report zero if it does not match the event configured for the campaign. A matching display name is not enough, and correcting the configuration does not backfill.
- A stripped click identifier. Strip
opprefat your edge with a redirect, a consent wall or a CDN rule and conversion tracking breaks entirely. Server-side it is never captured for you; the Conversions API requires you to pass it. - Impatience. Attributed conversions take 24 to 48 hours to appear, so a day-one check shows the same zero a broken pixel produces.
An account that has stopped recording conversions looks exactly like an account with a demand problem, and both get treated the same way: more budget, then a bid increase, then a decision that the channel does not work. Separating those two accounts is the audit’s first job. The Tools → Conversions pixel validation diagnostics panel is the honest starting point — it reports why events were dropped before being sent, the affected field, the error type and a recommended fix — and in most accounts nobody has opened it.
Why can you not grep for waste the way you can in Google?
You cannot grep for waste in ChatGPT Ads because there is no query log to grep. There is no search-term report, so the standard waste-hunt — export, sort by cost descending, find the spend that produced nothing, exclude it — has no equivalent. There is also no negative-hint list to exclude into. Negative hints are expected later; today the workaround is a tighter hint or a custom-audience exclusion at campaign level.
Two menus get mistaken for the missing report, and neither is it. Edit columns adds metric columns, including individual conversion events and the optional VTA (1d) column. Segment controls Device and Country breakdowns only, and will not add conversion-event columns. Between them you can slice by device and country, and that is the end of the native segmentation.
So the audit reasons forward from the inputs and pushes the segmentation downstream. The four URL macros — {campaign_id}, {ad_group_id}, {ad_id} and {ad_account_id} — are substituted at delivery time and set through the three-dot menu rather than the creation flow, which is where most operators fail to find them. Put them in values rather than keys, do not URL-encode the braces, and keep a mapping table, because macros return IDs and not names; our guide to ChatGPT Ads URL parameters covers the precedence order and the UTM generator builds the strings. Done properly, your analytics carries the ad-group detail Ads Manager will not give you. Done at the wrong level, you get one undifferentiated blob of ChatGPT traffic.
Why does bad targeting look different when hints are prose?
Bad targeting in ChatGPT Ads shows up as vagueness and mixed intent inside an ad group, not as an irrelevant query in a report, because context hints are free-text descriptions of conversations rather than keywords with match types. OpenAI’s own in-product wording is that hints “guide matching but aren’t exact-match targeting rules”. They are set at ad group level in a bare multi-line text box: no autocomplete, no suggestions, no volume estimator, no competitor research. There is no keyword planner because there are no keywords.
That changes what a targeting finding even looks like. The failure modes we see repeatedly are an ad group carrying three hints where five to fifteen is the working range; hints written as keyword strings rather than sentences; hints so narrow that impressions never accumulate enough to judge them; hints that overlap so heavily that no ad group can be told apart from its neighbour; and hints that describe the product rather than the moment the buyer is in. The last one is the most common and the most expensive, because it is invisible in the interface — the account looks fully configured.
The structural test is one ad group, one intent, written against the Audience — Intent — Topic framework and mapped across the four stages a buyer moves through: problem-aware, researching options, comparing a shortlist, ready to act. An ad group whose hints straddle two of those stages will underperform in a way no bid change can fix, because the ad copy cannot be right for both. The mechanics are in our context hints guide, and the rewriting method is in writing context hints.
| What you’d check in a Google Ads audit | What it maps to in ChatGPT Ads | Why the check is different |
|---|---|---|
| Search-terms report, sorted by cost | No equivalent. Read the ad group’s own context hints; reconcile downstream via URL macros and analytics | You reason forward from what you wrote, not backward from what was matched. Nobody can show you the conversation. |
| Negative keyword lists and shared exclusions | No negative-hint list. Tighten the hint, or exclude with a campaign-level custom audience | You cannot subtract traffic. You can only describe the traffic you want more precisely. |
| Quality Score and ad relevance diagnostics | Relevance computed from four inputs: context hints, landing page, ad title, ad copy. The image is explicitly not an input | There is no published score to read. You infer relevance from delivery and clearing price. |
| Auction insights and impression share | Not available | You cannot see competitors at all. You can only see whether your own delivery moves when your relevance inputs change. |
| Placement report and exclusions | No placement report. Ads serve to Free and Go plan users only, never Plus, Pro, Business, Enterprise or Education | Your inventory ceiling is set by plan and by policy — conversations about politics, health and mental health carry no ads — not by an exclusion list you manage. |
| Audience and demographic segmentation | Segment covers Device and Country only. No age or gender targeting, no retargeting audience, no cross-device identity | Users declared or predicted under 18 are excluded platform-wide. There is no demographic lever to audit. |
| Campaign experiments and ad A/B tests | No ad-level A/B testing primitive | Creative testing is manual and sequential, which is why accounts that change four things at once can never attribute the result. |
| Conversion tracking check in the tag interface | Tools → Conversions: data sources, event configuration, pixel diagnostics, automatic advanced matching | Every failure here is silent, and none of them backfill once corrected. |
| Bid strategy review | Objective locked at campaign creation (Reach, Clicks or Conversions); Maximize results or Manual: Max bid at ad group level | The objective is the bidding model, and it cannot be changed after creation. A wrong objective is a rebuild, not a setting change. |
The lever is relevance, not bid
ChatGPT Ads runs a relevance-weighted second-price auction: ads are ranked by bid multiplied by relevance, and the winner pays one increment above the second-place effective bid. OpenAI’s worked example has a $2.50 bid at 0.9 relevance beating a $4.00 bid at 0.4. Raising the bid raises only the ceiling on what you can pay; rewriting the hints, the title, the copy and the landing page raises the multiplier. There is still a floor — bidding much below $3 wins little or no delivery, and OpenAI’s guidance is a $3–$5 starting maximum CPC — but an audit that recommends only a bid increase has skipped the four inputs that actually move rank.
Why are two accounts built two months apart structurally different?
An account built in June 2026 and an account built in August 2026 are structurally different objects, because OpenAI shipped six changes to how campaigns are built, bid and measured in between. This is the part of the audit that has no analogue in a mature channel: before judging an account, you have to establish which version of the platform it was built against.
| Date | What shipped | What it means for an account built before it |
|---|---|---|
| 5 June 2026 | Conversions objective and oCPC go live — billed per valid click, not per conversion | Campaigns created earlier are Reach or Clicks campaigns permanently. The objective cannot be changed after creation; the August cloning feature creates a new oCPC campaign and leaves the original running until you pause it. |
| June 2026 | Product feeds and custom audiences ship | Older accounts have no feed campaign and no exclusion or bid-multiplier audiences, so retail accounts are often running text campaigns against a catalog that could be fed directly. |
| 27 July 2026 | Daily budgets become seven-day averages: maximum 2× the daily budget in a day, 7× across seven days | Pacing expectations set before this date are wrong. A $100/day budget can spend $140 on a Tuesday and $60 on a Wednesday, and an operator who has not internalized that will read normal pacing as a runaway. |
| August 2026 | Maximize results automated bidding ships, default-on for eligible new ad groups | New ad groups may be on automated bidding because nobody opted out, while ad groups created weeks earlier sit on Manual: Max bid. Two ad groups in one campaign can be running different bidding models by accident. |
| August 2026 | Platform targeting ships: iOS App, Android App or Web, multi-select | Campaigns created before this were never given a platform decision. Note that targeting is more granular than reporting — reporting groups device into Mobile and Desktop only, with mobile web counted under Mobile. |
| 17 Aug 2026 | Automatic advanced matching enabled on existing Web pixels — opt-out, and set per pixel | Expect a step change in reported conversion volume at the changeover, and annotate the date before comparing any before-and-after. A multi-property account has to change each pixel individually. |
Two further August changes matter for how an account is read rather than how it is built: VTA (1d) view-through reporting entered Ads Manager, and URL macros became usable. Both are routinely misread, the first by being summed into a conversion total where it does not belong. Measured from the 5 May 2026 self-serve launch this channel is about four months old, so treat any account convention older than roughly eight weeks as a hypothesis rather than a standard, and read our advanced matching guide before comparing a July conversion count to a September one.
Why do small samples make operators over-read noise?
Most ChatGPT Ads accounts are making decisions on sample sizes that cannot support them, and the interface does nothing to signal it. Here is illustrative arithmetic — not a client result and not a benchmark. Suppose an account spends $3,000 a month at a $4.00 average CPC. That is 750 clicks a month, roughly 25 a day. Split across five ad groups it is five clicks per ad group per day. At a 2% landing-page conversion rate, each ad group produces one conversion every ten days. Pausing the “worst” of those five ad groups after a week is not optimization; it is reading a coin toss.
The published numbers around the channel encourage the over-reading, because they disagree with each other. First Page Sage reported conversion rates spanning 0.2% to 5.8% across 19 industries on 12 June 2026. Reported CTR figures range from 0.91% to 3.8–4% to 1.5–6%. Observed CPCs run from $1.72 in one documented account — Opascope’s public case, one account, not a benchmark — up to $8–15 in B2B. An account landing anywhere inside those ranges can be told any story you like. Your own account’s history is the only comparison set that means anything, which is why the audit tests whether that history is trustworthy before it interprets what it says.
Three disciplines follow, and their absence is itself a finding. Change bids in 15–25% increments and budgets in 20–30% increments so a change stays attributable. Watch impressions for five to seven days after launching new hints before judging them. Size a pilot to the conversions you need rather than the spend you are comfortable with: a mid-market pilot of $10,000–$30,000 aimed at roughly 50–100 conversions answers questions a $1,000 test cannot, as our ChatGPT Ads cost guide works through.
The eleven checks, and what each one is looking for
The audit is eleven checks, each answering one question about a live account, each returning a severity. We publish the whole list because the list has never been the valuable part. Any competent operator can read the eleven questions below and go and ask them of their own account this afternoon, and we would rather they did — the free checklist further down this page is the same eleven checks written as instructions you can execute yourself. What we sell is the labor of running all eleven properly against a real account and its landing pages, and the judgement about which finding actually explains the number you are unhappy with.
Severity in the final column is about consequence, not effort. Critical means the account cannot report truthfully or cannot serve at all, so nothing else you conclude is safe. High means money is being spent against the problem right now. Medium means it is costing you decisions rather than dollars — which is cheaper today and more expensive over a quarter.
| Check | The question it answers | What a failing account looks like | Severity |
|---|---|---|---|
| 1. Measurement integrity | Is this account capable of telling the truth about what it produced? | Pixel present but no conversions recorded; a missing connect-src https://bzr.openai.com directive; oppref dropped by a redirect or consent wall; Conversions API events sent without obref; the pixel diagnostics panel never opened. | Critical |
| 2. Conversion event configuration | Does the event you fire match the event the campaign optimizes toward? | Events firing, accepted and forwarded while the Conversions column reads zero; a custom event matched on display name instead of Event type: Custom; a custom event set as an oCPC goal, which is not supported; an expectation that correcting it will backfill. | Critical |
| 3. Campaign and ad group architecture | Is spend concentrated enough for any single ad group to learn anything? | A dozen ad groups splitting a budget that supports three; ad groups mixing “researching options” and “ready to act” intent; a Clicks campaign being asked to behave like a Conversions campaign it can never be converted into. | High |
| 4. Context-hint coverage and quality | Do the hints describe the conversations your buyer actually has? | Three hints in an ad group rather than five to fifteen; hints written as keyword strings; hints that describe the product rather than the buyer’s moment; neighbouring ad groups whose hints are indistinguishable. | High |
| 5. Bid strategy and budget | Is the bid and budget configuration compatible with the objective and the currency? | A max bid below the roughly $3 delivery floor; a campaign-total budget being used as though it paced; a daily budget under the per-currency minimum; Maximize results left default-on in some ad groups and not others. | High |
| 6. Ad copy and creative | Does the ad answer the question the hint implies the user is asking? | One creative per ad group and no test cycle; four variables changed in one edit; copy written to describe the company rather than to continue the conversation; angle coverage that never leaves a single message. | Medium |
| 7. Product feed and catalog | Is the feed delivering what the campaign needs, at the cadence it needs? | Partial population of the 19 required fields in the 79-field spec; XML attempted, which is not supported; snapshots not refreshed daily; removals assumed to be implicit; the Products tab read as a feed inventory rather than an insights view. | High if you run a catalog |
| 8. Post-click experience | Does the page continue the conversation the ad started? | A page that answers a different question than the ad promised; a consent banner or redirect chain that strips the click identifier; forms asking for more than the offer justifies; a landing page that contradicts the hints and drags relevance down with it. | High |
| 9. Delivery, eligibility and policy | Can these ads serve at all, today? | Account name and logo not set under Settings → Account info, which alone prevents serving; billing or Persona verification incomplete; campaign dates that have passed; ads still in review; a target market that is not live; platform targeting that excludes where the traffic is. | Critical when it bites |
| 10. Reporting hygiene | Are the numbers being read the way the platform actually reports them? | VTA (1d) summed into the conversions total; conversion readouts taken before the 24–48 hour settle; ad clicks compared to analytics sessions across mismatched date ranges and time zones; cost per conversion assumed to exist rather than derived as spend ÷ conversions. | Medium |
| 11. Incrementality | Is this channel adding customers, or re-counting ones you already had? | No holdout, no self-reported attribution question at checkout, blended CAC never checked against the platform number; last-click treated as proof; view-through quietly doing the arguing. | Medium to high, rising with spend |
The order is not arbitrary. The checks run in sequence because a finding from a later check is only trustworthy if the earlier ones passed, and because the cost of acting on a wrong finding rises steeply as you move down the list. Checks 1 and 2 are the instrument: if measurement is broken, every performance judgement after it is a judgement about a broken gauge, and an ad group that genuinely does not convert is indistinguishable in the table from an ad group whose conversions never arrived. Checks 3 to 5 are the machine — structure, hints and money — which is where most of the fixable waste lives. Checks 6 to 8 are the message, and they can only be judged once the machine is pointing somewhere sensible. Check 9 is the gate, and it is run early in practice as well as read here, because a campaign that is not serving looks a great deal like a campaign that is serving badly. Checks 10 and 11 are interpretation: what the numbers mean and whether they represent anything you would not have got anyway.
Measurement comes first for one more reason that is specific to this platform. Corrections do not backfill. A campaign that has been optimizing toward a mismatched event for six weeks does not recover those six weeks when you fix the configuration — it starts learning from the day you fix it. Every week that measurement stays broken is a week of history permanently lost, which is why we will not proceed to the interesting parts of an audit while checks 1 and 2 are outstanding, and why an account with no tracking at all should buy the tracking implementation rather than the audit.
Two of the eleven are conditional rather than universal. Check 7 applies only if you run a catalog through the Ads Manager feed; if you do not, it is reported as not applicable rather than quietly passed, because a check that was never run is not a clean bill of health. Check 11 is bounded by your spend — below a certain volume, incrementality can be reasoned about but not proven, and we say which of the two we are doing. Every finding carries the evidence it rests on and our confidence in it, and where the honest answer is that the account does not yet produce enough data to settle the question, that is what the finding says. The eleven sections that follow work through each check in the order it runs, with the specific tests, the settings paths and the failure signatures for each.
Check 1: Measurement integrity
Measurement integrity is the check that establishes whether any number in the account can be trusted, and it runs first because a broken signal path makes every later judgement about structure, hints, bidding and creative worthless. In ChatGPT Ads the failure mode is silent. A missing Content-Security-Policy directive throws no error a marketer will ever see, the conversion column reads zero, nothing in the interface says why, and the account gets diagnosed as a creative problem for three months. We audit the whole path — browser to OpenAI, server to OpenAI, and the identifier that ties an individual ad interaction to an outcome — and prove each hop rather than assuming it.
There are three ways an event can reach OpenAI, and all three report to the same Pixel ID issued under Tools → Conversions. Which ones you run determines what you can measure at all, so the audit starts by establishing the inventory.
| JS pixel | Conversions API | Image tag | |
|---|---|---|---|
| Where it runs | The visitor’s browser | Your server | The visitor’s browser, HTML only |
Captures oppref | Automatically | You must pass it | No |
| Ad blockers | Blocked | Not blocked | Sometimes blocked |
| Offline and CRM events | No | Yes | No |
Is the pixel present, and is it initializing correctly?
The OpenAI Pixel is one SDK loaded from https://bzrcdn.openai.com/sdk/oaiq.min.js, exposing a single global function, oaiq. Initialization is oaiq("init", { pixelId: "<ID>" }); every event is oaiq("measure", "<event>", <data>, <options>). Passing debug: true writes confirmation to the browser console. It is the fastest ground-truth test available and the one most accounts have never run.
Three things go wrong here and all three survive a casual look at the page source. Partial coverage: the pixel is on the homepage and the product page but not on the order-confirmation template, the post-payment redirect, or the thank-you page behind a form. Wrong Pixel ID: a live risk for any business with more than one property, more than one region, or a staging environment copied to production — events fire, the console looks healthy, and they land in a data source nobody reports on. Initialization order: init has to run before any measure call, and a template or container that reverses the two will not report the event.
The audit reads the rendered source of every converting template, records the Pixel ID string it finds, compares each against the data sources under Tools → Conversions, and then fires a live test conversion with debug: true open. Anything short of that is inference. Our ChatGPT Ads conversion tracking guide walks the installation end to end if you want to work through it yourself first.
The three CSP directives — miss one and the pixel fails silently
If your site sends a Content-Security-Policy header, the pixel needs all three of the following, 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 andoaiqis undefined; at least the console says so loudly.connect-src https://bzr.openai.com— permits the browser to transmit the measured event. Miss this and the SDK loads,initsucceeds,measureappears to run, and nothing ever reaches OpenAI.img-src https://bzr.openai.com— permits the image-tag transmission path.
A missing connect-src is the classic cause of “the pixel is installed but no conversions appear.” It is the highest-yield ten-minute check in this audit, because the symptom is indistinguishable from “the channel does not work” and the fix is one line in a header. Confirm it by opening a converting page with DevTools on the Console and Network tabs: the violation is logged as a blocked request to https://bzr.openai.com. Security teams tighten CSP headers on their own schedule, so this is also a regression that surfaces months after a working installation — it belongs on a recurring check, not just a launch checklist.
Does your tag manager load it reliably, and in the right order?
A tag manager adds two risks a hard-coded snippet does not have. Load reliability: the container can be blocked, deferred behind consent, or fired on a trigger that misses a converting path, so the pixel is present in the container and absent on the page. Sequencing: tag managers do not guarantee execution order between tags unless you make them, and a container firing measure before init does not report the event.
We confirm the container loads on every converting template, that the initialization tag is bound to a trigger which always precedes the event tag, and that the event tag is not also duplicated by a hard-coded snippet left from an earlier implementation. A duplicated snippet is a real finding, because the two copies are rarely passing the same event_id — and once the identifiers differ, nothing deduplicates them. The count inflates, the apparent cost per conversion deflates, and oCPC bids toward an outcome happening less often than the interface claims.
Is the Conversions API doing the work the pixel cannot?
The Conversions API is the server-side path — POST https://bzr.openai.com/v1/events?pid=<PIXEL-ID> with Bearer authentication — and it is not an optional refinement in three situations. It is mandatory where ad blocking materially affects your audience, because the JS pixel is blocked and the API is not. It is mandatory where the conversion does not happen in a browser: a CRM-qualified lead, a phone-booked appointment, a subscription that activates after a trial. And it is strongly advised wherever you intend to run the Conversions objective, since oCPC is only as good as the density and reliability of the signal it optimizes against, and the API is more reliable than the pixel alone.
The audit checks coverage first — which real conversion events exist server-side, which exist only in the browser, which exist in neither — then checks the field integrators most often drop. oppref is not auto-captured server-side. You must pass it, as obref inside the user object, which means your server has to have received it from the browser in the first place, usually by reading the __oppref cookie at checkout and storing it against the order. A beautifully engineered CAPI integration with no obref in the payload is sending OpenAI events it cannot attribute to an ad.
While implementing, validate_only: true lets you exercise the endpoint without writing data. That flag left switched on in production is its own quiet failure: every call returns success, engineering signs it off, and nothing is ever recorded.
Are the pixel and the API deduplicating against each other?
Deduplication requires the same conversion to carry the same identifier in the pixel’s event_id and the API’s id, and for custom events that custom_event_name match on both sides too. Get it right and the two paths reinforce each other, with the API filling in what ad blockers 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.
- 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 worse than under-counting because it is invisible in the direction people check — nobody investigates a number that looks better than expected. The audit reconciles the platform conversion count against your own backend order count on the same date range and time zone, and a persistent ratio near 2:1 is diagnostic on its own.
Is oppref surviving the trip to your landing page?
oppref is OpenAI’s privacy-preserving click identifier. It is appended to the landing-page URL when someone interacts with your ad, the pixel captures it automatically into a first-party cookie named __oppref, and it identifies an individual ad interaction. It is the mechanism by which a conversion gets 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. The conversions are recorded against the pixel and simply cannot be attributed to any ad interaction, so Ads Manager stays at zero while your analytics package cheerfully reports the traffic. The culprits are ordinary infrastructure decisions taken by people who have never heard of this 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 unrecognized query parameters, an SPA router rewriting the URL on first paint, or canonical-URL enforcement that redirects ?-bearing URLs to the clean version.
Confirming it takes minutes. Append a test parameter to your landing-page URL, load it through the exact path a real click takes including any consent interstitial, watch the address bar after every redirect settles, then look for __oppref under Application → Cookies. If the parameter is present on the first request and absent on the last, you have found the account’s primary problem and the rest of the audit is bookkeeping. Worth reading alongside: how the four URL macros and landing-page query parameters work, a different mechanism serving a different purpose. oppref is how OpenAI credits a conversion to an ad; macros are how you credit a customer to an ad group.
Is the identity data hashed the way OpenAI expects?
Identity fields split into two categories and confusing them is a common, correctable finding. 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 field 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.
The audit inspects one real outgoing payload rather than reading the integration code, because the code frequently does not describe what the code does. Both errors are also on the standard failure list for connected ChatGPT Ads measurement partners such as Hightouch and WorkMagic, alongside non-unique primary keys, mismatched event_id values, backfilling history on first sync, and amounts sent in major units. Where a partner is connected, we check its configuration as carefully as your own code.
Is Automatic Advanced Matching on, and did anybody annotate the date?
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 that matter for an audit.
- The setting is per-pixel. A business with several properties, regions or a separate app funnel has several pixels, each checked and set 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 delivers server-side coverage has a gap it does not know about.
- Manual advanced matching alongside it is the strongest configuration. Automatic matching only sees what a visitor types into a form on the page.
- Expect a step change in reported volume at the changeover, and annotate the date. An account whose reported conversions rose in the second half of August 2026 has a measurement event in its history, not a performance improvement, and anyone comparing July with September without that annotation is drawing conclusions about the wrong thing.
The advanced matching guide covers configuration and the double-hashing trap in detail. The audit’s job is to establish current per-pixel state, whether internal traffic is polluting the matched set, and whether 17 August 2026 is annotated in whatever the client treats as a system of record.
Have you waited 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. This is the single most common reason an operator concludes a correctly configured account is broken, pauses a campaign that was working, and destroys the delivery it had accumulated. Judge conversions on ranges ending at least two days ago; when you change something, mark the date and read the effect from two days after; and when a number moves, check whether the range you are comparing crosses the settle boundary before you explain the movement.
What the Pixel validation diagnostics panel tells you
OpenAI ships a diagnostics panel on the right-hand side of Tools → Conversions reporting why events were dropped before being sent: the affected field, the error type, and a recommended fix. It is the closest thing the platform has to an error log for measurement, most accounts have never opened it, and it is the first screen we ask for.
Its limits matter as much as its contents. It reports events dropped before transmission. It cannot report an event that was never fired, an event blocked by a CSP directive, an event lost to a stripped oppref, or an event that arrived perfectly and matched no configured conversion. An empty diagnostics panel is not a clean bill of health — the account with the worst measurement problem is precisely the one whose panel is empty because nothing is reaching OpenAI at all.
The ten-minute diagnostic table
This is the table we work from. Each row pairs a symptom observable in Ads Manager or your own backend with the cause that explains it most often, and a confirmation you can finish in about ten minutes without waiting on a developer.
| Symptom | Most likely cause | How to confirm it in 10 minutes |
|---|---|---|
| Pixel is installed and the conversion column has never left zero | Missing connect-src https://bzr.openai.com in the site’s Content-Security-Policy header |
Open a converting page with DevTools on Console and Network. The violation appears as a blocked request to https://bzr.openai.com. The SDK will have loaded normally, which is what makes this convincing. |
| Events confirm in the debug console, Ads Manager still shows zero | The event you send does not match the event configured for the campaign | Compare the exact string in your oaiq("measure", …) call against Tools → Conversions. For custom events the type must be Custom and the name must match character for character. |
| Conversions run at roughly twice your real order count | Pixel and Conversions API send different identifiers, so deduplication never fires | Pull one order and compare the pixel’s event_id with the API’s id. They must be the same string — the order ID, not a timestamp, random value or session ID. |
| Conversions collapsed overnight with no site release and no campaign change | oppref is being stripped at a redirect, consent wall, link shortener or CDN rule |
Load the landing page with a test query parameter through the real click path, let every redirect settle, then check the address bar and look for __oppref under Application → Cookies. |
| Conversions register only for visitors who accept cookies | Consent sequencing: oaiq("consent", true) never runs, or the consent wall drops the query string |
Walk the consent flow with the console open. The order must be oaiq("consent", false), then init, then oaiq("consent", true), and the landing URL must survive the wall intact. |
| Reported conversion volume stepped up sharply in the second half of August 2026 | Automatic Advanced Matching was enabled on existing Web pixels on 17 August 2026 | Tools → Conversions → Data Source → Edit pixel shows current per-pixel state. Annotate 17 August 2026 on the chart rather than attributing the step to a campaign change. |
| Advanced matching is on and the match rate is still poor | Double-hashed values, or uppercase hex output | Inspect one real outgoing payload. Hashed fields must be exactly 64 characters, lowercase, and hashed once from the normalized raw value — never re-hashed from a value that arrived hashed. |
| Server-side integration returns success in testing, nothing appears in reporting | validate_only: true is still set on the production code path |
Search the integration for validate_only. A validation call is accepted and discarded, so success responses prove nothing about recording. |
| A whole block of server-side conversions is missing for one period | One malformed event failed a batch, and the entire batch failed with it | Check integration logs for a rejected batch response. Batches run up to 1,000 events and one failure takes the batch down, so the gap has a hard edge rather than a taper. |
| Server-side events rejected on timestamp | timestamp_ms outside the accepted range |
Compare the sent timestamp_ms against real time. It must be within the last 7 days and no more than 10 minutes in the future; a time-zone offset or a late CRM export explains most of these. |
| Platform conversions sit well below backend orders, with the gap concentrated in technical audiences | Pixel-only measurement with no Conversions API coverage, blocked in-browser | Compare pixel-recorded conversions against backend orders on the same date range and time zone. With no server-side path at all, the gap is structural rather than a bug. |
| Some converting pages report and others do not, on the same site | Wrong Pixel ID on one template, or no pixel on that template | Read the rendered source of every converting template, record each Pixel ID string, and compare against the data sources under Tools → Conversions. |
| The event fires, no error appears, nothing is recorded, and CSP is correct | A tag manager fired the measure call before init |
Reload with debug: true and read the console in sequence. A measure call appearing before any initialization confirmation is your answer — fix the trigger order and re-test. |
| Yesterday’s conversions look catastrophic | You are reading data inside the settle window | Re-check the same date range 24 to 48 hours later before acting. No day-one conversion data is stable enough to pause a campaign on. |
What this means for your account
Every check above is something you can run this afternoon with browser DevTools, Tools → Conversions, and your own order table. What you buy when you buy the audit is not the list — the list is right here — it is somebody running all of it in sequence, on your account, without skipping the one check that turns out to matter. If your conversion column reads zero today, start with the connect-src directive and the oppref path. Between them they explain more zero-conversion accounts than every other cause combined.
Check 2: Conversion event configuration
Conversion event configuration is the check that verifies the event your site sends is the same event the campaign is counting, and it is separate from measurement integrity because an event can fire correctly, be accepted by OpenAI, be forwarded successfully, and still report zero. Configuration failures do not produce errors. They produce a silent zero in the conversion column of an account whose pixel is installed perfectly, which is why operators who have verified their pixel often stop looking exactly one step before the answer.
What does “exact match” actually mean here?
The rule has three parts and each traps a different kind of account. For standard events, the event type configured in Ads Manager must match the event type you send. Sending checkout_started to a campaign counting order_created produces zero, not an approximation. For custom events, Ads Manager must use Event type: Custom and the name must match exactly. Custom names take 1 to 64 characters, alphanumerics plus underscore and dash, starting and ending on an alphanumeric — and matching means character for character, including case and separator style. quote_requested and Quote_Requested are two different events.
The third part costs the most money. A matching display name is not enough. Ads Manager lets you give a conversion event a human-readable label, and a label reading “Quote Requested” sitting on an event whose type is standard, or whose underlying name is quote-requested, looks right to everyone who reviews the account and matches nothing. Screenshots of the conversion setup do not prove correctness. The underlying type and name string do, and they are what the audit reads.
Correcting the configuration does not backfill. The conversions you missed while it was wrong are gone.
That changes the economics of this check. Other measurement defects are recoverable in the sense that you can reconstruct what happened from your own backend. A mismatched conversion event costs you the platform’s record permanently, and it costs oCPC the training signal it needed at the exact moment you most wanted it learning. This is why we verify the configured conversion is attached to the campaign before traffic starts, and why a two-week-old account with a mismatch is a materially better outcome than a six-month-old one.
The 13 standard events and their four data shapes
OpenAI supports 13 standard events grouped into four data shapes. The shape determines what payload the event expects, so choosing the event that genuinely describes your outcome matters more than choosing the one that reads best in a report.
| Event | Data shape | What it should represent |
|---|---|---|
order_created | contents | A completed purchase. The primary revenue event for retail and e-commerce. |
checkout_started | contents | Checkout entered. A higher-volume proxy while purchase volume is thin. |
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. Too broad to be a serious optimization goal in most accounts. |
lead_created | customer_action | A form-completed lead. The primary event for most B2B and services accounts. |
registration_completed | customer_action | An account or profile created. |
appointment_scheduled | customer_action | A booking or call scheduled — the right event for calendar-driven funnels. |
app_installed | customer_action | An app install. |
app_opened | customer_action | An app open. |
trial_started | plan_enrollment | A trial begun. The standard SaaS mid-funnel event. |
subscription_created | plan_enrollment | A paid subscription started. |
custom | custom | Anything the list above does not describe. Not eligible as an oCPC goal. |
Why custom cannot be your Conversions objective goal
custom is not eligible as an oCPC goal. If your real business outcome is something the 13 standard events do not describe — a qualified enquiry passing a scoring threshold, a sample requested, a configurator completed — you can measure it as a custom event and you should. You simply cannot point a Conversions campaign at it.
The fix is to fire a standard event alongside your custom one at the same moment, choosing whichever standard event most honestly describes the action — usually lead_created for enquiry-shaped outcomes, appointment_scheduled for booking-shaped ones. The custom event carries your reporting nuance; the standard event carries the bidding signal. Both must deduplicate correctly against their server-side counterparts, and for the custom event that means custom_event_name matching on both sides in addition to the shared identifier.
The four gates an account must clear before oCPC will run
The Conversions objective has four prerequisites, and cloning an existing CPC campaign into an oCPC one relaxes none of them. We check all four explicitly, because three fail quietly and the fourth fails with an error most people never see.
- 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 it is the only way to close the loop.
- 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 at all.
- The event belongs to this ad account, with an active conversion source. Events do not travel between accounts. Since country, billing currency and time zone are set once at account creation and cannot be changed, a migration is sometimes unavoidable — and the event configuration always has to be rebuilt on the far side.
- The account is enabled for conversion bidding. Otherwise the platform returns 403
Conversion bidding is not enabled. That string is the whole diagnosis: an account-level entitlement, not a configuration mistake, and no amount of re-checking your pixel will resolve it.
Is the revenue value in the right units?
Money is in ISO 4217 minor units
$129.99 is sent as 12999. Not 129.99, not 130. The platform reads whatever integer arrives as minor units, so an integration sending major units does not error — it records a number roughly two orders of magnitude too small. Illustrative arithmetic: a $129.99 order sent as 130 is recorded as 130 minor units, which is $1.30. A month of those produces revenue and ROAS figures that are internally consistent, plausibly formatted, and about a hundredfold wrong.
Amounts in major units is a documented failure mode for connected measurement partners as well as hand-rolled integrations, so check the partner mapping and your own code with equal suspicion. Confirm it by taking one known order, finding it in reporting, and comparing the recorded value against the real one.
Does the server-side batch behave the way your integration assumes?
Two Conversions API constraints shape how an integration should be built, and both cause outages that look like measurement failures when they are batching failures. A batch carries up to 1,000 events, and the entire batch fails if one event fails. One malformed record — a bad hash, a missing required field, a value in the wrong units — takes the other 999 with it. Integrations that log a batch-level result and move on report a clean run while losing a day of conversions, and the gap that leaves has a hard edge at both ends rather than a taper, which is how you recognise it.
The second constraint is temporal. timestamp_ms must be within the last 7 days and no more than 10 minutes in the future. That rules out backfilling old history on first sync — a partner failure mode in its own right — and rules out any pipeline whose clock drifts ahead. A job exporting CRM outcomes weekly rather than daily sits on the boundary and drops events on any week it runs late.
The “zero conversions” triage ladder
When the conversion column reads zero, work this sequence in order and stop at the first step that fails. It is ordered by how quickly each step resolves and how often each cause is the real one, so the cheap checks come before the ones that need a developer.
- Confirm you are looking at the right column. Individual conversion events are added through the three-dot menu → Edit columns, under Conversions & events. Segment will not add them — Segment controls Device and Country breakdowns only. A surprising number of zero-conversion reports are a column nobody enabled.
- Wait out the settle window. Allow 24 to 48 hours for attributed conversions to appear, then re-read the same range. Do not troubleshoot inside that window and do not pause anything on the strength of it.
- Confirm the campaign has a conversion event attached. On Conversions campaigns the event is set at campaign level, and the objective is locked permanently at creation — a CPC campaign cannot be converted to oCPC, only cloned into a new one.
- Confirm the event lives on this ad account with an active conversion source. Events do not move between accounts, so an event inherited from a previous account or a previous agency will not report here.
- Compare the configured event against the string you actually send. Standard event type must match the type sent. Custom events need
Event type: Customand a character-for-character name match. Ignore the display name entirely — it proves nothing. - Fire a live test conversion with
debug: true. This separates “the event is not firing” from “the event is firing and not matching”, which are two completely different repairs, and it takes about two minutes. - Check the three CSP directives.
script-src https://bzrcdn.openai.com,connect-src https://bzr.openai.com,img-src https://bzr.openai.com. If the console showed a cleanmeasurecall and nothing is arriving, this is the likeliest explanation. - Open the Pixel validation diagnostics panel. Tools → Conversions, right-hand side. It names the dropped field, the error type and a recommended fix. Remember that an empty panel is not a pass.
- Verify
opprefsurvives the click path. Load the landing page through every real redirect, consent screen and CDN rule, then check for the__opprefcookie. A conversion recorded with no ad interaction attached never appears in a campaign report. - Audit the server-side path. Check that
validate_onlyis off in production, thatobrefis present inside theuserobject, thattimestamp_mssits inside the accepted range, and that no batch is being rejected wholesale. - Reconcile counts and identifiers. Compare platform conversions against backend orders on the same date range and time zone. If the platform reads roughly double, the pixel
event_idand APIidare not the same value. - Fix, annotate, and re-cut the date range from the fix forward. Corrections do not backfill, so the historical period stays wrong permanently. Mark the fix date, treat everything before it as unusable for conversion analysis, and give the account another 24 to 48 hours before you read the result.
What this means for your account
If your conversion column reads zero and your pixel is verifiably firing, the answer is almost always in this section rather than the previous one. Walk the ladder in order — it is written to be executed, not admired — and if you reach step twelve, fix it today rather than next sprint, because every day the configuration stays wrong is a day of conversions you will never get back and a day of oCPC learning that never happened. The conversion tracking guide carries the implementation detail for each step.
Check 3: Campaign and ad group architecture
Campaign and ad group architecture in ChatGPT Ads is audited against three fixed facts about Ads Manager: the campaign objective is locked permanently at creation, context hints and bid strategy live at ad group level, and budget is set at campaign level. Those three constraints decide what can be corrected in place and what requires a rebuild, which is why this check runs before any optimization work is proposed. There is no point rewriting hints inside a campaign that is on the wrong objective and always will be.
Is the campaign on the right objective — and can it be changed?
The objective is set once at campaign creation and cannot be changed afterwards, 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. Everything downstream — what the auction optimizes toward, what you are billed for, what the numbers in the table mean — is decided by a dropdown the advertiser touched once, often months ago, usually without knowing it was permanent.
| Objective | Billing | Optimizes for | Changeable after creation |
|---|---|---|---|
| Reach | CPM, per 1,000 impressions | Broad delivery at scale | No |
| Clicks | CPC, per valid click | Clicks from users likely to engage | No |
| Conversions | oCPC — billed per valid click, not per conversion | Clicks likelier to drive your conversion goal | No |
The finding this produces is one of the most common in the whole audit, and it is entirely invisible from the performance table. An account has a working pixel, a live standard event, and several months of accumulated conversion data — and every campaign in it is still running on Clicks, because Clicks is what existed when the account was built. The Conversions objective went live on 5 June 2026. A large share of live accounts were built before that date, and nobody went back to check. The campaigns are not broken. They are simply optimizing for a cheaper click when the advertiser is paying for an outcome.
There is no in-place fix. The remedy is a new campaign, and 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. Cloning prefills the conversion event when exactly one eligible event is available, which removes the most common configuration slip during the rebuild. It relaxes none of the four eligibility gates — conversion tracking live, at least one standard event (custom events are not supported as an oCPC goal), the event belonging to this ad account with an active conversion source, and the account enabled for conversion bidding. We check all four before recommending a rebuild, because a clone into an account that fails gate four produces a 403 Conversion bidding is not enabled rather than a campaign. The mechanics are covered in full in our guide to running ChatGPT Ads conversion campaigns on oCPC.
How many ad groups should a campaign have?
One ad group holds one intent, and the ad group is where context hints and bid strategy are set, which makes it the only unit at which this channel can be steered. The temptation is to split further: an ad group per persona, per product line, per phrasing, per geography. Every one of those splits is free to make in the interface and none of them creates additional demand. They divide the same campaign budget into thinner slices, and thin slices are what starve a bid strategy of the conversion density it needs to do anything at all.
The legitimate reason to split is a genuine difference in intent, not a difference in vocabulary. The four-stage architecture we use is problem-aware, researching options, comparing a shortlist, and ready to act. A buyer at each of those stages needs a different landing page and a different ad, so each earns its own ad group. Two ad groups that would send traffic to the same page with the same offer do not describe two intents; they describe one intent written twice.
Illustrative arithmetic. The following figures are invented to show the shape of the problem, not drawn from any client account. Take a campaign on a $9,000 monthly budget — roughly $2,100 a week — at a $4.00 average CPC and a 3% landing-page conversion rate. That is about 525 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 (at $4.00 CPC) | Conversions each per week (at 3%) | What a bid strategy can read from that |
|---|---|---|---|---|
| 1 | $2,100 | 525 | ~15.8 | At the bottom edge of the 15–20 weekly conversions where automated bidding becomes viable |
| 2 | $1,050 | 263 | ~7.9 | Below the threshold. Weekly totals swing on two or three conversions |
| 3 | $700 | 175 | ~5.3 | Below the threshold. A single good day looks like a trend |
| 4 | $525 | 131 | ~3.9 | Below the threshold. Week-on-week comparisons are noise |
| 6 | $350 | 88 | ~2.6 | Roughly one conversion every three days per ad group |
| 9 | $233 | 58 | ~1.8 | Most ad groups post zero conversions in most weeks |
| 12 | $175 | 44 | ~1.3 | Nothing in the account is measurable at ad-group level |
Read the first row again, because it is the uncomfortable one. At $9,000 a month with those assumptions, the entire campaign undivided sits at the density floor, not comfortably above it. Segmentation is not a free organizational preference at this spend level; it is a decision to give up ad-group-level measurement in exchange for tidier reporting. Most accounts we audit have made that trade without noticing they made it.
When does consolidation beat segmentation?
Consolidate when the ad groups are not producing separable evidence, and keep the split when they are. The diagnostic is three questions, answered per ad group over a trailing 28 days:
- Did it deliver at all? Pull impressions per ad group over the last 7 and 28 days. Any ad group at or near zero impressions is not a segmentation choice, it is a dormant container — and it is often dormant because its hints are too narrow rather than because its budget is too small.
- Did it produce enough conversions to compare against anything? Under roughly 15–20 conversions a week, differences between ad groups are not readable. Two ad groups at four and six weekly conversions have not told you which one is better; they have told you nothing, twice.
- Would the two ad groups send a buyer to different pages with different offers? If the answer is no, they hold the same intent. Merge them, merge their hint sets, and delete the duplicates.
The consolidation itself is cheap: hints and bid strategy are ad-group settings, so merging two ad groups inside a campaign does not disturb the objective, the conversion event, or the accumulated campaign history. That is the opposite of the objective problem, where nothing can be fixed without a rebuild.
The structural details that quietly stop ads serving
For an ad to serve, the ad and both of its parents must be enabled — the campaign, the ad group and the ad itself. 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. We walk the full three-level status chain rather than trusting any single view.
Naming is a functional key, not decoration. Ad group names must be unique within a campaign, and ad names must be unique within an ad group. Two things depend on that beyond tidiness. Bulk upload identifies parents by name — the ad group row carries parent_campaign and the ad row carries parent_ad_group — and if validation fails on a single row the platform usually rejects the entire upload. Separately, the URL macros return IDs rather than names, so every account needs a mapping table from {ad_group_id} back to something a human recognizes. Ambiguous or near-duplicate names across campaigns make that table unreliable at exactly the moment you need it, which is when the analytics numbers disagree with Ads Manager.
Daily budget or campaign-total budget?
A daily budget is a delivery target and a campaign-total budget is a spending limit, and the two behave nothing alike. The daily budget paces — since 27 July 2026 it paces as a seven-day average, which is covered in detail under the bid and budget check below. The campaign-total budget does not pace at all: it is not distributed evenly across the campaign’s dates, and spend against it can accumulate far faster than a straight line would suggest.
The one-way switch
Switching a campaign from a campaign-total budget to a daily budget is permanent. You cannot switch back, and the only remedy is a new campaign. We record which budget type every campaign is on during the audit, because it is one of the few settings where the wrong choice compounds silently — a campaign-total budget that burns three weeks of intended spend in four days looks, in the daily table, like a good week.
What this means for your account
Two architecture faults cannot be fixed in place: the campaign objective and a campaign-total budget that has already been switched to daily. Both require a new campaign, and both are cheaper to catch in an audit than to discover after another quarter of spend. Everything else at this level — ad group count, hint placement, naming, status chains — is editable, and most accounts need consolidation rather than further segmentation.
Check 4: Context-hint coverage and quality
Context-hint auditing asks four questions of every ad group: whether there are enough hints, whether each hint describes a buyer’s situation rather than a product, whether the ad group holds exactly one intent, and whether the hints have changed since the day the account launched. Hints are the primary targeting control in ChatGPT Ads and one of four inputs into the auction’s relevance score, which makes hint quality both a reach lever and a price lever. It is also the part of the account with the least reporting support anywhere in the platform, and that constraint shapes everything about how the work is done.
OpenAI’s own definition is worth holding onto, because it is more modest than most advertisers assume: at the ad group level, advertisers provide context hints that describe the conversations, topics or keywords where their products or services may be relevant, and those hints guide ad matching but are not exact-match keywords and do not guarantee delivery in specific conversations. The in-product string says the same thing more bluntly — hints “guide matching but aren’t exact-match targeting rules.” Our cornerstone guide to context hints covers the mechanism in depth.
The interface reinforces how little scaffolding exists. Hints go into a bare multi-line text box at ad group level. 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.
What does a good context hint actually look like?
A good hint is a described scenario: a person, the thing they are trying to decide, and the constraint they are deciding under. The canonical shape is something like a user comparing running shoes for a first marathon, worried about cushioning over long distances, on a mid-range budget. That single sentence carries an audience, an intent and a topic — the three elements of the framework we write against — and it describes a moment in someone’s life rather than a line in a catalog. A bad hint reads like a search query, a product spec sheet, or a demographic.
The rewrites below are the pattern. Each “before” is a category of hint we find repeatedly; the wording is illustrative rather than lifted from any account.
| Before | After | What changed, and why |
|---|---|---|
| running shoes | Someone comparing running shoes for a first marathon, worried about cushioning over long distances, on a mid-range budget. | A two-word noun phrase is a keyword. It contains no buyer, no situation and no constraint, so it gives the matcher nothing to recognize a conversation by. |
| best running shoes 2026 | A runner who has narrowed the choice to two or three shoes and wants to know which one holds up past mile eighteen. | Strips search-engine syntax — superlative plus year — and names the decision stage instead, which is what distinguishes this ad group from an earlier-stage one. |
| Our shoes use a proprietary dual-density foam midsole with a carbon plate. | A runner whose knees ache after long runs and who is asking whether more cushioning would actually help. | Describes the buyer’s problem rather than the product’s feature. The spec is good ad copy and a bad hint; hints describe the moment the product gets considered. |
| B2B SaaS project management software for enterprise teams | An operations lead at a 200-person company whose team has outgrown shared spreadsheets and who is scoping tools before asking finance for budget. | Replaces a category label with a person, a trigger and a position in the buying process. Category labels describe the seller’s market, not the buyer’s situation. |
| affordable, cheap, budget, low-cost accounting software | A freelancer filing a self-assessment return for the first time, looking for the cheapest way to keep books an accountant will accept. | A comma-separated synonym list is a keyword list wearing a sentence’s clothes. There are no match types here, so stacking near-synonyms buys nothing and burns hint slots. |
| Anyone interested in fitness. | Someone returning to the gym after a year away, unsure how to structure a first week back without picking up an injury. | The original is broad enough to overlap every other ad group in the account. The rewrite names a specific state, which is what keeps ad groups from competing with each other. |
| Left-handed competitive archers in Vermont looking for a carbon riser under $400 before the state championship. | A competitive archer upgrading from an entry-level riser and weighing carbon against aluminium on a sub-$500 budget. | The original is narrow to the point that nothing serves. Loosening the geography, the handedness and the deadline keeps the decision intact while leaving a conversation population large enough to match against. |
| buy CRM | A sales manager who has already trialled one CRM, found it too heavy for a five-person team, and is looking at lighter alternatives. | Transactional shorthand assumes a search box. Naming what the buyer already tried and rejected gives the matcher a recognizable conversation shape. |
| Dentists. | A two-chair practice owner deciding whether to hire a second hygienist or buy a scheduling system to cut no-shows. | An occupation is an audience with no intent and no topic attached. The rewrite supplies the missing two thirds of the frame. |
| People who want to save money on their energy bills. | A homeowner who has just had a higher-than-expected winter bill and is working out whether insulation or a smart thermostat pays back faster. | Adds the trigger event and the specific comparison in play, converting a permanent preference into a moment. Preferences are always true and therefore never distinguishing. |
Five to fifteen hints per ad group is the working range. Launch an ad group with about five and watch impressions for five to seven days before adding more, because adding ten hints at once removes your ability to tell which direction the ad group moved in. The count matters less than the discipline behind it: fifteen hints describing one intent is a well-covered ad group, and five hints describing five intents is a broken one. Our guide to writing context hints that actually match conversations works through the drafting process line by line.
The coverage half of this check is a counting exercise, and it takes about twenty minutes on a normal account. Open every ad group, count its hints, and record the number next to the intent the ad group is supposed to hold. Two patterns fall out immediately. Ad groups sitting at one, two or three hints were launched and never revisited — they are running on a fraction of the surface area available to them, and they are usually the ad groups with the impression shortfall. Ad groups at twenty or thirty hints have almost always absorbed more than one intent, because it is difficult to write thirty genuinely distinct scenarios about a single moment without drifting into a second one. Then map the ad groups against the four stages — problem-aware, researching options, comparing a shortlist, ready to act — and see which stages have no coverage at all. A missing bottom-of-funnel ad group is the most expensive gap on that map and the most common.
The five ways hint sets fail
- Hints written as keywords. Noun phrases, synonym stacks, and search syntax carried over from a Google Ads export. This is the single most common pattern in accounts built by someone with paid-search experience, and it is the one that looks most professional at a glance.
- Hints describing the product rather than the buyer’s moment. Feature lists, spec sheets and brand adjectives. The test: if the sentence would sit comfortably on your own homepage, it is describing you, not the person deciding.
- Hints so narrow that nothing serves. Four or five stacked qualifiers — geography, seniority, deadline, price band, brand comparison — that describe a real buyer who exists roughly twice a month. The symptom is an ad group with near-zero impressions across seven days while its siblings deliver normally.
- Hints so broad they overlap across ad groups. When two ad groups can both plausibly match the same conversation, you have split the budget without splitting the demand, and neither ad group accumulates enough conversions to be readable. This is the segmentation failure from the previous check, expressed in prose instead of structure.
- Hints that never change. The most expensive one, and the easiest to miss, because nothing in the interface flags it. An ad group whose hint set is identical to its launch-day set has had no iteration applied to the only control that steers the channel. We check the account’s change history for exactly this.
Can you see which individual hints are working?
No. There is no search-term report and no per-hint performance data anywhere in Ads Manager, and this is the structural constraint that defines the entire discipline. You cannot see which conversations your ads appeared in, you cannot see which hint caused a match, and you cannot rank the hints inside an ad group by cost, clicks or conversions. Reporting is aggregated, and advertisers do not get access to chats, chat history, memories or personal details.
What you can do is test hint sets. The ad group is the smallest unit that produces separable numbers, so the method is to hold everything else constant — ads, landing page, bid strategy, budget, targeting — change one thing about the hint set, and read impressions, CTR and conversions at ad group level after the data has settled. Attributed conversions take 24 to 48 hours to appear, so day-one readings are noise. If you change the hints and the ads in the same week, you have learned nothing about either.
Be sceptical of per-hint reports
If an agency shows you a table ranking your individual context hints by performance, ask which Ads Manager view it came from. There isn’t one. Any such table has been constructed from inference or from a one-hint-per-ad-group structure that pays for the attribution with the budget fragmentation costed out in the previous check. Both are defensible as deliberate choices. Neither is a report the platform gives you, and it should not be presented as one.
This is also why there are no match types and no negative-keyword list. When an ad group is drawing conversations you do not want, the two available remedies are a tighter hint or a campaign-level custom-audience exclusion. Negative hints are expected to arrive later, but they do not exist today. In practice the tighter hint is the realistic lever for most accounts, because a custom audience needs a minimum of 25,000 matched users to build — OpenAI recommends 100,000 or more — which is a list most advertisers running a first ChatGPT Ads test simply do not have.
Why hint quality changes what you pay, not just who you reach
The ChatGPT Ads auction is a relevance-weighted second price: entries are ranked by bid multiplied by relevance, and the winner pays one increment above the second-place effective bid. OpenAI’s own worked example makes the size of the effect plain — a $2.50 bid at 0.9 relevance beats a $4.00 bid at 0.4. 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.
Three of those four inputs are text, and two of them — the ad title and the ad copy — have to share roughly 150 characters of total copy between them; our guide to ChatGPT Ads creative covers how to spend that budget. The hints are the only relevance input with room to breathe, and the only one you can rewrite in ninety seconds without touching a landing page or re-running ad review. That makes the hint set the most consequential text in the account, and a poorly written one an ongoing tax on every click. The cost mechanics are worked through in our breakdown of what ChatGPT Ads actually cost.
What this means for your account
Rewrite hints as described scenarios, keep five to fifteen of them per ad group, hold one intent per ad group, and accept that you will be testing sets rather than individual lines. The honest version of this discipline is slower and less certain than keyword management, and any account being run as though per-hint data exists is being run on an assumption the platform does not support.
Check 5: Bid strategy and budget configuration
Bid strategy in ChatGPT Ads is set at ad group level, not campaign level, and there are two options: Maximize results, an automated strategy that shipped in August 2026 and is default-on for eligible new ad groups, and Manual: Max bid. Budget is set one level up, at campaign level, as either a daily budget or a campaign-total budget. This check reconciles those settings against the account’s actual conversion density, its efficiency ceiling, and the currency minimums that apply to it — because in most accounts we open, at least one of the three was never a decision anybody made.
Do all your ad groups use the same bid strategy?
Accounts built before August 2026 do not match accounts built after it unless somebody checked. Maximize results arrived in August 2026 as the default for eligible new ad groups; ad groups created before that date carry whatever they were set to at the time. Because bid strategy is an ad-group setting, nothing keeps the two in sync. A single campaign can hold ad groups on Manual: Max bid alongside ad groups on Maximize results, with no visual signal in the campaign view that anything differs, and with nobody in the account having chosen either.
This is one of the most valuable findings the audit produces and one of the easiest to verify yourself. Open every ad group in the account and write down two things: the bid strategy, and the max bid where one is set. If the account predates August 2026 and has had ad groups added since, expect a split. The point is not that one strategy is right — it is that a mixed account is running an unplanned experiment with no hypothesis and no way to read the result.
| Maximize results | Manual: Max bid | |
|---|---|---|
| Set at | Ad group | Ad group |
| Available since | August 2026 | Since CPC bidding shipped |
| Default for new eligible ad groups | Yes | No |
| Optimizes toward | Result volume | Whatever your bid buys |
| Guarantees a CPA, CPC or ROAS target | No — not at this time | No, but the bid is a hard ceiling per click |
| Appropriate when | The ad group clears roughly 15–20 conversions a week and volume matters more than a fixed efficiency ceiling | Conversion volume is thin, or you have a hard cost ceiling you cannot exceed |
The line in that table that decides most cases is the guarantee line. Maximize results prioritizes result volume and does not guarantee delivery against a specific CPA, CPC or ROAS target at this time. If your business has a hard efficiency ceiling — a CPA above which the customer is unprofitable, a ROAS floor a board has agreed — then automated bidding is not the instrument for enforcing it, and the ad group belongs on Manual: Max bid where the ceiling is something you set rather than something you hope for.
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, it is not an average, and it is not a promise about what a conversion will cost. For oCPC campaigns specifically, OpenAI states that there is no recommended bid amount at this time — so any figure you set is your own commercial judgement, which is why the break-even arithmetic below matters more here than on channels that hand you a suggestion.
How many conversions does an ad group need before automated bidding is worth it?
Below roughly 15 to 20 conversions a week, hold the ad group on Manual: Max bid. Automated bidding needs conversion density to have anything to work from, and an ad group producing four conversions in a week is producing a number that swings 50% on one extra sale. The architecture arithmetic above shows how quickly segmentation pushes ad groups under that line: on the illustrative $9,000-a-month campaign, splitting into three ad groups drops each one to about five conversions a week. The bid strategy question and the ad group count question are the same question asked twice.
What should the bid actually be?
OpenAI’s published starting guidance is a $3–$5 maximum CPC bid, the bid field carries a $3.00 placeholder, and the accepted range runs from $0.01 to $100.00. The range is wide and the bottom of it is a trap: bidding much below $3 wins little or no delivery. An account that has quietly set $1.50 bids to control costs has usually not controlled costs — it has stopped buying, and the spend line reads low because nothing is being served.
| Setting | Value | Why the audit checks it |
|---|---|---|
| Recommended starting max CPC bid | $3–$5 (OpenAI guidance) | New ad groups set outside this band usually have no reasoning behind the number |
| Bid field default | $3.00 placeholder | An account where every ad group sits at exactly $3.00 has accepted a default, not made a decision |
| Accepted bid range | $0.01–$100.00 | The floor is accepted by the field and rejected by the auction |
| Practical delivery floor | Much below $3 wins little or no delivery | Explains most “campaign is live but nothing is spending” findings |
| Bid change increments | 15–25% | Larger jumps make the result unreadable against a small conversion sample |
| Budget scaling increments | 20–30% | Same reason, one level up. Doubling a budget is not a test |
The increments deserve a sentence of their own, because they are the most frequently ignored numbers in this whole check. Move bids in 15–25% steps and budgets in 20–30% steps, then wait for attribution to settle before reading the result. Accounts that swing bids from $3 to $7 and back have generated a great deal of activity and no information, and the weekly conversion counts in most accounts are far too small to survive that kind of handling.
What is the highest CPC you can afford?
Break-even CPC = target CPA × landing-page conversion rate. That single line decides whether the account can work at all before any bid strategy is chosen, and it is arithmetic almost no account we audit has ever written down.
Illustrative example — the figures below are invented to demonstrate the method, not results from any client. Suppose a business sells a $400 product at a 45% gross margin, and closes 30% of the leads it generates. Maximum allowable CPA is approximately average order value × gross margin × close rate, so $400 × 0.45 × 0.30 = $54. Round the target CPA down to $50 for headroom. At a 4% landing-page conversion rate, break-even CPC is $50 × 0.04 = $2.00. That number sits below the practical delivery floor of about $3. The account cannot bid its way to profitability, and no bid strategy on the platform will rescue it — the constraint is the landing page, not the auction.
Holding the target CPA at $50 and varying only the landing-page conversion rate shows where the line falls:
| Landing-page conversion rate | Break-even CPC at a $50 target CPA | Verdict against a ~$3 delivery floor |
|---|---|---|
| 2% | $1.00 | Well below the floor. Not viable at any bid |
| 3% | $1.50 | Below the floor. Fix the page before funding the channel |
| 4% | $2.00 | Below the floor. Delivery would be minimal at a break-even bid |
| 5% | $2.50 | Marginal. Every point of page conversion rate now matters more than any bid change |
| 6% | $3.00 | At the floor. Viable, with no margin for a bad week |
| 8% | $4.00 | Workable inside the recommended $3–$5 band |
| 10% | $5.00 | Comfortable. Bid strategy becomes a genuine optimization question |
Read down the verdict column and the audit’s recommendation writes itself. For a business in the first four rows, the honest finding is that bid configuration is not the problem, and telling that business to raise its bids would be selling them a worse outcome. This is the check where a bidding audit most often concludes that bidding is not where the money is going.
How does the daily budget actually pace?
Since 27 July 2026 the daily budget is a seven-day average, not 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.
The practical consequence for an audit is that a single day’s overspend is not a fault, and treating it as one causes real damage. We regularly find accounts where somebody checked spend on a Tuesday, saw 140% of the daily budget, cut the budget in a panic, then cut it again the following week — producing a campaign that has been reset repeatedly and never allowed to accumulate a readable week. The correct read is the seven-day total against 7× the daily budget. Anything inside that is the system working as documented.
Is the budget above the minimum for your billing currency?
Minimum daily budgets are set per billing currency, and budget is a campaign-level setting, so the minimum applies to the campaign daily budget. There is no platform-wide minimum spend commitment — the two halves of that statement always belong 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.
| 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 published, but India is not yet listed as an available market |
Put the minimum next to the delivery floor and the arithmetic gets uncomfortable for small accounts. A $25 daily minimum against a $3–$5 CPC band is five to eight clicks a day at the floor — around 35 to 58 clicks a week for an entire campaign. At a 3% landing-page conversion rate that is one or two conversions a week, which is below every threshold in this section. The platform will happily accept the budget. It will not produce a dataset anybody can optimize against, and an audit that pretends otherwise is not worth what you paid for it.
What this means for your account
Check three things before touching a bid. First, whether your ad groups are on the same bid strategy at all — the August 2026 default means older and newer ad groups diverge silently. Second, whether each ad group clears 15–20 conversions a week; below that, Manual: Max bid and a hand on the ceiling. Third, whether your break-even CPC clears roughly $3 — if it does not, the landing page is the fix and the bid is a distraction.
Check 6: Ad copy and creative
Check 6 audits whether the words in the ad answer the question the context hints said the user would be asking, and whether the account is testing creative in a way that can produce a readable result. A ChatGPT ad is a single sponsored card carrying roughly 150 characters of total copy, a title, an image and a landing page URL — which means creative here is not a design exercise, it is a compression exercise. The audit does not grade the writing on style. It grades whether the copy is answering the same question the hints are matching against, and whether anything in the account’s testing history could have told you which version wins.
Because the corpus disagrees with itself about the exact field limits — three different headline and description counts are currently published — we do not quote a number for either field. Work from the total: roughly 150 characters of copy for the whole unit, which is less than this sentence. The field-by-field breakdown, including what OpenAI currently shows in the composer, lives in our guide to ChatGPT Ads creative, and the structure of the card itself is set out in the anatomy of a ChatGPT sponsored card.
Which parts of the ad does the auction actually read?
The ChatGPT Ads auction computes relevance from four inputs: context hints, the landing page, the ad title and the ad copy. The image is explicitly not an input. That single fact reorganises the entire creative audit, because it means two of the four levers that set your effective bid are the ninety-odd words a copywriter spent twenty minutes on, and none of them is the asset that took a week to shoot.
The auction is a relevance-weighted second price: ads are ranked on bid × relevance and the winner pays one increment above the second-place effective bid. OpenAI’s own worked example is a $2.50 bid at 0.9 relevance beating a $4.00 bid at 0.4. Copy is therefore a price lever, not just a click lever. An ad group whose headline drifts away from its hints does not simply convert worse — it pays more per click for the impressions it does win, or stops winning them. When we find weak copy in an underdelivering ad group, we treat it as a bidding finding as much as a creative one.
The image is not a relevance input
Swapping the image cannot change what your ad matches or what it clears at. It can change click-through rate, and it is worth testing on those grounds, but an image test is a CTR test only. Accounts that have spent three months iterating on imagery while leaving the headline untouched have been testing the one element the auction does not read. Test copy first, image second, and read the two through different metrics.
The commonest failure: the hints describe one moment, the headline answers a different question
The single most frequent creative finding in a ChatGPT Ads audit is a hint set that describes a specific conversational moment paired with a headline written for a search result or a display banner. The hints say the user is comparing two options for a ten-person team; the headline says “the #1 platform for growing businesses.” Both are competent. Together they are incoherent, because the ad arrives inside a conversation that has already established the criteria, and the headline ignores every one of them.
The following pairs are illustrative rewrites, not client work. Read the middle column as what accounts actually ship and the third as what the same advertiser could have written from their own hint set.
| Hint moment the ad group targets | Headline that misses | Headline that lands | What changed |
|---|---|---|---|
| Comparing project tools for an eight-to-twenty person agency | “The #1 rated project management platform” | “Built for 8–20 person agencies, not enterprise rollouts” | Answers the sizing criterion the conversation has already set, and drops a rank claim the user did not ask about. |
| Invoices getting lost in email threads | “Complete finance automation suite” | “Every invoice in one place, chased automatically” | Repeats the user’s problem in the user’s words instead of naming a product category they have not reached yet. |
| Whether the product is worth the money — a ready-to-act moment | “Request a demo” | “Pricing on the page. No sales call to see it.” | Removes the friction the question was actually about, rather than adding a step. |
| Damp patch on an internal wall of a Victorian terrace | “Award-winning damp specialists” | “Victorian terraces surveyed. Written report in 48 hours.” | Matches the property type in the hint and attaches a timeframe to the next step. |
| What to buy someone who already owns everything | “Shop our bestsellers” | “Unusual gifts under $60, for people who buy their own things” | Takes the shape of the constraint rather than the shape of the catalog. |
| Switching payroll providers part-way through a tax year | “Payroll made simple” | “Mid-year switch with year-to-date figures carried across” | Answers the objection that is actually blocking the switch instead of the benefit that is not. |
| Team keeps missing mandatory security training deadlines | “Enterprise-grade compliance training” | “Training your team finishes: 12-minute modules, automatic reminders” | Promises completion, which is the failure the hint describes, rather than coverage. |
| Whether an accountant is needed or software is enough | “Trusted by thousands of businesses” | “Software, plus a real accountant when the return is due” | Takes a position on the either/or the conversation is weighing, instead of offering social proof for a question nobody asked. |
The audit test is mechanical. Print the ad group’s hints next to its ads. For each ad, write the question the copy answers. If that question is not one of the questions the hints describe, the ad is mismatched, and no amount of bid adjustment fixes it. This is also why the hint work in writing context hints and the creative work cannot be separated: they are two of the same four auction inputs, and they are graded together.
How many angles should an ad group carry?
Our audit standard is three to five distinct angles per ad group, and never fewer than three. An angle is a different reason to act or a different objection answered — price, speed, fit, risk, switching cost, proof — not a different way of phrasing the same claim. Because the architecture rule is one ad group, one intent, the angles inside an ad group are all aimed at a single moment, and their job is to find out which objection is actually load-bearing at that moment.
The diagnostic for angles-versus-synonyms takes two minutes. Write down, for each ad, the one sentence a sceptical buyer would say back to it. If two ads produce the same sentence, they are synonyms and one of them is wasting delivery. “Save hours every week” and “Get your time back” both produce “I doubt it will actually save me time.” “Save hours every week” and “Migrate in an afternoon, we do the import” produce different sentences, so they are different angles. Accounts that look like they are testing heavily are usually running four synonyms of a single angle and have therefore learned nothing in three months.
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 run structurally and read from aggregate outcomes. You are not splitting traffic and being handed a verdict; you are arranging ads and ad groups so that the aggregate numbers can be interpreted afterwards. That constrains the method in three ways, and every one of them is a thing we check the account has respected.
- One variable at a time. Change the headline or the copy or the image, never two together. With no split control, a two-variable change produces a result you cannot attribute, and the account carries that ambiguity forward into every subsequent decision.
- Delivery will not split evenly, so plan for that. Illustrative arithmetic: an ad group delivers 5,000 impressions across two ads over a fortnight and the platform allocates 3,200 to one and 1,800 to the other. At an illustrative 2% click-through rate that is 64 clicks against 36. No conclusion survives a comparison at that size and that imbalance, and treating it as a result is how accounts kill the better ad.
- Read tests on matched date ranges in one time zone. Use
Export daily values— a separate export mode, not a filter on the current view — so you can align the comparison periods day by day, cover the same days of the week, and drop the first 24 to 48 hours of each period while attributed conversions settle.
A sequential test — ad A for a fortnight, ad B for the matched fortnight after — is often cleaner than a concurrent one for exactly this reason, provided nothing else in the account changes across the boundary. Whichever way you run it, note that there is no search-term report, no placement report and no auction insights, so a creative result is a movement in impressions, clicks, CTR, average CPC and conversions, and nothing more granular exists to explain it. Published CTR figures for the channel range from 0.91% to 3.8–4% to 1.5–6% depending on the source, which is wide enough disagreement that only your own account’s baseline is usable as a comparison.
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 ads. Treat it as a test rather than general availability: it is not something to build a creative strategy around, and an audit will note whether an account has been promised it.
What this means for your account
Two of the four inputs your effective bid is computed from are the ad title and the ad copy, and the image is not one of them. If your creative work over the last quarter has been image iteration, you have been optimizing the only element the auction ignores — and if your headline answers a different question from the one your hints describe, you are paying an auction penalty on every impression you win.
Check 7: Product feed and catalog health
Check 7 applies only to advertisers running a product feed campaign; if you do not have a catalog connected to your ad account, skip to Check 8 — nothing in this section affects you. For everyone else, feed health is the check with the highest ratio of severity to attention: a feed defect does not produce an 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.
Which feed is this — the commerce feed or the Ads Manager feed?
There are two separate product-feed systems at OpenAI and they are frequently confused in the same conversation. The commerce feed is the organic one and is application-gated. The Ads Manager feed is the paid one, self-serve, created at Tools → Feeds → Create Feed, and it is the only one an ads audit is concerned with. An account that has been accepted for one has not been accepted for the other, and we have seen the two treated as a single onboarding step. The full mechanics are in our ChatGPT product feed guide; what follows is what the audit verifies.
The Ads Manager feed supports up to 2 million products, with one feed connection per ad account. The specification is 79 fields, 19 of them required. One connection per account is a structural constraint worth thinking about before you build: if you sell across brands or regions that need genuinely different catalogs, that separation has to happen inside the single feed, not across several.
| Delivery requirement | What the audit checks |
|---|---|
| Transport is SFTP | That a working SFTP job exists and is owned by someone still at the company. Feeds outlive the engineer who built them. |
Parquet preferred; jsonl.gz, csv.gz and tsv.gz supported | Which format is actually being written, and whether a compressed format is genuinely compressed rather than renamed. |
| XML is not supported | Whether the feed was ported from a channel that uses XML. This is the single fastest way to have a feed that never ingests at all. |
| UTF-8 encoding | Encoding of the written file, especially for catalogs with accented product names or non-Latin scripts. |
| Stable filename, overwritten in place | That the job is not writing products-2026-09-01.parquet and rotating the name. A date-stamped filename means nothing ingests after the first run. |
| Full snapshot at least daily | Cadence and completeness — a delta file is not a snapshot, and a snapshot written weekly is stale by definition. |
| Removals are explicit only | That discontinued and out-of-stock products are actively removed. Dropping a row from the file is not a removal, and the omitted product does not disappear on its own. |
Why feed copy quality is ad copy quality
In a product feed campaign the titles and descriptions that enter the auction come from the feed, not from a copywriter. The campaign type Product feed is locked at creation and cannot be changed afterwards, and the ad template currently lets you select only the image field. Everything else in the rendered card is fed.
Put that next to Check 6 and the consequence is sharp: the one creative field you can choose in a feed campaign is the image, and the image is explicitly not an auction relevance input. The two fields that are relevance inputs — the ad title and the ad copy — 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, and it is where the whole of Check 6 has to be applied. Audit the product titles and descriptions in the source system with the same hint-to-headline test above, because there is no ad-level override to rescue them.
That makes catalog cleanliness an upstream job with a long lead time, and the audit reports it as one. 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 they are the text the auction is scoring. Descriptions written for a product detail page assume the shopper is already looking at the product; here they are the first thing said to someone who has not seen it. Rewriting them is a merchandising project, not an ads change, and it usually has to be sequenced with whoever owns the PIM or the storefront. We flag it early in the findings for that reason.
The locked campaign type is worth stating plainly as well: because Product feed is set permanently at campaign creation, an advertiser who built a standard campaign and later wants feed delivery, or the reverse, is building a new campaign rather than changing a setting. The same lock applies to the objective, which is also permanent at creation, so a feed campaign carries both decisions for its whole life. Deciding the campaign type is therefore an architecture decision made once, and it belongs in the planning conversation rather than in the builder.
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. A product missing from the Products tab is therefore not evidence that the product is missing from the feed — it is equally consistent with a product that has simply never served. To confirm feed readiness, use the product count shown during ad-group setup. This trips up almost everyone diagnosing a “missing” product: they open the tab that looks like an inventory, find nothing, and go and rebuild a feed that was fine.
The three ways ingestion fails
Feed ingestion fails in three ways, and the audit checks for each against the current 79-field specification rather than against whatever the spec said when the integration was built.
| Failure mode | What it looks like | What to check |
|---|---|---|
| Missing required fields | Some products ingest and some do not, with no obvious pattern in the catalog. | All 19 required fields, present on every row — not present on the row you spot-checked. Long-tail SKUs are where required fields go missing. |
| Outdated field names | The feed was working and quietly stopped, or a whole column stopped being read. | Field names against the current specification. A feed built against an older revision is the classic cause of an integration that degraded without anyone touching it. |
| Malformed values | Products ingest but with wrong prices, broken links or unusable titles. | Types, formats and encoding — prices, currency, availability values and URLs. Malformed data is worse than missing data, because it delivers. |
Policy exclusions and promotions
Four categories are excluded from product feed advertising: adult content, age-restricted products, weapons, and prescription medications. If a meaningful share of your catalog falls into any of them, that share is not addressable and the audit accounts for it before drawing any conclusion about feed performance. A catalog that is 30% excluded is not underperforming by 30% — it is 30% smaller than the advertiser thinks it is.
Promotions data can only be delivered via the API. There is no SFTP path for it. Advertisers who have built their whole feed pipeline around the file drop routinely discover this at the point they want to run a sale, which is the worst possible moment to discover it. If promotions matter to your calendar, the API integration is a build item now, not a later one; see the Ads Manager setup guide for where API keys live and how they are scoped.
What this means for your account
A feed campaign moves the entire creative problem upstream into your product data, because the only field the ad template lets you choose is the one field the auction does not read. If your product titles were written for a shopping channel that rewards keyword stuffing, they are now competing on relevance against ads written for conversations — and no setting inside Ads Manager can fix that.
Check 8: Post-click experience
The landing page is one of the four inputs the ChatGPT Ads auction computes relevance from, alongside context hints, the ad title and the ad copy — which makes it a targeting input and a price lever, not merely a destination. This is the least intuitive finding in the whole audit and the one operators most often argue with, because in every other channel they have run the landing page affects conversion rate only. Here it affects what you match, what you pay, and whether you deliver at all. A page audit in ChatGPT Ads is not a conversion-rate-optimization courtesy at the end of the engagement. It is part of the media buy.
The economics compound. Break-even CPC is target CPA multiplied by landing-page conversion rate. Illustrative arithmetic: a $50 target CPA against a 4% page conversion rate gives a break-even CPC of $2.00. OpenAI’s guidance is to start at a $3–$5 max CPC bid, and bidding much below $3 wins little or no delivery. At 4%, illustratively, that page cannot afford the channel’s delivery floor. The same page at 6% breaks even at $3.00; at 8%, at $4.00 — inside the recommended starting range with headroom. The page is what decides whether you can bid into delivery at all, which is why we audit it before we recommend a bid change. There is more on how the bid and cost side interacts in our guide to what ChatGPT Ads cost.
Continuity: the ad answers a question the page has to keep answering
A ChatGPT ad arrives inside a conversation where the user has already stated their constraints, and the ad has just answered one of them in roughly 150 characters. The page then has to continue that answer. What we find instead, repeatedly, is a homepage or a category page that restarts the conversation from zero — brand statement, value proposition, three benefit tiles — as if the visitor had arrived from a billboard.
The audit checks continuity in a specific direction: the promise made in the ad, in the words the ad used, should be visible above the fold without scrolling or interpretation. If the ad said “mid-year switch with year-to-date figures carried across,” the page has to talk about mid-year switching, not about payroll in general. If the ad group’s hints describe a comparison moment, the page needs to survive being read as a comparison. A page built to be the answer to a search query is built for a user who has typed three words; a page built for this channel is answering a user who has typed three paragraphs and had a model summarise the options for them.
Consent banners and redirects: where post-click and measurement failures overlap
The oppref parameter is OpenAI’s privacy-preserving click identifier, appended to the landing-page URL and captured by the pixel into a first-party __oppref cookie. Stripping oppref at your edge — a redirect, a consent wall, a CDN rule that normalises query strings — breaks conversion tracking entirely. This is the point where the post-click check and the measurement check overlap, and it is the reason we audit them in the same pass rather than treating the page as a marketing artifact and the tracking as an engineering one.
Three patterns account for most of it. A consent management platform that blocks the pixel until acceptance and never re-initializes it; the supported sequence is oaiq("consent", false), then init, then oaiq("consent", true) once consent is granted. A redirect chain — vanity domain to canonical, HTTP to HTTPS, country splitter — that rebuilds the URL and drops unrecognised parameters along the way. And a CDN or router rule that strips query strings for cache-key hygiene, which is invisible in every test that starts from a clean URL. Test by loading your live ad URL with a dummy oppref value appended and confirming it is still in the address bar at the end of the chain. Our conversion tracking guide covers the pixel side, and the URL parameters guide covers macros and precedence.
Speed, forms, and a page built for the wrong intent
Speed is checked on the device mix the campaign actually targets, not on a desktop connection. Platform targeting can include iOS App, Android App and Web, and Web covers mobile web as well as desktop, so a page that is comfortable on a laptop and heavy on a phone is being served to a materially different experience than the one you tested. Form friction gets the same treatment: every field a visitor is asked for that is not needed to fulfil the promise the ad made is friction the ad paid for.
The subtler failure is intent shape. Pages built for search intent are structured to close quickly, because search traffic arrives at the end of a decision. Conversational traffic frequently arrives mid-decision — the model has just presented options and the user is orienting. Roughly 40% of ChatGPT-ad-attributable conversions happen in the immediate post-click session and roughly 60% arrive later by paths you cannot trace, according to AdVenture Media’s analysis. A page that offers only one action, priced for a decision the visitor has not made, will lose most of that 60% because it gave them nothing to take away.
| Symptom | What it usually means | What to change |
|---|---|---|
| Clicks are healthy, conversions are zero, pixel shows as installed | oppref is being stripped before the pixel can capture it, or the pixel never initializes behind the consent wall | Trace the redirect chain with a dummy oppref; re-sequence the consent calls; check the three CSP directives are all present |
| High bounce, very short session duration, no scroll | The page restarts the conversation instead of continuing it | Put the ad’s specific promise above the fold in the ad’s own words; stop sending conversational traffic to the homepage |
| Delivery is thin despite a bid inside the $3–$5 guidance range | Landing page relevance is dragging the effective bid down — it is one of the four inputs | Point the ad group at a page that matches its single intent rather than a general category page |
| Mobile conversion rate far below desktop | Page weight or form layout on the device the campaign is actually reaching | Test on a real mid-range phone on cellular; reduce fields; remember Web targeting includes mobile web |
| Form starts far exceed form completions | Fields being collected for internal routing rather than for the promise the ad made | Cut every field not needed to deliver what was promised; move qualification to a later step |
| Conversions appear in your CRM but not in Ads Manager | Server-side events without oppref passed, or an event-name mismatch | Pass oppref as obref in the Conversions API user object; confirm the event type matches the campaign configuration exactly |
| Analytics sessions are far below reported ad clicks | Redirects, consent, browser blocking or a time-zone mismatch — not necessarily invalid clicks | Reconcile on the same date range and time zone, then check campaign and ad-level activity in the CSV export |
What this means for your account
Your landing page is priced into every auction you enter, so a generic page is not a conversion problem you can fix later — it is a bid penalty you are paying now. And if a consent banner or a redirect strips oppref on the way in, the page can convert perfectly and Ads Manager will still report zero.
Check 9: Delivery, eligibility and policy
Check 9 establishes whether the campaign is capable of serving at all before anyone interprets its performance, because a campaign that never delivered and a campaign that delivered badly look identical in a dashboard full of zeroes. The order matters: each gate below has to be cleared before the next one tells you anything true. Most “the algorithm hates us” conversations end at step one or step three.
- Account verification and billing complete. Persona identity verification finished and a billing profile with 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. Common rejection causes are a missing industry classification, a business name inconsistent with the website, and incomplete Persona verification.
- Campaign and ads active, not paused. The hierarchy is campaign → ad group → ad, and an ad serves only if the ad and both of its parents are enabled. Check all three levels rather than the one you were looking at. Campaigns created through the API launch paused by default, which accounts for a specific and entirely silent class of “the integration went live and nothing happened.”
- Campaign dates include today. An end date that has passed stops spend with no error state that draws attention to itself. Dates are evaluated in the account time zone, which is fixed at account creation and cannot be changed.
- Ads have completed review. An enabled ad inside an enabled ad group inside an enabled campaign still does not serve until review clears. There is no expedite path; the only useful response is to have submitted early.
Settings → Account info: no Account name, no Logo, no delivery
Ads will not serve unless Account name and Logo are set in Settings → Account info. This is one step in the five-step onboarding sequence and it is skipped constantly, because nothing in the campaign builder blocks you from creating and enabling a complete campaign without it. The result is total non-delivery with every campaign-level setting showing green. If an account has never delivered a single impression, check this before you check anything else — it costs thirty seconds and it is the answer more often than any bidding or targeting explanation.
Is the daily budget above 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 one of three settings — with country/region and time zone — fixed permanently at account creation, so an account in the wrong currency has a floor it cannot negotiate and the remedy is a new advertiser account rather than a support ticket.
Above the floor, daily budgets have been a seven-day average since 27 July 2026: maximum daily spend is 2× the daily budget and maximum seven-day spend is 7×. OpenAI’s own example is seven days at $100/day totalling $700, spending $140 on Tuesday and $60 on Wednesday. An advertiser reading a single day in isolation and concluding that pacing is broken is reading the system working as designed.
Is your market actually available?
Ads Manager is live to buy in 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 distinction worth being precise about, because a currency appearing in a pricing table reads to most people as a market being open.
Geo targeting is country-level everywhere, and in the United States also state, DMA and ZIP. OpenAI publishes the location catalog as a downloadable CSV; search the picker to confirm a location exists rather than assuming it does. Country is also one of the three permanently fixed account settings, and it drives eligibility — so an account created in the wrong country is a rebuild, not a settings change.
Who can see a ChatGPT ad at all?
Ads serve to Free and Go plan users only — never to Plus, Pro, Business, Enterprise or Education subscribers. Users declared or predicted to be under 18 are excluded. Conversations about politics, health and mental health carry no ads. There is no cross-device identity, no retargeting audience, and no age or gender targeting.
An audit has to check that the target market is addressable before it blames the campaign, and this is where a certain kind of B2B advertiser discovers a structural problem rather than an execution one. If your buyer is a senior engineer at a large company, a substantial share of that population is on a paid tier and is therefore not reachable through this channel at any bid. Likewise a healthcare advertiser whose entire proposition lives inside health conversations is excluded from the context it most wants. Neither finding is fixable with better hints, and both are better discovered in an audit than in month six of a retainer.
Platform targeting is more granular than reporting
Platform targeting is a multi-select shipped in August 2026 with three options: iOS App, Android App and Web — where Web covers both desktop and mobile web. Reporting does not mirror this. The Segment control groups device into Mobile and Desktop only, and mobile web is counted under Mobile. Targeting is therefore more granular than reporting, and the two do not reconcile cleanly.
The practical consequence for an audit is that you cannot read app performance against mobile web performance from the Mobile row, because the Mobile row contains both. If you need to separate them, you have to separate them structurally — different campaigns for app and web platform selections — and accept the budget fragmentation that comes with it. Note also that Segment controls Device and Country breakdowns only and will not add conversion-event columns; those come from Edit columns, which is in the three-dot menu.
| “The campaign is not serving” | Cause | Fix |
|---|---|---|
| Zero impressions since launch, every setting looks correct | Account name or Logo not set in Settings → Account info | Set both. Ads will not serve until this step is complete. |
| Ad is enabled but nothing spends | The ad group or campaign above it is paused — an ad serves only if the ad and both parents are enabled | Check all three levels of the hierarchy, not the one you were looking at. |
| Campaign created by an integration never started | Campaigns created via the API launch paused | Enable the campaign after creation, and add that step to the integration. |
| Ads have sat unreviewed for over a week | Rolling review queue with no published SLA | Wait. OpenAI is unable to expedite account or ad review; build the lead time into launch plans instead. |
| Spend stopped on a date nobody set | Campaign end date has passed, evaluated in the account time zone | Confirm campaign dates include today; the time zone is fixed at account creation. |
| Campaign will not accept the budget you entered | Daily budget below the minimum for the account’s billing currency | Raise to at least the published minimum for that currency — the currency cannot be changed on an existing account. |
| Delivery in one market, nothing in the second | The second market is not among the nine live markets | Check the live list. The 31 European countries are announced, and India’s 725 INR minimum is published without the market being listed as available. |
| Reach far below the size of your addressable market | Ads reach Free and Go users only, exclude under-18 users, and never appear in politics, health or mental-health conversations | Re-size the reachable audience honestly before rebuilding the campaign. Some of this is not a campaign problem. |
| App campaign flat although mobile was targeted | Platform multi-select excludes iOS App and Android App, or Web-only targeting is delivering mobile web that reports under Mobile | Check the platform selection; separate app and web structurally if you need to read them apart. |
| Account verification rejected | Missing industry classification, business name inconsistent with the website, or incomplete Persona verification | Correct the specific field and resubmit. Verification and ad review are separate steps. |
oCPC campaign returns 403 Conversion bidding is not enabled | The account is not enabled for conversion bidding — the fourth of the four oCPC gates | Resolve account enablement; cloning a CPC campaign into oCPC relaxes none of the gates. |
What this means for your account
Before you interpret a single performance number, confirm the account could serve: verification and billing complete, Account name and Logo set, all three levels enabled, dates current, review cleared, budget above the currency minimum, and a market that is actually live. If any one of those is false, every metric in the account is a description of nothing, and optimizing against it will make the account worse.
Check 10 — Reporting hygiene
Reporting hygiene is the check that confirms an account is being read through the views Ads Manager actually produces, rather than through reports the operator has assumed into existence. It is the least glamorous of the eleven checks and the one that most often explains why two people looking at the same account disagree about whether it works. The reporting problems we find are rarely wrong numbers. They are right numbers pulled from the wrong view, compared across mismatched date ranges, or summed together in a spreadsheet in a way the platform deliberately avoids.
What does ChatGPT Ads reporting actually expose?
Ads Manager reports impressions, clicks, spend, CTR, avg CPC, avg CPM and conversions at campaign, ad group and ad level, plus VTA (1d) where the account is eligible. Those metrics are available in three places: the table view, the Insights charts, and CSV export. Cost per conversion is not a first-class metric in all views — if you want it reliably, derive it yourself as spend ÷ conversions rather than hunting for a column that may not be there. Any reporting process that depends on reading CPA straight off the screen will break the first time someone opens a view that does not carry it.
The more expensive half of this check is the reports that do not exist. Audits routinely find operators who have built weekly process around outputs the platform has never produced, and who interpret the empty result as a data problem rather than a category error.
| Report an operator expects | Exists? | What we find built on top of the assumption |
|---|---|---|
| Search-term / query report | No | A standing negative-keyword review with nothing to review, and a “wasted spend” spreadsheet nobody can populate. There are no keywords here, so there is no query log to grep. |
| Placement or “where ads showed” report | No | Placement exclusion lists carried over from Google or Meta process, and brand-safety reporting promised to a client that cannot be delivered. |
| Auction insights of the Google Ads kind — competitor overlap, impression share, outranking share | No | Share-of-voice slides that are estimates presented as measurements. |
| Ad-level A/B testing primitive | No | “Tests” that are two ads running unevenly in the same ad group with no traffic split and no control, read as if they were an experiment. |
| Cost per conversion as a guaranteed standing column | Not in all views | CPA either read off a column that is not present, or quietly dropped from the readout altogether. |
Edit columns or Segment — which one adds the metric you want?
Edit columns adds metric columns; Segment adds breakdowns, and the two are not interchangeable. Edit columns, reached from the three-dot menu on Campaigns, Ad groups or Ads, is where you add individual conversion events under Conversions & events and the optional VTA (1d) column. Segment controls Device and Country breakdowns only and will not add a conversion-event column no matter how long you look. This confusion is one of the most common single findings in the whole audit, and it produces a specific symptom: an operator convinced that per-event conversion data is unavailable in their account, when it is two clicks away in a different menu.
There is a second trap inside Segment worth knowing before you build a device narrative. Reporting groups device into Mobile and Desktop only, and mobile web sits under Mobile. Platform targeting, meanwhile, is a multi-select of iOS App, Android App or Web, where Web covers both desktop and mobile web. Targeting is more granular than reporting. A device segment therefore cannot tell you how app traffic performed against web traffic, and any optimization built on the assumption that it can is optimizing against a boundary the report does not draw.
How do you export ChatGPT Ads data day by day?
There are three export modes, and the day-by-day file is a separate export rather than a filter. From the three-dot menu you can export the current table view, export cumulative values, or choose Export daily values for a day-by-day breakdown. Changing the date range on the table does not produce the daily file; it produces the same aggregate over a different span. Operators who need a time series and do not know the third mode exists usually end up exporting seven single-day tables by hand, which is where transcription errors enter the reporting.
The four rules for view-through conversions
VTA (1d) is counted when someone converts within one day of an eligible impression and no qualifying click receives credit for the same conversion. Where both a click and a view qualify, the click wins. Four rules govern how it may be used, and all four exist to stop view-through leaking into performance numbers.
| Rule | What it means when you report |
|---|---|
| 1. It is not in your Conversions total | The Conversions figure is post-click. VTA sits in its own column and in the attribution breakdown on hover. If a total in your deck is larger than the platform total, a human added them together. |
| 2. It does not touch performance math | No effect on CPA, conversion rate, bidding or billing. oCPC does not optimize toward it. Treating VTA as a KPI optimizes toward a number the auction is not chasing. |
| 3. The window is fixed at one day | Not configurable, and independent of whatever click window applies to your account. A longer click window does not extend the view window to match. |
| 4. No implementation changes are needed | Nothing to install, no tag to add. If a vendor is quoting implementation work to “enable view-through”, that work does not exist. |
View-through is supplemental evidence, not performance. It belongs in the read, never in the total.
Clicks are not analytics sessions
Ad clicks and analytics sessions measure different things and will never fully agree. A click is an ad interaction; a session depends on page load, redirects, consent handling, browser blocking, UTM handling, attribution windows and time zones. The correct response to a gap is reconciliation, not explanation. Compare the same date range in the same time zone, then check campaign and ad-level activity in the CSV to see where the difference concentrates — a gap sitting in one campaign is usually a redirect or a consent wall on one landing page, while a gap spread evenly across every campaign is usually a time-zone offset or an ad blocker effect.
Time zone deserves its own sentence, because it is unfixable. Your account’s country, billing currency and time zone are set once at account creation and cannot be changed. If your analytics platform runs on a different time zone, every single daily comparison you make is offset, permanently, and the remedy is to account for the offset rather than to raise a support ticket. The discipline we hold ourselves to, and the one this check enforces: reconcile the two numbers, do not pick whichever one flatters the month. If you want the mechanics of getting ChatGPT traffic to land cleanly in your analytics in the first place, our UTM builder for ChatGPT Ads landing pages and the conversion tracking guide cover the parameter and macro side.
Discard the last 48 hours
Allow 24 to 48 hours for attributed conversions to appear in Ads Manager. A day-one conversion readout is noise, and a week-to-date figure pulled on a Monday morning is missing part of the weekend. We do not send a conversion readout before the data has settled and we cut the trailing 48 hours out of any trend line. Any agency reporting yesterday’s conversion performance is reporting a number that has not finished arriving.
Check 11 — Is the channel actually incremental?
Incrementality is the question of whether the conversions ChatGPT Ads reports would have happened without the ads, and it is the only one of the eleven checks that cannot be answered inside Ads Manager. It is also the check almost nobody runs, which is why an account can look profitable for six months while buying customers it already had. For a large share of readers the honest answer is that incrementality cannot be proven at their current spend, and the useful work is deciding what to do without proof.
The structural attribution gap
This channel under-reports by design. AdVenture Media’s analysis of ChatGPT-ad-attributable conversions found that roughly 40% happen in the immediate post-click session and roughly 60% arrive later, through paths that cannot be traced. That is not a tracking defect you can implement your way out of. There is no cross-device identity in the platform and no retargeting audience, so a person who reads a sponsored card on a phone, thinks about it for two days and buys on a laptop leaves no thread the platform can follow. The click identifier that credits a conversion, oppref, identifies an individual ad interaction — it does not identify a person across devices, and it was not designed to.
The practical consequence is that the reported CPA in your account is an upper bound on true cost per acquisition, not an estimate of it. Two errors then pull in opposite directions, and most accounts have both.
- Last-click flatters some accounts and starves others. An account selling a low-ticket, single-session purchase captures most of its value inside the post-click session, so the reported number looks close to the truth. An account selling a considered B2B purchase captures almost none of it, so the reported number looks like failure. Same channel, opposite verdicts, driven entirely by the length of the buying cycle rather than by anything about the media. When a founder tells us ChatGPT Ads “doesn’t work” and their sales cycle is six weeks, that is the first thing we check.
- View-through inflates the moment you let it into the total. The platform keeps
VTA (1d)out of the Conversions total for good reason. The inflation happens downstream, in a spreadsheet or a slide, when someone adds the two columns to make a quarter look better. An account that has been reported this way for months has no usable baseline left, and rebuilding one is part of what the audit does.
What can you actually test, and at what spend?
Six instruments are available to a ChatGPT Ads advertiser, and they differ enormously in what they can prove. The table runs from the strongest evidence available down to the weakest, and the last column is the point at which we would be willing to defend the result to a CFO.
| Method | What it can prove | What it costs | Minimum spend to be meaningful |
|---|---|---|---|
| Geo holdout (matched markets) | Causal lift. Conversions rose in exposed geographies and did not rise in held-out ones, with everything else held roughly constant. | Part of your addressable market goes dark for the test window. The design and the analysis both happen outside the platform, because there is no experiment primitive to run it for you. | Around $10,000/month, and effectively US-only. Geo targeting is country-level everywhere; only in the United States can you also target state, DMA and ZIP. Outside the US there is nothing below the country to hold out. |
| Full-channel pause (on/off) | Whether total demand moves when the channel stops. Weaker than a geo holdout because time, not geography, is the control. | Lost revenue during the dark period, and a result confounded by everything else that moves in the same weeks. | Around $10,000/month plus a stable baseline, and only credible if you can stay dark for at least one full purchase cycle. |
| Self-reported attribution (“how did you hear about us”) | What the buyer remembers. The only instrument that can see any part of the untraceable majority of conversions. | One required field on the order form or lead form, plus the discipline to read it every month. Effectively free. | Around 100 responses per month before the split between channels is stable enough to read at all. |
| CRM outcome tracking (closed-won by source) | Whether the leads this channel produces become revenue, which is a different question from whether they become leads. | CRM field discipline and, usually, a Conversions API path to send offline outcomes back. | Any spend, but unreadable until a full sales cycle has completed at least twice. |
| Blended CAC movement | A directional signal: total acquisition cost improved or worsened while this channel scaled. Not proof, but the cheapest honest evidence available. | Near zero if you already track total marketing spend and total new customers. | Any spend, provided you hold the other channels roughly still and give it two to three months. |
| Before/after comparison (pre-post) | Nothing, on its own. It is a hypothesis generator, not evidence. | Nothing to run. The cost is the false confidence it produces. | No spend makes this valid. It is confounded by seasonality, by every other channel, by price changes and by anything that happened in the news. |
The minimum-spend column is our threshold, not OpenAI’s. There is no platform-native lift test to reach for — no ad-level A/B testing primitive and no auction insights — so every method above is one you construct and analyze yourself. Our own budget framing sits behind those numbers: a first test at $1,000–$3,000, a real pilot at $10,000–$30,000 sized to produce roughly 50 to 100 conversions. A test that cannot produce that many conversions in each cell cannot produce a defensible result.
Why a customer-list holdout does not work here
The obvious workaround — hold out a slice of your customer list instead of a geography — runs into two platform limits. Custom audiences require a minimum of 25,000 matched users, and OpenAI recommends 100,000 or more; most advertisers at audit-relevant spend do not have a list that clears the floor, let alone one they can afford to split. And ad-group bid multipliers never gate eligibility: a 0.1x multiplier suppresses nothing and includes everybody, so you cannot manufacture a control cell by turning a multiplier down. The only genuine suppression is campaign-level exclusion of a custom audience, which brings you straight back to the match minimum. This is worth knowing before someone sells you a list-based lift test.
Self-reported attribution is underrated, and biased
A required “how did you hear about us” field is the highest-value measurement addition most small advertisers can make, because it is the only instrument pointed at the conversions the platform cannot see. It is also biased, and stating the biases is the difference between using it and being fooled by it. Buyers name the most recent touch rather than the one that changed their mind. They substitute familiar brand names for unfamiliar surfaces, and a ChatGPT conversation is exactly the kind of search-shaped moment that gets remembered as “Google”. Non-responders differ systematically from responders, and a required field produces answers rather than truth. Read the trend rather than the level, offer a short list plus free text, and put it on the order form rather than in a follow-up email only your happiest customers answer.
What cannot be proven at small spend
A business spending $2,000 a month on ChatGPT Ads cannot run a clean incrementality test, and no methodology fixes that. The illustrative arithmetic: at $4 per click — inside OpenAI’s own $3–$5 starting guidance — $2,000 buys 500 clicks a month, and at a 2% landing-page conversion rate that is ten conversions. Split into an exposed cell and a held-out cell you are comparing five against five, and a two-conversion difference is noise. Extend the test to three months to build the sample and you are now confounded by a quarter of seasonality. The sample is the sample.
For context on how much conversion rates vary before you even start: First Page Sage’s 12 June 2026 analysis put ChatGPT Ads conversion rates between 0.2% and 5.8% across 19 industries. An account sitting anywhere in that range could plausibly produce the five-versus-five result above by chance alone. Any agency offering you a geo holdout at $2,000/month is selling a deliverable, not a result. We will not sell you one, and we will say so on the call.
The honest alternative: a decision rule and a pre-committed ceiling
When proof is unavailable, the correct substitute is a rule you write down before you spend, so that the decision is made by your pre-commitment rather than by whichever number looks best in month three.
- Write the rule before the money moves. Something falsifiable and specific: “we continue past month three if blended CAC across all channels has not worsened by more than 10%, and if ChatGPT appears in at least 5% of self-reported attribution responses.” Both halves matter — one is a cost test, the other is an existence test.
- Pre-commit the ceiling. Decide the total you are willing to spend to find out, and treat it as tuition. Illustrative: $2,000 a month for three months is a $6,000 experiment. A ceiling that is not written down becomes an open-ended budget defended by sunk cost.
- Hold the other channels still. A directional read is only readable if nothing else moved. Freeze budgets elsewhere, do not launch a new offer, and annotate anything you cannot freeze — including platform-side changes such as the 17 August 2026 enablement of automatic advanced matching on existing Web pixels, which produces a step change in reported volume that has nothing to do with your media.
- Instrument all five layers. Platform tracking, then UTMs on dedicated landing pages, then self-reported attribution, then CRM outcome tracking, then holdout and lift testing once the spend justifies it. The measurement partner guide covers the warehouse and cross-channel options where a layer needs tooling rather than discipline.
- Read at the end of the window, not weekly. Weekly readings of a small sample generate the illusion of movement and invite mid-test changes that destroy the comparison. Discard the trailing 48 hours, then read once.
- Accept a directional verdict. The output is “keep buying while we scale toward a real test” or “stop”. It is not proof, and calling it proof is how accounts end up defending a channel for a year on evidence that never justified it.
The full economics — break-even CPC, maximum allowable CPA, and how to size a test against your margin rather than against a competitor’s screenshot — are worked through in our guide to measuring ChatGPT Ads ROI. At small spend the honest question is not “is this channel incremental”. It is “is it cheap enough to keep buying while we find out”.
What you actually receive
A ChatGPT Ads audit produces four artifacts and one conversation. Everything is written down, because a finding that exists only in a call is a finding you cannot act on in three weeks’ time when the person who took the call has moved on.
The deliverables below are the whole scope. There is no premium tier that unlocks the useful half, and there is no dashboard login that expires when the engagement ends. You get files.
The findings document. Typically 25 to 40 pages. Every one of the eleven checks written up with what we looked at, what we found, screenshots of the configuration as it stands, and what it is costing you in plain arithmetic. Findings that pass get a paragraph saying so — a clean check is information too, and you paid for it.
The prioritised fix list. Every issue scored on two axes: what it costs you per month if left alone, and how many hours it takes to fix. Sorted by the ratio, not by which section of the report it appeared in. Each row names who has to do it — you, your developer, or your agency — because “fix the pixel” is not an instruction anybody can action.
A recorded walkthrough. Thirty to forty-five minutes of screen recording, going through the account with the findings open. This is the artifact clients actually forward internally, because it is the one that makes a finance director understand why the conversion column has been lying since June.
A 30-day remediation plan. The fix list sequenced into a week-by-week schedule, with the dependencies made explicit. Measurement fixes come before bidding changes for a reason: changing a bid strategy while the conversion signal is broken teaches the system the wrong thing, and you cannot un-teach it.
The findings call. One hour with Tarun, live, after you have read the document. The point of the call is not to present the findings — you will already have them. It is for you to push back on the ones you disagree with, which is the part that makes the plan survive contact with your actual business.
What the audit does not include
Being explicit about the boundary is worth more than a longer feature list. The audit diagnoses; it does not treat.
| Included | Not included |
|---|---|
| Diagnosis across all eleven checks | Implementing the fixes — that is a separate engagement or your own team |
| Configuration review of pixel, Conversions API, events and matching | Writing or deploying tracking code on your site |
| Context-hint quality assessment and rewrite examples | A full hint research programme across every ad group |
| Review of the campaign structure you have | Rebuilding the account |
| Landing-page assessment as a relevance and measurement input | Landing-page design, copy or development |
| Feed health review where a catalog is connected | Catalog data cleanup at source |
| An honest read on whether the channel is working for you | A guarantee that it will, or a promise about what we will find |
We will not pad the report
Audit reports have a well-earned reputation for manufacturing severity, because a report that says “this is mostly fine” is a hard thing to charge for. Our answer is that the price is fixed before we look, so there is no commercial reason to inflate the findings. If your account is in good shape, the document will say so in the first paragraph and spend its length on what to do next instead.
How the audit runs, day by day
A ChatGPT Ads audit takes ten business days from the moment access lands to the findings call. That is not a queue time — it is working time, and most of it is spent on measurement verification, because measurement is where the expensive problems hide and where confirming a fault takes longer than spotting it.
- Day 0 — Access and intake. You grant access to the OpenAI Ads Manager account and, where relevant, read access to your analytics property. We send a short intake form: what you sell, what a conversion is worth, what you believe is wrong, and what you have already tried. The last question matters more than the first three.
- Days 1–2 — Data pull. We export the account at campaign, ad group and ad level, including the daily-values export rather than only the cumulative view, and reconcile the reporting period against your analytics on the same date range and time zone.
- Days 3–5 — Measurement verification. The longest block. Pixel firing and initialization, the content-security-policy allowlist, event-name matching, deduplication keys, advanced matching, click-reference preservation through every redirect and consent path. This is done by loading your pages and watching the network, not by reading your tag manager and assuming.
- Days 5–8 — Account analysis. Structure, context hints, bid strategy and budget configuration, creative, feed where present, delivery and eligibility, reporting hygiene.
- Days 8–9 — Incrementality read. What the account can and cannot prove at its current spend, and what it would take to prove more.
- Day 10 — Findings delivered. Document, fix list, walkthrough recording and remediation plan land together, at least 24 hours before the call so you have time to read and disagree.
- Day 10–12 — Findings call. One hour, live, with the person who did the work. Not an account manager reading someone else’s slides.
What access do you actually need?
Read access to the ad account is enough for the audit itself; we ask for nothing that lets us spend your money. Ads Manager access is granted under Settings → Users, and you can revoke it the moment the engagement ends. For the measurement checks we also need to be able to load your site as an ordinary visitor and, ideally, read access to your analytics property so we can reconcile the two. We do not need your site’s admin login, your CMS, or your Conversions API key — a server-side key belongs on your server, and an auditor has no business holding one.
If your account is currently run by another agency, we do not need to talk to them, and we do not contact them. Several of the accounts we look at are audited precisely because the relationship is under review, and that is your conversation to have on your timing.
Price, scope and the credit
ChatGPT Ads Audit
Eleven checks, four written artifacts, one findings call, ten business days. The price is agreed in writing after a short scoping conversation and does not move afterwards, whatever we find.
The fee is credited in full against managed service. If you move to White-Glove management within 60 days of the findings call, the audit fee comes off your retainer invoices until it is used up. At the $1,499 monthly retainer that works out at roughly your first two and a half months. It is a credit against invoices, not a free period and not a refund — we would rather state the mechanic precisely than round it into something that sounds more generous than it is.
What moves the price above the floor
| Factor | Effect | Why |
|---|---|---|
| A single ad account, one market, no catalog | At the floor | The standard shape and the one most accounts are in |
| Multiple connected ad accounts | Adds per account | Each account has its own measurement configuration, and per-pixel settings drift independently |
| A connected product feed | Adds | Feed health is a genuine engineering review — required fields, delivery format, snapshot cadence, eligibility flags |
| Multiple markets or currencies | Adds | Separate minimum budgets, separate delivery conditions, separate reporting time zones |
| Server-side measurement through a warehouse or partner | Adds | Verifying a Conversions API path through a partner integration is materially more work than checking a browser pixel |
| An account under $1,500 a month in media | We will decline | See when an audit is the wrong purchase — at that spend the fee is a bad trade and we will say so |
There is no percentage of spend, no success fee, and no obligation to buy anything afterwards. The audit is a product, not a qualifying call with a deliverable attached. You can take the findings to your existing agency, to your in-house team, or to a competitor of ours, and none of that changes what we hand over.
Run this audit yourself: the free checklist
Everything the eleven checks look at, you can look at yourself, and most readers should do exactly that before paying anyone — including us. What follows is the complete checklist, not a teaser version of it: the same menu paths, the same pass conditions, the same order. We give it away on purpose. A buyer who has run this list arrives at a first call already knowing what is broken, which makes the engagement shorter and better; a buyer who runs it and finds nothing wrong has saved $3,999 and should keep it. The offer is the labour and the judgement, not the secret.
Budget two to three hours. You need admin or read access to Ads Manager, access to your analytics platform, browser developer tools, and the ability to view your site’s response headers. Work in order — measurement first — because a finding in check 1 invalidates the numbers you would use to assess checks 3 through 6.
Check 1 — Measurement integrity
- Confirm the pixel loads. Open a tracked page, open the browser console and type
oaiq. If it returns undefined, the SDK athttps://bzrcdn.openai.com/sdk/oaiq.min.jsnever loaded. Pass: the global exists and the network tab shows the request completing. - Confirm the pixel ID matches. Compare the ID in
oaiq("init", { pixelId: "<ID>" })against the data source under Tools → Conversions. Pass: character-for-character identical. The two failures we see are a staging pixel left in production, and a second pixel installed by a previous agency. - Check your Content-Security-Policy. If your site sends a CSP header it needs all three directives:
script-src https://bzrcdn.openai.com,connect-src https://bzr.openai.com,img-src https://bzr.openai.com. A missingconnect-srcis the classic cause of “the pixel is installed but no conversions appear”, and it fails silently. - Read the diagnostics panel. Tools → Conversions, right-hand panel: why events were dropped before being sent, the affected field, the error type, a recommended fix. Pass: empty, or every entry explained.
- Verify
opprefsurvives your edge. Load a landing page carrying anopprefparameter and confirm the first-party__opprefcookie exists afterwards. Pass: the cookie is set even after any redirect, CDN rule or consent wall. Strippingopprefbreaks conversion tracking entirely and nothing warns you. - If you run the Conversions API, validate it. Send a batch with
validate_only: true. Check money is in ISO 4217 minor units ($129.99 is12999), thattimestamp_msfalls within the last seven days and no more than ten minutes in the future, and that you passopprefyourself asobrefinside theuserobject — it is not captured server-side. One bad event fails the whole batch of up to 1,000.
Check 2 — Conversion event configuration
- Compare what you send against what is configured. Put the event name your site fires next to the event configured on the campaign. For standard events the type must match what you send; for custom events Ads Manager must use
Event type: Customand the name must match exactly. Pass: exact string match. A matching display name is not enough, and this is the single most common reason a conversion column reads zero. - Check the event was attached before traffic started. Compare the campaign start date against the date the conversion event was configured. Correcting a mismatch does not backfill, so any spend before the fix is unrecoverable.
- If the campaign uses the Conversions objective, confirm the goal is a standard event. The
customtype is not eligible as an oCPC goal. If your real outcome is a custom event, fire a standard event alongside it and point the campaign at that. - Check deduplication. Where pixel and Conversions API both fire, the pixel’s
event_idand the API’sidmust be the same identifier, and for custom eventscustom_event_namemust match on both sides. Order or transaction ID is the right choice. Timestamps, random values and session IDs do not work and will silently double-count.
Check 3 — Campaign and ad group architecture
- List every campaign with its objective. Reach bills on CPM, Clicks on CPC, Conversions on oCPC. Objectives lock permanently at creation and an existing CPM or CPC campaign cannot be converted. Pass: each objective is the one you would choose today. If not, the fix is a new campaign — or a clone, since a CPC campaign can be cloned into a new oCPC campaign while the original keeps running.
- Divide monthly spend by active ad groups. Illustrative arithmetic: $3,000 a month across twelve active ad groups is about $8 of spend per ad group per day. Pass: each ad group accumulates enough conversion density for its bid strategy to learn from. Fragmented budget is the most common structural finding and it is invisible until you do the division.
- Read each ad group’s hints and name the single intent. One ad group, one intent. Pass: you can state the buying moment in one sentence without using the word “and”.
- Count ad groups with zero impressions over seven days. Those are consolidation candidates, not optimization candidates.
Check 4 — Context-hint coverage and quality
- Count the hints in each ad group. Five to fifteen. Below five you are starving matching; above fifteen the ad group is almost certainly covering more than one intent.
- Read them aloud. Hints describe the conversations, topics or keywords where your product may be relevant; they are not exact-match keywords and do not guarantee delivery. Pass: they read like something a person would say. Fail: a keyword list with modifiers, plurals and match-type punctuation carried over from Google Ads.
- Map each ad group to a stage. Problem-aware, researching options, comparing shortlist, ready to act. Pass: every ad group sits in exactly one, and its ad copy matches that stage.
- Flag hints that describe your product rather than the buyer’s moment. “Workflow automation platform” is a product description. “Ops team re-keying orders by hand between two systems” is a moment. The second matches conversations; the first matches your own website.
- Check for hints that cannibalize each other. Two ad groups competing on near-identical hints split their own data. There are no negative hints and no match types, so the remedy is a tighter hint or a custom-audience exclusion.
Check 5 — Bid strategy and budget configuration
- Note the bid strategy on every ad group. It is set at ad group level: Maximize results, or Manual: Max bid. Maximize results has been default-on for eligible new ad groups since August 2026, so check what you are on rather than what you remember choosing.
- Compare manual bids against the delivery floor. OpenAI’s guidance is $3–$5 to start; the field defaults to a $3.00 placeholder and accepts $0.01 to $100.00. Bidding much below $3 wins little or no delivery. Pass: your bid is above the floor, or you have knowingly accepted near-zero delivery.
- Compute your break-even CPC. Break-even CPC = target CPA × landing-page conversion rate. Illustrative: a $50 target CPA at a 4% conversion rate gives $2.00, below the delivery floor. That is a business-model finding, not a bidding finding, and no account optimization resolves it.
- Check the budget type. Daily budget has been a seven-day average since 27 July 2026: up to 2× the daily figure on one day and 7× across the week. A campaign-total budget is a spending limit, not a pacing control, and is not distributed evenly across dates. Switching campaign-total to daily is one-way.
- Confirm the daily budget clears your currency minimum. $25 USD, £15 GBP, 25 CAD, 25 AUD, 25 NZD, 40 BRL, 150 MXN, 2,500 JPY, 25,000 KRW. The minimum is per billing currency, and currency is fixed at account creation.
Check 6 — Ad copy and creative
- Count live variants per ad group, then count the variables that differ. If two ads differ in headline, image and landing page at once, no result from them is attributable. There is no ad-level A/B testing primitive to split traffic for you, so the discipline has to come from you.
- Check the four relevance inputs. Relevance is computed from context hints, landing page, ad title and ad copy. The image is explicitly not an input. Pass: your last creative refresh changed at least one of the four. A refresh that only swapped the image cannot have moved relevance.
- Read each ad against its ad group’s hints. Pass: a reader who saw the hint would recognise the ad as an answer to it. Mismatch between hint and headline is the quietest creative failure here.
- Check angle coverage and length. Keep total copy to roughly 150 characters and confirm each ad group runs more than one angle — our ChatGPT Ads creative guide covers the anatomy of the unit, and the conversion tracking guide covers tagging angles so you can tell them apart later in reporting.
Check 7 — Product feed and catalog health (skip if you run no catalog)
- Confirm feed readiness from the ad-group setup product count, not the Products tab. The Products tab is an insights-backed reporting view, not a feed inventory — products appear only once an active campaign has delivered. A product missing from the tab may be healthy and simply unserved.
- Check delivery mechanics and field completeness. SFTP, a stable filename overwritten in place, a full snapshot at least daily, UTF-8. Parquet is preferred;
jsonl.gz,csv.gzandtsv.gzare supported; XML is not. The spec is 79 fields with 19 required — pass: all 19 present on every row you care about. - Check removals. Removals are explicit only. A product deleted in your source system stays in the feed until you actively remove it, which is how discontinued lines keep getting advertised.
- Check policy exclusions and limits. Adult content, age-restricted products, weapons and prescription medications are excluded. One feed connection per ad account, up to 2 million products. The ad template currently lets you select only the image field — titles and descriptions come from the feed, so feed copy quality is ad copy quality.
Check 8 — Post-click experience
- Read the ad and the landing page back to back. Pass: the page answers the question the ad implied, in the first screen, in similar words. The failure to look for is an ad that answers a question the page never addresses.
- Load the page on a phone on a slow connection. Reporting groups device into Mobile and Desktop only, with mobile web counted under Mobile, so mobile weakness surfaces as a whole-channel problem rather than a device problem.
- Test the consent banner as a real visitor would. If consent blocks the pixel, sequence it properly:
oaiq("consent", false), then init, thenoaiq("consent", true). Then re-check that the consent flow has not strippedopprefon the way through. - Count form fields and remove one. Then confirm the form’s success state actually fires the configured conversion event, rather than a page-view on a thank-you URL that redirects.
- Confirm landing-page parameters are set at the right level. They live in the three-dot menu, not the creation flow. The four macros are
{campaign_id},{ad_group_id},{ad_id}and{ad_account_id}, substituted at delivery time, precedence most specific first: Ad URL, Ad, Ad Group, Campaign. Do not URL-encode the braces —%7Bcampaign_id%7Darrives literally. Build the rest of the string with our UTM generator.
Check 9 — Delivery, eligibility and policy
- 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.
- Check Settings → Account info. Account name and Logo must both be set. Ads will not serve until they are, and nothing in the campaign view tells you this is the reason.
- Check your market is live. Nine markets you can buy in: the United States, United Kingdom, Canada, Australia, New Zealand, Japan, South Korea, Brazil and Mexico, with 31 European countries announced. India appears in the published minimum-spend table at 725 INR but is not yet listed as available.
- Check who is reachable. Ads serve to Free and Go plan users only — never Plus, Pro, Business, Enterprise or Education. Users declared or predicted to be under 18 are excluded, and conversations about politics, health and mental health carry no ads. If your buyer is a ChatGPT Pro subscriber, this channel cannot reach them, and that is a strategy finding rather than an account finding.
- Check platform targeting on every campaign. iOS App, Android App and Web are a multi-select, where Web covers both desktop and mobile web. Platform targeting shipped in August 2026, so review rather than assume what older campaigns are set to.
- If you build via the API, check status. Campaigns created via the API launch paused. An account can look fully built and spend nothing for this reason alone.
Check 10 — Reporting hygiene
- Open Edit columns from the three-dot menu. Add the individual conversion events under Conversions & events, and the
VTA (1d)column if the account is eligible. Do not look for these under Segment — Segment adds Device and Country breakdowns only. - Export daily values. The day-by-day file is a separate export mode, not a date-range filter on the table view.
- Audit your own spreadsheet for VTA contamination. Pass: no total anywhere in your reporting adds
VTA (1d)to Conversions, and no CPA or conversion rate is computed using it. - Reconcile clicks against analytics sessions. Same date range, same time zone, then check campaign and ad-level activity in the CSV to see where the gap concentrates. Remember the account time zone was fixed at creation and cannot be changed.
- Cut the trailing 48 hours from every conversion readout. Attributed conversions take 24 to 48 hours to appear.
Check 11 — Incrementality
- Add a required “how did you hear about us” field to your order or lead form today. It costs nothing and it is the only instrument that sees any part of the roughly 60% of ChatGPT-ad-attributable conversions that AdVenture Media found arrive by untraceable paths.
- Compute blended CAC by month for the last six months: total marketing spend divided by total new customers. Mark the month ChatGPT Ads started. You are reading the direction of the line, not a number.
- Check whether a geo holdout is available to you at all. Below country level, geo granularity exists only in the United States, where you can target state, DMA and ZIP. If you sell in one non-US country, you cannot run a geo holdout and should stop planning one.
- Write your decision rule and your spend ceiling before next month starts, in a document with a date on it. A rule written after the results are in is not a rule.
The five findings that account for most of the damage
If you have thirty minutes rather than three hours, check these five. In the accounts we see, they account for the large majority of recoverable waste.
| Finding | Where to check it in ten minutes | Why it is the expensive one |
|---|---|---|
| Event-name mismatch | The event your site fires versus the event configured on the campaign, under Tools → Conversions. | The conversion column reads zero, oCPC optimizes against nothing, and the correction does not backfill — every dollar spent before the fix is gone. |
Missing CSP connect-src, or a stripped oppref | Your response headers, and the __oppref cookie after a real click through any redirect or consent wall. | The pixel looks installed, reports nothing and raises no error. It is the purest silent failure in this channel. |
| Budget fragmented across too many ad groups | Monthly spend divided by the count of active ad groups. | No ad group reaches the conversion density any bid strategy needs, so the account underperforms in a way no single ad group explains. |
| Hints written as keywords | The hint box on any ad group. | Matching degrades and there is no search-term report to diagnose it from, so the symptom is months of mediocre delivery with no visible cause. |
| Bidding below the delivery floor | The ad group bid against OpenAI’s $3–$5 starting guidance. | The campaign is live, spends almost nothing, and gets read as “ChatGPT Ads doesn’t work for us” when it never had the chance to serve. |
What a checklist cannot do for you
Every item above establishes a fact, and facts are the easy half. What the list cannot do is decide. It will not tell you which of three findings to fix first when fixing one changes the evidence for the other two. It will not tell you whether a hint set is failing because it is written badly or because it has not had enough impressions yet — those look identical for the first week and require opposite responses. It will not tell you whether a $9 CPC is a disaster or a fair price given your margin and close rate, or whether an account producing eleven conversions a month is telling you anything at all. And it will not tell you when the honest answer is to spend nothing for another quarter. That judgement — the priority order, the read on a small sample, and the willingness to say “wait” — is what an audit actually buys. If you run the checklist and everything passes, you have saved $3,999, and we would rather you did.
When an audit is the wrong purchase
An audit is worth buying when you have a live account, real spend, and a specific suspicion that something is wrong that you cannot locate. Outside those conditions it is usually the wrong product, and the honest thing to do is say which product is right instead. Every case below routes somewhere, including to nowhere.
You are spending under $1,500 a month
At that level the audit fee is a large multiple of a month’s media, and the arithmetic does not work no matter what we find. Run the free checklist published on this page instead. It is the same eleven checks in the same order, and for an account of that size it will surface most of what a paid audit would. We will decline this engagement if you ask for it.
Your account has been live for less than three weeks
This one is more nuanced than it looks. A structural audit — is the measurement correct, is the objective right, are the hints coherent, is the budget above the minimum — is perfectly valid on a three-week-old account, and arguably that is the best possible moment to run one, before the spend accumulates against a broken configuration. What is not valid on a three-week-old account is a performance audit, because there is no performance to read. If you want to know whether your account is built correctly, buy the audit. If you want to know whether the channel works for you, wait — and read the guide on measuring return in the meantime.
You already know the tracking is broken
Then you do not need a diagnosis, you need an implementation. Buy the conversion tracking implementation instead and skip a step. Paying for an audit to be told what you already told us is a waste of your money and our ten days.
You have no account yet
There is nothing to audit. Account setup and launch is the relevant engagement, and it includes the measurement configuration that most audits end up flagging on accounts that were built in a hurry.
You want someone to run the account, not report on it
Go straight to managed service. The retainer opens with an account audit anyway, and buying the diagnostic separately first only makes sense if you are undecided about the relationship or if you need a document you can take to someone else. If you already know you want it run for you, the audit is a detour with a price tag.
You want the audit to justify a decision you have already made
This happens more than anyone admits — an audit commissioned to build a case for firing an agency, or for killing a channel a stakeholder never liked. We will do the work honestly and the findings will say what they say, which sometimes means they will not support the case. If you need a specific answer, we are the wrong supplier, and it is cheaper for both of us to find that out now.
Match the engagement to your spend
The shortest version, if you want to skip the reasoning:
| Your monthly media spend | What to do | Why |
|---|---|---|
| Under $750 | You are below or near the minimum daily budget in most currencies. Fix that before anything else | A campaign that cannot clear the per-currency minimum will not deliver, and no audit changes that |
| $750–$1,500 | Run the free checklist yourself | The fee would dominate the media. We will tell you this rather than take the work |
| $1,500–$5,000 | Audit if something is wrong; otherwise managed service | Enough spend for findings to pay for themselves, not yet enough for a broken account to be catastrophic |
| $5,000–$10,000 | Audit, then decide on management with the credit applied | The credit makes the sequence effectively free if you go managed, and this is the band where a silent measurement fault is genuinely expensive |
| Above $10,000 | Audit, and expect the findings to move to an Enterprise conversation | At this spend a single misconfigured conversion event can cost more per month than the entire audit |
The test we apply before quoting
If we cannot describe, in one sentence and before starting, a plausible finding that would pay for the audit inside three months, we will say so and decline. That test disqualifies more enquiries than it passes, and it is the reason this page spends as long telling you not to buy as telling you to.
Sources and further reading
Every platform claim on this page traces to one of the following. Where a figure comes from a third party rather than from OpenAI, it is attributed inline at the point of use, and where the available sources disagree 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 measurement articles. The primary source for context hints, objectives, bidding, budgets and the conversion-tracking behaviour described throughout.
- OpenAI Ads Manager, observed directly. Menu paths, column behaviour, export modes, diagnostics and delivery states are described from the product as it stands in September 2026, not from documentation alone.
- Our own guide library — the long-form working notes behind each check: conversion tracking, automatic advanced matching, measurement partners, conversion campaigns and oCPC, context hints, writing context hints, costs and budgets, creative, product feeds, Ads Manager setup, measuring return, 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 individual account.
- Opascope — the single public account reporting 1.49× ROAS at a $1.72 CPC over fifteen days. One case, not a benchmark, and we cite it as such wherever it appears.
- Our own tools, free and requiring no account: the reach calculator, the context hint generator, and the UTM builder.
Two honest caveats about sourcing. First, this platform changes fast — six material changes shipped between June and August 2026 alone — so any page about it, including this one, carries a shelf life. The timeline is maintained specifically so you can check what has moved since. Second, OpenAI publishes no performance benchmarks across advertisers, industries or campaign types. Anyone quoting you an industry-standard ChatGPT Ads CPA is quoting their own book of business at best, and inventing it at worst. We benchmark your account against its own history and against the arithmetic of your margins, because those are the only two honest comparisons available.
ChatGPT Ads audit FAQ
What is a ChatGPT Ads audit?
A ChatGPT Ads audit is a fixed-scope diagnostic review of a live OpenAI Ads Manager account across eleven areas: measurement integrity, conversion event configuration, campaign and ad group architecture, context-hint coverage and quality, bid strategy and budget, creative, product feed health, post-click experience, delivery and eligibility, reporting hygiene, and incrementality. It produces a written findings document, a prioritised fix list, a recorded walkthrough and a 30-day remediation plan. It diagnoses; it does not implement the fixes.
How much does a ChatGPT Ads audit cost?
From $3,999 as a one-off, agreed in writing before the work starts and fixed regardless of what we find. The floor covers a single ad account in one market without a product feed. Multiple ad accounts, a connected catalog, several markets or currencies, or server-side measurement through a warehouse or partner each add to it. There is no percentage of spend and no success fee.
Is the audit fee credited if I hire you to manage the account?
Yes, in full. If you start White-Glove management within 60 days of the findings call, the audit fee comes off your retainer invoices until it is used up. At the $1,499 monthly retainer that is roughly your first two and a half months. It is a credit against invoices rather than a refund or a free period, and we state it that precisely on purpose.
How long does a ChatGPT Ads audit take?
Ten business days from the moment access is granted to the findings being delivered, with the findings call in the following two days. Roughly half that time goes on measurement verification, because confirming that a pixel, event or click-reference path is genuinely broken takes longer than suspecting it.
What access do you need to audit my account?
Read access to the OpenAI Ads Manager account, granted under Settings → Users and revocable by you at any time. We also ask for read access to your analytics property so we can reconcile clicks against sessions on the same date range and time zone, and we load your site as an ordinary visitor to verify the measurement path. We do not need your CMS login, your site admin credentials, or your Conversions API key.
Do you need admin access, or is read-only enough?
Read-only is enough for the audit itself. We ask for nothing that lets us spend your money or change your campaigns. If you subsequently want the fixes implemented, that is a separate engagement with its own access conversation — but the diagnostic never requires write access.
Can you audit an account that has only been running for two weeks?
Yes for a structural audit, no for a performance audit. Whether the measurement is correct, the objective is right, the hints are coherent and the budget clears the per-currency minimum can all be assessed on day one — and two weeks in is arguably the best moment to check, before spend accumulates against a broken configuration. Whether the channel performs for you cannot be answered that early, and we will not pretend otherwise.
What is the most common problem you find in ChatGPT Ads accounts?
Measurement faults that produce a silent zero. The single most frequent is a conversion event that fires correctly, is accepted, and still does not match the event configured on the campaign — for standard events the event type must match what you send, and for custom events the name must match exactly. A matching display name is not enough, no error is shown anywhere, and correcting the configuration does not backfill the lost history.
Why do my conversions show zero in Ads Manager?
There are five common causes, in roughly this order of frequency: the configured conversion event does not exactly match the event being sent; the content-security-policy allowlist is missing connect-src https://bzr.openai.com so the pixel loads but cannot transmit; the click reference oppref is being stripped by a redirect, consent wall or CDN rule; the conversion is being read before the 24 to 48 hour attribution delay has elapsed; or the campaign is not delivering at all. The audit walks these in order, and so does the free checklist on this page.
My click-through rate looks fine but nothing converts. What does the audit check for that?
A healthy CTR with no conversions points at one of three places, and the audit separates them. Either the conversions are happening and not being recorded, which is a measurement fault; or the traffic arrives and does not convert, which is a post-click and offer problem; or the hint set is attracting the wrong conversational moment, which is a targeting problem that looks like a creative success. These have completely different fixes, and guessing between them is how accounts waste a quarter.
Can I do this audit myself?
Yes, and for many accounts you should. The complete eleven-check list is published on this page with the menu paths and pass conditions for each item. If you are spending under about $1,500 a month we will actively tell you to run it yourself rather than sell you the engagement. What you are buying when you hire us is the labour and the judgement about which findings actually matter for your margins, not access to a secret checklist.
How is this different from the free audit other agencies offer?
A free audit is a sales call with a deliverable attached, and its scope is set by what will motivate you to sign. This is a paid product with a fixed price agreed before we look, which removes any commercial reason to inflate the severity of the findings. There is no obligation to buy anything afterwards, and you are free to take the document to your existing agency, your in-house team, or a competitor of ours.
Do you audit the landing page as well as the ad account?
Yes, because on this platform the landing page is not just a destination. It is one of the four inputs the auction uses to compute relevance, alongside context hints, the ad title and the ad copy. A weak landing page therefore raises what you pay per click as well as lowering what you convert. We assess it as a relevance input and as a measurement surface, but we do not design or build it.
Will the audit tell me whether ChatGPT Ads is worth it for my business?
It will tell you what your account can and cannot currently prove, and what it would take to prove more. For accounts with clean measurement and enough conversion volume, that is close to a direct answer. For accounts spending a few thousand a month, the honest output is a decision rule and a spend threshold rather than a verdict, because a clean incrementality test is not available at that scale to us or to anyone else.
Can you prove ChatGPT Ads is incremental to my other channels?
Not at most budgets, and you should be sceptical of anyone who says they can. Geo holdouts need scale to be readable, before-and-after comparisons are confounded by seasonality and by every other channel you run, and this channel under-reports by design — AdVenture Media's analysis puts roughly 40% of attributable conversions in the immediate post-click session and roughly 60% arriving later through paths that cannot be traced. The audit tells you which instruments your spend can actually support.
Do you audit product-feed and catalog campaigns?
Yes, where a feed is connected. That check covers required-field completeness against the 79-field specification, delivery format and cadence, eligibility flags, and the common confusion that the Products tab is an insights-backed reporting view rather than a feed inventory — products only appear there once an active campaign delivers. Feed work adds to the price above the floor because it is a genuine engineering review.
What if the audit finds nothing wrong?
Then the document says so in the first paragraph and spends its length on what to do next instead. Because the price is fixed before we look, there is no commercial incentive to manufacture severity. In practice a genuinely clean account is rare on a platform that shipped six material changes between June and August 2026 — the most common finding on a well-run account is drift, where the configuration was correct when it was built and no longer matches what the platform now offers.
Do you fix the problems you find, or only report them?
The audit diagnoses. Implementation is a separate engagement, either conversion tracking implementation for measurement faults or managed service for ongoing operation, and plenty of clients take the fix list to their own team or agency instead. The remediation plan is written so that someone other than us can execute it, which is deliberate.
What is the minimum ad spend that makes an audit worthwhile?
About $1,500 a month. Below that the fee is a large multiple of a month's media and the arithmetic does not work whatever we find, so we decline the work and point you at the free checklist. Between $1,500 and $5,000 an audit makes sense when something specific is wrong. Above $5,000 it usually pays for itself on a single measurement finding, and the credit makes the sequence effectively free if you go on to managed service.
Which markets and currencies can you audit?
Any market where Ads Manager is live: the United States, United Kingdom, Canada, Australia, New Zealand, Japan, South Korea, Brazil and Mexico, plus the 31 European countries OpenAI has announced. Each market carries its own minimum daily budget in its billing currency, and accounts running several markets need each checked separately, which adds to the price above the floor.
Do you sign an NDA?
Yes, routinely, and we will sign yours rather than insisting on ours. We do not name clients or use account data in published material without written permission, and none of the worked examples anywhere on this site come from client accounts — they are illustrative arithmetic and labelled as such.
What happens after the audit?
Nothing automatically. You have the findings, the fix list, the walkthrough and the plan, and there is no obligation of any kind. Clients typically do one of three things: hand the plan to their own team, engage us for the specific implementation work the findings identified, or move to managed service with the audit fee credited. Roughly the most common outcome is the first, which is why the plan is written to be executed by someone else.
Want to know what your account is actually doing?
Thirty minutes with Tarun to scope the audit and fix the price before anything starts. If your spend is too small for the engagement to pay for itself, he will tell you on that call and point you at the free checklist instead — that outcome is common enough that it is worth saying up front.
Book a scoping call