SDK data collection and privacy
Version 1.0 · Effective from 14 October 2026
This page is for app developers who use Voidhash ("Customer", "you"). It explains what the Voidhash SDKs collect from the people who use your app or website ("End Users"), what they store on the End User's device, what Voidhash adds on its servers, and how you can control it. It also tells you how to answer Apple's App Store privacy questions and Google Play's Data safety form, and gives you a paragraph you can adapt for your own privacy policy.
The page describes the current versions of the iOS (Swift), Android (Kotlin), React Native and web (JavaScript) SDKs. A Czech version of this page is also available; both versions have the same content and numbering.
This page is information, not legal advice. You know what your app does and which other SDKs it contains, so you are responsible for your own disclosures and consents.
1. Who is responsible for the data
1.1 You are the controller. You decide whether to use Voidhash in your app, what you send to it and why. The obligations of a controller under the GDPR and similar laws (informing End Users, having a legal basis, obtaining consents where required, answering requests) are yours.
1.2 Voidhash is your processor. Voidhash s.r.o., IČO 23738944, Chudenická 1059/30, 102 00 Praha 10, Czech Republic ("Voidhash", "we") processes End User data only on your behalf and on your instructions, under the Data Processing Addendum at voidhash.com/legal/dpa ("DPA"). Our subprocessors are listed at voidhash.com/legal/subprocessors.
1.3 Integrations you set up with your own credentials (Apple App Store Server API, Google Play Developer API and Pub/Sub, your Stripe account, APNs, Firebase Cloud Messaging, your webhook endpoints) are disclosures you instruct us to make. Those recipients are not our subprocessors; your relationship with them is governed by your own agreements.
1.4 We do not sell End User data, do not use it for advertising, and do not combine it with data from other customers to build profiles of End Users. As documented in the DPA, we may create anonymised, aggregated statistics that identify neither you nor any End User.
2. What the SDKs collect
2.1 The tables below list every field the client SDKs send. "Automatic" means the SDK sends it without you writing code for it once the SDK is configured. "Only if you provide it" means the SDK sends it only when your code (or a paywall you configured) passes it. "Server-derived" means the SDK does not send it; Voidhash records it when a request arrives. The React Native SDK runs on the iOS and Android SDK cores, so it collects the same fields as the native SDK of the platform it runs on.
2.2 Server libraries (Node, Go, PHP, Rust and others) and the REST API send only what your backend passes to them.
2.3 Identifiers
| Field | iOS | Android | RN | Web | Source | Purpose |
|---|---|---|---|---|---|---|
Anonymous ID (vh:anon: followed by a random UUID), created on first launch for each app install or browser profile | ✓ | ✓ | ✓ | ✓ | Automatic | Recognise the same install across launches; attach purchases, access and events to it before sign-in |
Your user ID (the "distinct ID" you pass to identify or the distinctId option) | ✓ | ✓ | ✓ | ✓ | Only if you provide it | Link the install to your account system so purchases and access follow the user across devices |
| Previous anonymous ID, sent once when you identify a user | ✓ | ✓ | ✓ | ✓ | Automatic after identify | Merge the anonymous history into the identified person |
| Session ID (random UUID; a new one after 30 minutes without events) | ✓ | ✓ | ✓ | Only if you pass it | Automatic (mobile) | Group events into sessions for analytics |
| Event ID (random UUID per event) | ✓ | ✓ | ✓ | ✓ | Automatic | Deduplicate events that are retried |
Account token: a UUID derived from the distinct ID (UUIDv5), given to the store as Apple appAccountToken or Google Play obfuscatedAccountId | ✓ | ✓ | ✓ | – | Automatic for purchases the SDK starts | Attribute a store purchase to the right person, including when the store reports it later |
The SDKs do not read the IDFA, IDFV, Google Advertising ID, Android ID or any hardware identifier (section 4).
2.4 Device and app context (mobile SDKs)
Sent automatically with every event and, as request headers, with every API request.
| Field | Example | Purpose |
|---|---|---|
| App name, version, build and bundle ID / package name | MyApp, 2.3.0, 412, com.example.app | Product analytics by release; detecting installs and updates; matching the app configuration |
| Platform and OS version | ios, 18.1 | Compatibility, analytics |
| Device brand and model | Apple / iPhone15,2; samsung / SM-S911B | Compatibility, analytics |
| Locale and preferred locales | cs-CZ, cs-CZ,en-US | Localising paywalls and prices; analytics |
| Time zone | Europe/Prague | Analytics in local time |
| SDK name and version | ios, 0.x | Support and compatibility |
| Environment and build flags | production, debug build, observer mode, app in background | Separating test data from live data; SDK behaviour |
2.5 Page context (web SDK)
Sent automatically with every event the web SDK sends.
| Field | Purpose |
|---|---|
| Page title | Analytics |
| URL origin and path of the current page (no query string or fragment) | Analytics |
| Referrer origin and path (no query string or fragment) | Analytics (traffic sources) |
| Screen size and viewport size | Analytics, layout |
| Browser language and preferred languages, time zone | Localisation, analytics |
Browser user agent string and navigator.platform (sent as request headers) | Compatibility, analytics |
SDK name and version, production environment | Support |
The web SDK sets no cookies. It does not capture page views or other events automatically; it sends
only the events your code tracks (including page() calls).
2.6 Events
| Event | iOS | Android | RN | Web | Source | What it records |
|---|---|---|---|---|---|---|
$app_installed, $app_updated | ✓ | ✓ | ✓ | – | Automatic, can be turned off (section 5) | First launch of an install; launch of a new app version |
$app_opened, $app_backgrounded, $app_became_active | ✓ | ✓ | ✓ | – | Automatic, can be turned off | App launches and foreground/background changes |
$sign_out | ✓ | ✓ | ✓ | – | Automatic when you call reset() / signOut() | The identity was cleared |
$screen with screen name, path, title, previous screen and time spent on it, integration source | ✓ | ✓ | ✓ | – | Automatic, can be turned off or filtered | Which screens are used, in what order |
$screen_params (route parameters, at most 20) | ✓ | ✓ | ✓ | – | Only if you turn on includeParams | Screen context. Off by default because parameters often contain IDs or tokens |
| Paywall and flow events and screens, with placement, paywall ID, release and screen index | ✓ | ✓ | ✓ | – | When a paywall you designed is shown, according to its design | Paywall performance, experiments |
Your custom events and their properties (capture, track, page) | ✓ | ✓ | ✓ | ✓ | Only if you provide it | Whatever you decide; you define the content |
| Revenue events (purchase, renewal, refund, cancellation) | – | – | – | – | Created by Voidhash from store data (section 2.8) | Revenue analytics |
2.7 Data you or your paywalls provide
| Data | How it reaches Voidhash | Notes |
|---|---|---|
| Email address and name | identify(…, email:, name:), setPersonAttributes | Optional. Voidhash works without them; see section 5.5 |
| Person attributes ("traits") | setPersonAttributes, identify traits, or a paywall allowed to set attributes | Free-form. Do not send special categories of data, payment card numbers or government IDs |
| Answers End Users enter in a paywall or flow (for example a survey or a form) | Only if your flow design captures them and you granted the flow the attributes capability, or the flow sends them as event properties | You design what is asked |
| Push notification token, platform, provider and bundle ID | Only if your app registers the device for push notifications through Voidhash | Used to send the notifications you create |
| Permission results (notifications, App Tracking Transparency) | A flow may ask the operating system for these only if you granted the notifications or tracking capability | The answer is passed back to the flow. The SDK never reads the IDFA |
2.8 Purchases
| Data | Source | Purpose |
|---|---|---|
| App Store signed transactions (JWS), transaction and original transaction IDs, product ID, purchase date, quantity | iOS and RN SDKs (automatic, for transactions StoreKit reports to the app), and Apple's servers through your App Store Server API credentials | Validate purchases, grant and revoke access, restore purchases |
| Google Play purchase tokens, order IDs, product ID, purchase date, quantity | Android and RN SDKs (automatic) and Google Play through your credentials | Same as above |
| Prices, currency, storefront country, offers, tax and store commission, renewal and expiry dates, subscription status, refunds and revocations | Apple, Google Play and Stripe, through the credentials you configure | Entitlements, subscription status, revenue reporting |
| Stripe customer and payment data | Your Stripe account, through the credentials you configure | Web purchases. Card numbers never reach Voidhash |
Purchase data is linked to the person and kept as long as you keep the project, because it is needed to account for subscriptions that are still active (see section 6).
2.9 Server-derived data
When a request from an SDK reaches Voidhash, the following is recorded with each analytics event:
| Data | How | Purpose |
|---|---|---|
| IP address (full) | From the connection, as reported by our edge network (Cloudflare) | Deriving approximate location; security, fraud and abuse prevention; identity resolution (see below) |
| User agent | From the request header | Compatibility, analytics |
| Approximate location: country, region, city, time zone | Derived from the IP address by Cloudflare. Not GPS and not the device's location services | Analytics, localisation, paywall targeting |
| Time received | Server clock | Ordering and auditing of events |
The full IP address is received with every request from the SDKs and the API and is stored with events. It is a deliberate part of the Service and is used to:
- (a) derive the approximate location (country, region, city, time zone) shown in the table above;
- (b) protect the Service, you and your End Users against security threats, fraud (for example receipt or entitlement abuse) and other abuse;
- (c) where offered, recognise the same End User across your own apps and websites (identity resolution), for example to recognise that a person who bought on your website is the same person who later opens your app. This works only within your own projects; Voidhash never links End Users across different customers.
If your app or website uses Voidhash, describe these uses, including (c), in your own privacy notice (see the template in section 10).
3. What is stored on the End User's device
3.1 The SDKs keep a small amount of state on the device so that purchases are not lost when the app is killed or offline, access can be checked without a network round trip, and events are delivered later. All of it is stored inside your app's own sandbox (mobile) or your website's origin (web). No other app or website can read it, and none of it is shared with other apps.
3.2 Keys are prefixed with a namespace, written below as <ns>, of the form vh:1:<hash>:, where
<hash> is derived from your publishable key and the API address. Files use the same hash.
3.3 Placing information on a device, or reading it, can require the End User's consent under the ePrivacy Directive (Art. 5(3)) and national laws implementing it, such as § 89(3) of Czech Act No. 127/2005 Coll., on electronic communications. Consent is not required for storage that is strictly necessary to provide a service the End User has explicitly requested. The "Category" column is our suggestion to help your assessment:
- Necessary (purchases): needed to deliver purchases, restores and access the End User paid for, or to show a paywall the End User opened.
- Analytics: needed only for usage analytics (section 5.1). Depending on your jurisdiction and assessment, this may require consent.
3.4 iOS (and React Native on iOS)
Mechanism: UserDefaults (the app's standard defaults) for key-value entries; files in the app's
Application Support and Caches directories. The SDK does not use the Keychain, so its data is
removed when the app is deleted.
| Key or file | Mechanism | Purpose | Lifetime | Category |
|---|---|---|---|---|
<ns>distinctId | UserDefaults | Current anonymous ID or your user ID | Until reset(), sign-in as another user, or app deletion | Necessary (purchases); also used for analytics |
<ns>person:<id>, <ns>person-none:<id> | UserDefaults | Cached person: access (entitlements), subscriptions, purchase history, email and name if set | Refreshed in use; treated as expired after 2 days; removed by reset() | Necessary (purchases) |
<ns>processed-transaction:…, <ns>transaction-identity:…, <ns>restored-transaction-identity:… | UserDefaults | Which store transactions were already reported and for whom | 30 minutes (processing state), 30 days (restored identity) | Necessary (purchases) |
Application Support/voidhash/<hash>/transaction-outbox.ndjson, accepted-receipts.ndjson | File | Store transactions waiting to be delivered; receipts already accepted | Until delivered; small bounded history | Necessary (purchases) |
Application Support/voidhash/<hash>/person-writes.ndjson | File | identify calls and person attributes waiting to be delivered | Until delivered | Necessary when used for sign-in; analytics for attributes |
<ns>schema:current | UserDefaults | Your project's product and paywall configuration | Until replaced by a newer version | Necessary (purchases) |
<ns>paywall:…, <ns>paywall:placements, Caches/… flow packages | UserDefaults; Caches directory | Paywalls already resolved for this person; recently used placements; downloaded paywall designs | 7 days (resolved paywalls); up to 20 placements; cache may be cleared by the system | Necessary when the End User opens a paywall |
<ns>flow-state:<id>:… | UserDefaults | Progress and answers inside a multi-step flow, so it can resume | 90 days; removed by reset() | Necessary for the flow the End User started |
<ns>flags:<id>:… | UserDefaults | Feature flag and experiment assignments | Refreshed after 5 minutes; removed by reset() | Functional; experiments may be analytics |
Application Support/voidhash/<hash>/analytics-queue.ndjson | File | Events waiting to be sent (at most 1,000) | Until sent | Analytics |
<ns>voidhash:analytics:session | UserDefaults | Current session ID and time of last event | Replaced after 30 minutes of inactivity | Analytics |
<ns>voidhash:analytics:last-seen-app-release | UserDefaults | App version and build seen last, to detect installs and updates | Until app deletion | Analytics |
<ns>cache-keys, <ns>migrated-from:voidhash | UserDefaults | Index of the entries above; one-time migration marker | Until app deletion | Technical, follows the entries above |
3.5 Android (and React Native on Android)
Mechanism: a private SharedPreferences file named com.voidhash.sdk.cache for key-value entries;
files in the app's private files and cache directories. The SDK does not use DataStore or external
storage.
| Key or file | Mechanism | Purpose | Lifetime | Category |
|---|---|---|---|---|
<ns>distinctId | SharedPreferences | As on iOS | As on iOS | Necessary (purchases); also analytics |
<ns>person:<id>, <ns>processed-transaction:…, <ns>transaction-identity:…, <ns>restored-transaction-identity:…, <ns>schema:current, <ns>paywall:…, <ns>flow-state:…, <ns>flags:… | SharedPreferences | As on iOS | As on iOS | As on iOS |
files/voidhash/vh-1-<hash>-transactions.ndjson, …-accepted-receipts.ndjson | File | Store purchases waiting to be delivered; receipts already accepted | Until delivered; small bounded history | Necessary (purchases) |
files/voidhash/vh-1-<hash>-person-writes.ndjson | File | identify calls and attributes waiting to be delivered | Until delivered | As on iOS |
files/voidhash/vh-1-<hash>-analytics.ndjson | File | Events waiting to be sent | Until sent | Analytics |
cache/voidhash-paywall-packages/ | File | Downloaded paywall designs | Cache; may be cleared by the system | Necessary when the End User opens a paywall |
<ns>voidhash:analytics:session | SharedPreferences | Session ID | 30 minutes of inactivity | Analytics |
<ns>voidhash:analytics:last-seen-app-release | SharedPreferences | Last app version, build and install time seen (the install time stays on the device), to detect installs, updates and restores from backup | Until app data is cleared | Analytics |
If your app uses Android Auto Backup, these entries can be included in the user's backup. The SDK detects a restore onto a new install and starts a new session.
3.6 Web
Mechanism: localStorage of your website's origin, with an in-memory fallback when storage is
unavailable. The web SDK sets no cookies and does not use IndexedDB or sessionStorage. To
coordinate open tabs, it uses the browser's Web Locks API, which stores nothing.
| Key | Purpose | Lifetime | Category |
|---|---|---|---|
<ns>:identity:distinct-id | Anonymous ID or your user ID | Until reset() or the visitor clears site data | Analytics; necessary only if you use it for purchases or access |
<ns>:identity:traits:<id> | Traits you passed to identify, including email or name if you included them | Until reset() or clearing site data | As above |
<ns>:feature-flags:<id>:… | Feature flag and experiment assignments | Refreshed after the configured time (default 5 minutes) | Functional; experiments may be analytics |
<ns>:analytics:queue:<tab>, <ns>:analytics:owner:<tab> | Events waiting to be sent; which tab owns the queue | Until sent; owner entry while the tab is open | Analytics |
<ns>:__keys__ | Index of the entries above | Until clearing site data | Technical |
If you need consent for analytics on your website, do not initialise the web SDK until the visitor has consented (section 5.2).
4. What the SDKs do not collect
4.1 The SDKs do not read or send:
- advertising identifiers (Apple IDFA, Google Advertising ID), the Apple IDFV, the Android ID, or hardware identifiers such as IMEI, serial number or MAC address;
- precise location (GPS or the device's location services); location is approximate and comes only from the IP address (section 2.9);
- contacts, photos, files, calendars, messages, health or fitness data, or browsing history outside your own website;
- crash logs or performance diagnostics. SDK diagnostics are delivered only to your app through the
onDiagnosticandonWarningcallbacks and are not sent to Voidhash; - payment card numbers. Card payments are handled by Apple, Google or Stripe.
4.2 The SDKs do not track End Users across apps or websites owned by other companies. A paywall can show Apple's App Tracking Transparency prompt only if you allow it (section 5.7); the SDK does not read the IDFA even when the End User allows tracking. Identity resolution based on the IP address (section 2.9) links activity only within your own apps and websites.
4.3 The SDKs request only the INTERNET and ACCESS_NETWORK_STATE permissions on Android. A
paywall can ask for notification permission only if you grant it that capability.
5. Consent and how you can control collection
5.1 Consent: our position. Voidhash distinguishes three kinds of processing:
- Purchases. Validating receipts and transactions, restoring purchases and granting access (entitlements), together with the identifiers and on-device storage they need (marked "Necessary (purchases)" in section 3), are part of the service the End User asked for when buying in your app. They are strictly necessary and run without consent.
- Revenue analytics. Revenue, MRR, subscription and refund reports are calculated on Voidhash's servers from the purchase transactions already processed for validation. They need no additional on-device storage or event collection, so they keep working whether or not an End User has consented to analytics. As the controller, you need your own legal basis for them, typically your legitimate interest in understanding your business or your legal obligations in accounting.
- Usage analytics. Automatic events (such as app opens and screen views), your custom events, paywall impressions and interactions, and person traits, together with the storage marked "Analytics" in section 3. Depending on the jurisdiction and how you use them, they may require the End User's consent under ePrivacy rules (in the Czech Republic, § 89(3) of Act No. 127/2005 Coll., on electronic communications). Deciding whether consent is needed, obtaining it and passing the result to the SDK is your responsibility.
If usage analytics is off for some End Users, metrics that rely on impressions, such as paywall conversion rates, are calculated only from End Users for whom usage analytics is on and may be incomplete. Revenue totals are not affected.
5.2 Start the SDK only after consent. Today the SDKs offer an all-or-nothing switch. On iOS,
Android and React Native, configure the client with enabled: false until you have the End User's
consent (or another legal basis). A disabled client makes no network requests and reads and writes
nothing on the device. To enable it later, configure it again with enabled: true (on React Native,
create a new client). On the web, call initialize() only after consent; nothing is stored before
it is called.
Important: A disabled client also disables purchases, restores and access checks through Voidhash. To keep purchases running for End Users who decline usage analytics, leave the SDK enabled, turn off automatic events (section 5.3) and do not send custom events or traits for them. The anonymous ID, session ID and analytics queue are still used in that case.
5.3 Turn off automatic events.
| SDK | Lifecycle events ($app_*, $sign_out) | Screen events ($screen) |
|---|---|---|
| iOS | VoidhashOptions(automaticLifecycleEvents: false) | screenTracking: ScreenTrackingOptions(automatic: false); screens you report yourself are still captured |
| Android | VoidhashOptions(automaticLifecycleEvents = false) | screenTracking = ScreenTrackingOptions(automatic = false) |
| React Native | No option to turn them off | screenTracking: { enabled: false } turns off all screen events |
| Web | None are captured automatically | None are captured automatically |
On the web, analytics: { enabled: false } stops the background sending of the analytics queue.
Events your code passes to track() are still queued on the device and can still be sent. If you do not want
events, do not call track() or page().
5.4 Limit what screens reveal. Leave includeParams off (the default) and use mapScreen to
rename or drop screens whose names or paths contain personal data. Return null (nil in Swift) to
skip a screen.
5.5 Minimise identity data. Use a random or internal user ID as the distinct ID, not an email address or phone number. Pass email and name only if you need them in Voidhash. Do not put special categories of data (health, religion, sexual orientation and similar), payment card numbers, government IDs or passwords into attributes, traits or event properties.
5.6 Sign-out. reset() (also signOut()) clears the stored identity, cached person, flags,
paywall assignments and flow progress, and starts a new anonymous ID and session. It keeps the
project configuration and the install marker, and lets queued events of the previous identity be
delivered. It does not delete data already held by Voidhash; use erasure (section 6) for that.
The SDKs have no single call that removes all of their data from the device; deleting the app or
clearing its data (or, on the web, clearing site data) does.
5.7 Paywall capabilities. By default a paywall may only open links. It can ask for notification or
tracking permission, or set person attributes, only if you add notifications, tracking or
attributes to flowCapabilities.
5.8 Server-side. In Studio you can view, and delete, each person and their events. Retention of analytics data follows your plan (section 6).
6. Retention and erasure
6.1 Retention. How long End User data is kept depends on your plan's retention period ("Retention Period"): Free 3 years, Grow 5 years, Enterprise as agreed in the Order Form.
- Event-level analytics data (events, sessions, screen views, custom events and their properties, including IP address and location) is kept for at least the Retention Period, counted from when each event occurred. After that, Voidhash may delete it or replace it with aggregated statistics that no longer identify End Users. We are not obliged to keep it longer.
- Aggregated reports (revenue, MRR, conversion, retention and cohort charts) remain available for the life of your account.
- Purchases, transactions, subscriptions and entitlements are kept for the life of your account, because access decisions and revenue history depend on them, unless you erase the End User (section 6.2) or close your account.
- Persons with no activity for longer than the Retention Period may be deleted.
- Before we first delete data of a project under this section, we notify you at least 30 days in advance, so that you can export it. If you move to a plan with a shorter Retention Period, the new period applies, with the same notice.
- You can erase End Users at any time (section 6.2). Enterprise customers may agree a shorter Retention Period.
- When your account ends, the retrieval and deletion rules for the end of the contract in the Terms and the DPA apply instead.
6.2 Erasure of an End User. When an End User asks you to delete their data, erase them in Studio
(People → the person → Delete person data) or call POST /api/v1/persons/erasures from your
backend with a secret key. The erasure covers the person and every profile merged into them. It
deletes their name, email, traits, all distinct IDs, events (including IP address, user agent and
location), devices registered for push notifications, cohort memberships, unfinished checkouts,
feature flag targeting that names them, and their identifiers in webhook delivery history, stored
store payloads and push notification content. A second pass a day later removes events that
arrived late from offline devices. Voidhash then sends the person.deleted webhook. See the
documentation article "Delete a person's data".
6.3 What is kept. Purchases, subscriptions, granted access and revenue events are kept, attached to an anonymous person ID and without personal properties, so that active subscriptions keep working and your revenue reports do not change. Store transaction IDs are kept because they identify the purchase, not the person.
6.4 On the device. Data the SDK stores locally is deleted when the End User deletes the app or clears its data (mobile), or clears site data (web). Erasure in Voidhash does not reach the device; if the app continues to send events under the same distinct ID, they create a new, empty person.
6.5 Technical logs that can contain IP addresses and identifiers are kept for 30 days.
7. App Store privacy details (Apple)
7.1 In App Store Connect, under App Privacy, declare the data below for Voidhash in addition to your own and other SDKs' data. Apple asks about the data your app collects, including through third-party SDKs.
| Apple data type | Declare when | Linked to the user | Used for tracking | Purposes to select |
|---|---|---|---|---|
| Purchases → Purchase History | Always, when you use purchases or entitlements | Yes | No | App Functionality, Analytics |
| Identifiers → User ID | When you call identify or set distinctId with your own user ID | Yes | No | App Functionality, Analytics |
| Identifiers → Device ID | Always (the anonymous install ID) | Yes | No | App Functionality, Analytics |
| Usage Data → Product Interaction | Unless you have turned off all automatic events and send no events | Yes | No | Analytics (add App Functionality if you use events for paywall targeting or experiments) |
| Location → Coarse Location | Always: Voidhash derives country, region and city from the IP address | Yes | No | Analytics, App Functionality |
| Contact Info → Email Address / Name | Only if you pass them to identify or as attributes | Yes | No | App Functionality (and the purposes you use them for) |
| Other types (for example Other User Content, Other Data Types) | If attributes, event properties or paywall answers you send contain such data | Yes | Depends on your use | Your purposes |
| Identifiers → Device ID (push token) | If you register push tokens through Voidhash; covered if you declare Device ID above | Yes | No | App Functionality |
| Diagnostics | Not collected by Voidhash | – | – | – |
7.2 Tracking. Voidhash does not use data for tracking as Apple defines it. Answer "No" for Voidhash unless you yourself combine Voidhash data with third-party data for targeted advertising or share it with data brokers, for example by forwarding webhooks to an advertising network.
7.3 Product Personalization. Whether to also select the Product Personalization purpose, for example because you target paywalls, offers or experiments based on person data, is your decision.
7.4 Privacy manifest. The iOS SDK ships a privacy manifest (PrivacyInfo.xcprivacy) that Xcode
merges into your app's privacy report. It declares no tracking and gives the reasons for the
required-reason APIs the SDK uses: UserDefaults (reason CA92.1, the SDK's own state) and system
boot time (reason 35F9.1, measuring elapsed time for retries and timeouts). The React Native SDK
includes the same manifest through its iOS core. Base your App Privacy answers on the table above,
including Coarse Location.
8. Google Play Data safety
8.1 In Play Console, under App content → Data safety, include the following for Voidhash.
| Google Play category → type | Declare when | Collected / shared | Processed ephemerally | Required or optional | Purposes |
|---|---|---|---|---|---|
| Financial info → Purchase history | Always, when you use purchases or entitlements | Collected | No | Required | App functionality, Analytics |
| Device or other IDs | Always (the anonymous install ID; also push tokens if you register them) | Collected | No | Required | App functionality, Analytics |
| Personal info → User IDs | When you call identify with your own user ID | Collected | No | Required if your app identifies users | App functionality, Analytics |
| App activity → App interactions | Unless you have turned off all automatic events and send no events | Collected | No | Your choice: "optional" only if users can turn it off in your app | Analytics |
| Location → Approximate location | Always: derived from the IP address | Collected | No | Required | Analytics, App functionality |
| Personal info → Email address / Name | Only if you pass them to Voidhash | Collected | No | As in your app | App functionality, Account management if applicable |
| App activity → Other user-generated content / Other actions | If paywall answers or event properties you send contain such data | Collected | No | As in your app | Your purposes |
| App info and performance (crash logs, diagnostics) | Not collected by Voidhash | – | – | – | – |
8.2 Sharing. Data sent to Voidhash as your service provider is "collected", not "shared". If you forward Voidhash data to third parties through webhooks or integrations that are not your service providers, evaluate whether to declare it as "shared".
8.3 Security practices.
- Is all of the user data collected by your app encrypted in transit? Yes for Voidhash: the SDKs communicate with Voidhash only over HTTPS (TLS).
- Do you provide a way for users to request that their data be deleted? Yes, provided you offer End Users a way to ask you (Google requires an in-app path and a web link for apps with accounts). You can fulfil the request through Voidhash erasure (section 6.2).
9. Using an app that uses Voidhash?
9.1 This section is for End Users. If an app or website you use relies on Voidhash, Voidhash helps the developer process your purchases and subscriptions, give you access to what you paid for, show you purchase screens and measure how the app is used.
9.2 The developer of the app is responsible for your data. It decides what is collected and why, and Voidhash processes the data only on the developer's behalf and instructions. Depending on how the developer has set up the app, this can include an app-specific identifier, your email or name if the developer provides it, information about your device and app (model, system version, language, time zone, app version), your IP address and the approximate location derived from it, how you use the app and its purchase screens, your purchases and subscriptions, and a push notification token. Your IP address is also used to protect the service against fraud and abuse and, where offered, to recognise that you are the same person across the developer's own apps and websites. Voidhash does not read advertising identifiers or your precise location and does not sell your data.
9.3 To access, correct or delete your data, or to object, contact the app developer. You will find its contact details in the app's privacy policy or its App Store or Google Play listing. The developer can delete your data in Voidhash. Deleting the app removes the data the SDK stored on your device.
9.4 If you cannot reach the developer, write to legal@voidhash.com and tell us which app it concerns. We will pass your request to the developer and let you know. Voidhash's own processing is described in our Privacy Policy at voidhash.com/legal/privacy.
10. Template for your privacy policy
10.1 You may copy and adapt the paragraph below. Remove what does not apply (for example email, push notifications or analytics), add your legal bases and retention, and make sure it matches your app. It does not replace your own privacy policy.
English template
Purchases, subscriptions and analytics (Voidhash). We use Voidhash, a service of Voidhash s.r.o. (Czech Republic), to process in-app purchases and subscriptions, give you access to paid features, show purchase screens and analyse how our app is used. For this, our app sends Voidhash an identifier created for your installation of the app [and our user ID for your account] [and your email address and name], information about your device and app (device model, operating system version, language, time zone, app version), your purchases and subscriptions, and how you use the app [and a push notification token]. Voidhash also receives your IP address and uses it to derive your approximate location (country, region, city), to prevent fraud and abuse [and to recognise that you are the same person across our apps and websites]. Voidhash processes this data as our processor, only on our instructions, and does not use it for its own purposes or for advertising. The data may be processed in the United States by Voidhash's subprocessors on the basis of the EU–US Data Privacy Framework or standard contractual clauses. We process this data [to perform our contract with you (purchases and access) and on the basis of our legitimate interest in improving our app / your consent (analytics)]. We keep it [for as long as you use our app and up to [X] years afterwards]. To exercise your rights, contact us at [contact].
Czech template (Šablona v češtině)
Nákupy, předplatné a analytika (Voidhash). Pro zpracování nákupů a předplatného v aplikaci, zpřístupnění placených funkcí, zobrazení nákupních obrazovek a analýzu používání aplikace využíváme službu Voidhash společnosti Voidhash s.r.o. (Česká republika). Naše aplikace za tímto účelem předává službě Voidhash identifikátor vytvořený pro vaši instalaci aplikace [a naše ID vašeho účtu] [a vaši e-mailovou adresu a jméno], údaje o zařízení a aplikaci (model zařízení, verze operačního systému, jazyk, časové pásmo, verze aplikace), údaje o vašich nákupech a předplatném a o tom, jak aplikaci používáte [, a token pro zasílání oznámení]. Voidhash dále získává vaši IP adresu a používá ji k určení vaší přibližné polohy (stát, region, město), k prevenci podvodů a zneužití [a k rozpoznání, že naše aplikace a weby používáte vy jako tatáž osoba]. Voidhash tyto údaje zpracovává jako náš zpracovatel, pouze podle našich pokynů, a nepoužívá je pro vlastní účely ani k reklamě. Údaje mohou být zpracovávány v USA subdodavateli společnosti Voidhash na základě rámce EU–USA pro ochranu osobních údajů nebo standardních smluvních doložek. Údaje zpracováváme [pro plnění smlouvy s vámi (nákupy a přístup k obsahu) a na základě našeho oprávněného zájmu na zlepšování aplikace / vašeho souhlasu (analytika)]. Uchováváme je [po dobu používání aplikace a nejvýše [X] let poté]. Svá práva můžete uplatnit na [kontakt].
11. Changes and contact
11.1 We update this page when the SDKs start or stop collecting data or change what they store. The version and effective date are shown at the top. Material changes are announced in the SDK release notes and by email to account owners.
11.2 Questions about this page: legal@voidhash.com. We have not appointed a data protection officer. For any data protection matter, contact us at legal@voidhash.com.