fix(moonlaunch): disclose the telemetry and analytics the game actually sends

The policy described leaderboards and cloud save as the only things that leave
the device, and stated outright: "This data is not transmitted to our servers
unless you use the leaderboard or cloud save features." That is not true.

- Gameplay telemetry POSTs to api.such.software on every platform, automatically
  rather than opt-in, tagged with the anonymous device ID, display name and
  platform. It carries level starts and completions with times and stars, how a
  run ended (cause, hazard, speed, fuel, progress through the level), rewarded-ad
  and share actions, purchase attempts, and error messages. None of it was
  disclosed.
- Google Firebase (Analytics and Crashlytics) ships in the mobile builds and
  receives the same device ID as a user property alongside app version, device
  model, OS version and language. It was not mentioned anywhere, including in the
  third-party recipients table.
- Cloud save uploads automatically on every save, not only on an explicit action,
  and its payload now also carries store purchase receipts (the ledger that stops
  a purchase being credited twice).
- The page claimed Google AdSense serves ads on the web build. It does not:
  web/custom_shell.html records that the AdSense placeholders were removed and
  web monetization is handled in-game. Removed the claim and the AdSense row from
  the recipients table.

Left as-is: the statement that iOS serves non-personalized ads and does not
access the IDFA. No code path presents the ATT prompt, so the identifier stays
zeroed and that claim holds.
This commit is contained in:
jw
2026-08-15 11:17:50 -04:00
parent a6ad27b3e2
commit b6fb6b743d
@@ -21,7 +21,7 @@ export default function SuchMoonLaunchPrivacyPage() {
<div className="glass-card mt-6">
<header className="mb-8 pb-6 border-b border-border">
<h1 className="text-3xl md:text-4xl font-bold">Privacy Policy for Such Moon Launch</h1>
<p className="text-muted-foreground mt-2">Last Updated: May 20, 2026</p>
<p className="text-muted-foreground mt-2">Last Updated: August 14, 2026</p>
</header>
<div className="prose dark:prose-invert max-w-none">
@@ -61,8 +61,9 @@ export default function SuchMoonLaunchPrivacyPage() {
<h3>Advertising Data (Mobile &amp; Web Only)</h3>
<p>
We use <strong>Google AdMob</strong> (mobile) and <strong>Google AdSense</strong> (web) to display
advertisements. These services may collect and use data to show you personalized ads. This data may include:
We use <strong>Google AdMob</strong> to display advertisements in the mobile
(iOS and Android) builds. The browser and desktop builds show no third-party
advertising. These services may collect and use data to show you personalized ads. This data may include:
</p>
<ul>
<li>Device identifiers (Advertising ID)</li>
@@ -117,7 +118,9 @@ export default function SuchMoonLaunchPrivacyPage() {
<li>Your chosen display name (randomly generated by default, editable)</li>
<li>Your game scores, star ratings, and level completion times</li>
<li>A randomly generated anonymous device ID</li>
<li>Your game save data (upgrades, skins, progress) for cloud backup</li>
<li>Your game save data for cloud backup &mdash; upgrades, skins, progress, wallet
balance, settings, and the store purchase receipts used to stop a purchase
being credited twice</li>
<li>Your device platform (e.g. &quot;Android&quot;, &quot;iOS&quot;, &quot;Web&quot;)</li>
</ul>
<p>
@@ -135,7 +138,33 @@ export default function SuchMoonLaunchPrivacyPage() {
<li>Premium purchase status (ad removal)</li>
<li>Death count and lifetime statistics</li>
</ul>
<p>This data is not transmitted to our servers unless you use the leaderboard or cloud save features.</p>
<p>
Cloud save uploads automatically whenever your progress is saved, so this data
reaches our servers without a separate action from you. See the next section for
the gameplay events we send.
</p>
<h3>Gameplay Analytics</h3>
<p>
On every platform, the App sends gameplay events to our own backend at{" "}
<strong>api.such.software</strong>. This is automatic rather than opt-in, and it is
how we balance level difficulty and find bugs. Each batch is tagged with your
anonymous device ID, your display name, and your platform, and contains:
</p>
<ul>
<li>Levels started and completed, with times, star ratings, and Moonrocks collected</li>
<li>How a run ended &mdash; the cause of death, which hazard, your speed and fuel at
the time, and how far through the level you were</li>
<li>Whether you chose to watch a rewarded ad, shared a score, or saw a rating prompt</li>
<li>Purchases you start and whether they complete</li>
<li>Error messages, so we can fix crashes and faults</li>
</ul>
<p>
The mobile builds additionally include <strong>Google Firebase</strong> (Analytics and
Crashlytics), which receives the same anonymous device ID as a user property along with
your app version, device model, operating-system version, and language. We do not send
Google your real name or email, because the App never asks for them.
</p>
<hr />
@@ -171,9 +200,9 @@ export default function SuchMoonLaunchPrivacyPage() {
<td><a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Link</a></td>
</tr>
<tr>
<td>Google AdSense</td>
<td>Advertising (web)</td>
<td><a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Link</a></td>
<td>Google Firebase (Analytics, Crashlytics)</td>
<td>Usage analytics and crash reporting (mobile)</td>
<td><a href="https://firebase.google.com/support/privacy" target="_blank" rel="noopener noreferrer">Link</a></td>
</tr>
<tr>
<td>Google Play Games Services</td>