Deeplinkly

Glossary/Android platform

App Set ID

Definition

The App Set ID is an Android identifier consistent across all apps published by the same developer on one device, provided for analytics and fraud prevention and barred by Google Play policy from any advertising use.

It exists to remove a bad incentive. Developers were using the GAID for legitimate non-advertising work — deduplicating users across a portfolio, spotting abusive accounts — which meant those use cases broke when a user opted out of ads. The App Set ID separates the two: it needs no consent and no permission, and in exchange it is scoped so narrowly that it is useless to an ad network.

Reading it

build.gradle.kts
dependencies {
    implementation("com.google.android.gms:play-services-appset:16.1.0")
}
The read — no permission required
import com.google.android.gms.appset.AppSet
import com.google.android.gms.appset.AppSetIdInfo

AppSet.getClient(context).appSetIdInfo
    .addOnSuccessListener { info: AppSetIdInfo ->
        val id = info.id                       // UUID string
        val scope = info.scope                 // SCOPE_APP or SCOPE_DEVELOPER
        // Persist it, but expect it to change — see the reset rules below.
        onAppSetId(id, scope)
    }
    .addOnFailureListener {
        // No Play services, or the service is unavailable. There is no
        // fallback identifier here by design; degrade rather than substitute.
        onAppSetIdUnavailable()
    }
The two scopes.
ScopeConsistent acrossWhen you get it
SCOPE_DEVELOPERAll your apps on the device, matched by Play developer accountApps published on Google Play under the same account
SCOPE_APPThis app onlySideloaded builds, or apps not distributed via Play

Always read the scope, never assume developer scope

A debug build installed over adb typically returns SCOPE_APP, so cross-app deduplication that works in production silently does nothing in testing — or worse, appears to work because you only tested one app. Branch on info.scope and treat app-scoped values as non-comparable across your portfolio.

When it resets

The App Set ID is stable but not permanent, and the reset conditions are what make it a privacy-preserving identifier rather than a device fingerprint.

  • It resets when all of your apps sharing the developer scope are uninstalled from the device. One remaining app preserves it.
  • It resets after a prolonged period — on the order of thirteen months — with no app in the set installed.
  • It resets on a factory reset.
  • It does not reset when a user clears app data, and it is not resettable by the user in Settings the way the GAID is.

This makes it wrong for long-window cohorts

An analysis keyed on the App Set ID over more than a year will show reset devices as churned and re-acquired. For anything longer than a few months, key on your own account identifier and use the App Set ID for the pre-login stretch only.

The policy line, and why it is enforced

Google Play policy permits the App Set ID for analytics and fraud prevention, and prohibits it for ads personalisation and advertising measurement. That is not a technical limitation you can engineer around — it is a distribution requirement, and a violation is an app-removal risk rather than a warning.

Permitted and prohibited uses.
Use casePermitted
Deduplicating users across your own appsYes
Detecting abusive or fraudulent accountsYes
First-party analytics and funnel measurementYes
Frequency capping an adNo
Attributing an install to an ad campaignNo
Building an audience segment for targetingNo
Sharing with an ad network or data brokerNo
App Set ID compared with the GAID.
App Set IDGAID
ScopeOne developer's appsEvery app on the device
Requires a manifest permissionNoYesAD_ID at API 33+
Affected by ads opt-outNoYes — returns zeros
User-resettable in SettingsNoYes
Usable for advertisingNo — policy prohibitedYes, when available
Visible to an ad networkNoYes

The two are complements, not alternatives. If you are trying to substitute the App Set ID for a zeroed GAID in an attribution join, you are solving the problem in the wrong place — the install referrer is the identifier-free attribution signal, and it is deterministic, permitted, and unaffected by any of this.

Android SDK documentation

Our Android SDK does not read the App Set ID for attribution, because policy does not permit it. The documentation sets out which signals it does use, so you can confirm the integration keeps your Play Data Safety declaration accurate.

Open the android sdk documentation

Frequently asked questions

What is the App Set ID on Android?
It is an identifier that is consistent across every app a developer publishes on one device, retrieved through Google Play services with no manifest permission and no user consent required. It was introduced so that legitimate non-advertising work such as cross-app deduplication and fraud prevention would not depend on the advertising ID, which disappears when a user opts out of ads personalisation.
Can I use the App Set ID for attribution?
No. Google Play policy limits it to analytics and fraud prevention and explicitly prohibits ads personalisation and advertising measurement, and a violation risks removal from Play rather than a warning. It is also scoped to a single developer's apps, so an ad network's app would compute an entirely different value for the same device and no match would be possible anyway.
When does the App Set ID reset?
When every one of your apps sharing the developer scope has been uninstalled from the device, after roughly thirteen months with no app from the set installed, or on a factory reset. Clearing an app's data does not reset it, and unlike the advertising ID the user cannot reset it directly from Settings.
What is the difference between SCOPE_APP and SCOPE_DEVELOPER?
Developer scope means the value is shared across all your Play-published apps on that device, which is what makes cross-app deduplication possible. App scope means the value is unique to that single app, and it is what you receive for sideloaded builds or apps not distributed through Google Play — so values from different apps must not be compared.
Is the App Set ID a replacement for the GAID?
Not for advertising purposes, since policy prohibits that use and the developer scoping makes cross-party matching impossible by construction. It replaces the GAID only for the non-advertising work developers were previously doing with it, and for install attribution the actual replacement on Android is the Play Install Referrer API.

Related terms

  • GAIDThe GAID, or Google Advertising ID, is a resettable per-device identifier that Android provides for advertising and analytics, and which is replaced by a string of zeros for users who opt out of ads personalisation.
  • Play Install ReferrerThe Play Install Referrer is a Google Play API that lets a newly installed Android app read the referrer string and click timestamps recorded when the user arrived at its Play Store listing.
  • Privacy Sandbox on AndroidThe Privacy Sandbox on Android was Google's initiative to replace cross-app advertising identifiers with on-device APIs for interest inference, audience targeting and conversion measurement, and Google announced its retirement in October 2025.