The question that decides next month's budget isn't "how much did the click cost me?", it's "how much did the customer cost me?". And in ChatGPT Ads that answer isn't in the platform: you have to build it.
The six steps
| # | Step | Who counts it |
|---|---|---|
| 1 | Impression | The platform |
| 2 | Click | The platform (and it's what you're charged for) |
| 3 | Real visit | You: a confirmed person on your site, bots excluded |
| 4 | Lead | You: form, sign-up, call or order |
| 5 | Qualified lead | You: the one your business accepts as good |
| 6 | Sale | You, with its value |
The border sits between 2 and 3, and it's a real border: from the third step down, the platform knows nothing you don't tell it. You can report conversions back (that route exists and OpenAI documents it for developers), but the data is born in your house.
Steps 4 to 6 are where the business is. A channel that brings twice as many leads at the same cost, but of worse quality, is a more expensive channel, whatever the report says.
The judge is cost per qualified lead
When you compare ChatGPT Ads with Google Ads, with Meta or with anything else, use the real cost per qualified lead, calculated from your data. Never the conversions each platform claims: each one uses its own window, its own model and its own deduplication, and they all tend to claim the same events.
And there are no official benchmarks: OpenAI doesn't publish any reference figures for CTR, conversion rate or cost per acquisition. What circulates are agency samples — for example, a recommended CPC of $3-5 and a starting CPM of $60 published by Choice OMG in 2026, a third-party source, not official. They're useful for sizing a test, not for judging your account. Your benchmark is your own funnel in another channel.
How the table is built, and how to read it
You only need two things, and both are prepared before launch:
- A different ad identifier for each ad in the destination address
(a
utm_contentof your own, for example). Without it, everything you measure is a campaign average and you can't switch off the ad that deserves it. - Measurement on the destination page, on all of them: if an ad points to a page without measurement, that ad doesn't exist in your funnel. It happened to us at launch: 7 of our 8 ads pointed to pages where we had no measurement installed.
With that, every lead is born with the ad that brought it and the rest is arithmetic.
💡 Ninja tip: if you create variants of the same ad to test them, give each one a different identifier from minute one. Two variants sharing an address share visits, and afterwards there's no way to tell them apart.
A made-up but realistic example (sample figures, not from a real account), 30 days and two ads from the same campaign:
| Ad A | Ad B | |
|---|---|---|
| Impressions | 12,400 | 9,800 |
| Clicks · CTR | 96 · 0.77% | 140 · 1.43% |
| Spend · CPC | €288 · €3.00 | €322 · €2.30 |
| Real visits | 81 | 118 |
| Leads · cost per lead | 9 · €32 | 14 · €23 |
| Qualified · cost | 3 · €96 | 2 · €161 |
| Sales · revenue | 1 · €1,450 | 0 · €0 |
Read quickly, B wins: better CTR, cheaper CPC and cheaper leads. Read to the end, A wins, and not by a little: its qualified lead costs €96 against €161, and it's the only one that brought revenue. B attracts easy clicks that don't qualify. Stop at the CTR row and you switch off the good ad.
⚠️ Trap: at these volumes, 3 qualified against 2 is not a proven difference. The table is there to direct your attention and shape the hypothesis; the decision to switch something off waits for a proper sample. Here the sensible move is to let A run and rewrite B.
The gaps that are normal
OpenAI's own help centre acknowledges that its figures, your analytics and other platforms don't have to match: different attribution windows and models, time zones, browser conditions, consent, different deduplication and modelled conversions. Add your own: filtered bots, click identifiers lost on the way and conversions that arrive late. So:
- Real visits will always be fewer than clicks. A steady 10-20 % gap is normal life; a gap that jumps overnight is a breakdown.
- Don't chase a click-level match. Watch that the ratio holds.
- Decide with closed days: today is half-done and yesterday can still change.
The revenue report is yours
Two facts that belong together: the platform's reports don't carry the conversion value (the amount only lives on your side, so you calculate ROAS yourself) and in ChatGPT Ads bidding by value doesn't exist, there's no equivalent of tROAS.
Since bidding can't chase the amount, the only way to bid for quality is to choose which event counts as the campaign's conversion — the qualified lead instead of the raw lead — and that needs volume: we don't take the step below 30 qualified leads a month.
Comparing with Google Ads without cheating
Three rules, all of them common sense:
- Same time window and the same days of the week.
- Same event: if you measure qualified leads in Google, measure qualified leads in ChatGPT. Don't compare sales in one with forms in the other.
- Same quality criteria: the same bot filter and the same point of the funnel.
And a fourth, about honesty: ChatGPT Ads has just been born in Spain (self-serve since 31/08/2026). It coming out worse than Google in the first comparison is no news; what matters is whether the gap closes when you adjust ad, device and moment.
What to take away
- Six steps: the platform counts two and you count four.
- The judge between channels is the real cost per qualified lead, not the conversions each platform claims.
- To have the table you need an identifier per ad and measurement on every destination page.
- An ad with a better CTR and cheaper leads can be the worst one.
- Gaps are normal; what isn't normal is a gap that changes suddenly.
- Value isn't in the platform's report and you can't bid for it: ROAS and quality are on you.