There's a message on my admob dash reading "IAB TCF v2.0 errors detected We've detected an issue on your IAB TC string on one or more of your sites or apps. These errors may affect your ability to serve ads to European users. A detailed report is available for you on the EU user consent page." I downloaded the "TCF error report" which reads:
Mobile App,Ad unit,Error,Error count,Last detected date
Unknown,4408782796,3.3,160,5/19/2023
Unknown,1406617951,3.3,20,5/19/2023
I've implemented GDPR many years ago:
com.google.android.ump:user-messaging-platform:2.0.0This is the code I've been using for years:public void getConsentStatus(){
consentInformation = UserMessagingPlatform.getConsentInformation(this);
ConsentRequestParameters parameters = new ConsentRequestParameters.Builder()
.setTagForUnderAgeOfConsent(false)
.build();
consentInformation.requestConsentInfoUpdate(this, parameters,
new ConsentInformation.OnConsentInfoUpdateSuccessListener() {
@Override
public void onConsentInfoUpdateSuccess() {
if (consentInformation.isConsentFormAvailable()) {
loadform();
}
}
},
new ConsentInformation.OnConsentInfoUpdateFailureListener() {
@Override
public void onConsentInfoUpdateFailure(FormError formError) {
}
}
);
}
public void loadform() {
UserMessagingPlatform.loadConsentForm(this, new UserMessagingPlatform.OnConsentFormLoadSuccessListener() {
@Override
public void onConsentFormLoadSuccess(ConsentForm consentForm) {
MainActivity.this.consentForm = consentForm;
if (consentInformation.getConsentStatus() == ConsentInformation.ConsentStatus.UNKNOWN) {
consentForm.show(MainActivity.this, new ConsentForm.OnConsentFormDismissedListener() {
@Override
public void onConsentFormDismissed(FormError formError) {
loadform();
}
});
}
if (consentInformation.getConsentStatus() == ConsentInformation.ConsentStatus.REQUIRED) {
consentForm.show(MainActivity.this, new ConsentForm.OnConsentFormDismissedListener() {
@Override
public void onConsentFormDismissed(FormError formError) {
loadform();
}
});
}
}
},
new UserMessagingPlatform.OnConsentFormLoadFailureListener() {
@Override
public void onConsentFormLoadFailure(FormError formError) {
loadform();
}
});"HELP" on admob dashboard reads "Refresh this page and try again. Sorry, there was a problem with the form." so I cannot ask them for more info.Other posts:If you're using UMP SDK to get the consent of your users, then this should be automatically handled by the SDK, code in my apps are from here:also on another post:according to that Google group if you are using UMP SDK, and you probably are as you're using Funding Choices like me, it should be handled by the SDK itself. So nothing to worry about, if the error persist, meaning it present itself in several different days, than I fear the only way is to open a ticket with Google Admob.
I already tried your suggestion yesterday "IAB TCF v2.0 errors detected" is still on my dashboard.public void deleteTCStringIfOutdated(Context context) {
// IABTCF string is stored in SharedPreferences
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
// get IABTCF string containing creation timestamp;
// fall back to string encoding timestamp 0 if nothing is currently stored
String tcString = sharedPrefs.getString("IABTCF_TCString", "AAAAAAA");
// base64 alphabet used to store data in IABTCF string
String base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
// date is stored in digits 1..7 of the IABTCF string
String dateSubstring = tcString.substring(1,7);
// interpret date substring as base64-encoded integer value
long timestamp = 0;
for (int i = 0; i < dateSubstring.length(); i++) {
char c = dateSubstring.charAt(i);
int value = base64.indexOf(c);
timestamp = timestamp * 64 + value;
}
// timestamp is given is deci-seconds, convert to milliseconds
timestamp *= 100;
// compare with current timestamp to get age in days
long daysAgo = (System.currentTimeMillis() - timestamp) / (1000*60*60*24);
// delete TC string if age is over a year
if (daysAgo > 365) {
sharedPrefs.edit().remove("IABTCF_TCString").apply();
}
}
}My email finally was sent on admob dashboard and this was their reply:Thank you for your email.
Google’s commitment to transparency and control means we regularly look at ways to improve the consent experience. When we do this, we’re thinking about evolving user expectations, as well as the regulatory indicators that we think will ultimately guide the broader advertising landscape.
In accordance with that commitment, later this year, we will require partners using our publisher products — Google AdSense, Ad Manager, or AdMob — to use only a Google certified Consent Manager Platform (CMP) that integrate with IAB Europe’s Transparency and Consent Framework (TCF) when serving ads to users in the European Economic Area or the UK. In the coming weeks, Google will make available a list of CMPs that Google has certified, and that have integrated with the TCF and meet the TCF’s specifications. We'll require that our partners use a CMP from that list . The list of Google certified CMPs will be available in our Help Center (Ad Manager, AdMob, AdSense). And further information is available in this blogpost (Ad Manager, AdMob, AdSense).
Why we are introducing this
In 2020, we integrated our ads systems with TCF. By supporting the TCF, we build on our 2020 commitment to support industry efforts aimed at managing user transparency and consent through a standardized framework. The decision also follows on from IAB's Europe’s announcement that TCF V2.2 has been finalized which further supports consistency in the online advertising consent experience. We anticipate others in the industry will follow with similar adjustments.
Next Steps:
- Google has begun the process of certifying TCF compliance by CMPs that work with our publishing partners. To ensure a smooth transition, publishers currently working with a CMP should proactively talk with their CMP provider about the certification process. For publishers seeking a new CMP partner, in the coming weeks we will make available a list of Google-certified CMPs in our HC articles (Ad Manager, AdMob, AdSense).
We will support your transition as you prepare for the new consent management requirements. In the meantime, please review our Help Center for further details (Ad Manager, AdMob, AdSense).
Yes, gonna give it a few days, also found this on admob website:Error 3.3: The TC string last updated date was more than 13 months agoConsent must be reobtained from the user. You should call requestConsentInfoUpdate() at the start of every app session. If the TC string is expired, the UMP SDK indicates that consent must be reobtained by setting ConsentInformation.ConsentStatus to ConsentStatus.REQUIRED. If you haven't already, implement a request to load and present a new UMP form in your app.
Mobile Ads SDK Team |
Hi Andreas,
Thank you for continuously providing your insight on this thread with regard to the TCF error. If you have any other concern related to Mobile Ads SDK, just kindly let us know and we'll be happy to assist you.
Mobile Ads SDK Team |
I forgot to mention, a interstitial ad is displayed after the splash screen:And there you thought it was over NO here we go again ADMOB:I received a few thousand emails and bug reports since I made all of the recent changes above, users saying the app is stuck on the splash screen so I asked for basic info such as app version and android version. I only opened a few emails, all latest versions of the apps and on android 10.Apart from consent form, I upgraded gradle to 8.0.1 and gms:play-services-ads:22.0.0 to gms:play-services-ads:22.1.0 that's it, luckily I have a phone running android 10 so I installed the apps from play store and yes stuck on splash but works perfectly on my phone running android 13, installing from android studio also works fine but not from apk as well, so considering the 1000's crashes on play console all related to com.google.android.gms:play-services-ads:... over the years I first downgraded to 22.0.0 and what do u know it worked perfectly.On Wednesday, May 24, 2023 at 10:03:52 PM UTC+2 Ronald Dwk wrote:UPDATE: So on post 6 above I posted code that I tried, it's been 3 days still no change on admob, now it's 3 ad units in the TCF error report, on admob's website it reads:Warning: Using alternative ways of checking the consent status—such as checking a cache your app utilizes or looking for a consent string in storage—are strongly discouraged as the set of ad technology partners could have changed since the user last consented.Basically forcing us to use their form which does not work like it supposed too.
Error 3.3: The TC string last updated date was more than 13 months agoConsent must be reobtained from the user. You should call requestConsentInfoUpdate() at the start of every app session. If the TC string is expired, the UMP SDK indicates that consent must be reobtained by setting ConsentInformation.ConsentStatus to ConsentStatus.REQUIRED. If you haven't already, implement a request to load and present a new UMP form in your app.
toI tried the above in 1 of my apps as astrovicApps said " it doesn't work as it should" 100% correct it doesn't.From Mobile Ads SDK Forum Advisor:
What this means is that you will need to ask your user's consent once again. You can do this by resetting the consent state:
On admob website it reads:In testing your app with the UMP SDK, you might find it helpful to reset the state of the SDK so that you can simulate a user's first install experience. The SDK provides the reset() method to do this.consentInformation.reset();I've implemented this a few hours ago and uploaded to play store, what consentInformation.reset(); does is display the form every time the app is opened but that's the only option that's available to me right now, who knows when admob will release an update too com.google.android.ump:user-messaging-platform:2.0.0 or perhaps the problem is on their server side.I've sent a notification to my users explaining why I had to do the above and as soon as the message on admob disappears I will release an update, luckily I have awesome users.And there you thought it was over NO here we go again ADMOB:I received a few thousand emails and bug reports since I made all of the recent changes above, users saying the app is stuck on the splash screen so I asked for basic info such as app version and android version. I only opened a few emails, all latest versions of the apps and on android 10.Apart from consent form, I upgraded gradle to 8.0.1 and gms:play-services-ads:22.0.0 to gms:play-services-ads:22.1.0 that's it, luckily I have a phone running android 10 so I installed the apps from play store and yes stuck on splash but works perfectly on my phone running android 13, installing from android studio also works fine but not from apk as well, so considering the 1000's crashes on play console all related to com.google.android.gms:play-services-ads:... over the years I first downgraded to 22.0.0 and what do u know it worked perfectly.When does it end, over the last 2 month's ads where restricted in over 20 of my apps, after requesting a review EVERY restriction was removed, didn't receive any of those emails in the last 4 days but that stopped and IAB TCF v2.0 errors detected began, anyways I will update you guys if consentInformation.reset(); works.Maybe your stats look like mine, after all the above began:Match rate used to be a solid 98 or 99% now it's around 50 to 60% the lowest it went was 11% YES ADMOB 11%eCPM varies but the lowest was 80 cent unbelievable I KNOW.
I also tried: selected Custom ad partners then ticked a few boxes, when saving a pop read "do u want to re-prompt users again...." however that didn't work for me if anything more ad units where added to error report.
Hi All,
@Andreas, Thank you again for continuously providing your insight on this TCF error that publishers are encountering.
@Ronald and astrovicApps, our team mentioned that, the UMP SDK is working as intended, but if the publishers are not implementing the UMP SDK according to the documentation (https://developers.google.com/admob/ios/privacy#display-message). On every app session, the publisher should be calling requestConsentInfoUpdate: to figure out if consent needs to be given again. If the consent is out of date, the SDK will set the consentStatus (https://developers.google.com/admob/ios/privacy/api/reference/Classes/UMPConsentInformation#consentstatus) field to required, and that should prompt publishers to request and show a new UMP form.
Update: 2 more ad units have been removed from the error list, using Andreas workaround, the other 2 methods still pending and it's been 8 days so I'm going to implement the workaround.
Hi All,
Thank you for your response.
@Andreas - We are not aware of why the latest message on this thread got deleted. Maybe the publisher who posted it deleted it also, but we didn't seem to find it in our end.
@Ronald - We're glad to know that everything works well for you.Hi AstrovicApps,
Thank you for your response. If you have any other concerns related to the Mobile Ads SDK implementation, just kindly let us know so we can assist you the best we can.
Hi Ronald,
Thank you for your response.
As this matter is as important to us as it is to you, we deeply understand the inconvenience this situation has caused. As much as we want to provide you more assistance for the deleted ad unit, this is already out of our scope, as this happened in your account. Since you mentioned that you already reached out to the product support team and got a reply with them, we suggest that you continue and wait for their further instruction on this from their end as they are more equipped to assist you further.
Hi Ronald,
Thank you for your response.
Allow us to share this to the wider team to further check. However, kindly provide us also your Ad unit id affected and App ID, so our wider team can further check this in their end. Rest assured that one of our team will reach out to you.
App ID - ca-app-pub-5429548830862354~9783118386Banner - ca-app-pub-5429548830862354/2391474522Interstitial - ca-app-pub-5429548830862354/8548151666Perhaps they can exclude these deleted ad units in future:Deleted ad units:
ca-app-pub-5429548830862354/4230750944
ca-app-pub-5429548830862354/2177742228
ca-app-pub-5429548830862354/8928056389
ca-app-pub-5429548830862354/6129986700
ca-app-pub-5429548830862354/9732309463
ca-app-pub-5429548830862354/2069441860
ca-app-pub-5429548830862354/6774054197
ca-app-pub-5429548830862354/8028386627
ca-app-pub-5429548830862354/2885395787
ca-app-pub-5429548830862354/8069824140
ca-app-pub-5429548830862354/9806199765
ca-app-pub-5429548830862354/4476823792
ca-app-pub-5429548830862354/7670849222
ca-app-pub-5429548830862354/6356017452
ca-app-pub-5429548830862354/8861781239
ca-app-pub-5429548830862354/1899167469
ca-app-pub-5429548830862354/6026736851
ca-app-pub-5429548830862354/8017447702
ca-app-pub-5429548830862354/3546727800
ca-app-pub-5429548830862354/9818101380
ca-app-pub-5429548830862354/1827890017
ca-app-pub-5429548830862354/4716902493
ca-app-pub-5429548830862354/9358449533
ca-app-pub-5429548830862354/4765626078
ca-app-pub-5429548830862354/5378684221
ca-app-pub-5429548830862354/8344137539
ca-app-pub-5429548830862354/5021314973
ca-app-pub-5429548830862354/7793302602
ca-app-pub-5429548830862354/6321222651
ca-app-pub-5429548830862354/1013055659
ca-app-pub-5429548830862354/5237129710
ca-app-pub-5429548830862354/4728326158
ca-app-pub-5429548830862354/3104957441
ca-app-pub-5429548830862354/6152917873
ca-app-pub-5429548830862354/8170039686
ca-app-pub-5429548830862354/8078185124
ca-app-pub-5429548830862354/4993903939
ca-app-pub-5429548830862354/7321542238
ca-app-pub-5429548830862354/3526754532
ca-app-pub-5429548830862354/1751422254
ca-app-pub-5429548830862354/5452021780
ca-app-pub-5429548830862354/9589391974
ca-app-pub-5429548830862354/1847011945
ca-app-pub-5429548830862354/2721814064
ca-app-pub-5429548830862354/5167139262
ca-app-pub-5429548830862354/9291549668
ca-app-pub-5429548830862354/9246768891
ca-app-pub-5429548830862354/7644763796
ca-app-pub-5429548830862354/8766273770
ca-app-pub-5429548830862354/2200865429
ca-app-pub-1492185577403123/4684932961
ca-app-pub-1492185577403123/8241034597
ca-app-pub-1492185577403123/6522141700
ca-app-pub-5429548830862354/8890097023
ca-app-pub-5429548830862354/1777019020
ca-app-pub-5429548830862354/1687790625
ca-app-pub-5429548830862354/5472188621
ca-app-pub-5429548830862354/9549134622
ca-app-pub-5429548830862354/2283219820
ca-app-pub-5429548830862354/5736213823
ca-app-pub-5429548830862354/1637418227
ca-app-pub-5429548830862354/6750445425
ca-app-pub-5429548830862354/4205448220
ca-app-pub-5429548830862354/7158914622
ca-app-pub-5429548830862354/1112381023
ca-app-pub-5429548830862354/4065847427
ca-app-pub-5429548830862354/7019313826
ca-app-pub-5429548830862354/2449513422
ca-app-pub-5429548830862354/5402979820
ca-app-pub-5429548830862354/9833179428
ca-app-pub-5429548830862354/3786645820
ca-app-pub-5429548830862354/6740112220
ca-app-pub-5429548830862354/9693578629
ca-app-pub-5429548830862354/1458425024
ca-app-pub-5429548830862354/8283687828
ca-app-pub-5429548830862354/2457480222
ca-app-pub-5429548830862354/7482462228
ca-app-pub-5429548830862354/3955416224
ca-app-pub-5429548830862354/6056101424
ca-app-pub-5429548830862354/7179581025
ca-app-pub-5429548830862354/9155841823
ca-app-pub-5429548830862354/1213772629
ca-app-pub-5429548830862354/3094131822
ca-app-pub-5429548830862354/4431264226
--
---
You received this message because you are subscribed to the Google Groups "Google Mobile Ads SDK Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-admob-ads...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-admob-ads-sdk/f9da3472-388b-48aa-a9c0-6b57fadfc853n%40googlegroups.com.
Hi Ronald,
Thank you for providing that information. If you are able to download the TCF error report in the AdMob dashboard there are two ad units that are associated with the 3.3 error:
5774309082
7807512802
It also looks like the last time these errors were detected July 25th.
However, 3.3 errors are not so much about the ad unit as it is related to the UMP implementation. The iOS/Android SDK internally knows when to flip the consent status to REQUIRED 13 months after it has been obtained. Are you able to provide a minimum reproducible example of your code? To verify the implementation is correct.
Thanks,
Justin
If the file(s) you are looking to share are less than 25mb in total you can attach them to this case on your next reply. If you are having trouble attaching your file to this case or if your file(s) are larger than 25mb, you can share your files with me by performing the following steps:
1. Navigate to
https://docs.google.com/forms/d/e/1FAIpQLSfkAiXMeYP-fw1W3Z-tT9uwmATEKO5X6S-th0gR2ezdKaaqfg/viewform?usp=pp_url&entry.400550049=Mobile+Ads+SDK&entry.460850823=5004Q00002lKKCkQAO&entry.80707362=001801542. Fill out all fields, and attach your file(s).
3. Please reply back on this thread when you have uploaded your file(s). Please do not share this link.
To follow up, I want to clarify some misinformation on this thread.
1) The call to requestConsentInfoUpdate() is when the UMP SDK checks the TCString to evaluate it against the 13 months, and updates consent status to REQUIRED if the TCString is invalid. The current recommended implementation is to call requestConsentInfoUpdate() at the start of every session. However, if you have long app sessions, it is possible the 13 months expires mid-session, resulting in a minor amount of 3.3 errors. Additionally, on the next app session, if you start preloading ads at the same time as you check requestConsentInfoUpdate(), those requests will also give a 3.3 until requestConsentInfoUpdate() completes. This should represent a tiny fraction of overall 3.3 errors (e.g. 0.0x%) that we believe are acceptable. We are looking into raising the threshold of 3.3 errors that generates concerning-looking warnings in the AdMob UI on this.
2) If you want to recover that 0.0x%, storing the consent date in local storage and reprompting proactively after 12 months is a workaround. Doing that in the UMP SDK is an idea that's been floating around but we haven't decided to implement that yet. I would still recommend against calling consentInformation.reset() explicitly though. That method is intended to be used for testing, and by calling that, you are deleting potentially valid consent and re-prompting your users more unnecessarily.
Thanks,
Justin