pixellint

Blog · ChatGPT ads

ChatGPT ads MMP attribution is not proof your OpenAI CAPI pipe ingests order_created

Measurement vendors are wiring ChatGPT Ads into the same server-side story as Meta CAPI: flip a partner integration, get deduplicated campaign rows. OpenAI still expects the advertiser to POST order_created to bzr.openai.com with timestamp_ms and, for click-through, oppref you captured yourself.

Industry press this week describes an MMP expanding attribution to organic referrals from AI answer engines and paid ChatGPT Ads, including an integration that attributes campaigns through OpenAI's Conversions API on web and mobile. The pitch is server-side infrastructure, an independent deduplicated view, and activation without engineering work.

That is useful for campaign analytics inside the MMP. It is not a substitute for the advertiser-owned conversion queue. Ads Manager and your MMP can disagree while both look internally consistent, because they answer different questions on different hops.

What the MMP integration actually measures

Mobile measurement platforms built their business on click and impression signals they observe or ingest: OneLink, Smart Script, SDK lifecycle events, partner postbacks. ChatGPT Ads adds a paid surface where the click lands on a web URL with oppref, and the conversion may finish in a browser checkout or in an app opened from that landing hop.

When the vendor says ChatGPT Ads attribution runs through OpenAI's Conversions API, read that as the MMP (or its server partner) posting events OpenAI accepts on behalf of the advertiser account. The MMP's job is to tie campaign spend to installs, re-engagements, and web conversions it can see in its graph. That graph is not your shop's order pipeline.

The same release cycle also extends organic attribution to answer-engine optimization: referrals from ChatGPT, Claude, Perplexity, and other AI surfaces alongside classic search. Reporting that separates SEO from AEO, and paid ChatGPT traffic from organic AI referrals, is a media-mix view. It does not lint the JSON your worker sends from checkout.

What OpenAI CAPI still requires from you

OpenAI documents a hybrid pattern: JavaScript pixel on the page plus server POST with the same Pixel ID and the same event id for deduplication. The host for live events is bzr.openai.com, not graph.facebook.com. The array is events[], not data[]. The clock is timestamp_ms in milliseconds, bounded to the last seven days and ten minutes in the future.

Unlike the pixel, the API does not capture oppref for you. Capture the value yourself and pass it with the server event when it is available to support click matching. That sentence is the whole class of production bugs MMP dashboards will not surface, because the MMP is not your landing-page logger.

Web conversions use type order_created, action_source web, and source_url with HTTPS scheme and host. amount is minor currency units. currency is ISO 4217. A Meta-shaped Purchase with event_time in seconds is the wrong envelope even if the MMP integration is enabled. HTTP 200 on a malformed body still happens when the gateway only checks JSON parse.

Where the two pipes diverge in production

Hosted checkout is the familiar fracture. ChatGPT appends oppref on the ad click landing URL. The pixel can store it in a first-party cookie. The thank-you page on another subdomain never reads that cookie unless you copied the value through the redirect chain. The MMP may still attribute the campaign click it saw. OpenAI CAPI POSTs without oppref never join click-through Conversions.

App campaigns add a second split. OpenAI supports app_installed and app_opened with action_source mobile_app on CAPI only. MMP S2S posts to api3.appsflyer.com with eventName and eventTime as a UTC string, a different dialect entirely. Enabling ChatGPT Ads in the MMP UI does not merge those clocks or field names into one worker.

Partners may set integration_source on the OpenAI request root when posting on behalf of advertisers. That identifies the integration partner. It does not replace your Conversions API key, and it does not move oppref from the landing URL into the server body for you.

What the advertiser POST still looks like

OpenAI Ads Conversions API shape. The MMP integration does not remove the need for this POST on your worker.

POST https://bzr.openai.com/v1/events?pid=PIXEL_ID
Authorization: Bearer <CONVERSIONS_API_KEY>

{
  "events": [{
    "id": "evt_20260918_001",
    "type": "order_created",
    "timestamp_ms": 1758201600000,
    "oppref": "oppref_from_landing_query",
    "action_source": "web",
    "source_url": "https://shop.example/thanks",
    "data": {
      "type": "contents",
      "contents": [{ "id": "sku_1", "quantity": 1 }],
      "amount": 4200,
      "currency": "USD"
    },
    "user": {
      "emails_sha256": ["64ec88ca..."],
      "ip_address": "203.0.113.10",
      "user_agent": "Mozilla/5.0..."
    }
  }]
}

If your team only validates the partner toggle in the MMP, you can ship without ever logging this body. validate_only on OpenAI confirms schema without saving. Production POSTs need the Conversions API key, not the Advertiser API key used on api.ads.openai.com for setup.

Dedup on OpenAI is Pixel ID plus event type plus id. Reuse the pixel's event_id as id when you run hybrid. The MMP's deduplicated campaign metric uses its own keys. Matching MMP revenue to Ads Manager Conversions requires both pipes to ingest the same order, not one green checkmark in a partner panel.

View-through on web uses a separate window from click-through Conversions. Optimizing on a blended number while CAPI omits oppref is how CPA looks fine in one UI and empty in another.

Organic AI referrals are a third lane

Answer-engine referrals are not ChatGPT Ads clicks. They still show up in analytics as AI-driven discovery. MMP reporting that splits AEO from SEO helps media teams see which prompts send traffic. That lane does not populate oppref, because there is no paid click id.

Treat organic AI traffic like organic search for collector design: log referrer and landing URL on the edge, persist query parameters before client-side redirects strip them, and decide which events need manual UTM or prompt metadata. None of that replaces CAPI for paid ChatGPT campaigns.

Press coverage notes vendors claiming ChatGPT scale in the billions of weekly users and billions of daily prompts. Scale makes the attribution gap expensive: a small miss rate on oppref capture across hosted checkout is a large absolute dollar leak when spend follows conversational ads.

Product marketing that promises no engineering work is aimed at media buyers, not at the platform engineer who owns checkout redirects. Assume you still need a first-party log line on every ChatGPT ad landing and a server mapper that emits OpenAI events[] at commit time.

Checklist when the MMP says ChatGPT Ads is connected

Unlike the pixel, the API does not capture oppref for you. Capture the value yourself and pass it with the server event when it is available to support click matching.

OpenAI Ads Conversions API

What to do before you trust the integration toggle

Run one known purchase through hybrid pixel plus your worker. Capture oppref on the landing hit, copy it through checkout, POST order_created with thirteen-digit timestamp_ms, then read Ads Manager Conversions and the MMP campaign row the same day.

If the MMP shows the ChatGPT Ads click and OpenAI shows zero server events, you have a partner analytics path without advertiser CAPI ingest. Fix the worker before you tune bids on MMP ROAS alone.

Pixellint is not affiliated with OpenAI or any MMP. Passing validate json on the OpenAI pack means the artifact matches the published envelope. It does not mean the MMP integration replaced your obligation to capture oppref on the landing hop.

Treat the MMP row as campaign truth and the CAPI POST as ledger truth until both match on the same order id.

Sources

Contract pages

The dated argument is above. These pages are the field lists.

Open the OpenAI CAPI pack Docs