Back to Insights

How to Set Up ChatGPT Ads Manager: A Step-by-Step Guide From Our Own Pilot

September 8, 2026|19 min read|Kilian Dreher

When we published our first look at ChatGPT Ads landing in Europe, we ended on a promise: build a real account, run a real pilot, and come back with numbers instead of theories. That pilot is done. Between September 1 and September 5, 2026, we set up a ChatGPT Ads Manager account for zentric.digital from a blank login screen, worked through every setup screen ourselves, ran three live campaigns on €150 total spend, and pulled the first performance numbers straight from OpenAI's own reporting API.

This is the how-to we said we'd write. Not a rewrite of OpenAI's help docs, but what actually happens on screen, which settings quietly block your campaigns from serving, and what the specs really are once you're inside the product instead of reading about it secondhand. If you're setting up your own account this week, treat this as the checklist we wish we'd had.

One thing up front: some of the character-limit numbers and pricing figures that circulated before the European self-serve launch don't match what the live UI shows. We'll flag every place that happened.

Table of Contents


What Actually Happens When You Open ads.openai.com

First surprise: the public marketing page at ads.openai.com shows "Log in / Sign up" even when you're already authenticated in the same browser session. You have to click through, "Start now" is the button, before it checks your actual auth state and either drops you into an existing account or starts onboarding. If you've bookmarked the marketing page and keep seeing a login prompt, that's expected. Click through anyway.

First-time account setup asks for your legal business name, your business website, and an industry from a dropdown. The list we saw: Retail & eCommerce, Consumer Goods, Software & Technology, Financial Services, Media & Entertainment, Professional Services, Local Services, Education & Careers, Automotive, Health, Travel & Hospitality, and Other. Pick the closest fit, it feeds targeting categorization later.

Next comes country, currency, and timezone, and this screen is explicit about the stakes: "These settings can't be changed later, please configure carefully." Denmark is available as a full country option. Worth noting for anyone running a multi-market pilot: geo-targeting later goes down to state and region level even within a single country, every German Bundesland is individually selectable, for example. Get the country/currency/timezone choice right the first time, there's no do-over screen.

Then billing. It's a Google-Pay-style secure iframe for card entry, an invoice delivery email that auto-fills from your login email, and an optional field for invoice CCs. Try to skip it and you get a real confirm dialog, not a soft warning: "Ads cannot serve until you set up your billing profile." You can technically build campaigns without billing attached, but nothing goes live until it's there.

Once billing clears, you land in the actual Ads Manager dashboard with an "Ads Manager Beta" welcome modal. That word, beta, is doing real work here. Keep it in mind for the rest of this guide.


The Two Settings That Silently Block Every Campaign From Serving

This is the section we wish someone had written for us, because both of these cost us real time before we found them.

The "Advertiser type" field doesn't save the way it looks like it saves. In Settings, under General, under Verification, there's an "Advertiser type" dropdown. It shows "Business" pre-filled by default. It looks done. It is not done. That value isn't actually saved until you open the dropdown, re-select a value (even the same one), and click Save. Skip this step and every campaign Publish attempt fails silently, no UI error, nothing on screen. The only trace is a 409: advertiser_type_required error that shows up in the browser console and nowhere else. If your campaigns won't publish and you don't see any error explaining why, this is very likely it. Check Verification settings first.

A business logo is a second hard requirement, alongside billing. The platform's own language: "Set up billing and upload an account logo to start serving ads." We found the UI's read on whether a logo actually exists is inconsistent, it flickered between "found" and "missing" across different screens in the same session. Don't trust a single reading from wherever you happen to be in the app. Go check Settings, then General, directly, and confirm the logo shows there before assuming it's the reason a campaign won't serve.

Beyond those two, a few more things worth knowing before you're deep into setup:

  • A brand-new account gets a separate review gate, even with billing and a logo both set. Click a "Not serving" campaign's status and you'll see a paginated list of reasons. One of ours read: "Getting your account ready. No further action is expected from you at this time. This may take between 5-7 days." That's a real, quotable number for how long a fresh account takes before it can actually deliver.
  • Custom audiences don't work for EEA or Swiss targeting. The platform states this directly: "Custom audiences are not supported for campaigns that target locations within EEA or Switzerland, where personalized ads are not yet available." If you're running this for a European market, budget your targeting strategy around contextual-only from the start, don't design a campaign around an audience feature that won't apply.
  • The platform can and does go down. We hit a full-page "SERVICE TEMPORARILY UNAVAILABLE" error mid-build, with matching 503s in the browser console. Nothing was wrong on our end. It's a beta product, and it behaves like one occasionally.
  • A status toggle can lie to you. We paused a campaign, got a "Status updated successfully" toast, and watched it show as paused. On a fresh page reload, it was active again. This isn't unique to ChatGPT Ads, it's the same discipline we've written about for evaluating browser automation tools running against ad platforms generally: don't trust a UI's immediate response as proof a change persisted. Always verify with a hard reload before you move on.

Format Specs: What the Live UI Actually Allows

Pre-launch coverage of ChatGPT Ads circulated tighter character limits than what the live product actually enforces. Here's what we verified directly in the ad-builder:

FieldVerified live
TitleUp to 50 characters
DescriptionUp to 100 characters
Image1:1 square, minimum 256x256px, with a built-in square-crop editor
Suggested starting CPCA flat €2.60 "Strong Delivery" baseline, shown identically for both Germany and Denmark, no market-based variation we could see

If you've been writing copy against the older, tighter limits, rewrite it. You have meaningfully more room than the earlier public numbers suggested, and cramming a headline into 24 characters when the field actually allows 50 is leaving clarity on the table for no reason.


Two Ways to Build a Campaign (and Which One We'd Recommend)

Ads Manager gives you two genuinely different paths into a campaign.

The first is AI-assisted: point it at your website, it scrapes the page, and it drops you almost directly into a review screen with most decisions already made for you. Defaults out of the box: Daily budget (not Campaign total, more on why that distinction matters below), "Maximize results" bidding, and AI text auto-generation switched on. That last one matters more than it sounds. The platform's own language warns that auto-generated text "may be shown without your individual review or approval." We turned it off in every campaign we ran, because letting an algorithm write and ship copy on your brand's behalf without a review step isn't a risk worth taking for the time it saves.

The second path is "Create from scratch," a manual flow with actual control: an Objective dropdown (Reach, Clicks, or Conversions), granular location targeting, custom audiences where they're available, start and end dates, and landing-page query-parameter templating so you can pass campaign_id, ad_group_id, ad_id, ad_account_id, and oppref straight into your URL for tracking, without hand-building UTM logic.

Our recommendation: use the manual flow. If you care about exact copy, character-limit precision, and knowing exactly what bidding strategy you're running, the AI-assisted path removes decisions you actually want to be making yourself, especially in a small, capped pilot where every euro needs to earn its keep.


Budget Types: Daily Budget vs. Campaign Total Budget

This is the single most important setting to get right if you're running anything with a strict spending ceiling.

Daily budget works the way Meta's does: it's an average daily spend, and the platform allows up to roughly 2x overspend on a given day and up to 7x on a weekly basis, as long as it evens out. That's fine for an ongoing campaign. It is not a hard cap.

Campaign total budget is a true lifetime ceiling. Once it's spent, the campaign stops. No averaging, no weekly flex.

If you're running a fixed-dollar pilot, like we did, use Campaign total budget, not Daily budget. Defaulting to Daily budget on a strict-ceiling test risks blowing past your intended spend without realizing it until you check the account days later.


How We Structured Our Own Pilot: One Variable at a Time

We originally planned this as a single campaign. We pivoted it into a small localization test instead, because with only €150 total to work with, one well-designed test beats a vague one.

CampaignLocationAd languageDestinationBudget
DE PilotGermanyGermanzentric.digital/de€50 (Campaign total budget)
DK PilotDenmarkDanishzentric.digital/da€50 (Campaign total budget)
DE+DK PilotGermany + DenmarkEnglishzentric.digital/€50 (Campaign total budget)

Two design choices worth explaining, because they look like mistakes if you don't know the reasoning.

First, the German and Danish campaigns and the English campaign deliberately target the same two countries. That's not a targeting error, it's the whole point. The question we wanted answered was whether localized ad creative actually outperforms English creative in the same market, and you can't answer that if the campaigns aren't competing for the same audience.

Second, every campaign ran with exactly one ad, one USP angle ("no lock-in, pay for performance"), held identical across all three languages. We didn't test multiple angles per campaign. With €150 split three ways, testing two variables at once, language and angle, would have diluted both signals past the point of being readable. If you're running your own small pilot on a limited budget, this is the actual lesson: pick the one variable you want signal on, and hold everything else constant. Testing everything at once with too little spend tells you nothing about anything.

Bidding was manual CPC, capped at €3.50, against that live-suggested €2.60 baseline. Objective was set to Clicks, which is what manual CPC bidding maps to directly.


Setting Up Conversion Tracking: Pixel, CAPI, and What to Verify

Ads Manager ships with a real measurement stack: a browser-based Measurement Pixel, a server-side Conversions API, standard and custom conversion events, campaign-level linking, an Event Stream, hashed user matching, Pixel-plus-CAPI deduplication, and both click-through and view-through attribution. It is not mature multi-touch attribution, don't oversell it to yourself, but it's real first-party conversion measurement, which is a meaningfully different starting point than "no pixel at all."

The conversion checklist inside Ads Manager links directly to OpenAI's official "OpenAI Ads Conversions" setup guide, with documentation at developers.openai.com covering the Measurement Pixel, the Conversions API, and supported events. We connected our existing data source, "Ads OpenAI Pixel," and mapped a "Completed Lead" conversion event to OpenAI's documented standard event, lead_created. The custom-conversion form caps reporting names at 30 characters and defaults to a 30-day click-through attribution window, with alternative windows listed as "coming later."

Pixel and CAPI share one browser-generated logical event ID for deduplication, both are gated behind the site's existing marketing-cookie consent, and matching uses a normalized SHA-256 hash of email plus valid IP and user agent, so raw email addresses are never sent to OpenAI Ads. Browser-side source URLs are trimmed to trusted origin plus pathname, query strings and fragments get stripped before anything is sent.

We verified this the same way we verified Meta's one-click Conversions API setup a few weeks earlier: don't trust the feature description, test it live. The Pixel SDK loaded only after marketing consent was granted, as intended. A test event sent without attribution returned HTTP 202. The Event Stream showed it. A CAPI call with validate_only set to true returned HTTP 200 with accepted_events equal to 1. After a hard reload, the "Completed Lead" event showed "Used by: 3 campaigns," confirming the link held across all three pilot campaigns. Linking a conversion event added conversion and CPA reporting to the dashboard. It did not silently switch bidding into conversion optimization, our objective stayed Clicks throughout, exactly as expected.

A few live UI quirks worth flagging if you're setting this up yourself: the Event Stream does nothing until you click "Start polling," it doesn't stream by default. The conversion "Set up" control on the Campaigns table is hover-revealed, an overlapping wrapper element intercepts clicks if you're not hovering the right cell. A conversion listbox can look like it's still open after you save, even though the save already went through. Again: verify with a hard reload, not the immediate on-screen state.

One more thing, on the security side. If your setup flow shows you a one-time-reveal secret, a CAPI key being the obvious example, never read it back through a page snapshot or a console log. Copy it once, straight to a private destination, and treat every "this won't be shown again" dialog on this platform as sensitive by default.


The Reporting API Nobody Told Us We Could Use

This is the most useful thing we found, and it's the opposite of what you'd expect from the public docs.

OpenAI's developer documentation at developers.openai.com/ads frames campaign-management and insights API access as gated, something OpenAI enables per-account for approved partners. That did not match what we found. On a plain self-serve account, with no partner status and no approval request filed, Settings, under General, under API Keys, has a working "Create New Key" button, and it works immediately. The key it issued had full read access on the first call. Both GET /campaigns and GET /ad_account/insights against the base URL api.ads.openai.com/v1, using standard bearer auth, worked on the first try. No waiting, no partner conversation.

If you assumed you'd need to talk to an OpenAI rep to get programmatic reporting on a small self-serve pilot, that assumption is wrong, at least as of this beta. It's a similar gap to the one we've flagged before around where the official Meta Ads MCP falls short for AI agent workflows: documentation and marketing framing don't always match what's actually accessible if you go look.

One sharp edge: a plain Python urllib request against the API gets rejected with a 403 from a Cloudflare bot check, error 1010, using its default user agent. curl works without any issue. If you're scripting against this API, set an explicit, curl-like user agent header, otherwise it looks exactly like an authentication failure and isn't one.


Four Days In: Our First Real Numbers

We pulled these numbers via the API, not the dashboard UI, covering September 1 through September 5, four days of live delivery.

CampaignImpressionsClicksCTRCPCCPMSpendConversions
DE Pilot (German)1,948301.54%€1.72€25.72€50.00 (fully spent)0
DK Pilot (Danish)1,733251.44%€2.04€28.80€48.920
DE+DK Pilot (English)1,927341.76%€1.45€25.75€49.410

Read this as four days of data, not a verdict. On the actual question we set out to answer, does localized creative beat English creative in the same market, the early signal so far says no. The English ad has the best CTR and the cheapest CPC of the three, in the exact markets the localized versions are supposed to have a home-turf advantage in. That's genuinely counterintuitive, and we're not ready to call it settled. A rough rule of thumb we use before trusting any per-variant comparison: don't trust it below roughly 100 clicks per variant. We're sitting at 25 to 34. Treat this as an early signal worth watching, not a conclusion worth acting on yet.

Zero conversions across all three campaigns so far. With only 89 total clicks across the whole pilot, that's a low-volume artifact, not evidence of a tracking problem, and we're not going to speculate further than that from four days of data.

One structural factor worth naming on top of the volume issue, and our own read on why: ChatGPT Ads currently only show to Free and Go tier users, not Plus, Pro, Business, Enterprise, or Edu subscribers. That's a real ceiling on the addressable audience, and we think it's part of why these particular clicks haven't converted yet, not just the fact that there are only 89 of them. Free-tier usage skews toward lighter, more casual ChatGPT sessions, which isn't automatically the same audience actively comparing options and ready to buy. We'd rather flag that as a live hypothesis than pretend the zero-conversion number has one clean explanation.

One thing the numbers do confirm: all three campaigns paced close to their €50 caps individually, one already fully exhausted, rather than overspending past it. That's the Campaign total budget behavior we described above, holding up exactly as it should under real delivery.

We'll publish a results-focused follow-up once there's meaningfully more volume to read. We're not putting a date on it, we'd rather wait for a real sample than promise a timeline and pad the data to hit it.


Frequently Asked Questions

Q: How do I set up a ChatGPT Ads Manager account?

A: Go to ads.openai.com and click "Start now" even if you're already logged in, the marketing page doesn't reflect your auth state. You'll set your legal business name, website, and industry, then a country, currency, and timezone (locked once set), then billing. Only after billing is confirmed do you land in the actual Ads Manager dashboard.

Q: What image size does ChatGPT Ads require?

A: A 1:1 square image, minimum 256x256px. The ad builder includes a built-in square-crop editor if your source image isn't already square.

Q: Why is my ChatGPT Ads campaign stuck on "Not serving"?

A: Click the "Not serving" status for the specific listed reasons, it's usually one of: billing not set up, no account logo uploaded, the account still in its initial brand review window (which the platform states can take 5-7 days), or the "Advertiser type" field in Settings not actually saved, which fails Publish silently and only shows a 409 error in the browser console.

Q: How much do ChatGPT Ads cost per click?

A: In our live test, Ads Manager's own suggested starting CPC was a flat €2.60 "Strong Delivery" baseline in both Germany and Denmark. We ran manual CPC bidding capped at €3.50 and saw actual CPCs between €1.45 and €2.04 across three campaigns.

Q: Can I set a hard spending cap on ChatGPT Ads?

A: Yes, but only if you choose "Campaign total budget" instead of "Daily budget." Daily budget allows up to roughly 2x daily and 7x weekly overspend, similar to Meta. Campaign total budget is a true lifetime ceiling that stops delivery once it's spent.


Key Takeaways

  • Open ads.openai.com and click through even if it shows a login prompt while you're already authenticated, then complete business details, a locked-in country/currency/timezone choice, and billing before you reach the real dashboard.
  • Two settings silently block every campaign from serving: the "Advertiser type" dropdown in Verification settings, which isn't saved until you re-select and click Save, and a missing account logo, which the UI reports inconsistently.
  • Verified live specs beat the numbers that circulated before EU launch: titles up to 50 characters, descriptions up to 100, one 1:1 image at minimum 256x256px.
  • Use "Create from scratch" over the AI-assisted flow if you want control over copy and bidding, and turn off AI text auto-generation, it can publish copy without your review.
  • Use Campaign total budget, not Daily budget, for anything with a strict spending ceiling.
  • The programmatic reporting API works on a plain self-serve account with no partner approval required, despite documentation implying otherwise, just make sure your requests use a curl-like user agent.
  • Our first four days of live data show English creative slightly outperforming localized German and Danish creative in the same markets, but at 25-34 clicks per campaign, that's a signal worth watching, not a conclusion worth acting on.

Building a real pilot before trusting a new ad platform's own claims, and knowing which numbers are worth acting on versus which ones need more volume first, is exactly the kind of work we do for e-commerce and DTC clients every week. Book a discovery call and we'll help you figure out whether a channel like this belongs in your media plan yet.

Ready to Scale Profitably?

Book your free discovery call and let us map out the next growth moves for your e-commerce brand.