OpenAI published an engineering account of how ChatGPT serves ads on October 21, 2026. The architectural detail is the news: a separately post-trained model, which OpenAI calls the orchestrator, runs the ad flow through tool calls, in a service that never touches the model writing the answer. The post also carries the commercial number, with ChatGPT Ads at $1 billion in annualized run rate less than 200 days after launch and more than 100,000 advertisers since then.
What was actually released
There is no new product in this post. It describes a stack already serving ads, written by two members of technical staff, Ritendra Datta and Karthik Gopalratnam. Three decisions are presented as the ones that shaped it: ad sessions keep state across turns and across conversations, the orchestrator interprets the conversation and calls tools, and ad selection runs in its own service with separate models and separate code. The last is the load-bearing one, because a slow ad server cannot delay a ChatGPT answer, and OpenAI states plainly that it does not delay a response to wait for an ad.
| Published figure | Value | What it measures |
|---|---|---|
| Annualized revenue run rate | $1 billion | ChatGPT Ads, less than 200 days after launch |
| Advertisers since launch | more than 100,000 | advertisers that have run ads on ChatGPT |
Both figures come from the OpenAI post of October 21, 2026, and from nowhere else. No period, no audit and no methodology accompany them.
The mechanics are ordinary advertising machinery around an unusual controller. The orchestrator rewrites a conversation into commercial queries, embeds them, retrieves candidates through approximate nearest-neighbor search, filters for eligibility, scores relevance, engagement and past performance, then nominates candidates for the auction. It sets no price and picks no winner.
| Stage | What the orchestrator calls | What the stage removes |
|---|---|---|
| Retrieval | rewritten queries, embeddings, ANN search over several indices | nothing yet, the pool is deliberately broad |
| Filtering | eligibility on creative, locale, policy, budget, pacing, placement | inactive campaigns, excluded locales, spent budgets |
| Scoring | semantic relevance, predicted engagement, historical performance | candidates below the relevance and safety bar |
| Auction | admission threshold, pacing, bid computation, quality-adjusted ranking, pricing | candidates below the value threshold |
Stages and checks as listed by OpenAI on October 21, 2026. The weights, the thresholds and the reserve price are not given.
After the auction, two failures are specific to chat. An integrity model can clear a conversation and the orchestrator can still block an ad as inappropriate in context, or the ad arrives after the answer is ready and is dropped for that turn. If it does arrive, the frontend shows it below the response, labeled as sponsored, behind a model-generated preamble kept separate from the advertiser copy. OpenAI draws the line itself: server-side delivery is not an impression.
The three sentences that carry the design
- Stateful ad sessions remember a conversation across turns and across separate chats.
- A post-trained model, not a rules engine, decides when the ad flow runs.
- The ad service and the answer service share no model and no code.
What the claim rests on
The $1 billion and the 100,000 advertisers are the company’s own figures, published without a definition of run rate, without the period they cover, and without a split between advertising and other revenue. A run rate is an extrapolation, not a receipt. Read both as a statement of scale.
The architectural claim is different in kind, because it is falsifiable. Ads cannot influence answers, OpenAI argues, because selection happens in a separate service and because returning no ad is treated as an ordinary success rather than a failure to fix. That is the right shape for a guarantee: a boundary someone can describe is a boundary someone can test. What is missing is the test. No external audit is cited, no measurement of answer quality with and without ads is published.
The self-improvement loop is asserted rather than shown. The strongest reasoning models watch outcomes and train the smaller models that do retrieval and orchestration, and human signals from clicks, hides, surveys and advertiser feedback steer direction, with no evaluation numbers attached. The Codex claim is thinner still: a force multiplier that let a small team bootstrap the system, with no figure for how much of the code or the iteration it produced.
What OpenAI does not publish
No fill rate, so nobody outside can say how often an eligible conversation gets an ad. No timeout threshold in milliseconds and no latency distribution, which is what an advertiser would need to understand lost impressions. No reserve price, no auction weights, no measured lift in relevance or engagement, no breakdown of the $1 billion, and no audit of the separation between ads and answers.
On this page
What it changes for advertisers and buyers
For an advertiser, the useful part is the list of recorded outcomes. OpenAI logs five reasons a placement does not happen: the turn was not eligible, a session opened with no retrieval, retrieval returned no candidates, candidates failed hydration or eligibility, or an ad was delivered and later interacted with. That is a diagnostic ladder, and a report showing only impressions and spend cannot tell a targeting problem from a budget problem or from a conversation with no commercial moment.
Ask which of those five outcomes your report shows before scaling, because a vendor able to log them internally has already done the work of exposing them.
For a reader, the details are small but concrete. Personalization is opt-in, and when it is on the orchestrator may use non-sensitive information from past conversations. Ads sit below the answer, never inside it, and carry a label. For anyone comparing tools on the promise that ads will not corrupt output, this post is the template to demand: a policy page says ads will not influence answers, a separated service says how.
The Neural Minute take
Ignore the billion. The line that should decide how you read the post is the one about returning nothing.
Returning no ad is an ordinary, successful outcome.
That is a commitment with a cost. A system that must fill every eligible turn and one allowed to return nothing are different products with different incentives, and only the second can be trusted with a conversational surface. A fill rate is the number that proves it, and the post does not give one.
Our reservation is about what the post chooses to quantify. Revenue and advertiser count are quantified, because they impress. Latency, fill, timeout, auction thresholds and any before-and-after on answer quality are not, and those are the numbers a buyer would use to check the design. Run rate is not revenue, and 100,000 advertisers is not 100,000 active ones. Neither figure is wrong. Both are chosen.
What we would keep: the diagnostic ladder changes a decision this quarter, the separation of services changes a decision at renewal, and the billion is context. That order is the reverse of how the post is written, and it is the right order for anyone paying for the product rather than selling against it.
Sources
- How we built ChatGPT’s novel ad stack for user trust and relevance, openai.com, published October 21, 2026: https://openai.com/index/building-chatgpt-ad-stack
- The figures used here, read on that page on October 21, 2026: $1 billion in annualized revenue run rate less than 200 days after launch, more than 100,000 advertisers since launch, five recorded outcomes for a turn that produces no impression
- The milestone page OpenAI links to from the post, on access to ChatGPT Ads: https://openai.com/index/expanding-access-to-ai-with-chatgpt-ads/
- The advertising principles OpenAI names as the boundary of the system: https://openai.com/index/our-approach-to-advertising-and-expanding-access/