OpenAI Ads
The goal of everything here: as many clicks and conversions per unit of spend
as possible, and from those, leads that turn into business. Reach without
conversion is not success.
Read first
references/platform-facts.md — every hard limit and rule
references/misinformation.md — always read before quoting a figure or a
feature. A lot of false information about this platform is in circulation.
references/benchmarks.md — sufficiency thresholds and your own measured values
Do not load all three at once. Copy work needs platform-facts; assessments
add benchmarks.
The one rule that shapes everything
There is no reporting per context_hint. The API accepts up to 2000 hints
per ad group but never reports which of them produced a conversion.
That determines how every campaign is cut:
The ad group is the smallest unit of measurement. So: few hints per group,
tightly scoped by theme, and more groups instead.
A group with 200 hints is a black box — it may perform, but you never learn
why, and you cannot repeat it. Five groups with 10 to 20 hints each produce
usable signal.
Guideline: 10 to 25 hints per group. Warn above 50.
Routing
| Task |
Use |
| New campaign |
ads-campaign — clarify, decide, create |
| Ad copy |
ads-creative — character economy, validation |
| Finding topics |
ads-hints — clustering, negative keywords |
| Location targeting |
ads-geo — postcode sets instead of a radius |
| Reviewing a running campaign |
ads-audit |
Build order
The sequence matters because each step depends on the previous one:
get_account — currency, timezone, review.status. If rejected with
missing_favicon, fix the account first.
check_feature_access — what is enabled? This API answers 403, and
sometimes 404, when something is gated.
- Conversion measurement before the first campaign. Without it you cannot
switch to conversion bidding later —
bidding_type is immutable.
- Check the landing page — reachable for crawlers, no redirect, favicon
present.
- Create the campaign paused, then the ad group, then the image, then the ad.
preview_ad and look at it.
- Only then activate, one thing at a time.
Structure
- One campaign per goal and bidding type.
bidding_type cannot be changed,
so anyone planning to move to conversion optimisation later will need a new
campaign anyway.
- One ad group per intent. Not per product, not per audience. Intent
determines which phrasing lands.
- Two or three ads per group, using different angles rather than reworded
versions of the same claim. Only then is the comparison meaningful.
Assessing
Run the sufficiency check from references/benchmarks.md before quoting any
number. If the data is too thin, output no score — state what is missing
and how long to keep measuring.
Assess against the maximum tolerable CPA derived from the business model,
not against industry figures. There are none for this platform.
Every recommendation needs four things
Without these it is a finding, not a recommendation:
- Observation — what it rests on, with a number
- Dependency — what has to happen first
- Falsification — how would you know it did not work?
- Leading indicator — what moves first, without re-running the analysis
Point 3 matters most. Anyone who cannot say how they would notice being wrong
is recommending on a hunch, and here that spends real budget.
When things go wrong
| Situation |
Response |
| 403 on an endpoint |
Feature not enabled. Say so, do not work around it. |
| 404 on a resource that exists |
Usually the same cause. |
| 409 "missing details" |
Account profile incomplete — or sporadic. A retry tells you which. |
Ad rejected |
Read review.reason_code. A crawler_* code points at the landing page, not the copy. |
| No conversion data |
Do not read as poor performance. Check measurement first, then data volume. |
| Someone wants to use search-ad CPCs as bids |
Explain it is a different auction. Start small and measure. |
| Someone quotes 35/67 characters |
Correct it: 50 and 100 per the spec. |
What this platform cannot do
Do not look for, suggest or claim: keyword bidding, match types, keyword
planner, search volume, radius targeting, personalised ads in the EEA, a
sandbox, official benchmarks, a Python SDK.
Details and reasoning in references/misinformation.md.
1---2name: ads3description: Plan, build, review and optimise OpenAI Ads (ChatGPT Ads) campaigns — structure, context hints, ad copy against verified character limits, postcode-level geo targeting, bidding, conversion measurement and reporting. Use this skill whenever ChatGPT Ads, OpenAI Ads, advertising inside ChatGPT, running ads, creating a campaign, ad copy, context hints, ad budget, click price or ad performance come up — even when the word "skill" is not used. Covers both building new campaigns and analysing running ones.4license: MIT5---67# OpenAI Ads89The goal of everything here: **as many clicks and conversions per unit of spend10as possible**, and from those, leads that turn into business. Reach without11conversion is not success.1213## Read first1415- `references/platform-facts.md` — every hard limit and rule16- `references/misinformation.md` — **always read before quoting a figure or a17 feature.** A lot of false information about this platform is in circulation.18- `references/benchmarks.md` — sufficiency thresholds and your own measured values1920Do not load all three at once. Copy work needs `platform-facts`; assessments21add `benchmarks`.2223## The one rule that shapes everything2425**There is no reporting per `context_hint`.** The API accepts up to 2000 hints26per ad group but never reports which of them produced a conversion.2728That determines how every campaign is cut:2930> The ad group is the smallest unit of measurement. So: **few hints per group,31> tightly scoped by theme, and more groups instead.**3233A group with 200 hints is a black box — it may perform, but you never learn34why, and you cannot repeat it. Five groups with 10 to 20 hints each produce35usable signal.3637Guideline: **10 to 25 hints per group.** Warn above 50.3839## Routing4041| Task | Use |42|---|---|43| New campaign | `ads-campaign` — clarify, decide, create |44| Ad copy | `ads-creative` — character economy, validation |45| Finding topics | `ads-hints` — clustering, negative keywords |46| Location targeting | `ads-geo` — postcode sets instead of a radius |47| Reviewing a running campaign | `ads-audit` |4849## Build order5051The sequence matters because each step depends on the previous one:52531. **`get_account`** — currency, timezone, `review.status`. If `rejected` with54 `missing_favicon`, fix the account first.552. **`check_feature_access`** — what is enabled? This API answers 403, and56 sometimes 404, when something is gated.573. **Conversion measurement** before the first campaign. Without it you cannot58 switch to conversion bidding later — `bidding_type` is immutable.594. **Check the landing page** — reachable for crawlers, no redirect, favicon60 present.615. **Create the campaign paused**, then the ad group, then the image, then the ad.626. **`preview_ad`** and look at it.637. Only then activate, one thing at a time.6465## Structure6667- **One campaign per goal and bidding type.** `bidding_type` cannot be changed,68 so anyone planning to move to conversion optimisation later will need a new69 campaign anyway.70- **One ad group per intent.** Not per product, not per audience. Intent71 determines which phrasing lands.72- **Two or three ads per group**, using different angles rather than reworded73 versions of the same claim. Only then is the comparison meaningful.7475## Assessing7677Run the sufficiency check from `references/benchmarks.md` before quoting any78number. If the data is too thin, output **no score** — state what is missing79and how long to keep measuring.8081Assess against the **maximum tolerable CPA** derived from the business model,82not against industry figures. There are none for this platform.8384## Every recommendation needs four things8586Without these it is a finding, not a recommendation:87881. **Observation** — what it rests on, with a number892. **Dependency** — what has to happen first903. **Falsification** — how would you know it did not work?914. **Leading indicator** — what moves first, without re-running the analysis9293Point 3 matters most. Anyone who cannot say how they would notice being wrong94is recommending on a hunch, and here that spends real budget.9596## When things go wrong9798| Situation | Response |99|---|---|100| 403 on an endpoint | Feature not enabled. Say so, do not work around it. |101| 404 on a resource that exists | Usually the same cause. |102| 409 "missing details" | Account profile incomplete — **or** sporadic. A retry tells you which. |103| Ad `rejected` | Read `review.reason_code`. A `crawler_*` code points at the landing page, not the copy. |104| No conversion data | Do not read as poor performance. Check measurement first, then data volume. |105| Someone wants to use search-ad CPCs as bids | Explain it is a different auction. Start small and measure. |106| Someone quotes 35/67 characters | Correct it: 50 and 100 per the spec. |107108## What this platform cannot do109110Do not look for, suggest or claim: keyword bidding, match types, keyword111planner, search volume, radius targeting, personalised ads in the EEA, a112sandbox, official benchmarks, a Python SDK.113114Details and reasoning in `references/misinformation.md`.