Introduction
Echoes of Battle ("we", "our", "the app") is committed to protecting your privacy. This Privacy Policy explains how we collect, use, and safeguard your information when you use our mobile application. We process personal data in accordance with the EU General Data Protection Regulation (GDPR) and similar laws.
Information We Collect
We collect the following categories of data:
Account Data: When you sign in (via Google, Apple, or as a guest), we store your user ID, display name, and email address. Guest accounts use a locally generated anonymous ID.
Usage Data: Battle listening history, quiz scores, GPS visits, achievements, XP, gold, streaks, and activity logs. This data is stored locally on your device and optionally synced to Firebase for cross-device access.
Location Data: When you use GPS battlefield detection, we access your device location to determine proximity to historical battle sites. Location is read only while the app is open (never in the background). When you check in at a battlefield, your precise coordinates are sent to our server once to verify you are there, and a visit record (battle and time) is stored with your account. Pin coordinates (when you publicly place a pin) are also stored on our servers.
Purchase Data: In-app purchase transactions are processed by Apple App Store or Google Play Store via RevenueCat. We do not store payment card details.
Push Notification Token: When you grant push permission, we store an Expo push token on the user record so re-engagement and event reminders can reach your device. This token is treated as personal data under GDPR.
Age Declaration: Before you can reach a real-money purchase, we show a neutral age screen and store the year of birth you enter on your account. We use it only to decide whether a parental gate is required and to serve age-appropriate content. We do not collect your full date of birth.
No Advertising: The app shows no ads. It contains no advertising SDK, does not access the device advertising identifier, and does no ad tracking.
Analytics: The Android app sends no usage analytics. With your consent only, the app sends crash reports via Sentry, tagged with a pseudonymous account ID (no name, no email). On our website, Google Analytics and Metricool provide anonymous statistics and load only after you accept cookies.
How We Use Your Data
We use collected data to:
- Provide core app functionality (progress tracking, achievements, leaderboards)
- Sync your progress across devices (Firebase)
- Process in-app purchases (RevenueCat)
- Improve app stability (crash reporting, with consent)
- Understand usage patterns (analytics, with consent)
- Deliver push notifications (streaks, achievements, with your permission)
- Verify you are old enough for real-money purchases (age screen + parental gate)
Legal Basis for Processing (GDPR Art. 6)
We process your personal data on the following legal bases:
Contract (Art. 6(1)(b)): Account data, usage data, in-app purchase data, and cloud sync are required to deliver the app's core functionality you have requested.
Legitimate Interest (Art. 6(1)(f)): The push notification token, re-engagement reminders, and aggregated leaderboard standings serve our legitimate interest in keeping users engaged. You can opt out at any time via Settings > Notifications.
Consent (Art. 6(1)(a)): Optional analytics, optional crash reporting, and optional personalization rely on your explicit consent (Settings > Privacy). You may withdraw consent at any time without affecting the lawfulness of prior processing.
Legal Obligation (Art. 6(1)(c)): Where applicable, we retain payment records for the period required by tax law.
Data Storage & Security
Your data is stored locally on your device using AsyncStorage. When signed in, progress data is synced to Firebase Firestore (Google Cloud, EU region: europe-west1). All data transmission uses HTTPS encryption. We do not sell your personal data. We share data only with the service providers listed under "Third-Party Services" below, and only to the extent needed to provide the functionality you use.
Your Rights (GDPR)
Under GDPR/RODO, you have the right to:
- Access (Art. 15): Export all your data (Settings > Privacy > Export Data). The export includes both the data stored locally on your device AND the data we hold on our servers (account record, last 100 PvP matches with opponent IDs hashed, tournament registrations, league standing, clan war IDs). Delivered as a JSON file via the standard share sheet.
- Rectification (Art. 16): Update your profile information from the Profile screen.
- Erasure (Art. 17): Delete all your data (Settings > Delete Account). This triggers a server-side cascade that removes your account record, your PvP matches (opponent's record is preserved with your slot replaced by '[deleted]'), tournament registrations, league standing, and your participation in clan war records. See the account deletion guide for the full steps and what is removed.
- Portability (Art. 20): Your export is delivered as JSON, a machine-readable format suitable for porting to any other service.
- Restriction (Art. 18): You may request we restrict processing while exercising the right to object, contact privacy@echoesofbattle.com.
- Objection (Art. 21): You may object to processing based on legitimate interest, disable push notifications in Settings > Notifications, or revoke analytics/crash reporting consent in Settings > Privacy.
- Withdraw Consent: Revoke analytics/crash reporting consent at any time (Settings > Privacy) without affecting prior lawful processing.
To exercise these rights, use the in-app options or contact us at privacy@echoesofbattle.com. We respond within 30 days as required by Art. 12(3).
Consent Management
On first launch, we ask for your consent regarding:
- Analytics: Anonymous usage tracking (optional)
- Crash Reporting: Error logging for stability (optional)
Both switches start off, and nothing is sent before you choose. Personalization can be switched on or off in Settings > Privacy.
You can change your consent preferences at any time in Settings > Privacy. We keep an audit log of your last 50 consent changes.
Children's Privacy
Echoes of Battle is designed for educational use and is suitable for users aged 12+. We do not knowingly collect personal information from children under 13. Before any real-money purchase, we present a neutral age screen and require a parental gate (an arithmetic challenge) for anyone who declares an age below 18. The Classroom Mode is designed for supervised educational environments.
Third-Party Services
We use the following third-party services:
- Firebase (Google, EU region): Authentication, data storage; analytics (web only)
- RevenueCat: In-app purchase management
- Sentry: Crash reporting (with consent)
- Google Analytics and Metricool (website analytics): Anonymous visitor statistics on our website, loaded only with your cookie consent
- Google Ads, the Meta (Facebook) pixel and the X (Twitter) pixel (website): Measure how our ads perform, loaded only with your cookie consent
- Cloudflare (website): Cookieless Web Analytics (page-view counts, no consent needed) and Turnstile bot-protection on the newsletter form
- Expo Push Service: Notification delivery
- Apple/Google: Authentication via Sign in with Apple/Google
Data Retention
We retain your data according to the following periods:
- Account record (Firestore users/{uid}): For as long as your account is active. Deleted immediately when you delete your account in the app; email requests are handled within 30 days.
- PvP matches & replays: Replay docs auto-expire 90 days after settlement. Match docs survive longer for opponent's history but are anonymized on your account deletion.
- Crash reports (Sentry): Only sent with your consent. 90 days, then auto-deleted by Sentry's hosted retention policy.
- Purchase records (RevenueCat): Retained for the duration required by tax law.
- Consent audit log: Last 50 consent change entries, stored locally on your device.
- Cache (audio, images): User-controllable via Downloads > Clear All.
Daily game leaderboards
When you finish a daily game (the Pin of the Day, the Battle of the Day or the Daily Challenge of “Where Was It Fought?”), your result goes to a shared leaderboard that the website and the app use together. It is stored in Google Firebase (region europe-west1) and contains: the day, your answer (where you put each pin, or the battle you named and at which step), the score our server works out from that answer, a random identifier your browser creates for this site (we store only a salted hash of it), and the name shown on the board: a name drawn from our preset list, or a name you type yourself.
- Country: the request passes through our Cloudflare edge server, which reads your country from your connection and sends it with the result. The board then shows that country's flag next to your name and counts you in your country's and region's tables and in the nations table. Your IP address is not stored; for a soft limit on the number of entries from one network per day we keep only a salted hash of it with that day's board.
- Pirate flag: when your real location cannot be worked out (the connection gives no country, or it runs through Tor, a VPN or a cloud network, recognised by the network operator, or the browser time zone is on another continent than the connection), you appear under a pirate flag instead, on the world board only. The network operator and time zone are used for this check alone and are not stored.
- Your own name: an optional name you type is checked by our server against a list of insults, slurs and hate terms in several languages; a name that fails is refused, and we may hide a name on the board that breaks this rule. Do not use your real full name or other personal details in it.
- Who sees it: the board shows publicly only the name, the flag and the score. Legal basis: our legitimate interest in running the leaderboard you choose to take part in (Art. 6(1)(f)). To have your entries removed, write to privacy@echoesofbattle.com and include the name you played under and the days.
Personalization on the website
Some blocks on echoesofbattle.com adapt to you: “Continue reading” under each story, “Picked for you” on the home page and the blog, the optional survey “What’s your history front?”, the path shown after a quiz, the call to action at the end of a page and one block chosen by country. Wherever this happens you see the note “Picked for you · change · turn off”. We never try to guess your gender or any other personal trait, and nothing is adapted on school and classroom pages.
Stored only on your device (your browser’s local storage, never sent to us):
- Reading history (
eob_read,eob_last): which of our stories you opened and the last one, to show unread stories first and offer “Continue reading”. - Survey answers and interest profile (
eob_profile): the eras and topics you picked, the shares worked out from them, and the results of quizzes you take. Plus when the survey was shown or skipped (eob_pz_sv), so it is offered at most once every 14 days. - Your starter era (
eob_era) and whether you already joined the list (eob_subscribed). - Visit counter (
eob_visits): only after you accept analytics in the cookie banner. Without that consent we only remember the current visit, for the length of the browser session. - Where this visit came from: campaign labels in the link and the referring site, kept for the current browser session only (together with an ad click identifier, if you arrived from one of our Google ads), to show a matching offer and, only if you accept analytics in the cookie banner, to tell Google Analytics and Google Ads where the visit started (for example the classroom offer when you arrive from a school link, or no newsletter prompt when you arrive from our newsletter). The one exception to “stored only on your device”: if you then join the newsletter, the campaign labels of that link (not the referring site) are sent with your email, as described under Website Newsletter.
- Control group and on/off switch (
eob_pz_group,eob_pz_off).
Country block. On the home page and under stories one block depends on the country of your connection (for example “Battles that built America” in the United States). Cloudflare, our hosting provider, derives the country from your IP address for each request; we use it on the fly to choose that block and do not store it. The story itself, the page title and its description are the same for everyone. Legal basis: our legitimate interest in showing relevant reading (GDPR Art. 6(1)(f)).
Control group. To check that personalization really helps, about 1 in 10 devices is randomly placed, on the first visit, in a control group that sees the editorial default order and no country block. If you accepted analytics, Google Analytics receives which group you are in and which suggestion you clicked, never your reading history or survey answers.
Newsletter interests. If you subscribe from the survey and tick “Match the stories to my answers”, the topics listed next to that box (for example “Second World War, The sea”) are saved with your email address in MailerLite, so the weekly story fits your front. This is the only case in which anything from personalization leaves your device. Leave the box unticked and only your email is sent.
Clear or turn off. Use the buttons below, or “turn off” next to any personalized block. Clearing removes your reading history, survey answers, counters and starter era from this browser. You can also delete this site’s data in your browser settings.
Privacy Contact
For privacy-related questions, complaints, or to exercise your GDPR rights:
- Primary contact: privacy@echoesofbattle.com
- Designated privacy contact (acts as DPO for inquiries): the privacy contact above
- Response time: Within 30 days as required by GDPR Art. 12(3)
- Supervisory authority: If you believe your data is being processed unlawfully, you have the right to lodge a complaint with your local data protection authority. For EU users, see https://edpb.europa.eu/about-edpb/board/members_en for your national authority.