Help.... Google Ads is not picking up
Help.... Google Ads is not picking up conversions anymore since we are using the IAB TCF compliant consent modal. Is there anybody experiencing the same problem and knows a fix for it? If we can't get it fixed this week we have to roll back to the old modal which was working correctly (but not compliant for EU / UK). Thanks in advance!
35 Replies
Are you seeing it fire in the zaraz debugger and then also the actual conversions requests get fired off in the browser network tab?
This is what I see in the debugger (Order Completed event):
Client side:

And these:



Result in EC Assist


Setup Google Ads tool and "order completed" action.


Diagnostics Google Ads


16 september is the exact day we switched to the compliant consent modal..... no conversions tracked anymore after that day...
Checked everything... It makes my head spin....
@Mackenly Jones Thank you very much in advance!
I noticed this strange notation when I add the property "currency" with value "EUR" to the action.... Is that normal?

Very interesting. I haven't had a ton of experience working with the IAB TCF modal. Does Google Analytics work properly? They're both supposed to use consent mode.
Zaraz hides how the consent parameters get applied for Google ads somewhere outside of the open source managed component so I'm not really sure how that works. Just going by what's in the component, it has nothing about gcd but it is clearly getting added to that request.
Cloudflare Docs
Google Consent Mode
Google Consent Mode is used by Google tools to manage consent regarding the usage of private data and Personally Identifiable Information (PII). Zaraz provides automatic support for Consent Mode v2, as well as manual support for Consent Mode v1.
Google Analytics seems to honor the consent mode... all looks okay.

Google Ads also shows excellent Consent mode and Enhanced conversions active...

Still.... no conversions.... Very strange...
hmmmmm the initial click on the "allow all" button on the consent modal sets all consent to "denied".
If I visit another page on our website "zarazData" still shows all "denied"
After the second or third page "zarazData" will show "granted"....
I guess the problem is how fast the consent is set after clicking "allow all"
Can you verify the same behaviour in your browser?
Check: https://www.adams-music.com/shop
Adams Musical Instruments
Muziekinstrumenten en accessoires | Adams Music Centre
Ben je op zoek naar een nieuwe trompet, saxofoon of drumstel? Bekijk dan ons complete aanbod online. Wij helpen je bij het vinden van jouw unieke instrument.
We use this script right after the body
<script>
zaraz.set("google_consent_default", {
'ad_storage' : 'denied',
'ad_user_data' : 'denied',
'ad_personalization' : 'denied',
'analytics_storage' : 'denied'
});
document.addEventListener("zarazConsentAPIReady", () => { var strAnalytics = zaraz.consent.get('KdRa') ? 'granted' : 'denied'; var strMarketing = zaraz.consent.get('WMnQ') ? 'granted' : 'denied';
zaraz.set("google_consent_update", { 'ad_storage' : strMarketing, 'ad_user_data' : strMarketing, 'ad_personalization' : strMarketing, 'analytics_storage' : strAnalytics }); }); </script> So... do we need a better / different script to set consent when using the TCF compliant modal? After clicking "allow all" consent has to be set immediately.... that's not the case now I see Did another check... After "allow all" the page will send consent string: 11q1q1q1q5 to Google. After 2 or 3 page refreshes it will suddenly change to 11r1r1r1r5..... I don't know why?? @yo'av Please share some wise words... 😉 I don't know if this is the reason why we don't receive conversions anymore in Google Ads... but hey... it's a start. Already breaking my head for a week... Waited another day and still no conversions 🙁 Does anybody out here uses TCF compliant consent and successfully receives conversions in Google Ads?? Please tell me the secret.... we can't get it to work.... Main question... When using TCF compliant consent, is it still necessary to manually send the google_consent_default and google_consent_update? Or is it being sent automatically by Zaraz in TCF consent mode? To my understanding all TCF purposes are mapped to the corresponding Google consent flags in the background? Tried al lot of different approaches but none of them seem to work 🙁
document.addEventListener("zarazConsentAPIReady", () => { var strAnalytics = zaraz.consent.get('KdRa') ? 'granted' : 'denied'; var strMarketing = zaraz.consent.get('WMnQ') ? 'granted' : 'denied';
zaraz.set("google_consent_update", { 'ad_storage' : strMarketing, 'ad_user_data' : strMarketing, 'ad_personalization' : strMarketing, 'analytics_storage' : strAnalytics }); }); </script> So... do we need a better / different script to set consent when using the TCF compliant modal? After clicking "allow all" consent has to be set immediately.... that's not the case now I see Did another check... After "allow all" the page will send consent string: 11q1q1q1q5 to Google. After 2 or 3 page refreshes it will suddenly change to 11r1r1r1r5..... I don't know why?? @yo'av Please share some wise words... 😉 I don't know if this is the reason why we don't receive conversions anymore in Google Ads... but hey... it's a start. Already breaking my head for a week... Waited another day and still no conversions 🙁 Does anybody out here uses TCF compliant consent and successfully receives conversions in Google Ads?? Please tell me the secret.... we can't get it to work.... Main question... When using TCF compliant consent, is it still necessary to manually send the google_consent_default and google_consent_update? Or is it being sent automatically by Zaraz in TCF consent mode? To my understanding all TCF purposes are mapped to the corresponding Google consent flags in the background? Tried al lot of different approaches but none of them seem to work 🙁
Very sorry that this is not working for you, unfortunately I have no experience of the IAB TCF consent modal, I am still amazed that you have the EC and Consent ticks in GAds though.
I notice in your network request to Google Ads you have the tv.1 EC parameters which we have never managed to achieve.
I followed your guide here, but nothing in this logic seems to generate the tv.1 parameters?
Is this logic meant to be generated by the Zaraz Google Ads managed component. I dont see anything in the source code for the managed component that would geenrate this data.
Basically, I don't know how Zaraz gets from the "user_data" parameter supplied to the tv.1 parameters sent in the request. We are supplying the user_data as directed but the resultant network request just has user_data in it as supplied in the event details, its not getting converted into the EC parameters.
EC Assist says theres no EC data in the request.
Indeed very confusing and little or no documentation on the EC setup. What I did at the end is make a variable and included all properties in the correct structure.

After that I made a (conversion) action in the Google Ads tool like this.... and in a couple of days you will see the EC coming in.

Oh wow, this is the bit I am missing!!!
How on earth did you work that out I have scoured the internet looking for those parameters and what they need to be set too!
Guess I was lucky this time 😉 Give it a try! Keep in mind that you need the zaraz.track event with all the user properties.
yeah we have that bit
Thanks so much for this!
Let me know if it works out for you 🙂
typing that out on every website is going to be a nightmare. you can't copy/paste that field, I have 10 sites to do 😄
you havent included the parameters for the post code or the new customer flag
do you know what the codes are for those?
Postcode = ~pc0 .... We have the new customer flag as well.... but I don't know how to add it to the string. No docs....
OK thanks!
No need to hash
yeah instead of sending the user_data to Zaraz, I am going to just build the string server side
Of course! Genius!
Definitely follow up if you're able to get those EC working. I've been working on completely rewriting the Google Ads MC off and on for several months but keep up running into issues with Google not issuing production access to the API. I think a CAPI focused solution would be more maintainable (it is at least documented by google) but ultimately useless if Google won't give access (especially if everyone who uses it needs to go through the whole process of getting credentials).
its been working for BadgeMan so I expect it to work for us.
But this was definitely the missing piece of the puzzle to get this stuff working
I think it takes about 72 hours according to Google for the dashboard to say EC is working.
However, we still dont have a green tick for our consent flags on any of our Ads accounts but I cant see anything wrong with our consent configuration. Google Analytics shows all green with "Excellent" as its rating.
I have also been informed by our PPC person today that our audience data is not showing up from Analytics into Ads, which potentially indicates a remarketing consent failure, but I dont really understand how that can be the case when Analytics says that our remarketing flag is set correctly :S
I have noticed that not all ad requests made by the current Zaraz MC have the gcd parameter appended to them, here for example https://github.com/managed-components/google-ads/blob/da072705e87d9d34853bb96856ca4f979b04588a/src/index.ts#L83 never has the gcd parameter appended
Clearly this cant be the reason for us not seeing consent mode success in Google Ads because other people are seeing it and everyone is using the same managed component.
GitHub
google-ads/src/index.ts at da072705e87d9d34853bb96856ca4f979b04588a...
Google Ads Managed Component. Contribute to managed-components/google-ads development by creating an account on GitHub.
Following on from this, I am not entirely sure why the Google Analytics MC is not built on top of the measurement protocol as its a documented API for sending Analytics data, I am sure there is a reason for it though.
I have been considering writing a Zaraz MC for the Analytics Measurement protocol, I just havent found the time.
I am guessing the reason it wasnt done previously though is this warning:
While it's possible to send events to Google Analytics solely with the Measurement Protocol, only partial reporting may be available. The purpose of the Measurement Protocol is to augment existing events collected using gtag, GTM, or Firebase. Some event and parameter names are reserved for use through automatic collection and cannot be sent through the Measurement Protocol.
After 10 days.... Google Ads has 'activity' on the 'Zaraz - Order Completed' conversion.... but no actual conversions are recognized (or all are rejected by Google Ads). I tried to find the cause of it but unfortunately the documentation and some friends on this discord channel weren't able to help me solving the problem. Also quite disappointed that nobody from the Zaraz team is reaching out to give a helping hand.... Today we are going to switch off TCF compliant consent. I will keep following Discord looking for a solution how to actually get TCF IAB compliant consent to work... Thanks to everybody who reached out to help!

I came up with the following script to map the TCF purposes to Google Consent.
<script>
var p1 = zaraz.consent.get('tcf-purposes-1'); var p2 = zaraz.consent.get('tcf-purposes-2'); var p3 = zaraz.consent.get('tcf-purposes-3'); var p4 = zaraz.consent.get('tcf-purposes-4'); var p6 = zaraz.consent.get('tcf-purposes-6'); var p7 = zaraz.consent.get('tcf-purposes-7'); var p8 = zaraz.consent.get('tcf-purposes-8'); var p9 = zaraz.consent.get('tcf-purposes-9'); var p10 = zaraz.consent.get('tcf-purposes-10'); var strUserdata = p1 && (p2 p3 p4 p7) ? 'granted' : 'denied'; var strAdstorage = p1 && (p3 p4) ? 'granted' : 'denied'; var strAnalytics = p1 && (p7 p8 p9 || p10) ? 'granted' : 'denied';
zaraz.set("google_consent_update", { 'ad_storage' : strAdstorage, 'ad_user_data' : strUserdata, 'ad_personalization' : strAdstorage, 'analytics_storage' : strAnalytics }); </script> Trying to run it on another CF website (with TCF compliant modus enabled). Is this necessary to do? Or does Zaraz manages this 'under the hood'? Am I warm @yo'av ? I don't give up easily...
var p1 = zaraz.consent.get('tcf-purposes-1'); var p2 = zaraz.consent.get('tcf-purposes-2'); var p3 = zaraz.consent.get('tcf-purposes-3'); var p4 = zaraz.consent.get('tcf-purposes-4'); var p6 = zaraz.consent.get('tcf-purposes-6'); var p7 = zaraz.consent.get('tcf-purposes-7'); var p8 = zaraz.consent.get('tcf-purposes-8'); var p9 = zaraz.consent.get('tcf-purposes-9'); var p10 = zaraz.consent.get('tcf-purposes-10'); var strUserdata = p1 && (p2 p3 p4 p7) ? 'granted' : 'denied'; var strAdstorage = p1 && (p3 p4) ? 'granted' : 'denied'; var strAnalytics = p1 && (p7 p8 p9 || p10) ? 'granted' : 'denied';
zaraz.set("google_consent_update", { 'ad_storage' : strAdstorage, 'ad_user_data' : strUserdata, 'ad_personalization' : strAdstorage, 'analytics_storage' : strAnalytics }); </script> Trying to run it on another CF website (with TCF compliant modus enabled). Is this necessary to do? Or does Zaraz manages this 'under the hood'? Am I warm @yo'av ? I don't give up easily...
EC is working for us now.
I am on holiday as of today but have checked Google ads this morning and its reporting EC as a green tick (Still no Consent Mode green tick though, no idea how I fix that still.)
Once I am back I will write up a more complete guide on getting EC enabled on Zaraz. but ultimately it is fairly simple, construct the encoded enhanced conversion string as per the script in this message https://discord.com/channels/595317990191398933/1420057491063967934/1420741905632989224 and add this as a custom param named "em" with another custom param named "ec_mode" which should be set to "m", the hashing functions should work the same as the Google defined hashing functions but further details can be found on MVUG's write up here: https://gist.github.com/it-can/188acc89637160d21ab9a37e1bbf0b2c
Gist
Cloudflare Zaraz Google Ads conversion tracking with "enhanced conv...
Cloudflare Zaraz Google Ads conversion tracking with "enhanced conversions" - checkout-succes.blade.php