Post

HN
Hacker News

ChatGPT serves ads. Here's the full attribution loop

OpenAI's ad platform has two halves. On the ChatGPT side, the backend injects structured single_advertiser_ad_unit objects into the conversation SSE stream while the model is responding. On the merchant side, a tracking SDK called OAIQ runs in the visitor's browser and reports product views back to OpenAI. The two are tied together by Fernet-encrypted click tokens, four of them per ad.

I captured both halves on a consented mobile-traffic research fleet. Everything below comes from observed traffic.

When you send a message to ChatGPT, the backend opens an SSE response at chatgpt.com/backend-api/f/conversation . Most events in that stream are model-output. Some are ad units. They look like this:

A single account in the panel received six different ads across six conversations on six different topics. The targeting is contextual to the chat:

Same account, different topic, different brand. I didn't find evidence one way or the other on whether targeting also incorporates prior conversation history.

Every ad ships with four distinct Fernet-encrypted blobs. Their roles, based on where they appear: