Unity Ads Integration
Beta
The Unity Ads integration is still being verified with real advertiser accounts. If adstage numbers differ from the Unity console, please let us know.
In adstage, you can collect Unity Ads campaign cost, report clicks, installs, and purchases arriving through a tracking link under the unity.ads channel, and send installs and purchases back to Unity. Unity Ads does not use an OAuth sign-in; you connect it by entering a service account key issued in Unity Cloud.
1. Integration Overview
When you connect Unity Ads in Integrations > Ad Channel Integration > Unity Ads, three capabilities work together.
| Feature | Support | Description |
|---|---|---|
| Cost collection | Supported | Register a key in the Cost Integration tab to collect spend, impressions, clicks, and installs per campaign every 4 hours |
| Click attribution | Supported | Clicks, installs, and events arriving through a tracking link are reported under the unity.ads channel |
| Conversion sending | Supported | A Network Postback preset on the link sends installs and purchases to Unity. This is the custom (non-MMP) integration Unity officially allows |
Please note
ironSource Ads direct demand shut down on April 30, 2026 (new accounts and campaigns stopped on April 15), and Unity directs advertisers to Unity Ads. adstage does not offer an ironSource Ads integration, so use the Unity Ads integration instead.
2. Getting a Key from Unity
Unity Ads cost is read through Unity's Advertising Statistics API, which authenticates with a service account Key ID and Secret key. The same steps appear in the How to get your Unity Ads key box in adstage, and the Open Unity Ads key page button opens Unity Cloud directly.
-
In Unity Cloud, go to Manage organization > Administration > Service Accounts and create a service account. Only an organization Owner or Manager can do this.
-
Add the organization role Growth > Advertise Stats API Viewer to the service account. Without this role, Unity rejects the request when adstage registers the key.
-
On the service account page, click Create key and copy the Key ID and Secret key. The secret is shown only once; if you lose it, create a new key.
-
In the Unity User Acquisition (Acquire) dashboard, open Settings and copy the Organization core ID. This is the value for the
Organization IDfield in adstage.
Please note
- The Settings page also has a separate Organization ID field. The value adstage needs is the Organization core ID.
- Unity also documents an Advertise Stats API MMP Viewer role for service accounts created at an MMP's request. adstage uses a service account you create yourself, so add Advertise Stats API Viewer.
3. Registering the Account in adstage
-
Go to Integrations > Ad Channel Integration > Unity Ads and open the
Cost Integrationtab. -
Turn on the
Unity Ads Cost Integrationswitch. TheAdd Integration Accountbutton is disabled while the switch is off. -
Click
Add Integration Accountand fill in the fields.
| Field | Description |
|---|---|
Account Label | A name to identify this account in adstage. Any text works |
Organization ID | The Organization core ID from Settings in the Unity User Acquisition dashboard |
Key ID | The Key ID of the service account key |
Secret Key | The Secret key of the service account key. It is masked on screen and stored encrypted |
- Click
Integrate. Before saving, adstage requests one day of reporting from Unity with the key to confirm it is valid (the button showsVerifying...). When this finishes, the message "Unity Ads account has been successfully added." appears and the first collection of the last 30 days starts immediately.
Errors shown while connecting
| Message | Cause | What to do |
|---|---|---|
| This account is already registered | The same organization ID is already registered in this organization | Keep using the existing account |
| The key was rejected by Unity Ads. Please check the key and its permissions. | The Key ID, Secret key, or Organization ID is wrong, or the service account lacks the Advertise Stats API Viewer role | Add the role and copy the key again |
| Could not reach Unity Ads to verify the key. Please try again later. | A temporary error or a request limit on Unity's side | Try again shortly |
4. Managing Connected Accounts
Registered accounts are listed in the Cost Integration tab with the columns Account Name, Status, Last Data Update, and Management.
- Preparing: the first collection is running right after registration. It usually finishes within a few minutes.
- Success: the Unity API connection is healthy. If no ads ran and zero rows were collected, the status is still Success as long as the connection works.
- Failed: Unity rejected the key (key deleted, role removed, and so on). Hover over the badge to see the error. Request limits (429) and temporary errors do not change the status; collection is retried in the next cycle.
If no cost rows are stored for more than 3 days, a warning appears next to the status with an Action Required notice ("No cost data has been collected for N days"). It clears automatically once collection resumes.
To rotate a key or disconnect, delete the account with the delete icon in the Management column. Data already collected is kept; only new data stops. There is no way to edit a stored key on screen.
5. Creating Tracking Links
In Deep Links > Create, select Unity Ads as the ad channel. The campaign and creative fields are filled with Unity macros; leave them as they are and Unity replaces them with real values at click time. Unity has no ad group level, so leave the ad group field empty.
| adstage parameter | Unity macro | Value |
|---|---|---|
campaign | {campaign_name} | Campaign name |
campaign_id | {campaign_id} | Campaign ID |
ad_creative | {creative_pack} | Creative pack name |
ad_creative_id | {creative_pack_id} | Creative pack ID |
sub_channel | {source_app_id} | ID of the app that showed the ad. Added only if you fill the additional parameter field |
ifa_raw | {ifa} | Advertising ID (IDFA on iOS, GAID on Android). Unity requires this macro in every link |
gamer_id | {gamer_id} | Unity user ID. Returned to Unity as gamerId in the install postback |
unity_game_id | {game_id} | Unity Game ID of the advertised game. Used in the install postback path |
ifa_raw, gamer_id, unity_game_id, and the ID macros are always appended, whether or not you typed anything. The generated link looks like this:
Unity does not provide a per-click ID macro. adstage issues the click ID for the tracking link, and when the network postback is on, gamer_id is used as the matching key with Unity.
Paste the copied link into the app's attribution link settings in the Unity User Acquisition dashboard, one per platform. Unity validates the URL format when you save it. If you cannot find the menu, ask your Unity contact.
Please note
- Do not remove or edit the
{ifa},{gamer_id}, and{game_id}macros. Unity refuses to save a link without{ifa}, and without the other two values the install postback cannot be sent.- Unity requires attribution links to use https, to redirect with HTTP 3xx codes, and not to redirect to the App Store or Google Play. Point the link's redirect settings at a web landing page, not a store.
- Because Unity fills in the campaign name, cost and conversions merge into the same campaign row. If you typed a name yourself, it must match the Unity campaign name exactly.
6. Sending Conversions to Unity
Unity publishes the install and in-app event postback spec for advertisers who send data directly without an MMP. When you turn on Network Postback on a Unity Ads channel link, the Network Preset Unity Ads — Install & purchase (custom integration) is filled in automatically; if the fields are empty, choose it from Network Preset. See Network Postback for what each setting does.
| Field | Value filled in |
|---|---|
Install Postback URL Template | https://postback.unityads.unity3d.com/games/{unity_game_id}/install?advertisingTrackingId={adid}&gamerId={click_id}&attributed=1 |
Event Postback URL Template | https://ads-secondary-conversion.unityads.unity3d.com/v1/events?ifa={adid}&gamer_id={click_id}&tracking_enabled={tracking_enabled}&campaign_id={campaign_id}&game_id={unity_game_id}&platform={platform}&bundle_id={bundle_id}&install_ts={install_ts}&was_conversion_attributed=1&event={event}&value={revenue}¤cy={currency} |
Click ID Parameter | gamer_id |
Trigger Events | install, purchase |
{unity_game_id}and{campaign_id}echo the values Unity put in the link at click time. Nothing needs to be entered.{bundle_id}is read from the Android package name (App Links) and iOS bundle ID (Universal Links) registered in your deep link settings. To use the purchase postback, both must be set in Link Settings.{install_ts}is the install time, and{tracking_enabled}is 1 when the advertising ID is available and 0 otherwise.{revenue}and{currency}carry the purchase amount and currency.installalso matchesfirst_open.- Unity accepts three in-app event names:
purchase,ad_revenue, andsession. adstage'spurchaseis sent with the same name, so leaveEvent Name Mappingempty. Do not add events Unity does not accept.
Please note
- The install postback is the basis for CPI billing. Unity counts installs from the install postbacks it receives, so set up both the tracking link and the install postback for installs and cost to appear correctly in the Unity console and in adstage cost reports.
- Event optimization campaigns (Retention, Payer, and Level Complete) can only run with an MMP Unity designates (Adjust, AppsFlyer, or Singular). They are not available with a custom integration, and Unity notes it may not be able to troubleshoot custom integrations.
- Unity recommends sharing all installs, including unattributed ones, but the adstage network postback sends only events attributed to that link, marked
attributed=1.
7. Collected Data
Cost data is what Unity reports, stored per day and per campaign.
| Item | Description |
|---|---|
| Collection interval | Every 4 hours (1, 5, 9, 13, 17, and 21 o'clock Korea Standard Time) |
| Update range | The last 30 days excluding the day of the update (D-30 to D-1), re-fetched every cycle so values stay current |
| First collection | Starts automatically right after registration. Older data is not collected |
| Data level | Campaign level (day x campaign) |
| Currency | Stored as USD and converted to your report currency. Unity does not state a currency, so the advertiser billing currency USD is used |
| Timezone | UTC (Unity Statistics API) |
| Channel name | unity.ads |
In reports, metric names carry a (Channel) suffix to show they are network-reported values.
| Report metric | Unity value |
|---|---|
| Ad Spend (Channel) | Spend |
| Impressions (Channel) | Ad starts, which Unity counts as impressions |
| Clicks (Channel) | Clicks |
| Conversions (Channel) | Installs attributed by Unity |
| Conversion Value (Channel) | Not collected. Use purchase revenue measured by the adstage SDK |
Days where spend, impressions, clicks, and installs are all zero are not stored. Campaigns are keyed by campaign ID, so renaming a campaign in the Unity console keeps the same history.
8. Cautions
Please note the following.
- Numbers may differ between Unity Ads and adstage. Unity reports in UTC, and aggregation timing and currency conversion also differ.
- For CPI campaigns, spend follows the installs Unity counts, so late install postbacks can change figures for past days. Changes are picked up when the last 30 days are re-fetched.
- The Unity Statistics API allows 1 request per second and 30 requests per 30 minutes per organization ID. If other tools call the API heavily with the same organization ID, collection may be delayed; adstage retries automatically.
- Deleting the service account key or removing its role stops collection and sets the status to Failed.
- Turning off the
Unity Ads Cost Integrationswitch stops collection for every Unity account in this organization. The accounts remain, so turning it back on resumes collection. adstage only reads Unity reports and never changes campaign settings.
9. Troubleshooting
If something goes wrong, check the following.
The key cannot be registered
- Check the role: confirm the service account has the Growth > Advertise Stats API Viewer role
- Check the organization: confirm the value in
Organization IDis the Organization core ID from Settings and belongs to the organization where the service account was created - Check the key: confirm the Secret key is exactly the value copied at creation. If it is lost, create a new key
- Retry: "Could not reach Unity Ads" is a temporary error, so try again shortly
Status is Success but there is no data
- Check spend: compare with the Unity console report to confirm campaigns spent in the last 30 days
- Check timing: the first collection starts right after registration, then the last 30 days (excluding today) are refreshed every 4 hours. Today's data arrives with tomorrow's update
- Check the install postback: CPI campaigns are billed on the installs Unity receives, so cost may stay at 0 without them
Postbacks do not reach Unity
- Check the link: confirm the
gamer_id,unity_game_id, andifa_rawparameters are still in the tracking link - Check the settings: confirm
Network Postbackis on for that link andClick ID Parameterisgamer_id - Check app info: the purchase postback needs
bundle_id, so confirm the Android package name and iOS bundle ID are registered in link settings - Check attribution: postbacks fire only for installs and purchases attributed to that link
If you need further help, contact adstage support.
10. FAQ
Do I need to register adstage as an MMP with Unity?
No. Unity officially allows advertisers to send data through a custom integration, so cost collection, tracking links, and postbacks work without any registration. Event optimization campaigns, however, require a Unity-designated MMP.
I have several Unity organizations.
Create a service account key in each organization and add one account per organization. The same organization ID can be registered only once.
What channel name should I use in a custom link?
unity, unityads, unity_ads, and unity ads are all reported as unity.ads.
Why do Conversions (Channel) and adstage installs differ?
Conversions (Channel) are installs Unity attributed by its own rules, while adstage installs are measured with the tracking link and SDK. Different attribution rules and timezones produce different numbers.
11. References
- Unity Advertising Statistics API v2 — service account auth, the Advertise Stats API Viewer role, rate limits, metrics and breakdowns
- Create a service account in Unity Cloud
- Attribution link macros (Dynamic custom tokens) — macro list and the https / redirect requirements
- Send attribution links with a custom integration
- Custom integration install postback parameters
- Custom integration in-app event postbacks
- Post-install event data and optimized campaigns — the MMP requirement for event optimization campaigns
- ironSource Ads direct demand sunset guide

