EU User Advertising Privacy Features
To protect user data privacy and promote fairer market competition, the European Union officially implemented the Digital Markets Act (DMA) in November 2022.To comply with DMA regulations, the Consent Management Platform (CMP) from Google must be integrated into the Player Network SDK for EU users covered by DMA.
Enabling CMP configuration in INTLConfig
Below is the recommended CMP activation configuration in INTLConfig.ini. It is not recommended to change ANALYTICS_CONSENT_REQUIRED_TYPE and ANALYTICS_CONSENT_DEFAULT_CONFIG; if modification is needed, please contact Google Business regarding the relevant policy permissions first.
[Analytics]
ANALYTICS_CONSENT_ENABLE = 1
ANALYTICS_CONSENT_CHANNEL = Firebase,AppsFlyer,Adjust
ANALYTICS_CONSENT_REQUIRED_TYPE = ad_user_data,ad_personalization
ANALYTICS_CONSENT_DEFAULT_CONFIG = ad_storage:1,analytics_storage:1,ad_user_data:1,ad_personalization:1
ANALYTICS_CONSENT_ENABLE: Indicates whether the Consent Mode feature is enabled.1: Enables CMP, pre-determines whether the player is an EU user based on IP, and sets Google Consent Mode. The IP pre-determination result is also synced to AppsFlyer and Adjust as the initial value ofisDMA.0: Disables CMP, sets the configured Google Consent Mode permissions to agree by default. In this case, the game must handle the related logic, e.g., disabling privacy confirmation pop-up features. IfisDMAis not passed throughSetConsent, AppsFlyer and Adjust receive the status of a non-EEA user (isDMA = false).
ANALYTICS_CONSENT_CHANNEL: The channels where the Consent Mode feature takes effect. Supports Firebase, AppsFlyer, and Adjust; separate multiple channels with an English comma,.- A channel only takes effect if it is also configured in
ANALYTICS_REPORT_CHANNELand initialized successfully. The channel name must match the one inANALYTICS_REPORT_CHANNEL. - If not configured, the default value is
Firebase,AppsFlyer,Adjust(since Player Network SDK 1.33.00). If you have integrated AppsFlyer or Adjust but do not need to sync the user consent status to it, configure this item explicitly and remove that channel.
- A channel only takes effect if it is also configured in
ANALYTICS_CONSENT_REQUIRED_TYPE: Permission types that must be handled by the Consent Mode feature. Supported permission types include:ad_storage: Enables storage mechanisms related to advertisinganalytics_storage: Enables storage mechanisms related to analytics, such as device identifier storagead_user_data: Requests user consent to send user data for online advertising purposesad_personalization: Configures user consent status for personalized ads
ANALYTICS_CONSENT_DEFAULT_CONFIG: Default configuration for each permission when Consent Mode is enabled. The Player Network SDK reads this configuration for its default settings.1: User agrees to the permission type0: User refuses the permission type
Setting Consent Mode
When the EU user advertising privacy feature is enabled:
- You must call the
SetConsentinterface each time the game launches. - If
ANALYTICS_CONSENT_CHANNELincludes AppsFlyer or Adjust, passisDMA = truefor EEA users.isDMAdefaults tofalse, and each call overrides the SDK's IP pre-determination result. If it is not passed, AppsFlyer marks the user as not subject to GDPR and Adjust reportseea=0, so the user's refusal cannot be passed to these two channels.
According to the information returned by the user, call the SetConsent interface of Unity SDK or Unreal Engine SDK to set the consent status.
- Unity
- Unreal Engine
// EEA user agrees
INTLAPI.SetConsent(kConsentStatusGranted, "", "", true);
// EEA user refuses
INTLAPI.SetConsent(kConsentStatusDenied, "", "", true);
// Non-EEA user
INTLAPI.SetConsent(kConsentStatusGranted, "", "", false);
// EEA user agrees
UINTLSDKAPI::SetConsent(kConsentStatusGranted, "", "", true);
// EEA user refuses
UINTLSDKAPI::SetConsent(kConsentStatusDenied, "", "", true);
// Non-EEA user
UINTLSDKAPI::SetConsent(kConsentStatusGranted, "", "", false);
Fields Reported to Each Channel
The Player Network SDK converts the permission types and isDMA into the corresponding fields of each channel before reporting:
| Player Network SDK | Firebase | AppsFlyer | Adjust (partner: google_dma) |
|---|---|---|---|
isDMA | Not used | isUserSubjectToGDPR | eea |
ad_user_data | ad_user_data | hasConsentForDataUsage | ad_user_data |
ad_personalization | ad_personalization | hasConsentForAdsPersonalization | ad_personalization |
ad_storage | ad_storage | hasConsentForAdStorage | Not used |
analytics_storage | analytics_storage | Not used | Not used |
- AppsFlyer: When
isDMAisfalse, onlyisUserSubjectToGDPR = falseis reported as required by AppsFlyer, and the other fields are not reported. WhenisDMAistrue, permission types that are not included in the consent configuration (such asad_storageunder the default configuration) are reported as granted. - Adjust: Reported through the granular options of third party sharing, where
1means yes/granted and0means no/denied.eeais always reported;ad_user_dataandad_personalizationare reported only when they are included in the consent configuration.
Process Logic Diagram

- Game needs to handle logic within the dashed box.
- Set by reading default configuration: read default values set in
ANALYTICS_CONSENT_DEFAULT_CONFIGand apply upon game launch. - Set(Granted)/Set(Denied): Call the Unity SDK or Unreal Engine SDK
SetConsentinterface to update the user consent status- Set(Granted): Pass the parameter
kConsentStatusGrantedfor consent - Set(Denied): Pass the parameter
kConsentStatusDeniedfor denial - To sync to AppsFlyer or Adjust, also pass
isDMA
- Set(Granted): Pass the parameter
Verifying Consent Mode
The Consent Mode feature can be verified via logs:
-
Set
LOG_LEVEL = 1(info) orLOG_LEVEL = 0(debug) in INTLConfig.ini. -
Search for keywords in logs, use the last entry, and check if it matches the configured
ANALYTICS_CONSENT_REQUIRED_TYPE:-
Keyword and example for Android platform:
FirebaseAnalytics setConsent:FirebaseAnalytics setConsent: consentMap = {AD_USER_DATA=GRANTED, AD_PERSONALIZATION=GRANTED} -
Keyword and example for iOS platform:
Firebase: set consent:Firebase: set consent: {
"ad_personalization" = granted;
"ad_user_data" = granted;} -
AppsFlyer keyword:
AppsFlyerAnalytics setConsent:for Android andAppsFlyer: setConsent:for iOS. Android example:AppsFlyerAnalytics setConsent: isUserSubjectToGDPR=true, dataUsage=granted, adsPersonalization=granted, adStorage=granted -
Adjust keyword:
AdjustAnalytics setConsent:for Android andAdjust: setConsent:for iOS. Android example:AdjustAnalytics setConsent: eea=1, ad_user_data=granted, ad_personalization=granted
-
-
For EEA users, the AppsFlyer log should show
isUserSubjectToGDPR=trueand the Adjust log should showeea=1. You can also search for the keywordconsent_result_jsonto see what the SDK sends to each channel, whereis_dmais theisDMAvalue currently in effect:[Analytics SetConsent] consent_result_json = {"is_dma":"true","ad_user_data":"granted","ad_personalization":"granted"}
Modifying CMP Default Configuration
It is not recommended to modify the ANALYTICS_CONSENT_DEFAULT_CONFIG. For modifications, please consult with Google Business to confirm the policy on related permissions first.
The configuration in this section applies to Firebase only.
When Player Network SDK initialization is incomplete, Firebase will read settings from XML (Android)/Plist (iOS) configuration files to set CMP.You should ensure that the permission configuration in the XML/Plist matches that in ANALYTICS_CONSENT_DEFAULT_CONFIG.
Android Platform Configuration
- Unity
- Unreal Engine
<meta-data android:name="google_analytics_default_allow_analytics_storage" android:value="true" />
<meta-data android:name="google_analytics_default_allow_ad_storage" android:value="true" />
<meta-data android:name="google_analytics_default_allow_ad_user_data" android:value="true" />
<meta-data android:name="google_analytics_default_allow_ad_personalization_signals" android:value="true" />
Because the above configuration exists in INTLFirebase.aar and cannot be modified directly, in Unity engine projects, use tools:replace in the AndroidManifest.xml file to replace the corresponding permission android:value. For example, to deny the ad_storage permission:
<meta-data android:name="google_analytics_default_allow_ad_storage" android:value="false" tools:replace="android:value"/>
<meta-data android:name="google_analytics_default_allow_analytics_storage" android:value="true" />
<meta-data android:name="google_analytics_default_allow_ad_storage" android:value="true" />
<meta-data android:name="google_analytics_default_allow_ad_user_data" android:value="true" />
<meta-data android:name="google_analytics_default_allow_ad_personalization_signals" android:value="true" />
Because the above configuration exists in INTLFirebase.aar and cannot be modified directly, in Unreal Engine projects, add an addElements tag under the root node in the INTLFirebase_APL.xml file, and use tools:replace to replace the corresponding permission android:value. For example, to deny the ad_storage permission:
<addElements tag="application">
<meta-data android:name="google_analytics_default_allow_ad_storage" android:value="false" tools:replace="android:value"/>
</addElements>
iOS Platform Configuration
- Unity
- Unreal Engine
"GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE":true,
"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE":true,
"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA":true,
"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS":true,
In the INTLFirebaseKit.projmods file, locate the Info.plist node and modify the corresponding permission. For example, to deny the ad_storage permission:
"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE":false,
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_ANALYTICS_STORAGE</key>
<true/>
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE</key>
<true/>
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_USER_DATA</key>
<true/>
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS</key>
<true/>
In the INTLFirebase_UPL.xml file, modify the corresponding permission. For example, to deny the ad_storage permission:
<key>GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_STORAGE</key>
<false/>