AdMob consent is not a legal footnote hidden at the bottom of a privacy policy — in 2026 it is a monetisation setting. The ads your app is allowed to serve to users in the EEA, the UK and Switzerland depend on a message you build in the AdMob console and on a small SDK that reads the user's answer back to the ad request path. The Google User Messaging Platform (UMP) SDK is that SDK, and the events it drives decide whether an ad request is a personalised impression, a limited one, or nothing at all.
The frustrating part is that a broken consent setup barely looks broken. The app installs, the ads render, the dashboard shows impressions — and revenue per user simply comes in lower than it should, in exactly the geographies that pay best. This checklist covers the whole AdMob consent configuration in the order it is actually done: account prerequisites, the message type and targeting, the UMP SDK integration on Android and iOS, the canRequestAds() gate, the privacy options entry point, testing with debug geography and test devices, US states signals, and Consent Mode. Each step maps to behaviour that Google documents in its own AdMob Help and Mobile Ads SDK references.
1. Three consent layers that are not the same thing
Most setup mistakes come from treating one system as another. Keep these three separate in your head, because they are configured in different places and fail in different ways.
- The European regulations message. A user-facing form, created in the AdMob UI, that collects consent for users in the EEA, the UK and Switzerland. Governed by Google's EU user consent policy.
- The UMP SDK. The client-side library that requests the message, presents it, caches the outcome, and tells your app whether ads may be requested. It is the messenger, not the policy.
- Consent Mode and US state signals. How the app passes privacy choices (ad storage, ad personalisation, ad user data, analytics storage) and US state signals to Google's advertising systems. These are plumbing beneath the message, not the message itself.
If a user in Germany never sees a form, the problem is the message configuration or the targeting — not your ad implementation. If a user sees the form but your app requests ads before the SDK has an answer, the problem is your request flow. Different layers, different fixes.
2. Checklist step 1 — confirm you can configure this at all
Consent settings live behind an account permission, and this trips up larger operations first.
- To configure EU Consent and GDPR, US State regulations and the User Messaging Platform in AdMob, your account needs the Account Management permission. If the Privacy & messaging pages are read-only, the publisher is usually not the account owner.
- Anyone managing monetisation at scale should confirm this before launch day, not on launch day. A single account owner with 2FA on a personal phone is a single point of failure for consent configuration across every app in the account.
3. Checklist step 2 — create the European regulations message
The form itself is built in AdMob, under Privacy & messaging. For the European regulations message type:
- In AdMob, open Privacy & messaging and create a new message (the button reads Create if this is your first message for the app, or Manage if you have created one before).
- Select the apps the message will be shown in. Under the UMP SDK, the message is resolved from the AdMob Application ID configured in your project, so an app that is not selected here has no form to show.
- Select the languages. The message falls back to a default language when the device language cannot be determined, so review every language you add before publishing.
- In the Targeting section choose either Countries subject to GDPR (EEA, UK, and Switzerland) or Everywhere. Most apps want the first option: the form reaches the users the policy applies to and leaves everyone else alone.
- Add a privacy policy URL — it is a required part of the message — then review and publish. Saving a draft is not publishing, and an unpublished message means no form ever appears.
Google also exposes Error reports in the AdMob UI for consent implementations, which is the first place to look when a form behaves oddly rather than the last.
4. Checklist step 3 — Android integration
The UMP SDK is a separate library from the ads SDK and requires Android API level 21 or higher.
// app/build.gradle
dependencies {
implementation("com.google.android.ump:user-messaging-platform:4.0.0")
}
<!-- AndroidManifest.xml -->
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/>
- The application ID must be the real AdMob app ID from the AdMob UI. It is the key the SDK uses to look up which message to display.
- Get a
ConsentInformationinstance withUserMessagingPlatform.getConsentInformation(context). - Sync Gradle and confirm the library resolves before you debug anything else — a missing SDK looks exactly like a missing message.
5. Checklist step 4 — iOS integration
# Podfile
pod 'GoogleUserMessagingPlatform'
<!-- Info.plist -->
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy</string>
- CocoaPods is the documented default; the SDK is also available as a Swift Package and as a manual framework download.
- On iOS the singleton is
UMPConsentInformation.sharedInstance, and the form call isloadAndPresentIfRequired(from:). - If you ship iOS and Android from one dashboard, keep the two application IDs straight. Pasting an Android app ID into an iOS project compiles and then quietly shows the wrong message — or none.
6. Checklist step 5 — request consent information on every launch
This is the step people implement once and forget. It has to run every app launch, before any ad request.
- Call
requestConsentInfoUpdate()(Android) orrequestConsentInfoUpdate(with:completionHandler:)(iOS) with your consent request parameters. - That single call answers two questions: is consent required (first run, or a previous decision that has expired), and is a privacy options entry point required.
- When the update succeeds, call
loadAndShowConsentFormIfRequired()/loadAndPresentIfRequired(from:)to present any form that is actually required. If no form is needed, the callback runs immediately — so this is safe to put on every launch path. - Google explicitly warns against inferring consent status from your own cache or a previously saved consent string. That data can be stale, and a stale "yes" is a policy problem, not a performance problem.
7. Checklist step 6 — gate ad requests on canRequestAds()
The consent decision is only meaningful if it actually gates the ad request.
- Before requesting ads, check
consentInformation.canRequestAds(). Request ads only when it returns true. canRequestAds()always returns false until you have calledrequestConsentInfoUpdate(). An app that loads a banner on cold start before the consent call is, by definition, requesting ads with no answer.- Google lists three moments to check it: after the SDK gathers consent in the current session, immediately after
requestConsentInfoUpdate()returns, and when the SDK already holds consent from a previous session. - If an error occurs while gathering consent, decide deliberately how your app behaves instead of defaulting to "keep loading ads".
8. Checklist step 7 — the privacy options entry point
- Read
consentInformation.privacyOptionsRequirementStatus. When it is REQUIRED, the app must give users an obvious, permanently reachable way to change their privacy choices. - Wire that UI element to
UserMessagingPlatform.showPrivacyOptionsForm()so the form can be re-opened at any time. - When the status is not REQUIRED, hide and disable the entry point — a stray settings row that opens nothing is a small support ticket generator.
- Revocation has to be as easy as consent. Google's EU user consent policy asks for clear instructions for withdrawing consent; a buried settings toggle does not satisfy that.
9. Checklist step 8 — test with debug geography and test devices
Consent code that cannot be replayed is consent code that will break in production.
- Build
ConsentDebugSettingsand register your test device withaddTestDeviceHashedId("…"). The hashed ID is printed in the log output of the firstrequestConsentInfoUpdate()call, so you can copy it from there. - Force a region with
setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_EEA)so an EEA form can be exercised without travelling. The same setting covers the UK and Switzerland. - Emulators are treated as test devices by default from UMP SDK 2.2.0 onward — no device ID required.
- Use
consentInformation.reset()to simulate a fresh install and see the first-run experience again. This is a testing tool: do not callreset()in production code. - Remove the debug device IDs and geography before you ship. Forced geography is a hard-coded lie about where the user is; it belongs in development builds only.
10. Checklist step 9 — US states: RDP or the IAB GPP signal
US state privacy laws are handled differently from European consent, and you must choose one approach rather than sprinkling both.
- Restricted data processing. The Google Mobile Ads SDK (Legacy) accepts an RDP parameter; writing the key
gad_rdpwith a value of1to SharedPreferences tells the SDK to restrict certain identifiers and other data in the services provided to you. - IAB Global Privacy Platform. If you collect decisions with a consent management platform or your own messaging, the SDK respects GPP signals written to local storage for the applicable US states.
- Decide how restricted data processing fits your compliance plan before launch, and be consistent per ad request. A signal that flips between requests is worse than a deliberate choice.
- You can verify what is actually sent: inspect ad requests for the
&rdp=parameter with network tracing or a proxy tool.
11. Checklist step 10 — Consent Mode mapping
If you also run analytics, the UMP SDK can translate GDPR choices into Google Consent Mode so measurement and ads agree with the user's decision.
- UMP interprets four purposes for Consent Mode: ad storage, ad personalization, ad user data and analytics storage.
- Prerequisites: turn Consent Mode on in the AdMob UI, use UMP SDK 3.2.0 or higher, and initialise Firebase Analytics before the UMP SDK.
- Set a default consent state — it applies to users that EU regulations do not cover.
- Choose advanced versus basic mode deliberately. Advanced is Google's default; basic mode needs additional steps.
12. What actually happens when a user declines
Declining is a supported outcome, not an error state — but it changes what you can serve.
- The Google UMP SDK is IAB-certified for TCF v2.3 across all SDK versions, so its signals are what ad partners read when deciding whether to bid.
- If there is no consent for IAB TCF Purpose 1, limited ads serving applies, in line with Google's EU user consent policy. That is the mechanism by which a decline reduces revenue instead of breaking the app.
- TCF implementation errors have their own reporting surface: the Error reports area of the AdMob UI.
- Retain the records of consent your users give, and make revocation reachable — both are explicit duties under the EU user consent policy, alongside identifying each party that may collect or use the user's personal data.
13. The failure list — eight ways this breaks quietly
- The message was saved as a draft and never published.
- The app was not selected in the message, so the SDK has nothing to show for that Application ID.
- The wrong AdMob application ID is in the manifest or Info.plist.
- Targeting is set to Everywhere (or left misconfigured) when only EEA, UK and Switzerland traffic was intended, or the reverse.
- The privacy policy URL is missing, which blocks publication of the message.
- Ad requests fire on cold start, before
requestConsentInfoUpdate()— socanRequestAds()could never have returned true. - The app caches its own consent verdict instead of asking the SDK each launch.
- Debug device IDs, forced geography or
reset()shipped in the release build.
Every item in that list is checkable before release, and none of them require a policy argument — they are build and configuration defects.
14. Where KappS fits in
Consent sits in the same chain as the developer account, the payments profile and the tax information: any one of them can quietly hold up revenue without stopping the product. KappS helps developers prepare and submit compliant material across that chain — including the AdMob side, where the difference between a published message, a correctly registered application ID and a properly gated ad request is measurable in EEA revenue.
What we do not do is manufacture consent. A form that is never shown, or a signal that claims an answer the user never gave, is a policy violation that puts the account and its payouts at risk, and it is not a service we offer. The setup above is the whole trick: show the real form, keep the real answer, and respect it at the ad request.
Sources (Google official documentation): AdMob Help — European regulations message (support.google.com/admob/answer/10113207); Mobile Ads SDK — Set up UMP SDK (Android / iOS, developers.google.com/admob); US states privacy laws (RDP and IAB GPP); Interpret consent mode values; Google EU user consent policy.