In Google Ads, when a campaign goes wrong, you open the search terms report and see what people typed. In ChatGPT Ads that report doesn't exist: OpenAI doesn't share conversations with advertisers. What you get is aggregated figures, each with its own delay, and a handful of statuses that explain why an ad isn't serving.
Reading those figures properly, and understanding that an empty report is information too, is half the job on such a young platform.
What you can see
The main metrics are impressions, clicks, spend, CTR, average CPC,
average CPM and conversions. The API also separates conversions after a
click (click_through_conversions) from those after seeing the ad
(view_through_conversions); the latter are for information only
(lesson 4 of this module). Every query combines three axes:
| Axis | Options |
|---|---|
| Level | Account, campaign, ad group or ad |
| Granularity | Hour, day, month or period total |
| Breakdown | Country, device, platform or product: one per query |
In the API, platform takes the values android_app, android_web,
desktop_web, ios_app, ios_web and web.
The single breakdown has a catch: you can see spend by country and, in another query, by platform, but not platform within each country. If you need to cross two axes, cross them in your structure, with one campaign per platform or per country (lesson 7 of this module).
When the data arrives
| Metric | When it appears | How to read it |
|---|---|---|
| Impressions, clicks and CTR | Within minutes | They tell you whether delivery is starting |
| Spend | Later | Zero spend doesn't mean there are no charges |
| Conversions | With daily processing: at least a day | Don't judge today's |
Practical rule: decide on closed days; today's figures are provisional.
⚠️ Pitfall: seeing clicks with zero spend and thinking that traffic is free or that billing has failed. Spend arrives after clicks.
What you won't find
There is no conversation or query report, so there are no "search terms" either. It's a privacy decision: advertisers receive aggregated data (views, clicks) and never conversations, chat history, memories, names, emails, precise locations or IP addresses.
So how do you know which context works? Through structure: one ad group per intent, each with its own context hints (lesson 1 of this module), and by comparing groups against each other. Your structure is your search terms report.
Cross-checking with your analytics
Add UTM parameters to each ad's URL (a different utm_content per
ad, for example): they're static, persist through the click and any
analytics tool can read them. Even so, OpenAI's clicks and your visits
won't match, for several reasons:
- Consent: people who reject cookies may not show up in your analytics.
- Bots: OpenAI's crawlers visit your landing pages. In our analytics, OAI-AdsBot, OAI-SearchBot and ChatGPT-User appeared right during the review.
- Your own checks: when we verified the ad URLs with a program, our analytics recorded them as people arriving from the ad. We now filter them out by requiring a browser to confirm the visit.
- Links that lose parameters: a redirect that doesn't keep the full URL turns the visit into "direct".
Don't chase a click-perfect match: watch that the gap stays stable. If it suddenly widens, something has changed.
💡 Ninja trick: filter your own checks and known bots out of your analytics before launching. Otherwise, in the first week, right when the review happens, you'll see visits "from the ad" that belong to nobody.
Diagnosis: everything active and not a single impression
It happened to us at launch: 8 approved ads, a bid that wasn't low and zero impressions. The API gave the reason: "account brand review in progress". Until the brand was approved, on 16 September, nothing was delivered. The empty report wasn't a reporting failure: it was the signal that something was blocking delivery. Check in this order:
| What to check | Why it blocks | What to do |
|---|---|---|
| Account review (brand or integrity) | With an account review pending, nothing is delivered | Wait; changing the brand can trigger another review |
| Ad status | In review or rejected, it doesn't serve | Edit the rejected ad and it goes back to review |
| Campaign and ad group | An active ad needs an active campaign and ad group | Activate them, although activating isn't enough if another condition fails |
| Budget and spend cap | When they run out, delivery stops | Check both: they apply separately |
| Bid | A low bid loses auctions | The low-bid warning is guidance, not a block |
With invoice billing, also check the account's daily limit. And remember that editing an approved ad creates a new version that goes through another review.
Via the API, request include[]=serving_issues on the campaign, ad
group or ad record to see the reason, and watch for bid_too_low on ad
groups. But an empty list doesn't promise impressions: even with
everything green, you need conversations in which your ad is relevant.
What to remember
- There's no search terms or conversation report: your intent-based structure is your report.
- One breakdown per query; to cross axes, split them into campaigns.
- Impressions and clicks within minutes; spend later; conversions at least a day later.
- Your visits won't match the clicks: consent, bots, your own checks and links that lose parameters.
- No impressions? Check in order: account, ad, campaign and ad group, budget and caps, bid.
- An empty report isn't an error: it's a signal.