Detects the stack (native iOS / Android, React Native, Expo, Capacitor, Cordova, Flutter, Unity, Godot) and the SDKs from a maintained table with versions, file:line and each vendor's disclosure page, then reports App Store and Google Play rejection risks with guideline, evidence, fix, severity and skill: 2.1(a) demo account and placeholder text, 5.1.1(v) account deletion, 4.8 login services, 3.1.1 restore and outside payments, 3.1.2 subscription info, 5.1.2(i) ATT, purpose strings, privacy link, privacy manifest, 2.3.10, 2.3.7, 2.3.8, 4.2 web wrappers, 2.5.1, 2.5.5, ATS, export compliance, 1.3 kids ads, review prompts, privacy labels vs SDKs; Play target SDK 36, delete-account URL, App access, foreground services, exact alarms, QUERY_ALL_PACKAGES, SMS / call log, com.example package name. Proposes Data safety / App Privacy / ATT / privacy manifest answers (detected file:line or ask owner) as a diff against the config; --write adds only the detected ones. scan.ignore records owner-accepted findings. MCP tool scan (read-only), validate includes open findings, desktop Checks tab shows them. Fixtures for iOS, Android, Capacitor, Unity, Flutter, clean and teaser.
45 lines
3.8 KiB
Markdown
45 lines
3.8 KiB
Markdown
---
|
|
name: account-deletion
|
|
description: Make account deletion pass App Store and Google Play review for an app with sign-up or sign-in - Apple Guideline 5.1.1(v) in-app deletion (the whole account, not deactivation; Sign in with Apple token revocation; subscription billing note), Google Play's in-app path plus a public web page declared in Data safety, the config (accounts.enabled, deletionUrl, inApp) and the storebound checks. Use when the app has accounts, when the user adds sign-up, or after a 5.1.1(v) / Play account deletion rejection.
|
|
---
|
|
|
|
# Account deletion (both stores)
|
|
|
|
`storebound scan` finds sign-up and sign-in code (Firebase Auth, Supabase, Google / Facebook / Apple sign-in, custom endpoints) without a deletion path (5.1.1(v)) and accounts without `accounts.deletionUrl` (Play): run it after adding deletion.
|
|
|
|
Applies to every app that lets people create an account (email, phone, social sign-in, Sign in with Apple). Games
|
|
without accounts can skip it. Sources: Apple, "Offering account deletion in your app"
|
|
(https://developer.apple.com/support/offering-account-deletion-in-your-app/) and App Review Guideline 5.1.1(v)
|
|
(https://developer.apple.com/app-store/review/guidelines/); Google Play, "Understanding Google Play's app account
|
|
deletion requirements" (https://support.google.com/googleplay/android-developer/answer/13327111).
|
|
|
|
## What the stores require
|
|
- **Apple 5.1.1(v)**: people can **start** deleting their account **inside the app**, easy to find (e.g. Settings >
|
|
Account > Delete account). Delete the whole account and its personal data, not only deactivate it. A link to a web
|
|
page that completes the deletion is fine; "email or call us" is only acceptable in highly regulated industries.
|
|
With Sign in with Apple, revoke the user's tokens (Sign in with Apple REST API). With auto-renewable
|
|
subscriptions, tell people that billing continues through Apple until they cancel, and how to cancel.
|
|
- **Google Play**: if the app lets people create an account, it must offer deletion **in the app** and on a **web
|
|
page** people can reach without the app (no reinstall needed). The URL goes into the Data safety form ("Data
|
|
deletion"). People can also ask to delete some data without deleting the account; say how.
|
|
|
|
## Steps
|
|
1. Config: `accounts: { enabled: true, deletionUrl: 'https://example.com/delete-account', inApp: 'Settings > Account >
|
|
Delete account' }`. `storebound check` errors without `deletionUrl` (Play) and warns without `inApp` (Apple);
|
|
`storebound apple review-details` adds "Account deletion: <inApp>" to the review notes.
|
|
2. Web page at `deletionUrl`: names the app and developer, the steps to request deletion (sign in, or a form that
|
|
verifies the email), what is deleted and what is kept (and for how long, e.g. invoices for tax law), and how long it
|
|
takes. No login wall to read it. `storebound validate --play` checks that it answers.
|
|
3. In the app: a clear entry, a confirmation step, then the deletion (or the web page). Sign people out afterwards.
|
|
4. Play Data safety: `dataSafety.deletionRequest: true`, `accountCreation` set to the sign-up methods you offer (not
|
|
`PSL_ACM_NONE`). Google does not publish the question ids for the delete-account URL: export the form once
|
|
(Play Console > App content > Data safety > Export to CSV), copy the id, and add it as
|
|
`dataSafety.extra: [{ question: '<id>', value: '<deletionUrl>' }]`; otherwise enter the URL in the Console after
|
|
`storebound play data-safety`.
|
|
5. Privacy policy: a "Deleting your account" section with both paths (`privacy-policy` skill).
|
|
6. Test it on a fresh account before every submission; the reviewer will.
|
|
|
|
## Gotchas
|
|
- "Deactivate" or "contact support" is not deletion for Apple.
|
|
- Deleting the account does not cancel a store subscription: say so in the app and on the web page.
|
|
- Keep the in-app path, the web page, Data safety and the privacy policy saying the same thing.
|