Skip to content
Documentation

Documentation

Ad platforms

Connecting Meta, Google Ads, TikTok, Apple Ads, Mintegral, AppLovin and Unity Ads: what to copy from each, where it lives, and what goes wrong.

Connecting

Open Integrations (or an app's Ad accounts tab) and pick a platform. Each opens a guided setup with the same steps as this page, and every credential is checked with the platform before anything is saved: a wrong key is refused on the spot rather than failing quietly in an hourly sync.

PlatformHow you connectSends sales back
MetaSign in with Meta, or paste a system-user tokenYes, Conversions API
Google AdsSign in with Google, or paste a refresh tokenYes, conversion upload
TikTokSign in with TikTok for Business, or paste a long-term tokenYes, Events API
Apple AdsUpload a public key to Apple, paste the private keyNo: Apple has no conversions API
MintegralPaste the access key and API keyYes, postbacks (Partners tab)
AppLovinPaste the Report KeyYes, postbacks (Partners tab)
Unity AdsPaste a service account's keyYes, postbacks (Partners tab)

Whether Meta, Google and TikTok offer the sign-in button depends on your workspace's configuration; when they don't, the setup asks for the pasted credential instead. Apple Ads, Mintegral, AppLovin and Unity Ads have no sign-in screen at all. Apple Ads is for iOS apps; Mintegral, AppLovin and Unity Ads are for apps, and don't appear on a website.

Meta

You need admin access to the Meta Business portfolio that owns the ad account. With sign-in, press Connect with Meta, approve read access (ads_read) and pick the account. Without it, create a system-user token:

  1. In Meta Business Settings, open Users → System users and press Add. Give it the Employee or Admin role.
  2. Select it, press Assign assets, choose the ad account and allow at least View performance.
  3. Press Generate token, pick your app, set the expiry to Never and tick ads_read. Copy it: Meta shows it once.
  4. Copy the ad account ID from Ads Manager (the act_… in the URL; either form works).
FieldWhere to find it
Access tokenBusiness Settings → Users → System users → Generate token
Ad account IDAds Manager account menu, or act_… in the URL
Pixel / dataset ID (optional)Events Manager → your dataset → Settings. Turns on sending sales back. Set here, or later on the app's Partners tab.
Test event code (optional)Events Manager → Test events. While set, pushes stay out of Meta's optimizer; clear it to go live.

TikTok

With sign-in, press Connect with TikTok, choose the advertiser accounts to share and pick one. The token doesn't expire. Without sign-in you need a long-term access token from a TikTok Marketing API developer app (approved in the TikTok for Business developer portal) authorised on your advertiser account; if you don't have one, ask us to enable sign-in instead.

FieldWhere to find it
Advertiser IDTikTok Ads Manager, under the account name or aadvid= in the URL
Pixel code or App ID (optional)Added on the Partners tab. A pixel code for a website, the TikTok App ID for an app. Turns on the Events API.

Apple Ads

For iOS apps. You need an Apple Ads user with the API role: Read Only access to the campaign group is enough for reporting; the API Account Manager role also lets Owners and Managers pause and enable campaigns, ad groups and keywords and change budgets, bids and target CPA from the Apple Search Ads Manager, and add negative keywords. They can also create campaigns and ad groups (paused unless chosen otherwise), add and copy keywords, copy or move ad groups between the app's campaigns, add a search term as a keyword or a negative from its row, and delete campaigns, ad groups and keywords (a campaign only after its name is typed back, since Apple Ads cannot restore it). Every change is recorded in Settings → History.

Rules act on their own, on a schedule you choose: when keywords, search terms, ad groups or campaigns meet your conditions over the last N closed days (spend, taps, Apple's installs, conversion rate, CPT, CPI, and our verified revenue, ROAS, purchases, subscribers, CAC and RPC), they pause, change a bid, budget or target CPA, or add a search term as a keyword or a negative. A rule starts in Preview, which only lists what it would do; going live is a separate confirmation. A figure we don't have never counts as zero, a revenue rule waits until verified revenue reaches the app, stale Apple data skips the run, a run changes at most 50 things, an increase must have a ceiling, and anything a rule changed is left alone for its cooldown. Every change is logged with the figures that triggered it, and pauses, bids, budgets and target CPA can be undone.

  1. Generate a key pair: press Generate key pair on the connect screen (the key is made in your browser and the private half fills itself in), or run openssl ecparam -genkey -name prime256v1 -noout -out private-key.pem, then openssl ec -in private-key.pem -pubout -out public-key.pem.
  2. In Apple Ads, open Account Settings → API and add the public key. Apple shows a client ID, team ID and key ID. One key serves every app the Apple Ads account advertises, so keep the private key if you will connect more than one app.
  3. Paste those three and the whole of private-key.pem, and press Verify. Pick the campaign group.

Installs are matched through AdServices, so there is no link to set up. Apple has no server-side conversions API, so nothing is sent back.

We read three of Apple's reports: spend per ad, per keyword and per search term. Ad-level spend is the spend every report divides by. The keyword and search-term reports split that same money more finely and are never added to it. The first sync pulls the last 90 days, which is as far back as Apple's daily reports go.

  • Revenue per keyword is ours, not Apple's. When the app is first opened, AdServices names the campaign, ad group and ad that won the install and, when there is one, the keyword. Every sale and subscription credited to that install carries the keyword, so a keyword's ROAS is built on the sales your own attribution credited. Apple's reports carry spend and installs, not revenue. Installs recorded before keyword capture shipped on 21 October 2026 carry no keyword, and the Apple Search Ads page shows how many of your attributed installs do.
  • Apps on RevenueCat are covered too. With RevenueCat's Apple Ads integration on, RevenueCat asks Apple the same question and writes the campaign, ad group and keyword on the subscriber. A sale none of our own evidence credits takes that answer, once the campaign matches one of the app's Apple campaigns (so another partner's campaign is never read as Apple's), within the app's click window counted from the subscriber's first sale. An answer that arrives a renewal later reaches the earlier sales too. Our own evidence always comes first.
  • Not every dollar has a keyword. Search Match and ads on the Today tab, the Search tab and product pages spend without one. That spend gets its own Search Match & other placements row in each ad group, so the keyword level adds up to the same spend as the campaign. Installs AdServices attributed without naming a keyword (Search Match, those placements, and ad groups targeted by age or gender) are counted there too.
  • Search terms are Apple's figures only. No attribution can name the search a person typed. They refresh once a day. Apple leaves out terms with fewer than 10 impressions and reports them together as one Low-volume searches row per keyword.
  • Apple's installs and ours differ. Apple counts downloads within 30 days of a tap. We count first opens. A download never opened, a redownload, or an install a tracking-link click claimed first all make them differ, so the two are shown side by side and never merged.
  • A view is a view-through. When Apple attributes an install to an ad that was shown but not tapped, it is credited as view-through, and only while impression-based attribution is on in the app's Attribution tab.

To see net proceeds as well as gross revenue on the Apple Search Ads page, set the store commission (the 15% or 30% the App Store keeps) on the iOS app's Revenue tab.

Mintegral

Spend per offer and creative. A Mintegral offer is what other platforms call a campaign.

  1. In the Mintegral advertiser dashboard, open Account Management → Basic Information.
  2. Copy the access key and the API key. They are two different values.
  3. Paste both and press Verify.

AppLovin

Spend per campaign and creative set, for app campaigns.

  1. In the AppLovin dashboard, click your account at the top right and choose Keys (Account → Keys).
  2. Copy the Report Key. Not the SDK key, and not the Campaign Management API key.
  3. Paste it and press Verify.

AppLovin's API has no account ID, so the connection is shown as a short fingerprint of the key (al_…). It stays the same when you replace the key. Spend is pulled in UTC days.

Unity Ads

Spend per campaign and creative pack.

  1. In the Unity Cloud dashboard, open Administration → Service accounts, create one and give it the Advertise Stats API Viewer role.
  2. On its page, add a key. Copy the key ID and the secret key; Unity shows the secret once.
  3. In the Acquire dashboard, open Settings and copy the Organization core ID.
  4. Paste all three and press Verify.

When a connection is refused

Every refusal names its cause. The common ones:

MessageWhat to do
This account sits under a manager (MCC) accountGoogle: enter the manager account's 10-digit ID on Account details.
The Google user you signed in with can't see that accountSign in with a user who has access, or grant it in Google Ads → Admin → Access and security.
Meta didn't accept the token / can't read this ad accountReconnect, or assign the ad account to the user or system user in Business Settings.
Apple did not recognise this keyThe IDs must match the public key you uploaded, and the private key must be its other half.
Mintegral did not accept these keysCopy both again; the access key and API key differ.
AppLovin did not accept this keyUse the Report Key from Account → Keys, not the SDK or Campaign Management key.
Unity found no organization with that IDUse the Organization core ID from Acquire → Settings.
Unity did not accept this key for that organizationCheck the key ID and secret, and the Advertise Stats API Viewer role.
This ad account is already connected to this appEdit the existing connection on the Ad accounts tab.

How spend joins revenue

Spend and revenue are joined on platform ad IDs, lifted from the URL macros in your ad links: campaign ID and ad ID.

Names are only a fallback, for when one side lacks IDs. A name is something a marketer typed and can retype, and renaming an ad mid-flight used to split one campaign into two half-rows with nonsense ROAS on both.

Sending conversions back

Matched sales are pushed back to Meta's Conversions API, Google Ads and TikTok's Events API, so the platforms can optimise against real revenue instead of a pixel's guess.

Where each network's pixel or conversion action, token and test event code are set is the app's Partners tab, kept apart from Ad accounts: an ad account pulls spend in, a partner sends sales out, so removing or reconnecting an account never erases these settings. Google signs its uploads with the ad account the partner is linked to, so it needs one connected.

Every network on the Partners tab, including AppLovin, Unity, Mintegral and Apple, can also have its own attribution windows: a click window (1 to 90 days) and an impression window (1 to 168 hours). Meta's is not Google's, so setting each to what that network's own report uses is how the two sides come to agree. Blank means the app's value, and an app with none set attributes exactly as it always has. The probabilistic window stays the app's, because it bounds how many strangers behind one shared address the guess may pair.

Share each sale's value (on by default) decides whether the amount goes out with the event. Off, the value is left out and never sent as 0, since a 0 would tell the network the sale was worth nothing. The network still counts the conversion but cannot bid for revenue, so value optimisation and target ROAS stop working for it. Check how the network treats an event with no value in its test events before relying on this.

Each platform is delivered and retried independently, so a dead Google credential cannot stall Meta. Apple Ads offers no server-side conversions API, so there is nothing to send back there. Mintegral, AppLovin and Unity Ads take postbacks instead (below).

Postbacks to Mintegral, AppLovin and Unity Ads. On the app's Partners tab, paste the postback URL the network gives you, put our macros where its placeholders go, and choose whether it fires on installs, in-app events (all of them, or one named event) or purchases. Each install, event or sale we attribute to that network is sent to it once, as a GET, and retried for about two days if the network doesn't answer. Organic installs, reinstalls, bots, sandbox purchases and refunds are never sent, and pausing the partner pauses its postbacks.

Raw advertising ids and IP addresses cannot be sent, because we store only hashes of them; a URL that asks for one is refused when you save it. The network's own click id travels instead: when the network adds it to your click link, {click.<param>} sends it back (for example {click.clickid}). Preview shows the URL we would send for your newest install from that network without sending it, since a test request would book a fake install in the network's reports.