Reputation: 9474
I am using the Google Tag Manager with a single tag referencing a default Google Analytics script. My solution is based on the information from these resources:
The code is simple (commit):
index.html: define gtag()
and set denied as a default for all storages
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { window.dataLayer.push(arguments); }
gtag('consent', 'default', {
ad_storage: 'denied',
analytics_storage: 'denied',
personalization_storage: 'denied',
functionality_storage: 'granted',
security_storage: 'granted',
wait_for_update: 400,
});
Then load a user configuration from the localStorage
and call update:
handleCookies(preferences) {
console.log('handleCookies callback');
gtag('consent', 'update', {
ad_storage: preferences.ad,
analytics_storage: preferences.analytics,
personalization_storage: preferences.personalization,
});
console.log(window.dataLayer);
},
So far so good because I see the event queue is updated in dataLayer
:
As the consent is set I anticipate the the cookies will be set for the Google Analytics now. But they are missing. What stupid mistake have I done?
Upvotes: 12
Views: 6811
Reputation: 9474
As a note for my silly future myself I will write some findings and notes there.
gtag()
function and set the default settings prior gtag initializationdenied
for ad_storage
, analytics_storage
and personalization_storage
update
message later, even in a Vue component's mounted
method. A value in wait_for_update
might be useful there because you want to initialize Google Analytics with cookies rather then without them.gcs: G100
is sent when the cookies consent is missing.update
message. The values are denied
/ granted
, not true
/ false
, you fool!collect
will be sent again with gcs: G111
. I am bit surprised that neither the request not the response holds any cookie. Why?gcs: G111
is still present in GA's collect but the page's existing cookies are not present in the request. Why?Upvotes: 3
Reputation: 1446
Your update
command happens after the GTM container snippet is rendered by the browser, so the update command is processed only after the All Pages trigger has already been processed.
You need to either delay your tags to fire on a later trigger (e.g. DOM Ready) or change how your script works to push the 'update'
command sooner.
Alternatively, you can use the Consent Mode tag template found in the template gallery to orchestrate everything through GTM. The template uses GTM's synchronous consent APIs which ensure that the consent state is applied immediately rather than only once the dataLayer
queue is processed.
Upvotes: 6
Reputation: 14189
From your screenshot, gtm.js
is executed before the update
of the consent mode so the pageview continues to be sent to Google Analytics as denied.
The update must take place before gtm.js
Upvotes: 5