ChatGPT Ads (beta)
AppRefer attributes installs to self-serve ChatGPT Ads through the oppref click reference, sends conversions to OpenAI's Conversions API and imports campaign spend for the campaigns you list.
Uses your own ads account
AppRefer uses credentials from your own OpenAI Ads account. OpenAI must have enabled Ads Manager, a pixel and the APIs for that account; no separate partner setup is needed.What you need
- An OpenAI Ads pixel ID and Conversions API key.
- An Ads API key, if you want spend and ROAS.
- The OpenAI campaign IDs that belong to this app.
- Your App Store and/or Google Play URLs set on the app in AppRefer.
1. Connect conversions
- Open Settings → Integrations → ChatGPT Ads.
- Enter the pixel ID and Conversions API key and save.
- Run the conversions Test Connection. It sends a validate-only request that records nothing.
Conversions only start once that test has passed. If you change the pixel ID or key later, through the dashboard, the API or MCP, the integration goes back to not connected until you test again.
POST https://bzr.openai.com/v1/events?pid={pixelId}2. Create the tracking link
Create a tracking link with network openai and use its /o/ URL as the ad destination:
https://apprefer.com/o/{linkId}The /o/ page is a crawlable app page with store buttons, like the Google landing page. OpenAI adds its opaque oppref to the URL; AppRefer records a click only when a valid oppref is present, so OpenAI's review and search crawlers can load the page without creating clicks. On Android the page passes AppRefer's click ID through Google Play Install Referrer for an exact match; on iOS the install is matched to the click.
Set campaign IDs on each link
OpenAI has no campaign macros for the destination URL yet, so setexternalCampaignId, externalAdGroupId and externalAdId on each tracking link. The oppref alone doesn't tell AppRefer which campaign a click came from.3. Connect spend reporting
- Enter the Ads API key and save.
- Run the reporting Test Connection. It reads back the ad account ID, currency and time zone and stores them.
- Add the campaign IDs that belong to this app (
campaignIds, up to 200). Only these campaigns are imported, so another app's campaigns in the same account are never counted here.
AppRefer imports whole days of campaign spend and re-reads today through three days ago on each regular run. A failed or partial response never replaces a day that was already complete. Spend sync currently works for USD ad accounts only; attribution and conversions work in any currency. Country breakdowns use OpenAI's own country segment.
Event mapping
| AppRefer event | OpenAI event |
|---|---|
| install | app_installed |
| sign_up, signup, complete_registration | registration_completed |
| Trial start (startTrial, qualified_trial) | trial_started |
| First paid subscription period, including intro and promotional offers; subscribe | subscription_created |
| One-time purchase, SDK purchase event, website purchase | order_created |
| add_to_cart / initiate_checkout / view_content / page_view | items_added / checkout_started / contents_viewed / page_viewed |
| lead / appointment_scheduled | lead_created / appointment_scheduled |
| app_opened (only if your app tracks an event with this name) | app_opened |
| Renewal, plan change, cancellation, expiration, billing issue, pause | Never sent |
Override a mapping in Settings → Event Mapping: enter another OpenAI event name, custom:<name> for a custom event, or leave it empty to stop sending that event. Unknown events are not sent. With Qualified trials on, the trial is held and trial_started is sent only once it qualifies.
Website purchases
If the ad leads to your website instead of a store, use a web_funnel tracking link. The /o/ page then sends visitors to your site with ar_click_id, and your payment backend reports each settled order to AppRefer with a private organisation key (apps:write):
POST /api/v1/apps/{appId}/web-events, the general endpoint for every network (see web events), orPOST /api/v1/apps/{appId}/web-purchases, the older ChatGPT-Ads-only endpoint:eventId,arClickId, anonymousdeviceId, originaltimestampMs,revenuein major units,currency, a generic HTTPSsourceUrl(/,/checkoutor/checkout/confirmation, no query) and optional adult purchaseremailSha256. Unknown fields are rejected.
Both return 202 once the order is safely queued (not once OpenAI has credited it); identical retries are deduplicated and a changed payload for the same eventId returns 409. Only purchases reach ChatGPT Ads from the website, as order_created with action_source: "web" and the page URL. No app install is created for them.
Delivery and privacy
- App events are sent with
action_source: "mobile_app", the originaloppref, a stable event ID and the event time in milliseconds. - Amounts are sent in the currency's minor units (cents for USD, whole yen for JPY).
- Matching fields: hashed email from Advanced Matching, a hashed user or device ID, and IP address and user agent when known.
- Retries reuse the same event ID. Events more than seven days old (OpenAI's limit) are dropped.
- Keys are encrypted at rest and masked in the dashboard, API and MCP.