
The reasoning behind our own campaign: ten ad groups, one hundred ads and ninety-six context hints. Structure, budget maths, and the mistakes we expect to be most common.
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 analysisWe have built our own OpenAI Ads campaign out in full while waiting for billing for Swedish entities to roll out. One campaign, ten ad groups, one hundred ads, ninety-six 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.
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.
| Level | What you decide here |
|---|---|
| Campaign | Budget and budget type, start and end dates, objective (views, clicks or conversions), countries |
| Ad group | Maximum bid and context hints β which is to say, all of the targeting |
| Ad | Title, 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 group | Max 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 descriptions, not search strings
A context hint is not a keyword. It is a description of a conversation.
The most useful framework we have found is audience β intent β topic: who is asking, what are they trying to accomplish right now, and what is the subject. A hint that names only the topic leaves two thirds of the signal unused.
Compare:
- Weak: "marketing agency Stockholm"
- Strong: "A company unhappy with its current agency and looking for alternatives in Stockholm for a B2B business"
The second captures buying stage, role, geography and cause. That is exactly the kind of context keyword-based systems could never represent β and the whole point of the channel.
Practical guidelines we followed:
- Five to fifteen hints per ad group. Fewer than that fails to cover the different ways buyers phrase the same situation. More blurs the group's identity.
- Write in both Swedish and English. This may be the most overlooked point in a Swedish market. Swedish professionals routinely prompt in English, particularly on technical subjects. The two phrasings match differently, and you want both.
- Use the buyer's words, not your internal ones. Nobody types "GTM engineering" into ChatGPT. They describe being stuck in manual work between forms and CRM.
- Mirror your hint in the ad copy. The relevance model reads them together.
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: 24 characters for the title, 48 for the copy, with guidance to aim for 16 and 32 so nothing truncates on mobile.
In Swedish that is hard. We deliberately chose not to force all hundred ads under 16/32 β the result would have been near-identical lines with no substance. Instead each ad group carries both: three short variants that always render in full, plus longer ones with room for more specific information. Around a third of our ads sit under the tighter recommendation.
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:
| CPM | Effective 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.
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.
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 keywords. Short topic phrases throw away the two thirds of the signal that sits in audience and intent.
- Writing only in Swedish. A large share of your buyers prompt in English.
- Expecting Google's click-through rate. Around 0.91% is normal in this interface. Evaluate on conversions and traffic quality, not CTR.
What we are doing while we wait on billing
Our campaign is finished. What remains before upload is square creative and a real start date β everything else is built and validated.
In the meantime we are putting the work where it pays off regardless: into GEO. Paid placement and organic citation in AI answers are driven by the same underlying signals, which means the preparation for ads is not sitting idle β it is already paying off in the organic channel. We developed that argument in ChatGPT Ads and GEO: Why They're the Same Strategy.
Want help building the structure for your own campaign, or to know how you show up in AI answers today? Book a free analysis.



