View as Markdownllms.txt

Integrations

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

  1. Open Settings → Integrations → ChatGPT Ads.
  2. Enter the pixel ID and Conversions API key and save.
  3. 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.

OpenAI Conversions API
POST https://bzr.openai.com/v1/events?pid={pixelId}

Create a tracking link with network openai and use its /o/ URL as the ad destination:

ChatGPT Ads 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 set externalCampaignId, externalAdGroupId and externalAdId on each tracking link. The oppref alone doesn't tell AppRefer which campaign a click came from.

3. Connect spend reporting

  1. Enter the Ads API key and save.
  2. Run the reporting Test Connection. It reads back the ad account ID, currency and time zone and stores them.
  3. 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 eventOpenAI event
installapp_installed
sign_up, signup, complete_registrationregistration_completed
Trial start (startTrial, qualified_trial)trial_started
First paid subscription period, including intro and promotional offers; subscribesubscription_created
One-time purchase, SDK purchase event, website purchaseorder_created
add_to_cart / initiate_checkout / view_content / page_viewitems_added / checkout_started / contents_viewed / page_viewed
lead / appointment_scheduledlead_created / appointment_scheduled
app_opened (only if your app tracks an event with this name)app_opened
Renewal, plan change, cancellation, expiration, billing issue, pauseNever 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), or
  • POST /api/v1/apps/{appId}/web-purchases, the older ChatGPT-Ads-only endpoint: eventId, arClickId, anonymous deviceId, original timestampMs, revenue in major units, currency, a generic HTTPS sourceUrl (/, /checkout or /checkout/confirmation, no query) and optional adult purchaser emailSha256. 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 original oppref, 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.