Google Consent Mode

Google Consent Mode allows web and app developers to adjust tag and app SDK behavior based on user consent choices. Google will be able to dynamically adapt the behavior of Google tags, Google Analytics, Google Ads, Floodlight and Conversion Linker. To accomplish this, consent types have been created to alter specific behavior in the aforementioned products.

📘

Platform support

GCM is supported on Android Mobile, Android TV, and Fire TV.

Consent types include:

Consent typeDescriptionConsent statuses
analytics_storageEnables storage, such as cookies (web) or device identifiers (apps), related to analytics, for example, visit duration.granted | denied
ad_storageEnables storage, such as cookies (web) or device identifiers (apps), related to advertising.granted | denied
ad_user_dataSets consent for sending user data to Google for online advertising purposes.granted | denied
ad_personalizationSets consent for personalized advertising.granted | denied

More information here: https://support.google.com/google-ads/answer/10000067?hl=en

Setting up Google Consent Mode (GCM) for Android

  1. Enable Google Consent Mode in your geolocation rules and map categories from the OneTrust CMP to Google storage types.

  2. Ensure the supported Google products (e.g. Firebase) have been installed on the app already.

  3. Set default values for Consent Mode in your AndroidManifest.xml . Value can be set to true or false.

    <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" />
    
  4. Query for Google Consent Mode consent statuses from the OneTrust SDK. getOTGoogleConsentModeData() will return an object containing the current status and values for each of the Google Consent types based on the mapping done in Step 1.

    new OTPublishersHeadlessSDK(MainActivity.this).getOTGoogleConsentModeData();
    

    Status typeDescription
    NOT_INITIALIZEDApplication calls method before a successful SDK initialization (at least once). Consent has not been collected.
    NOT_CONSENTEDApplication calls method before user interacts with and dismisses the banner. Consent has not been collected.
    CONSENT_GIVENApplication calls method after user has interacted with the banner. Consent has been collected.

    Consent typeDescription
    UNASSIGNED'Do not Assign Category' was mapped to this storage/consent type in the geolocation rules.
    UNDEFINEDThe SDK was not initialized successfully at least once, data was not fetched, or the mapped category does not exist (no SDKs assigned).
    DENIEDConsent is rejected/withdrawn for the associated category.
    GRANTEDConsent is given/provided to associated category.

    Sample Response:

    //consent interaction status
    OTGoogleConsentModeData(
    sdkStatus=CONSENT_GIVEN,
                        
    //consent value of each storage type
    consentType=OTGoogleConsentType(
    analyticsStorage=GRANTED, 
    adStorage=GRANTED, 
    adUserData=GRANTED, 
    adPersonalization=GRANTED))                                     
    
  5. Update the desired Google library from the consent retrieved in Step 4 with the setConsent() public method from Google.

    // Set consent types.
    Map<ConsentType, ConsentStatus> consentMap = new EnumMap<>(ConsentType.class);
    consentMap.put(ConsentType.ANALYTICS_STORAGE, ConsentStatus.GRANTED);
    consentMap.put(ConsentType.AD_STORAGE, ConsentStatus.GRANTED);
    consentMap.put(ConsentType.AD_USER_DATA, ConsentStatus.GRANTED);
    consentMap.put(ConsentType.AD_PERSONALIZATION, ConsentStatus.GRANTED);
    
    mFirebaseAnalytics.setConsent(consentMap);
    

As the application will need to retrieve the consents for each Consent type and set it in the Google library as indicated in steps 4 and 5, OneTrust has written a couple of functions to assist with and simplify the process:

  1. These two functions will retrieve the Google Consent Mode consents from the OneTrust SDK and set the status in the associated Google product.

    private void setConsentToGoogleAnalytics() {
        OTGoogleConsentModeData otGoogleConsentModeData = new OTPublishersHeadlessSDK(MainActivity.this).getOTGoogleConsentModeData();
            Map<FirebaseAnalytics.ConsentType, FirebaseAnalytics.ConsentStatus> consentMap =
                    new EnumMap<>(FirebaseAnalytics.ConsentType.class);
            consentMap.put(FirebaseAnalytics.ConsentType.ANALYTICS_STORAGE,
                    getAnalyticsConsentStatus(otGoogleConsentModeData.getConsentType().getAnalyticsStorage()));
            consentMap.put(FirebaseAnalytics.ConsentType.AD_STORAGE,
                    getAnalyticsConsentStatus(otGoogleConsentModeData.getConsentType().getAdStorage()));
            consentMap.put(FirebaseAnalytics.ConsentType.AD_USER_DATA,
                    getAnalyticsConsentStatus(otGoogleConsentModeData.getConsentType().getAdUserData()));
            consentMap.put(FirebaseAnalytics.ConsentType.AD_PERSONALIZATION,
                    getAnalyticsConsentStatus(otGoogleConsentModeData.getConsentType().getAdPersonalization()));
            mFirebaseAnalytics.setConsent(consentMap);
    }
    
    private static FirebaseAnalytics.ConsentStatus getAnalyticsConsentStatus(OTGCMConsentStatus consentStatus) {
        FirebaseAnalytics.ConsentStatus fbTypeConsentStatus = FirebaseAnalytics.ConsentStatus.DENIED;
        if (consentStatus == OTGCMConsentStatus.GRANTED) {
            fbTypeConsentStatus = FirebaseAnalytics.ConsentStatus.GRANTED;
        }
        return fbTypeConsentStatus;
    }
    
  2. OneTrust recommends calling the setConsentToGoogleAnalytics() function above when the OTConsentUpdated broadcast is triggered. OTConsentUpdated is triggered every time any OneTrust UI is dismissed. More info on that method here.

    registerReceiver(OTConsentUpdated, new IntentFilter("OTConsentUpdated"));
    
    BroadcastReceiver OTConsentUpdated = new BroadcastReceiver() {
        setConsentToGoogleAnalytics();
    };
    

    Alternatively, you can also use UI Interaction Events instead of broadcast receivers to know when to call setConsentToGoogleAnalytics(). Reference this page for more information.

📘

Additional Information

You can view more information regarding consent mode setup here: https://developers.google.com/tag-platform/security/guides/app-consent?platform=android&consentmode=advanced

Verifying consent settings

You can verify that your consent settings are working as intended by viewing the log messages for your app.

  1. Enable verbose logging on your device.
  2. In the Android Studio logcat, find the log message that starts with Setting consent. For example, if Ad storage is enabled, you'll see the following log message:
    Setting consent, ... AD_STORAGE=granted
    

Google Consent Mode for TCF Templates.

Applications can be configured to tell Google to use the TC string to infer the settings for ad_storage, ad_personalization, and ad_user_data settings. Google will ensure to detect this key and value to adjust their signals

The key “IABTCF_EnableAdvertiserConsentMode” indicates whether Google consent mode is enabled or not for TCF templates, this key will be stored under shared preferences when user access the application from an IAB Region.

KeyvalueDescription
IABTCF_EnableAdvertiserConsentMode1Indicates GCM is enabled for TCF template
IABTCF_EnableAdvertiserConsentMode0Indicates GCM is disabled for TCF template

📘

Note

  • Don’t get confused with the naming convention of the key, this is not defined in IAB spec. Google has recommended this attribute to make it available for them to adjust signals
  • For a Geo-rule with TCF template - if the GCM categories are mapped to non IAB categories - OT GCM public method will still provide the response with ‘granted’ or ‘denied’
  • Application developer should be aware of based on the use-case whether to consume above flag for IAB template OR the OT public method response for Non IAB template

To find out more information about TCF integration behaviour with GCM and category mapping please visit Google Documentation here