·10 min read

Google Play data safety form: AdMob + Firebase

How I filled in the Google Play Data safety form for a word game that ships AdMob, Firebase Analytics and Crashlytics, Play Billing and Play Games, from the build's own SDK list, with the reason behind each tick.

google-playprivacyadmobandroid

Contents

Picture Word Connect has no accounts, no sign-up and no server of mine. It still sends data to Google from five different SDKs, and the Google Play data safety form wants every one of them accounted for. I filled it in on 2026-10-10, one page at a time, pasting each page of the form into Claude Code and asking what to tick.

The useful decision came before the first page. I did not answer from the privacy policy. I answered from the build. That turned out to matter: the next day an audit of the game found that the privacy page bundled inside the app still said data "never leaves your device" and named ads as the only third-party service. A form filled in from that text would have declared almost nothing, and been wrong on every page.

Start from the build

The inventory is three greps. Which Capacitor plugins are compiled into the Android app, which native libraries those plugins pull in, and what the manifest asks for:

grep implementation android/app/capacitor.build.gradle
grep -h implementation node_modules/*/android/build.gradle   # the plugins' native deps
grep -o 'uses-permission[^>]*' android/app/src/main/AndroidManifest.xml

That gave five SDKs that send anything off the phone, at the versions in the build as I write this:

SDK Version Sends
Google Mobile Ads, Next-Gen (ads-mobile-sdk), with Google's consent prompt 1.5.0 advertising ID, IP-derived approximate location, ad interactions, diagnostics
Firebase Analytics (@capacitor-firebase/analytics) 8.5.x screens and events, app-instance ID, purchase events
Firebase Crashlytics and Performance 8.5.x crash logs, traces, installation ID
Play Billing 9.1.0 purchase records; card details stay with Google
Play Games Services v2 (play-services-games-v2) 22.1.0 player ID, leaderboard scores

Local notifications, preferences, share, haptics, filesystem and the in-app review sheet stay on the device and need no declaration.

The source manifest asks for one permission, INTERNET. That is not what ships. The merged manifest from a release build that week has fourteen, including these:

uses-permission android:name="com.google.android.gms.permission.AD_ID"
uses-permission android:name="com.android.vending.BILLING"
uses-permission android:name="android.permission.ACCESS_ADSERVICES_AD_ID"

Read the merged one under android/app/build/intermediates/ before you answer anything about identifiers in the Google Play Console data safety form. The AD_ID line is also why the separate Advertising ID declaration under App content has to say yes, for advertising and analytics. That page and the Data safety form are filled in on different screens, and nothing in Play Console makes them agree for you.

Step 2 of the data safety form in Google Play Console

Step 1 is an overview with nothing to fill in. Step 2 is five questions, and the answers followed from the table:

Question Answer Why
Does your app collect or share any of the required user data types? Yes ads, Analytics and Crashlytics all send data
Is all of the user data collected by your app encrypted in transit? Yes all five send to Google over HTTPS (I took that from the SDKs; I did not capture traffic)
Which of the following methods of account creation does your app support? My app does not allow users to create an account nobody signs up
Can users log in to your app with accounts created outside of the app? No there is no login screen
Independent security review, UPI payments verified left blank neither applies to a game

The login question is the one that made me hesitate. The game does use a Google account, through Play Games, which signs most players in quietly at launch. But the question is about a login the app itself offers, a screen where someone types in an account made elsewhere. Play services does that sign-in, and the game never owns, stores or manages the account. So the answer is no, and with no account the form never asks for a delete-account URL.

The deletion answer, and why not 90 days

The last question in Step 2 is optional: "Do you provide a way for users to request that their data is deleted?" There are three answers, and one of them is a trap.

  • Yes, with a URL. The listing then shows that you can request deletion. The URL has to lead somewhere that says how. The game's privacy policy has that section now: an in-game "delete data" row that removes the saved game and everything on the device, plus what it does not delete and where Google keeps the rest.
  • No. Allowed, because the question is optional.
  • "No, but user data is automatically deleted within 90 days." Do not pick this one with Firebase in the build. Google Analytics keeps event data for two months or fourteen, depending on a setting in the Analytics property, and AdMob keeps its data under Google's own rules. Neither is a number I control from the app, and neither is 90 days.

Step 3: eight data types and no more

The data types page is a long list of categories, each opened with Show. I ticked eight boxes:

Category Ticked Left empty, and why
Location Approximate location Precise location: the game has no location permission. The rough one comes from the IP address, through ads.
Personal info User IDs Name, email and the rest. The ID is the Play Games player ID sent with each score.
Financial info Purchase history Payment info: Google Play handles the card.
App activity App interactions, Other actions Search history, installed apps, user-generated content
App info and performance Crash logs, Diagnostics
Device or other IDs Device or other IDs

Everything else stays empty. Sharing goes through the Android share sheet, which the app hands off to and does not collect.

Two of those eight are a judgement call. User IDs and Other actions come from Play Games, and there is a fair argument that Google's own game service is Google's collection, not mine. I ticked both anyway. My reasoning was that a type declared and arguably unneeded is a smaller problem than one left out, but I have no review outcome that proves it either way.

Does Firebase app data collection need to be declared on the form?

Yes, and it accounts for most of the form. Firebase is behind App interactions, Crash logs, Diagnostics and Device or other IDs, alongside the ads SDK for three of them, and it logs in_app_purchase events on Android without being told to, which puts it under Purchase history too.

What Firebase does not do in this game is carry a user ID. The only setUserId in the source is in a test mock. No player identifier of mine reaches Analytics, so the User IDs tick rests on Play Games alone.

The rule I used to split collected from shared: Firebase processes the data for me, as a service provider, so its types are collected. Google Mobile Ads also uses what it receives for its own ad network, so anything the ads SDK touches is collected and shared.

Step 4: collected, shared, required

Step 4 asks the same five questions of each type. These are the answers I planned, and the Preview confirmed the shared half of them:

Data type Collected / shared Required Collected for
Approximate location both yes advertising, analytics, fraud prevention
User IDs collected users can choose app functionality
Purchase history collected yes app functionality, analytics
App interactions both yes analytics, advertising
Other actions collected yes app functionality, analytics
Crash logs collected yes analytics
Diagnostics both yes analytics, advertising
Device or other IDs both yes advertising, analytics, fraud prevention

Ephemeral is no for all eight, because Analytics, Crashlytics and the ads SDK all store what they receive. Most types are required because the game has no switch to turn off analytics, crash reports or ads. The consent prompt decides whether ads are personalised, and the data is collected either way. User IDs is the exception, since a player can decline Play Games sign-in and the game carries on without it.

Purposes I left unticked: developer communications (local notifications are scheduled on the phone, nothing is pushed from a server), personalization, and account management.

The preview, and what I don't know

The Preview page is what the Google Play Store data safety form will show on the listing. It listed four shared types, approximate location, diagnostics, app interactions and device or other IDs, which is the ads SDK's set and what I expected. It differed from my plan in one place. I had meant the sharing purpose to be advertising only. The saved form lists analytics as a sharing purpose on all four, and fraud prevention on location and device IDs as well. I left it.

That is where the record stops. The preview matched the plan; I have nothing from Google's review of it, positive or negative. If you came here with an invalid data safety form Google Play Console notice, this post cannot tell you how to clear one, because I have not had one for this game.

What the inventory missed

Writing this up, I read the game's code again and found something the inventory got only half right. It found Play Games, and I described Play Games as a leaderboard. Picture Word Connect also keeps a Saved Game in the player's Play Games account, so progress survives a new phone. Same library, so nothing new showed up in the greps.

The form as I filled it declares gameplay data under Other actions, collected for app functionality, which is a reasonable home for a saved game too. The draft deletion paragraph I wrote that day was the real casualty: it said game progress lives only on the device. The published policy says what the game actually does. The lesson for the next form is to grep for what the game uses, not only for what it links.

Reusing it for the next game

Filling in the data safety form, Google Play app by app, is mostly the same answers each time. The Data safety page has Export to CSV and Import from CSV buttons. Once a form is saved, export it. A new game on the same stack imports the CSV, and the only work left is the difference between the two builds:

  • no ads: approximate location goes, the three ads-shared types become collected only, advertising leaves every purpose, and the Advertising ID declaration becomes no
  • no in-app purchases: Purchase history goes
  • no Play Games at all: User IDs and Other actions go

Then re-read the merged manifest, check the deletion URL names the right game, and look at the Preview before saving. The answers transfer between games. The inventory has to be run again every time.

More posts

New writing when there is something worth saying. By email or by RSS, whichever you prefer.