Skip to content
Back to blog
AI|Growth Hackers Stockholm

How to Build Your First ChatGPT Ads Campaign in OpenAI Ads

How to Build Your First ChatGPT Ads Campaign in OpenAI Ads

The reasoning behind our own ChatGPT Ads campaign β€” now live, with day-one results: CPM, CPC and CTR against the planning assumptions. Structure, budget maths, running it over MCP, and the most common mistakes.

Free analysis

Curious how your marketing is really performing?

Get a free analysis of your digital channels β€” no fluff, just clear findings and next steps.

Book free analysis

Updated 1 September 2026: the campaign is now live and has spent its first full day of budget. Actual results β€” CPM, CPC and click-through rate, revised once reporting caught up β€” are in step 5, and a new closing section covers what day one taught us: reporting lag, segment reporting by platform/device/country, and an EEA restriction on custom audiences that only shows up in the interface. Earlier update, 31 August: the sections on context hints and character limits were corrected against OpenAI's official creative guidance.

We built our own OpenAI Ads campaign out in full while waiting for billing for Swedish entities to roll out β€” and it is now live, starting with a first ad group serving while the rest of the structure rolls out. The build: one campaign, ten ad groups, one hundred ads, eighty context hints.

This guide is the reasoning behind it β€” not a click-through tutorial, but the decisions that actually determine whether the campaign works. If you have not read our breakdown of what the Swedish launch means, start there β€” or see our ChatGPT Ads guide for the condensed version of formats, pricing and targeting.

The structure: three levels, different decisions at each

OpenAI's campaign model has three levels. What makes it unfamiliar is not the hierarchy but what gets decided where β€” in particular that targeting sits at ad-group level while budget sits at campaign level.

LevelWhat you decide here
CampaignBudget and budget type, start and end dates, objective (views, clicks or conversions), countries
Ad groupMaximum bid and context hints β€” which is to say, all of the targeting
AdTitle, copy, link and image

The consequence: if you want to bid differently for different buying situations, they have to be separate ad groups. If you want to target several countries with different budgets, you need separate campaigns.

Step 1: Choose the objective before anything else

The campaign objective determines the bidding your ad groups get: views give you CPM, clicks give you CPC, conversions give you oCPC. You cannot mix within a campaign.

We chose clicks. The reason is cost control in a channel where we do not yet have our own conversion data. With CPM you pay for exposure whether or not the format works for your audience; with CPC you only pay once someone actually breaks their conversation flow to click. In a new channel that is the more cautious route.

The conversion objective also requires a conversion event setting ID, which assumes tracking is already in place and that you have accumulated volume. That is where you want to end up β€” but rarely where you start.

Step 2: One ad group = one buying situation

This is where the biggest mistake gets made. The temptation is to build ad groups around your service catalogue, as you would in Google Ads. It works poorly here.

Because context hints and bids live at ad-group level, a group is only as sharp as it is coherent. Mix two different audiences into one group and your hints become a compromise between two situations, leaving the relevance model less to work with. You also cannot bid differently for them, even though they are almost certainly worth different amounts.

We split by audience – intent – topic instead. Ten groups, each with one clearly defined buying situation:

Ad groupMax bid (CPC)
Free analysis β€” someone wanting an independent assessment$4.50
GEO and AI visibility β€” noticing AI recommends competitors$4.00
Claude Code workshop β€” wanting hands-on team training$4.00
Corporate AI workshop β€” rolling out AI across the organisation$3.75
AI in marketing β€” moving from ad hoc to system$3.50
Growth management β€” growth has plateaued$3.50
Measurement and analytics β€” the numbers do not reconcile$3.25
GTM engineering β€” stuck in manual processes$3.25
Performance marketing β€” suspecting budget leakage$3.00
Choosing an agency in Stockholm β€” comparing options$2.75

Bids are ranked by intent, not by how much we want to sell the service. Someone actively looking for a free analysis is closer to a decision than someone generally comparing agencies β€” so that group bids highest and agency comparison lowest.

Step 3: Write context hints as short phrases

We got this step wrong at first, and it is worth being explicit about why β€” the mistake is an easy one to make.

Because ChatGPT matches on conversational context, the intuitive conclusion is that context hints should be sentence-length descriptions of a person and their situation. That is wrong. OpenAI's own guidance is to write them as descriptive phrases of roughly four to five words, following the pattern:

[product or category] + [use case or context] + [qualifier]

OpenAI's own examples: "project management tool for marketers", "online accounting software for freelancers", "family vacation planning on a budget". Short, concrete, closer to a keyword than a persona.

In fact OpenAI explicitly writes that if you are familiar with search keywords, context hints are "a good place to include keywords or phrases" describing relevant contexts. The difference from exact match is that they do not guarantee delivery for a given query β€” they guide matching rather than locking it.

The guidelines in short:

  • Five to ten hints per ad group. If you need to cover meaningfully different products, audiences or use cases, the answer is more ad groups β€” not more hints.
  • Around four to five words per hint. Specific enough to describe a real need, broad enough to allow for natural language variation.
  • Describe needs and situations, not just standalone terms.
  • Use the buyer's words. Nobody types "GTM engineering" into ChatGPT unless they already know the term.
  • Mirror your hint in the ad copy. The relevance model reads them together.

And the mistakes OpenAI lists explicitly:

  • Vague hints such as "software", "marketing" or "AI".
  • Unrelated popular terms added to expand reach.
  • Several unrelated products in one ad group.
  • Relying only on brand or competitor names.
  • Repeating the same idea with minor wording changes.
  • Treating hints as guaranteed targeting rules.

That last item deserves attention in a Swedish market. Our first instinct was to write every hint in both Swedish and English. That borders on repeating the same idea with different wording. We went with predominantly Swedish hints instead, using English only where the term genuinely is English in Swedish business usage β€” "performance marketing byrΓ₯ Stockholm", "generative engine optimization agency". There is no room for duplicates when the ceiling is ten.

Step 4: One hundred ads, and why that is not excessive

OpenAI recommends roughly a hundred ads per campaign. It is not a volume heuristic β€” it follows from matching happening on context.

When relevance is judged on how well the ad mirrors the conversation, generic copy becomes a liability. A headline that works everywhere does not work particularly well anywhere. So the breadth of specific creative is not waste; it is the targeting.

Ten ads per ad group gives the auction ten phrasings to choose between within a single buying situation. That is a reasonable level of ambition to start at.

The format limits are tighter than most people are used to, but they are a range β€” not a ceiling to squeeze under. OpenAI's wording is that the title should be 16–24 characters and the copy 32–48 characters where possible, with 24 and 48 as absolute maximums.

We had this wrong at first too. We read "aim for 16 and 32" as a ceiling and deliberately wrote short ads β€” which left forty of our hundred ads below the floor, leaving space unused. In Swedish the range is a relief rather than a constraint: 16–24 characters is enough for a concrete offer instead of just a product name.

Title and copy should complement each other rather than repeat the same message. And avoid minor rewrites of the same ad β€” they fill the quota but add nothing to the auction.

One tip that saved us a lot of time: validate character lengths in a script rather than in the spreadsheet. With a hundred ads in two language versions this is not a manual task, and a single ad over the limit can block the entire upload.

Step 5: Convert CPM into something you can budget with

OpenAI quotes a typical range of $15–60 CPM. But if you run a click campaign your maximum bid is a CPC, and the two need connecting before you can set a number.

At a reported click-through rate of around 0.91%, 1,000 impressions yield roughly 9.1 clicks. So:

CPMEffective cost per click
$15~$1.65
$30~$3.30
$60~$6.59

Our bids of $2.75–4.50 sit in the lower half of that range: high enough to win auctions on high-intent conversations, low enough that we are not paying awareness prices for traffic.

At a $25 daily budget and a little over $3 effective cost per click, that works out to roughly seven or eight clicks a day. It is a learning budget, not a scaling budget β€” and that is deliberate. The first thing the campaign should produce is data on which context hints actually match, not volume.

Also choose a daily budget rather than a lifetime one. Pacing for total campaign budget is not yet enabled, which makes spend hard to predict.

The actual outcome after day one: the campaign spent its full daily budget and landed β€” once reporting had caught up β€” at a CPM of about $12, an effective CPC of about $0.65 and a click-through rate of roughly 1.8%. The maths above turned out to be pessimistic in the right direction: CTR came in at double the 0.91% planning assumption, the CPM landed below the floor of OpenAI's quoted range, and the effective cost per click ended up at a fifth of the mid-range figure β€” delivering several times the clicks per day the estimate predicted. One day is a small sample, but as a first validation of the budget maths, the direction is clear.

Note the qualifier "once reporting had caught up": our first reading, taken right as the daily budget was spent, badly undercounted both impressions and clicks β€” clicks were revised up by about half over the following hours, and the spend columns in parts of the interface temporarily showed zero. Never evaluate on fresh numbers.

Step 6: Square creative, without the logo

The image must be 1:1, at least 640Γ—640 and no larger than 1200Γ—1200 pixels, PNG or JPG, and reachable at a public URL. OpenAI's stated recommendation is not to use the logo as the primary visual β€” the favicon already appears next to your brand name, so a logo in the image duplicates it and takes space from something that sells better.

Expect this to be production work you do not already have. Most marketing teams have 16:9 and 4:5 on file, rarely square at the right resolution.

Step 7: Make the ads measurable before they go live

A hundred ads across ten groups pointing at the same landing pages become impossible to evaluate afterwards if they share UTM parameters.

We gave every individual ad a unique utm_term, with the ad group in utm_content:

?utm_source=chatgpt&utm_medium=cpc&utm_campaign=gh-se-growth-2026&utm_content=geo-ai-synlighet&utm_term=geo-ai-synlighet-04

That makes each ad separable in GA4 without depending on the platform's own reporting. If your measurement is not already reliable, it is worth fixing before the campaign starts rather than after.

Step 8: Run the campaign from your AI assistant over MCP

A hundred ads across ten ad groups is a lot of surface to keep an eye on, and Ads Manager is not built for the kind of daily reading a learning budget needs. Since our campaign went live, most of our own checking has moved out of the interface entirely.

Cogny’s OpenAI Ads MCP is now live: an MCP server (Model Context Protocol β€” the open standard that lets an AI assistant call external systems as tools) that exposes campaigns, ad groups, chat-card ads and insights from OpenAI Ads. In practice you ask in plain language β€” “which ad groups spent yesterday, and what was the click-through rate per platform?” β€” instead of clicking through reporting views. Disclosure: Cogny is an AI marketing platform built by the same founders as Growth Hackers, and we use it on our own campaign.

Connecting it takes a couple of minutes. In OpenAI Ads Manager, go to Settings β†’ API keys and create a key for the ad account you want to connect β€” each key is scoped to one account, and it is only shown once. Paste it into Cogny, where it is stored encrypted and used server-side by the MCP proxy. You can revoke it in Ads Manager whenever you want.

This matters more here than in other channels, for two reasons. The reporting lag described in step 5 means you have to re-read the same day several times before the numbers settle β€” and the effort per reading is what decides whether you actually do it. And because the same assistant can hold Google Ads, GA4 and Search Console in the same session, comparing this channel against the ones you already run stops being an export-and-spreadsheet exercise.

What it does not do is remove the judgement. The assistant reads and changes what you ask it to; deciding which context hints to cut and which bids to move is still yours.

The four mistakes we expect to be most common

  • Building ad groups around your service catalogue. Structure should follow buying situations, because that is where the targeting lives.
  • Writing context hints as sentences. Aim for four to five words. Twenty-word persona descriptions are not what the platform is asking for.
  • Reading 16 and 32 characters as a ceiling. It is the floor of a target range that ends at 24 and 48.
  • Expecting Google's click-through rate. Plan for under 1% β€” our own first day delivered ~1.8%, but that is still nowhere near search levels. Evaluate on conversions and traffic quality, not CTR.

The campaign is live: what day one taught us

Billing came through and the campaign is now running β€” in stages, with a first ad group serving while the rest of the structure rolls out. Five things from the first day are worth passing on.

The budget maths held, with room to spare. The full daily budget was spent, at a CPM of about $12, an effective CPC of about $0.65 and a click-through rate of roughly 1.8% β€” see step 5. Planning on pessimistic assumptions and being positively surprised is the right direction to be wrong in.

Reporting lags β€” a lot. The reading taken right after the daily budget was spent undercounted clicks by about half compared with what was later reported for the same day, and spend columns can temporarily show zero. Build in a delay before drawing conclusions from today's numbers.

Segment reporting is more detailed than expected. Delivery can be broken down by platform (Android app, iOS app, web), device (desktop, mobile) and country. Our first day: roughly six out of ten impressions from the mobile apps, nearly two thirds of impressions and clicks mobile overall, and a strikingly even click-through rate of 1.7–1.9% across every segment. Mobile-ready landing pages are, in other words, not optional.

Custom audiences are not available in Europe at all. While building the campaign, the interface showed a notice that is not in the public material: "Custom audiences are not supported for campaigns that target locations within EEA or Switzerland, where personalized ads are not yet available." Everything written about customer lists and 25,000-contact thresholds is, for now, irrelevant for campaigns targeting the EEA or Switzerland. Targeting here is context hints plus geography β€” which makes the hint work in step 3 even more important, because it is the entire targeting layer.

The preparation is what made the speed possible. Because structure, hints, ads and measurement were built and validated in advance, we could go live the same week billing opened. And that work pays off regardless, since paid placement and organic citation in AI answers are driven by the same underlying signals β€” the argument is in ChatGPT Ads and GEO: Why They're the Same Strategy. The next report worth writing is when GEO and ads data can be compared side by side.

Want help building the structure for your own campaign, or to know how you show up in AI answers today? Book a free analysis.

Free analysis

Want to learn more?

We are happy to help you grow with data-driven marketing and growth hacking.

Contact us